Hi. I'm using Inkscape to author a comic and the slow speed for certain
things is very annoying. I'm already have OpenMP turned on and using 4
1. *large blurs are slow* - I'm an expert with writing SIMD code, so I was
thinking about vectorizing the Gaussian IIR filter with SIMD intrinsics,
even though it's harder than for a FIR. But I noticed there isn't any SIMD
code in Inkscape so does that mean it's something to avoid.
I'm pretty sure no current compiler is smart enough to vectorize it, and
besides, Inkscape is compiled with -O2, meaning -ftree-vectorize isn't on
2. *when there's a large image (raster based) background - scrolling in a
zoomed region is very slow*
I compiled the latest 0.49 code with GCC profiling and it shows this:
33.98 22.47 22.47 exp2l
21.29 36.55 14.08 log2l
17.57 48.17 11.62 pow
7.12 52.88 4.71 658 0.01 0.01
6.72 57.32 4.44 563 0.01 0.01
5.51 60.96 3.64 1216 0.00 0.00
5.23 64.42 3.46 internal_modf
0.59 64.81 0.39 _mcount_private
0.41 65.08 0.27 __fentry__
0.12 65.16 0.08 GC_mark_from
0.09 65.22 0.06 5579 0.00 0.00
Geom::parse_svg_path(char const*, Geom::SVGPathSink&)
0.06 65.26 0.04 35320 0.00 0.00
std::allocator<Geom::Path> > const&, Geom::Affine const&)
0.06 65.30 0.04 8 0.01 0.01
0.05 65.33 0.03 885444 0.00 0.00
std::vector<Geom::Linear, std::allocator<Geom::Linear> > >, unsigned long
long, Geom::Linear const&)
The cost is absolutely dominated by ink_cairo_surface_srgb_to_linear() and
ink_cairo_surface_linear_to_srgb(). My first instinct was to optimize
those 2 functions, but then I thought why are those even being called every
time I scroll through the image?
Why not convert the images up front to linear and stay that way in memory?
If that can't be done, then my optimization approach is:
1. replace ink_cairo_surface_srgb_to_linear() with a simple 3rd degree
polynomial approximation (0.902590573087882 - 0.010238759806148x +
0.002825455367280x^2 + 0.000004414767235x^3) and vectorize with SSE
intrinsics. The approximation was calculated by minimizing the square error
(maxError = 0.313) over the range [10, 255]. For x < 10, it uses simple
2. replace ink_surface_linear_to_srgb() with a vectorized implementation
of pow(). Unlike srgb_to_linear(), a low degree polynomial can't be used
due to the curve having larger high order derivatives. An alternative would
be piece wise, low order polynomials.
The main question I have is what degree of accuracy is desired? Certainly,
it doesn't need double precision pow() since the input is only 8 bits! Is
+- 0.5 from the true value (before quantization) OK or do people depend on
getting pixel perfect results?
I initially asked at
was told to better post my request to this mailing list.
I wonder if it wouldn't be possible to create releases more regularly.
Currently there are many months or even years between each release of
Bug fixes should get out more quickly and it should be possible to try out
new features of upcoming versions. Most users don't have the possibility to
build Inkscape by their own, so they have to wait for the next release.
Unfortunately the provided development downloads are not synchronized,
hosted on different third-party web sites and out of date (currently
especially the Windows version).
So I suggest to create a (more or less) fixed fast release cycle for normal
releases (e.g. every two or three months) and periodically (e.g. every one
or two weeks) create alpha versions.
Alpha versions should be built (maybe even automatically) for all supported
OSes and hosted directly on inkscape.org.
I tried your modified build with an NVidia Quadro 1000M on Windows 7 and it
seemed okay to me.
> Le Jeudi 21 novembre 2013 9h09, Nicolas Dufour <nicoduf@...48...> a ?crit
> > I'm still investigating the issue, and just found out that the computers
> > used to reproduced the bug were all using an Intel GPU. Tests with an
> > GeForce 210 (GT218) show no slowness at all.
> Could some Windows users help me? I'd like to confirm the slowness only
> affects Intel graphics cards. Could you test a modified Inkscape binary
> (from ftp://download.tuxfamily.org/inkscape/inkscape-12282-cairo-220.127.116.11z),
> give your graphic card model and tell me if it's slow or not? IMHO it could
> be a blocker for 0.49 on Windows.
ref : https://bugs.launchpad.net/inkscape/+bug/165665
I believe this bug can be fixed by disabling the flag USE_PANGO_WIN32 in
line 19 of src/libnrtype/FontFactory.h. When I do this on Windows XP, I gain
about 35 new fonts. Not all of these new fonts are useable, but the most
interesting ones, such as CommercialPi, Symbol, Technic, Webdings,
Wingdings, MonoType Sorts, TechnicLite are working well, both in Inkscape
and in IE9.
This is a Windows-specific bug which hides symbol fonts, and does not
occur in Gimp 2.6 on Win XP. As far as I can tell, the Gimp source code does
not contain any analogue or equivalent of the flag USE_PANGO_WIN32.
Would there be any objection if I disable this flag, or does it serve a
specific purpose that is essential?
- Alvin Penner
View this message in context: http://old.nabble.com/non-Unicode-symbol-fonts-do-not-work-on-Windows.-Bu...
Sent from the Inkscape - Dev mailing list archive at Nabble.com.
We had a very good meeting this morning. Nine (9!) Inkscapers were present (partially thanks to the Inkscape development fund). Here is a list of those present:
Martin Owen/doctormo (barcode extension, Python, C++)
Joakim Verona (artwork, Inkscape with emacs, d-bus, interest in embedded Inkscape)
Krzysztof Kosiński (Clipboard, Cairo renderer, boolean path operations)
Gémy Cédric/pygmee (extensions, Python, documentations)
Sirko Kemter (LGM Host, Inkscape trainer)
Elisa de Castro Guerra (documentation, translations)
Ryan Lerch (Redhat user)
the Adib (translation, Cairo, interest in PDF output)
Here are some notes I took from the session merged with some notes from Elisa (thanks!). We covered a lot of stuff. Let me appoligize to those present if I get some details mixed up.
1. Community Development
The Inkscape community appears to be quite weak compared to other projects. We discussed a variety of reasons for this and possible solutions.
* The community appears to be quite fragmented due to multiple websites for code, bug-tracker, mailing lists, forums, etc. We should consolidate where possible. There could be better linkage between sites. The Inkscape website still needs to be expanded. For example, there is no page for translators (already fixed since our meeting, thanks Elisa and Martin!). Also, we need make sure that feature requests in the Inkscape forums get aggregated to the developers email list. Martin will try to find someone to volunteer to act as liaison.
* There appears to be a lack of direction. The Inkscape board is, by design, limited to controlling Inkscape's donations and trademark. Having some kind of steering committee might be beneficial.
* There is a lack of visible momentum in the project, exasperated by the long time between current releases. (We desperately NEED to get 0.91 out - as well as 0.48.5. People need to see progress.) More news articles are needed (with rapid translation).
* Paid developer: Synfig hired a developer who is now paid month-to-month by crowd-funding. This has actually stimulated additional developer contributions. People see progress being made and are more likely to make their own code contributions. There are weekly updates by the developer where people see the progress being made. (This is in contrast to the prevailing view inside the Inkscape community where paid development might threaten further contributions by non-paid developers.) Blender uses a subscription system. Many communities use a voting process to select the direction of paid development. We do need to be careful, as Scribus had a bad experience with a paid developer disappearing without delivering promised code.
* Extensions is a place where people can easily make contributions. We need a web page with links to contributed extensions (or host them ourselves). (BTW, Blender had 8 part-time developers but still has a very active community of people contributing extensions.)
2. Paid developer
We discussed what we would want a developer to do if one were hired. Ideas were:
* Animation (high profile, improve sense of forward momentum).
* PDF Export (same as above).
* Plug-in structure (make it easier to contribute).
* Code clean-up and documentation (make it easier to contribute).
* Release (get timely releases out).
3. Website Translations
Several problems were identified with translating the website. Translated news is being shown twice, once in the translated language and once in English. Martin and Adib will look into fixing this (some python coding). Also, translators are not notified of news updates. Martin will assemble a list of translators and set up a "cron" job to monitor changes to the website and then notify translators when changes are detected.
4. Technical discussions:
* 0.91 release: We need to get this out, even if there are a few remaining bugs. Adib will help with Windows builds. There is great demand for a GTK3 OSX build. It seems that the only hold-up is redoing the rulers as GTK3 dropped the ruler widget. Gimp has the same problem.
* Testing: We need better automated testing in both rendering and in unit-tests. cxxtests is awkward to use (and nobody seems to look at it, their are many tests failing now).
* Patch reviews: We need to be quicker in reviewing patches or we risk losing new devolopers. We might need to revisit our very easy access to code check-in rights. A person writing Python extensions might not be as proficient with C++.
* PDF Export: We discussed various strategies for improving our export to PDF, especially focusing on CMYK. Krzysztof has some ideas for achieving this. After our meeting, we had further discussions with people from Scribus on this topic. This topic is also coupled into possibly supporting other rendering methods (e.g. GEGL).
There are a couple possible solutions. One is to extend Cairo to handle color profiles. This might not be so hard as we could write out RGB but include a color profile to hand RGB to CMYK conversion. One problem is that Cairo doesn't support the color-depth we would like. The second is to write our own PDF exporter. While Scibus's PDF export code is tightly coupled to the rest of Scribus, it can serve as a good model of what we need to do.
The current "recommended" way of getting good PDF CMYK files is to pass Inkscape's SVG through Scribus. This is problematic as SVG support in Scribus is behind Inkscape's. Filters are not supported in Scribus. Adib will look in to possible filter support in Scribus.
* Export: Our export mechanisms needs to be unified, probably with a "visitor's" model.
* Filters: Needs to be reworked to follow the model of other objects. (There are hacks needed now to get the rendering done correctly.)
* Multipage SVG: We discussed ways to use groups (layers) to handle multipage SVGs. The layer dialog might be modified with some added Inkscape name-space attributes to have groups of layers of which selecting one will hide the others in the group. (This would make editing JessyInk presentations much easier!) Martin has volunteered to put a plan together.
* Remove need for "id" attributes. (Krzysztofv has an idea on this.)
* Excessive signaling. Why does dragging a gradient handle cause closed dialogs to call style handling code?
* Redhat/Gnome/Fedora had a series of requests already forwarded to the mailing list.
* BZR migration: BZR is no longer under development.
In order to find memory leaks, some types of access violations, and the
use of uninitialized variables I depend on valgrind. The problem is
that valgrind is barely usable with Inkscape. The output on even the
most minimal session (open, type a few letters, format them, close) runs
to just under 500K lines and takes 5 minutes to complete. Some of this
may be because garbage collection must be turned off in order to use
valgrind. That is:
valgrind .... src/inkscape
There is no choice in that though, because if it is not done valgrind
crashes when it tries to run inkscape. (Ubuntu 12.10.4, 32 bit, current
Trunk). There is a libgc.supp in the top of the distribution, but it
cannot be used on my system, since it does not suppress valgrind's crash
when it tries to run inkscape with GC enabled.
Here is the damage seen on a normal exit for a minimal run:
==16527== LEAK SUMMARY:
==16527== definitely lost: 567,697 bytes in 17,670 blocks
==16527== indirectly lost: 2,167,402 bytes in 73,234 blocks
==16527== possibly lost: 21,940,610 bytes in 282,461 blocks
==16527== still reachable: 21,470,100 bytes in 360,304 blocks
What can be done so that Inkscape makes a better effort at cleaning up
its enormous memory tangle when it exits while running in valgrind?
Some of the memory Inksape allocates is cleaned up, but it seems like a
very high percentage of memory allocations are tacked into this complex
memory structure, and inside valgrind the whole ball of yarn is just
dropped on the floor when the program reaches the final exit(), rather
than being unwound in an orderly fashion. (In theory GC may be
cleaning this up better, but I'm not sure how we can really know, since
valgrind cannot tell us.)
Could somebody who understands these parts of Inkscape PLEASE clean up
this mess, so that in future when "_INKSCAPE_GC==disable" Inkscape will
unwind its memory structures before exiting? At the very least we will
learn after this unwinding what memory is still left, and that will be
the result of existing bugs in the code. Once we obtain a baseline
inkscape that is usable once again in valgrind, we can reasonably expect
that by using valgrind developers will be able to catch the memory
problems they may introduce. Sadly that is far from true now, what with
so many thousands of lines of background noise in the log files to slog
Admittedly some of the lines in valgrind's log file do come from
valgrind issues, but the ones I know about can be removed with:
cat >wcslen_sse2.supp <<EOD
valgrind -v --leak-check=yes --leak-resolution=high --num-callers=15
which improves the output to:
--16527-- used_suppression: 208319 wcslen1
--16527-- used_suppression: 142 wcslen2
--16527-- used_suppression: 330 iffyinflate
==16527== ERROR SUMMARY: 97190 errors from 13437 contexts (suppressed:
208791 from 656)
I understand that there may be other problems in some libraries which
are called, but from the contents of the log file it looks like the
majority of the loose ends were directly created in Inkscape. (And we
can use valgrind suppression files, as above, to silence the unfixable
Manager, Sequence Analysis Facility, Biology Division, Caltech
Hi TimeWaster and Nick,
Alvin Penner has suggested that I contact both of you about a change to
Inkscape I am pushing for:
Currently Inkscape transforms non-pixel units (e.g 'in', 'cm') using the
ratio 90 pixels per inch. This ratio is hinted at in SVG 1.1 but not
explicitly defined (someday I'll blog about the history of this). CSS
2.1 does explicitly defined the ratio to be 96 pixels per inch, a
standard that all web browsers as well a Batik have followed for many
years. I recently proposed that in SVG one should be allowed to set this
ratio but that idea was quickly rejected by the standards group.
Previous to Inkscape 0.91 all dimensions inside of Inkscape were stored
only as pixels values (despite allowing the user to enter dimensions in
other units). As long as one did not import SVGs from other sources the
ratio between px and in was not all that important. With 0.91, one can
optionally set font-size to be output in points. To ensure consistency
with what is rendered in Inkscape and what is displayed by other SVG
renderers we should move to the standard 96 pixels per inch per CSS2.1.
To make the change, two files must be modified:
and probably the default export resolution should also be changed in
Alvin is afraid this will cause trouble in the world of desktop cutters
and plotters. Do you see this as a problem?
BTW, the 0.91 release notes suggest that extensions relying on units
other than pixels were already broken by the work on units.
During last LGM we have discussed on future development of Inkscape. Among the tasks, we pointed the print-ready PDF request. I mentionned we have 2 opportunities :
- as scribus does a print-ready PDF, try to learn from that to develop our own. Discussions with Franz and Andreas have pointed it was not hard in the principle but that cairo might not do it so soon and that Scribus don't provide a library whoch could easily implement it into Inkscape. Andreas has shown interest in helping in a way, and Kryzstof seem to be on the way
- i also said that actually we usually import Inkscape documents into Scribus and make the PDF from it. Of course, this is far from being a perfect workflow for it needs few minutes to be done and redone when needed just for an "export". Plus we have issues with Scribus SVG import features which sometimes means come back to a standard PNG export, which is not desired when we decide to use vector. I gave the filter example and this one is really not it the Roadmap because there are many other more important feature to get implement before and that filters are not in PDF so they might be rasterized anyway. Scribus don't provide a command line option that would allow PDF generation on the fly from Inkscape. The situation is improving because Scribus is itself getting getter in SVG support but there are no real plans so that we have no idea when it could be done and the guy working mainly on Postscript and SVG may not be available in the next months.
I think that create a better Workflow with Scribus is interesting for many other reasons that get Print-ready PDF for Inkscape. Especially, we'd anyway need to import often vector drawing in Scribus for complex layout. Actually Inkscape is missing many interesting things such as text styles, flowing text around objects, multipage... So we should not imagine Inkscape could replace Scribus as easily. May be that one of the easiest would be exploring by ourselves especially give Scribus files that it can easily read : i guess it's will be easier to get an exporter than an importer
- Provide a "Scribus SVG" which contains bitmap data or links so that we could flatten or rasterize everything scribus won't support, choosing the resolution. I didn't check if this could be done in python, especially accessing primitive filters
- Provide an exchange format that could help and i'm thinking of OpenRaster. Scribus just begun implemented it in March and i've done some test on it. There is actually no vector support, but this format might be a could beginning point to work with many other softwares too like Krita or Mypaint. I think it would worth to put the effort on ora more that on XCF esport, for example.
I can help on this as i can, but i'm not a programmer so i'm slow in coding. I more used in python but i've really done little patch in C++ though never for Inkscape.