From af48e0ba36aed330e8b262687e3192d7e09796f7 Mon Sep 17 00:00:00 2001 From: Jiang Jiang Date: Mon, 23 Jan 2012 15:06:41 +0100 Subject: Move glyphMargin() to QFontEngine glyphMargin() support for QTextureGlyphCache is implemented in respective font engines, thus this function is platform dependent. Before Qt 5 the code is guarded in macros like #ifdef Q_WS_MAC, now we should move them into QFontEngine and its subclasses. So far only Windows font engines support it. FreeType and Core Text based font engines all ignore it. Change-Id: Ia14016533d8fbfaacf848a7d3bc928f8197318f5 Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/gui/opengl/qopenglpaintengine.cpp | 2 +- src/gui/painting/qpaintengine_raster.cpp | 2 +- src/gui/painting/qtextureglyphcache.cpp | 12 ++++-------- src/gui/painting/qtextureglyphcache_p.h | 2 -- src/gui/text/qfontengine.cpp | 8 ++++---- src/gui/text/qfontengine_ft.cpp | 6 +++--- src/gui/text/qfontengine_ft_p.h | 3 ++- src/gui/text/qfontengine_p.h | 5 +++-- src/gui/text/qfontenginedirectwrite.cpp | 5 +++-- src/gui/text/qfontenginedirectwrite_p.h | 3 +-- src/gui/text/qrawfont.cpp | 2 +- 11 files changed, 23 insertions(+), 27 deletions(-) (limited to 'src/gui') diff --git a/src/gui/opengl/qopenglpaintengine.cpp b/src/gui/opengl/qopenglpaintengine.cpp index 5cbc646e84..359605cdb1 100644 --- a/src/gui/opengl/qopenglpaintengine.cpp +++ b/src/gui/opengl/qopenglpaintengine.cpp @@ -1581,7 +1581,7 @@ void QOpenGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type transferMode(TextDrawingMode); - int margin = cache->glyphMargin(); + int margin = fe->glyphMargin(glyphType); GLfloat dx = 1.0 / cache->width(); GLfloat dy = 1.0 / cache->height(); diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp index c53eda4d94..1e2e340c8a 100644 --- a/src/gui/painting/qpaintengine_raster.cpp +++ b/src/gui/painting/qpaintengine_raster.cpp @@ -2747,7 +2747,7 @@ bool QRasterPaintEngine::drawCachedGlyphs(int numGlyphs, const glyph_t *glyphs, else if (depth == 1) rightShift = 3; // divide by 8 - int margin = cache->glyphMargin(); + int margin = fontEngine->glyphMargin(glyphType); const QFixed offs = QFixed::fromReal(aliasedCoordinateDelta); const uchar *bits = image.bits(); for (int i=0; iglyphMargin(m_type); const int paddingDoubled = glyphPadding() * 2; bool supportsSubPixelPositions = fontEngine->supportsSubPixelPositions(); @@ -274,7 +274,7 @@ void QTextureGlyphCache::fillInPendingGlyphs() QImage QTextureGlyphCache::textureMapForGlyph(glyph_t g, QFixed subPixelPosition) const { if (m_type == QFontEngineGlyphCache::Raster_RGBMask) - return m_current_fontengine->alphaRGBMapForGlyph(g, subPixelPosition, glyphMargin(), m_transform); + return m_current_fontengine->alphaRGBMapForGlyph(g, subPixelPosition, m_transform); else return m_current_fontengine->alphaMapForGlyph(g, subPixelPosition, m_transform); @@ -311,11 +311,6 @@ void QImageTextureGlyphCache::createTextureData(int width, int height) } } -int QImageTextureGlyphCache::glyphMargin() const -{ - return m_type == QFontEngineGlyphCache::Raster_RGBMask ? 2 : 0; -} - void QImageTextureGlyphCache::fillTexture(const Coord &c, glyph_t g, QFixed subPixelPosition) { QImage mask = textureMapForGlyph(g, subPixelPosition); @@ -400,7 +395,8 @@ void QImageTextureGlyphCache::fillTexture(const Coord &c, glyph_t g, QFixed subP #ifdef CACHE_DEBUG // QPainter p(&m_image); // p.drawLine( - QPoint base(c.x + glyphMargin(), c.y + glyphMargin() + c.baseLineY-1); + int margin = m_current_fontengine ? m_current_fontengine->glyphMargin(m_type) : 0; + QPoint base(c.x + margin, c.y + margin + c.baseLineY-1); if (m_image.rect().contains(base)) m_image.setPixel(base, 255); m_image.save(QString::fromLatin1("cache-%1.png").arg(qint64(this))); diff --git a/src/gui/painting/qtextureglyphcache_p.h b/src/gui/painting/qtextureglyphcache_p.h index eb0c968740..8f852b37d3 100644 --- a/src/gui/painting/qtextureglyphcache_p.h +++ b/src/gui/painting/qtextureglyphcache_p.h @@ -120,7 +120,6 @@ public: virtual void createTextureData(int width, int height) = 0; virtual void resizeTextureData(int width, int height) = 0; - virtual int glyphMargin() const { return 0; } virtual int glyphPadding() const { return 0; } virtual void fillTexture(const Coord &coord, glyph_t glyph, QFixed subPixelPosition) = 0; @@ -170,7 +169,6 @@ class Q_GUI_EXPORT QImageTextureGlyphCache : public QTextureGlyphCache public: QImageTextureGlyphCache(QFontEngineGlyphCache::Type type, const QTransform &matrix) : QTextureGlyphCache(type, matrix) { } - virtual int glyphMargin() const; virtual void createTextureData(int width, int height); virtual void resizeTextureData(int width, int height); virtual void fillTexture(const Coord &c, glyph_t glyph, QFixed subPixelPosition); diff --git a/src/gui/text/qfontengine.cpp b/src/gui/text/qfontengine.cpp index 3894644f41..9303c65bac 100644 --- a/src/gui/text/qfontengine.cpp +++ b/src/gui/text/qfontengine.cpp @@ -618,7 +618,7 @@ QImage QFontEngine::alphaMapForGlyph(glyph_t glyph, QFixed subPixelPosition, con return i; } -QImage QFontEngine::alphaRGBMapForGlyph(glyph_t glyph, QFixed /*subPixelPosition*/, int /* margin */, const QTransform &t) +QImage QFontEngine::alphaRGBMapForGlyph(glyph_t glyph, QFixed /*subPixelPosition*/, const QTransform &t) { QImage alphaMask = alphaMapForGlyph(glyph, t); QImage rgbMask(alphaMask.width(), alphaMask.height(), QImage::Format_RGB32); @@ -664,7 +664,7 @@ QImage *QFontEngine::lockedAlphaMapForGlyph(glyph_t glyph, QFixed subPixelPositi if (neededFormat != Format_A32) currentlyLockedAlphaMap = alphaMapForGlyph(glyph, subPixelPosition, t); else - currentlyLockedAlphaMap = alphaRGBMapForGlyph(glyph, subPixelPosition, 0, t); + currentlyLockedAlphaMap = alphaRGBMapForGlyph(glyph, subPixelPosition, t); if (offset != 0) *offset = QPoint(0, 0); @@ -1747,11 +1747,11 @@ QImage QFontEngineMulti::alphaMapForGlyph(glyph_t glyph, QFixed subPixelPosition return engine(which)->alphaMapForGlyph(stripped(glyph), subPixelPosition, t); } -QImage QFontEngineMulti::alphaRGBMapForGlyph(glyph_t glyph, QFixed subPixelPosition, int margin, const QTransform &t) +QImage QFontEngineMulti::alphaRGBMapForGlyph(glyph_t glyph, QFixed subPixelPosition, const QTransform &t) { const int which = highByte(glyph); Q_ASSERT(which < engines.size()); - return engine(which)->alphaRGBMapForGlyph(stripped(glyph), subPixelPosition, margin, t); + return engine(which)->alphaRGBMapForGlyph(stripped(glyph), subPixelPosition, t); } QT_END_NAMESPACE diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp index 6fdb04ef61..31882af8bd 100644 --- a/src/gui/text/qfontengine_ft.cpp +++ b/src/gui/text/qfontengine_ft.cpp @@ -1896,17 +1896,17 @@ QImage QFontEngineFT::alphaMapForGlyph(glyph_t g, QFixed subPixelPosition) return img; } -QImage QFontEngineFT::alphaRGBMapForGlyph(glyph_t g, QFixed subPixelPosition, int margin, const QTransform &t) +QImage QFontEngineFT::alphaRGBMapForGlyph(glyph_t g, QFixed subPixelPosition, const QTransform &t) { if (t.type() > QTransform::TxTranslate) - return QFontEngine::alphaRGBMapForGlyph(g, subPixelPosition, margin, t); + return QFontEngine::alphaRGBMapForGlyph(g, subPixelPosition, t); lockFace(); Glyph *glyph = loadGlyphFor(g, subPixelPosition, Format_A32); if (!glyph) { unlockFace(); - return QFontEngine::alphaRGBMapForGlyph(g, subPixelPosition, margin, t); + return QFontEngine::alphaRGBMapForGlyph(g, subPixelPosition, t); } QImage img(glyph->width, glyph->height, QImage::Format_RGB32); diff --git a/src/gui/text/qfontengine_ft_p.h b/src/gui/text/qfontengine_ft_p.h index 577b46c776..aaea1ea5fb 100644 --- a/src/gui/text/qfontengine_ft_p.h +++ b/src/gui/text/qfontengine_ft_p.h @@ -255,7 +255,7 @@ private: virtual void recalcAdvances(QGlyphLayout *glyphs, QTextEngine::ShaperFlags flags) const; virtual QImage alphaMapForGlyph(glyph_t g) { return alphaMapForGlyph(g, 0); } virtual QImage alphaMapForGlyph(glyph_t, QFixed); - virtual QImage alphaRGBMapForGlyph(glyph_t, QFixed subPixelPosition, int margin, const QTransform &t); + virtual QImage alphaRGBMapForGlyph(glyph_t, QFixed subPixelPosition, const QTransform &t); virtual glyph_metrics_t alphaMapBoundingBox(glyph_t glyph, QFixed subPixelPosition, const QTransform &matrix, @@ -267,6 +267,7 @@ private: virtual void unlockAlphaMapForGlyph(); virtual void removeGlyphFromCache(glyph_t glyph); + virtual int glyphMargin(QFontEngineGlyphCache::Type type) { return 0; } virtual int glyphCount() const; diff --git a/src/gui/text/qfontengine_p.h b/src/gui/text/qfontengine_p.h index cb3a0e111d..6fd83b06a6 100644 --- a/src/gui/text/qfontengine_p.h +++ b/src/gui/text/qfontengine_p.h @@ -189,7 +189,7 @@ public: virtual QImage alphaMapForGlyph(glyph_t glyph, QFixed subPixelPosition); virtual QImage alphaMapForGlyph(glyph_t, const QTransform &t); virtual QImage alphaMapForGlyph(glyph_t, QFixed subPixelPosition, const QTransform &t); - virtual QImage alphaRGBMapForGlyph(glyph_t, QFixed subPixelPosition, int margin, const QTransform &t); + virtual QImage alphaRGBMapForGlyph(glyph_t, QFixed subPixelPosition, const QTransform &t); virtual QImage *lockedAlphaMapForGlyph(glyph_t glyph, QFixed subPixelPosition, GlyphFormat neededFormat, const QTransform &t = QTransform(), @@ -231,6 +231,7 @@ public: virtual Type type() const = 0; virtual int glyphCount() const; + virtual int glyphMargin(QFontEngineGlyphCache::Type type) { return type == QFontEngineGlyphCache::Raster_RGBMask ? 2 : 0; } virtual QFontEngine *cloneWithSize(qreal /*pixelSize*/) const { return 0; } @@ -370,7 +371,7 @@ public: virtual QImage alphaMapForGlyph(glyph_t glyph, QFixed subPixelPosition); virtual QImage alphaMapForGlyph(glyph_t, const QTransform &t); virtual QImage alphaMapForGlyph(glyph_t, QFixed subPixelPosition, const QTransform &t); - virtual QImage alphaRGBMapForGlyph(glyph_t, QFixed subPixelPosition, int margin, const QTransform &t); + virtual QImage alphaRGBMapForGlyph(glyph_t, QFixed subPixelPosition, const QTransform &t); virtual QFixed lineThickness() const; virtual QFixed underlinePosition() const; diff --git a/src/gui/text/qfontenginedirectwrite.cpp b/src/gui/text/qfontenginedirectwrite.cpp index 84dfe606e7..411642f231 100644 --- a/src/gui/text/qfontenginedirectwrite.cpp +++ b/src/gui/text/qfontenginedirectwrite.cpp @@ -641,10 +641,11 @@ QImage QFontEngineDirectWrite::imageForGlyph(glyph_t t, QImage QFontEngineDirectWrite::alphaRGBMapForGlyph(glyph_t t, QFixed subPixelPosition, - int margin, const QTransform &xform) { - QImage mask = imageForGlyph(t, subPixelPosition, margin, xform); + QImage mask = imageForGlyph(t, subPixelPosition, + glyphMargin(QFontEngineGlyphCache::Raster_RGBMask), + xform); return mask.depth() == 32 ? mask : mask.convertToFormat(QImage::Format_RGB32); diff --git a/src/gui/text/qfontenginedirectwrite_p.h b/src/gui/text/qfontenginedirectwrite_p.h index de263c6214..f614b0497f 100644 --- a/src/gui/text/qfontenginedirectwrite_p.h +++ b/src/gui/text/qfontenginedirectwrite_p.h @@ -102,8 +102,7 @@ public: bool supportsSubPixelPositions() const; QImage alphaMapForGlyph(glyph_t, QFixed subPixelPosition, const QTransform &t); - QImage alphaRGBMapForGlyph(glyph_t t, QFixed subPixelPosition, int margin, - const QTransform &xform); + QImage alphaRGBMapForGlyph(glyph_t t, QFixed subPixelPosition, const QTransform &xform); QFontEngine *cloneWithSize(qreal pixelSize) const; diff --git a/src/gui/text/qrawfont.cpp b/src/gui/text/qrawfont.cpp index 15d0d0ce20..7bd515366d 100644 --- a/src/gui/text/qrawfont.cpp +++ b/src/gui/text/qrawfont.cpp @@ -250,7 +250,7 @@ QImage QRawFont::alphaMapForGlyph(quint32 glyphIndex, AntialiasingType antialias return QImage(); if (antialiasingType == SubPixelAntialiasing) - return d->fontEngine->alphaRGBMapForGlyph(glyphIndex, QFixed(), 0, transform); + return d->fontEngine->alphaRGBMapForGlyph(glyphIndex, QFixed(), transform); return d->fontEngine->alphaMapForGlyph(glyphIndex, QFixed(), transform); } -- cgit v1.2.3