summaryrefslogtreecommitdiffstats
path: root/src/gui/text
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/text')
-rw-r--r--src/gui/text/qfontengine.cpp13
-rw-r--r--src/gui/text/qfontengine_ft.cpp1
-rw-r--r--src/gui/text/qfontengine_ft_p.h1
-rw-r--r--src/gui/text/qfontengine_p.h3
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();