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;
|
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 QCoreTextFontEngine::boundingBox(glyph_t glyph)
|
||||||
{
|
{
|
||||||
glyph_metrics_t ret;
|
glyph_metrics_t ret;
|
||||||
|
@ -41,7 +41,6 @@ public:
|
|||||||
bool stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, int *nglyphs, ShaperFlags flags) const override;
|
bool stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, int *nglyphs, ShaperFlags flags) const override;
|
||||||
void recalcAdvances(QGlyphLayout *, ShaperFlags) const override;
|
void recalcAdvances(QGlyphLayout *, ShaperFlags) const override;
|
||||||
|
|
||||||
glyph_metrics_t boundingBox(const QGlyphLayout &glyphs) override;
|
|
||||||
glyph_metrics_t boundingBox(glyph_t glyph) override;
|
glyph_metrics_t boundingBox(glyph_t glyph) override;
|
||||||
|
|
||||||
QFixed capHeight() const override;
|
QFixed capHeight() const override;
|
||||||
|
@ -562,6 +562,16 @@ qreal QFontEngine::minRightBearing() const
|
|||||||
return m_minRightBearing;
|
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 QFontEngine::tightBoundingBox(const QGlyphLayout &glyphs)
|
||||||
{
|
{
|
||||||
glyph_metrics_t overall;
|
glyph_metrics_t overall;
|
||||||
@ -1452,6 +1462,17 @@ bool QFontEngine::hasUnreliableGlyphOutline() const
|
|||||||
return glyphFormat == QFontEngine::Format_ARGB;
|
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)
|
QFixed QFontEngine::lastRightBearing(const QGlyphLayout &glyphs)
|
||||||
{
|
{
|
||||||
if (glyphs.numGlyphs >= 1) {
|
if (glyphs.numGlyphs >= 1) {
|
||||||
|
@ -189,7 +189,7 @@ public:
|
|||||||
|
|
||||||
virtual void removeGlyphFromCache(glyph_t);
|
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) = 0;
|
||||||
virtual glyph_metrics_t boundingBox(glyph_t glyph, const QTransform &matrix);
|
virtual glyph_metrics_t boundingBox(glyph_t glyph, const QTransform &matrix);
|
||||||
glyph_metrics_t tightBoundingBox(const QGlyphLayout &glyphs);
|
glyph_metrics_t tightBoundingBox(const QGlyphLayout &glyphs);
|
||||||
@ -332,6 +332,7 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
explicit QFontEngine(Type type);
|
explicit QFontEngine(Type type);
|
||||||
|
|
||||||
|
QFixed firstLeftBearing(const QGlyphLayout &glyphs);
|
||||||
QFixed lastRightBearing(const QGlyphLayout &glyphs);
|
QFixed lastRightBearing(const QGlyphLayout &glyphs);
|
||||||
|
|
||||||
QFixed calculatedCapHeight() const;
|
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
|
bool QWindowsFontEngine::getOutlineMetrics(glyph_t glyph, const QTransform &t, glyph_metrics_t *metrics) const
|
||||||
{
|
{
|
||||||
Q_ASSERT(metrics != 0);
|
Q_ASSERT(metrics != 0);
|
||||||
|
@ -57,7 +57,6 @@ public:
|
|||||||
|
|
||||||
HGDIOBJ selectDesignFont() const;
|
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) override { return boundingBox(g, QTransform()); }
|
||||||
glyph_metrics_t boundingBox(glyph_t g, const QTransform &t) override;
|
glyph_metrics_t boundingBox(glyph_t g, const QTransform &t) override;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user