summaryrefslogtreecommitdiffstats
path: root/src/platformsupport
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2017-11-17 10:59:47 +0100
committerLars Knoll <lars.knoll@qt.io>2019-08-08 11:18:02 +0200
commitafb326f07109da0035112e6f56e683e37b8a5d72 (patch)
treed80903f40fc0c481b4ea1e34c8cb94d82c056d2a /src/platformsupport
parent6ac610c79bf7f311ee244d45583eb669ada58781 (diff)
Refactor lockedAlphaMapForGlyph
Simply return a Glyph pointer and not a QImage to avoid allocating and deleting lots of d pointers for QImage when drawing text. Saves one new/delete pair per glyph drawn and speeds up text drawing by 10% for relatively large glyphs (probably more for smaller ones). The qtext::paintLayoutToPixmap() benchmark shows a 16% improvement in performance with this change. Renamed the method to glyphData(). Change-Id: I7a353de521e4f4321c770fb1ac6043d33f6f332c Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Diffstat (limited to 'src/platformsupport')
-rw-r--r--src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp41
-rw-r--r--src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h20
2 files changed, 8 insertions, 53 deletions
diff --git a/src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp b/src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp
index ef80d68bfe..e132442e37 100644
--- a/src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp
+++ b/src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp
@@ -106,7 +106,7 @@ static bool ft_getSfntTable(void *user_data, uint tag, uchar *buffer, uint *leng
return result;
}
-static QFontEngineFT::Glyph emptyGlyph = {0, 0, 0, 0, 0, 0, 0, 0};
+static QFontEngineFT::Glyph emptyGlyph;
static const QFontEngine::HintStyle ftInitialDefaultHintStyle =
#ifdef Q_OS_WIN
@@ -556,11 +556,6 @@ void QFreetypeFace::addBitmapToPath(FT_GlyphSlot slot, const QFixedPoint &point,
slot->bitmap.buffer, slot->bitmap.pitch, slot->bitmap.width, slot->bitmap.rows, path);
}
-QFontEngineFT::Glyph::~Glyph()
-{
- delete [] data;
-}
-
struct LcdFilterDummy
{
static inline void filterPixel(uchar &, uchar &, uchar &)
@@ -1986,11 +1981,10 @@ static inline QImage alphaMapFromGlyphData(QFontEngineFT::Glyph *glyph, QFontEng
return img;
}
-QImage *QFontEngineFT::lockedAlphaMapForGlyph(glyph_t glyphIndex, QFixed subPixelPosition,
- QFontEngine::GlyphFormat neededFormat,
- const QTransform &t, QPoint *offset)
+QFontEngine::Glyph *QFontEngineFT::glyphData(glyph_t glyphIndex, QFixed subPixelPosition,
+ QFontEngine::GlyphFormat neededFormat, const QTransform &t)
{
- Q_ASSERT(currentlyLockedAlphaMap.isNull());
+ Q_ASSERT(cacheEnabled);
if (isBitmapFont())
neededFormat = Format_Mono;
@@ -2000,33 +1994,10 @@ QImage *QFontEngineFT::lockedAlphaMapForGlyph(glyph_t glyphIndex, QFixed subPixe
neededFormat = Format_A8;
Glyph *glyph = loadGlyphFor(glyphIndex, subPixelPosition, neededFormat, t);
-
- if (offset != 0 && glyph != 0)
- *offset = QPoint(glyph->x, -glyph->y);
-
- currentlyLockedAlphaMap = alphaMapFromGlyphData(glyph, neededFormat);
-
- const bool glyphHasGeometry = glyph != nullptr && glyph->height != 0 && glyph->width != 0;
- if (!cacheEnabled && glyph != &emptyGlyph) {
- currentlyLockedAlphaMap = currentlyLockedAlphaMap.copy();
- delete glyph;
- }
-
- if (!glyphHasGeometry)
+ if (!glyph || !glyph->width || !glyph->height)
return nullptr;
- if (currentlyLockedAlphaMap.isNull())
- return QFontEngine::lockedAlphaMapForGlyph(glyphIndex, subPixelPosition, neededFormat, t, offset);
-
- QImageData *data = currentlyLockedAlphaMap.data_ptr();
- data->is_locked = true;
-
- return &currentlyLockedAlphaMap;
-}
-
-void QFontEngineFT::unlockAlphaMapForGlyph()
-{
- QFontEngine::unlockAlphaMapForGlyph();
+ return glyph;
}
static inline bool is2dRotation(const QTransform &t)
diff --git a/src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h b/src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h
index 109bae86e9..2863d206d2 100644
--- a/src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h
+++ b/src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h
@@ -129,20 +129,6 @@ private:
class QFontEngineFT : public QFontEngine
{
public:
-
- /* we don't cache glyphs that are too large anyway, so we can make this struct rather small */
- struct Glyph {
- ~Glyph();
- int linearAdvance : 22;
- unsigned char width;
- unsigned char height;
- short x;
- short y;
- short advance;
- signed char format;
- uchar *data;
- };
-
struct GlyphInfo {
int linearAdvance;
unsigned short width;
@@ -241,11 +227,9 @@ private:
QFixed subPixelPosition,
const QTransform &matrix,
QFontEngine::GlyphFormat format) override;
- QImage *lockedAlphaMapForGlyph(glyph_t glyph, QFixed subPixelPosition,
- GlyphFormat neededFormat, const QTransform &t,
- QPoint *offset) override;
+ Glyph *glyphData(glyph_t glyph, QFixed subPixelPosition,
+ GlyphFormat neededFormat, const QTransform &t) override;
bool hasInternalCaching() const override { return cacheEnabled; }
- void unlockAlphaMapForGlyph() override;
bool expectsGammaCorrectedBlending() const override;
void removeGlyphFromCache(glyph_t glyph) override;