[Development] Something is wrong in QFontEngineFT::loadGlyph

Mark markg85 at gmail.com
Tue Feb 14 00:03:52 CET 2012


Hi,

While using Qt's elidedText function
http://developer.qt.nokia.com/doc/qt-4.8/qfontmetricsf.html#elidedText i
noticed the function was dog slow. For just 1000 entries (each 250 chars)
eliding them to 200px took about 190ms on windows and 100ms on linux. Using
that for drawing is noticeable slow. I haven't actually tried that, but i
certainly would notice that and in the longer run that is my intention.

So, i started playing with it in an attempt to get it blazing fast. And i
got there. On windows i have a speedup of 39x (same job only takes 5ms) and
on Linux i got a speedup of 10x (same job takes 10ms, side effect is that
linux while 10x faster is now slower then windows.. odd), Those speedups
are nice but it tasted like more so i went on to profilling. I already knew
the QFontMetricsF::width was the function dragging everything down and a
kcachegrind seems to indicate the same.

Note for the speedups, i got them mostly by cashing the width of the used
character thus avoiding the width function as much as possible.

This is the path that width() takes till the point of calling the freetype
functions:
QFontEngineFT::stringToCMap
QFontEngineFT::recalcAdvances
QFontEngineFT::loadGlyph

loadGlyph is where i think something odd is going on.
http://qt.gitorious.org/qt/qt/blobs/4.8/src/gui/text/qfontengine_ft.cpp#line812

Note the last parameter: "fetchMetricsOnly" ... The path it took
had fetchMetricsOnly set to true :
http://qt.gitorious.org/qt/qt/blobs/4.8/src/gui/text/qfontengine_ft.cpp#line1611.
That leads me to think that this function is only going to fetch the
metrics of the glyph, not render it! The opposite is the case. It's
rendering it and that is the part that takes long.

So, am i right here? Is this function doing to much? Remember, we come from
the "width()" function. All we actually need is the width of the glyph,
that's it.

Actually, if you look in that function for
the fetchMetricsOnly occurrence you'll see that it's only used in one place
and there it doesn't seem to do a lot with metrics. It kinda looks like
the original implementer of this has some idea, but never finished
implementing it. Or am i wrong here?

Kind regards,
Mark
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/development/attachments/20120214/0c9efd6e/attachment.html>


More information about the Development mailing list