Unify QFontEngine::boundingRect for coretext and Windows
They were both using the same algorithm, and also both had the same mistake of not handling left-bearing. This unifies them and adds left bearing handling. Change-Id: Id06392abde0bfeb8b49faf4632082b2e25352497 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
This commit is contained in:
parent
d754e43721
commit
f1a3069afb
@ -301,14 +301,6 @@ bool QCoreTextFontEngine::stringToCMap(const QChar *str, int len, QGlyphLayout *
|
||||
return true;
|
||||
}
|
||||
|
||||
glyph_metrics_t QCoreTextFontEngine::boundingBox(const QGlyphLayout &glyphs)
|
||||
{
|
||||
QFixed w;
|
||||
for (int i = 0; i < glyphs.numGlyphs; ++i)
|
||||
w += glyphs.effectiveAdvance(i);
|
||||
return glyph_metrics_t(0, -(ascent()), w - lastRightBearing(glyphs), ascent()+descent(), w, 0);
|
||||
}
|
||||
|
||||
glyph_metrics_t QCoreTextFontEngine::boundingBox(glyph_t glyph)
|
||||
{
|
||||
glyph_metrics_t ret;
|
||||
|
@ -41,7 +41,6 @@ public:
|
||||
bool stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, int *nglyphs, ShaperFlags flags) const override;
|
||||
void recalcAdvances(QGlyphLayout *, ShaperFlags) const override;
|
||||
|
||||
glyph_metrics_t boundingBox(const QGlyphLayout &glyphs) override;
|
||||
glyph_metrics_t boundingBox(glyph_t glyph) override;
|
||||
|
||||
QFixed capHeight() const override;
|
||||
|
@ -562,6 +562,16 @@ qreal QFontEngine::minRightBearing() const
|
||||
return m_minRightBearing;
|
||||
}
|
||||
|
||||
glyph_metrics_t QFontEngine::boundingBox(const QGlyphLayout &glyphs)
|
||||
{
|
||||
QFixed w;
|
||||
for (int i = 0; i < glyphs.numGlyphs; ++i)
|
||||
w += glyphs.effectiveAdvance(i);
|
||||
const QFixed leftBearing = firstLeftBearing(glyphs);
|
||||
const QFixed rightBearing = lastRightBearing(glyphs);
|
||||
return glyph_metrics_t(leftBearing, -(ascent()), w - leftBearing - rightBearing, ascent() + descent(), w, 0);
|
||||
}
|
||||
|
||||
glyph_metrics_t QFontEngine::tightBoundingBox(const QGlyphLayout &glyphs)
|
||||
{
|
||||
glyph_metrics_t overall;
|
||||
@ -1452,6 +1462,17 @@ bool QFontEngine::hasUnreliableGlyphOutline() const
|
||||
return glyphFormat == QFontEngine::Format_ARGB;
|
||||
}
|
||||
|
||||
QFixed QFontEngine::firstLeftBearing(const QGlyphLayout &glyphs)
|
||||
{
|
||||
if (glyphs.numGlyphs >= 1) {
|
||||
glyph_t glyph = glyphs.glyphs[0];
|
||||
glyph_metrics_t gi = boundingBox(glyph);
|
||||
if (gi.isValid())
|
||||
return gi.leftBearing();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
QFixed QFontEngine::lastRightBearing(const QGlyphLayout &glyphs)
|
||||
{
|
||||
if (glyphs.numGlyphs >= 1) {
|
||||
|
@ -189,7 +189,7 @@ public:
|
||||
|
||||
virtual void removeGlyphFromCache(glyph_t);
|
||||
|
||||
virtual glyph_metrics_t boundingBox(const QGlyphLayout &glyphs) = 0;
|
||||
virtual glyph_metrics_t boundingBox(const QGlyphLayout &glyphs);
|
||||
virtual glyph_metrics_t boundingBox(glyph_t glyph) = 0;
|
||||
virtual glyph_metrics_t boundingBox(glyph_t glyph, const QTransform &matrix);
|
||||
glyph_metrics_t tightBoundingBox(const QGlyphLayout &glyphs);
|
||||
@ -332,6 +332,7 @@ public:
|
||||
protected:
|
||||
explicit QFontEngine(Type type);
|
||||
|
||||
QFixed firstLeftBearing(const QGlyphLayout &glyphs);
|
||||
QFixed lastRightBearing(const QGlyphLayout &glyphs);
|
||||
|
||||
QFixed calculatedCapHeight() const;
|
||||
|
@ -352,18 +352,6 @@ void QWindowsFontEngine::recalcAdvances(QGlyphLayout *glyphs, QFontEngine::Shape
|
||||
}
|
||||
}
|
||||
|
||||
glyph_metrics_t QWindowsFontEngine::boundingBox(const QGlyphLayout &glyphs)
|
||||
{
|
||||
if (glyphs.numGlyphs == 0)
|
||||
return glyph_metrics_t();
|
||||
|
||||
QFixed w = 0;
|
||||
for (int i = 0; i < glyphs.numGlyphs; ++i)
|
||||
w += glyphs.effectiveAdvance(i);
|
||||
|
||||
return glyph_metrics_t(0, -tm.tmAscent, w - lastRightBearing(glyphs), tm.tmHeight, w, 0);
|
||||
}
|
||||
|
||||
bool QWindowsFontEngine::getOutlineMetrics(glyph_t glyph, const QTransform &t, glyph_metrics_t *metrics) const
|
||||
{
|
||||
Q_ASSERT(metrics != 0);
|
||||
|
@ -57,7 +57,6 @@ public:
|
||||
|
||||
HGDIOBJ selectDesignFont() const;
|
||||
|
||||
glyph_metrics_t boundingBox(const QGlyphLayout &glyphs) override;
|
||||
glyph_metrics_t boundingBox(glyph_t g) override { return boundingBox(g, QTransform()); }
|
||||
glyph_metrics_t boundingBox(glyph_t g, const QTransform &t) override;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user