diff options
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(); |