diff options
author | Jiang Jiang <jiang.jiang@nokia.com> | 2011-11-04 14:47:31 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-11-08 07:43:00 +0100 |
commit | 63eae1bd15ea8aa1e4fc460194e34ecb5fc55b3a (patch) | |
tree | af59cef7a05fffcc04655449ad18371f3719c8ee /src/gui/text | |
parent | 04f6983979021aecd5c3dbb7cc80f864bb4ee56d (diff) |
Fix subpixel positioning support
Move subpixelPositionForX from QTextureGlyphCache to QFontEngine,
since some font engines like QFontEngineFT may need a custom
implementation or tweak it a little bit.
In QRasterPaintEngine::drawCachedGlyphs, do not add aliasedCoodinate
to x offset as that will break subpixel positioning.
Change-Id: Idbcec617509459b80965220ceb07b17737649bbf
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>
Diffstat (limited to 'src/gui/text')
-rw-r--r-- | src/gui/text/qfontengine.cpp | 13 | ||||
-rw-r--r-- | src/gui/text/qfontengine_ft.cpp | 1 | ||||
-rw-r--r-- | src/gui/text/qfontengine_ft_p.h | 1 | ||||
-rw-r--r-- | src/gui/text/qfontengine_p.h | 3 |
4 files changed, 11 insertions, 7 deletions
diff --git a/src/gui/text/qfontengine.cpp b/src/gui/text/qfontengine.cpp index 067a630d4d..5c6c8d186a 100644 --- a/src/gui/text/qfontengine.cpp +++ b/src/gui/text/qfontengine.cpp @@ -179,6 +179,7 @@ QFontEngine::QFontEngine() hbFace = 0; glyphFormat = -1; + m_subPixelPositionCount = 0; } QFontEngine::~QFontEngine() @@ -635,17 +636,19 @@ QImage QFontEngine::alphaRGBMapForGlyph(glyph_t glyph, QFixed /*subPixelPosition return rgbMask; } -QFixed QFontEngine::subPixelPositionForX(QFixed x) +QFixed QFontEngine::subPixelPositionForX(QFixed x) const { - int m_subPixelPositionCount = 4; - if (!supportsSubPixelPositions()) - return 0; + if (m_subPixelPositionCount <= 1 || !supportsSubPixelPositions()) + return QFixed(); QFixed subPixelPosition; if (x != 0) { subPixelPosition = x - x.floor(); QFixed fraction = (subPixelPosition / QFixed::fromReal(1.0 / m_subPixelPositionCount)).floor(); - subPixelPosition = fraction / QFixed(m_subPixelPositionCount); + + // Compensate for precision loss in fixed point to make sure we are always drawing at a subpixel position over + // the lower boundary for the selected rasterization by adding 1/64. + subPixelPosition = fraction / QFixed(m_subPixelPositionCount) + QFixed::fromReal(0.015625); } return subPixelPosition; } diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp index eb7415ae8e..6845c67463 100644 --- a/src/gui/text/qfontengine_ft.cpp +++ b/src/gui/text/qfontengine_ft.cpp @@ -657,6 +657,7 @@ QFontEngineFT::QFontEngineFT(const QFontDef &fd) defaultFormat = Format_None; embeddedbitmap = false; cacheEnabled = qgetenv("QT_NO_FT_CACHE").isEmpty() || qgetenv("QT_NO_FT_CACHE").toInt() == 0; + m_subPixelPositionCount = 4; } QFontEngineFT::~QFontEngineFT() diff --git a/src/gui/text/qfontengine_ft_p.h b/src/gui/text/qfontengine_ft_p.h index d4a6def286..fd0be4f1c8 100644 --- a/src/gui/text/qfontengine_ft_p.h +++ b/src/gui/text/qfontengine_ft_p.h @@ -315,7 +315,6 @@ private: bool initFromFontEngine(const QFontEngineFT *fontEngine); HintStyle defaultHintStyle() const { return default_hint_style; } - protected: QFreetypeFace *freetype; diff --git a/src/gui/text/qfontengine_p.h b/src/gui/text/qfontengine_p.h index ec1f22b6e1..4caf91e735 100644 --- a/src/gui/text/qfontengine_p.h +++ b/src/gui/text/qfontengine_p.h @@ -158,7 +158,7 @@ public: }; virtual int synthesized() const { return 0; } virtual bool supportsSubPixelPositions() const { return false; } - QFixed subPixelPositionForX(QFixed x); + virtual QFixed subPixelPositionForX(QFixed x) const; virtual QFixed emSquareSize() const { return ascent(); } @@ -277,6 +277,7 @@ public: int glyphFormat; QImage currentlyLockedAlphaMap; + int m_subPixelPositionCount; // Number of positions within a single pixel for this cache protected: static const QVector<QRgb> &grayPalette(); |