Remove historical +1 from font height calculation

Historically, we've calculated font height as ascent+descent+1.
In Qt 4, a patch was added to work around this by subtracting
1 from the descent of the font engines. We now remove the +1 and
the work arounds.

Change-Id: I7e25d49b97ac892015d3328f32d70eb9a7c2d88f
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
This commit is contained in:
Eskil Abrahamsen Blomfeldt 2012-02-03 14:28:16 +01:00 committed by Qt by Nokia
parent 2801db558c
commit cb8445f032
10 changed files with 22 additions and 27 deletions

View File

@ -469,7 +469,7 @@ void QAbstractTextDocumentLayout::resizeInlineObject(QTextInlineObject item, int
QSizeF s = handler.iface->intrinsicSize(document(), posInDocument, format);
item.setWidth(s.width());
item.setAscent(s.height() - 1);
item.setAscent(s.height());
item.setDescent(0);
}

View File

@ -1173,8 +1173,7 @@ QFixed QFontEngineFT::ascent() const
QFixed QFontEngineFT::descent() const
{
// subtract a pixel to work around QFontMetrics's built-in + 1
return QFixed::fromFixed(-metrics.descender - 64);
return QFixed::fromFixed(-metrics.descender);
}
QFixed QFontEngineFT::leading() const
@ -1589,7 +1588,7 @@ glyph_metrics_t QFontEngineFT::boundingBox(const QGlyphLayout &glyphs)
glyph_metrics_t overall;
// initialize with line height, we get the same behaviour on all platforms
overall.y = -ascent();
overall.height = ascent() + descent() + 1;
overall.height = ascent() + descent();
QFixed ymax = 0;
QFixed xmax = 0;

View File

@ -484,8 +484,8 @@ QFixed QFontEngineDirectWrite::ascent() const
QFixed QFontEngineDirectWrite::descent() const
{
return fontDef.styleStrategy & QFont::ForceIntegerMetrics
? (m_descent - 1).round()
: (m_descent - 1);
? (m_descent).round()
: (m_descent);
}
QFixed QFontEngineDirectWrite::leading() const

View File

@ -288,7 +288,7 @@ int QFontMetrics::height() const
{
QFontEngine *engine = d->engineForScript(QUnicodeTables::Common);
Q_ASSERT(engine != 0);
return qRound(engine->ascent()) + qRound(engine->descent()) + 1;
return qRound(engine->ascent()) + qRound(engine->descent());
}
/*!
@ -316,7 +316,7 @@ int QFontMetrics::lineSpacing() const
{
QFontEngine *engine = d->engineForScript(QUnicodeTables::Common);
Q_ASSERT(engine != 0);
return qRound(engine->leading()) + qRound(engine->ascent()) + qRound(engine->descent()) + 1;
return qRound(engine->leading()) + qRound(engine->ascent()) + qRound(engine->descent());
}
/*!
@ -1147,7 +1147,7 @@ qreal QFontMetricsF::height() const
QFontEngine *engine = d->engineForScript(QUnicodeTables::Common);
Q_ASSERT(engine != 0);
return (engine->ascent() + engine->descent() + 1).toReal();
return (engine->ascent() + engine->descent()).toReal();
}
/*!
@ -1175,7 +1175,7 @@ qreal QFontMetricsF::lineSpacing() const
{
QFontEngine *engine = d->engineForScript(QUnicodeTables::Common);
Q_ASSERT(engine != 0);
return (engine->leading() + engine->ascent() + engine->descent() + 1).toReal();
return (engine->leading() + engine->ascent() + engine->descent()).toReal();
}
/*!

View File

@ -366,7 +366,7 @@ struct Q_AUTOTEST_EXPORT QScriptItem
QFixed leading;
QFixed width;
int glyph_data_offset;
QFixed height() const { return ascent + descent + 1; }
QFixed height() const { return ascent + descent; }
};
@ -396,7 +396,7 @@ struct Q_AUTOTEST_EXPORT QScriptLine
mutable uint gridfitted : 1;
uint hasTrailingSpaces : 1;
uint leadingIncluded : 1;
QFixed height() const { return (ascent + descent).ceil() + 1
QFixed height() const { return (ascent + descent).ceil()
+ (leadingIncluded? qMax(QFixed(),leading) : QFixed()); }
QFixed base() const { return ascent
+ (leadingIncluded ? qMax(QFixed(),leading) : QFixed()); }

View File

@ -1429,9 +1429,9 @@ qreal QTextLine::descent() const
}
/*!
Returns the line's height. This is equal to ascent() + descent() + 1
Returns the line's height. This is equal to ascent() + descent()
if leading is not included. If leading is included, this equals to
ascent() + descent() + leading() + 1.
ascent() + descent() + leading().
\sa ascent(), descent(), leading(), setLeadingIncluded()
*/

View File

@ -255,9 +255,7 @@ QFixed QCoreTextFontEngine::descent() const
if (fontDef.styleStrategy & QFont::ForceIntegerMetrics)
d = d.round();
// subtract a pixel to even out the historical +1 in QFontMetrics::height().
// Fix in Qt 5.
return d - 1;
return d;
}
QFixed QCoreTextFontEngine::leading() const
{

View File

@ -517,9 +517,7 @@ QFixed QWindowsFontEngine::ascent() const
QFixed QWindowsFontEngine::descent() const
{
// ### we subtract 1 to even out the historical +1 in QFontMetrics'
// ### height=asc+desc+1 equation. Fix in Qt5.
return tm.tmDescent - 1;
return tm.tmDescent;
}
QFixed QWindowsFontEngine::leading() const

View File

@ -140,7 +140,7 @@ void tst_QFontMetrics::metrics()
font = fdb.font(family, style, 12);
QFontMetrics fontmetrics(font);
QCOMPARE(fontmetrics.ascent() + fontmetrics.descent() + 1,
QCOMPARE(fontmetrics.ascent() + fontmetrics.descent(),
fontmetrics.height());
QCOMPARE(fontmetrics.height() + fontmetrics.leading(),
@ -156,7 +156,7 @@ void tst_QFontMetrics::metrics()
font = fdb.font(family, style, size);
QFontMetrics fontmetrics(font);
QCOMPARE(fontmetrics.ascent() + fontmetrics.descent() + 1,
QCOMPARE(fontmetrics.ascent() + fontmetrics.descent(),
fontmetrics.height());
QCOMPARE(fontmetrics.height() + fontmetrics.leading(),
fontmetrics.lineSpacing());

View File

@ -352,7 +352,7 @@ void tst_QTextLayout::threeLineBoundingRect()
QCOMPARE(qRound(line.naturalTextWidth()), thirdLineWidth);
y += qRound(line.ascent() + line.descent());
QCOMPARE(layout.boundingRect(), QRectF(0, 0, longestLine, y + 1));
QCOMPARE(layout.boundingRect(), QRectF(0, 0, longestLine, y));
}
void tst_QTextLayout::boundingRectWithLongLineAndNoWrap()
@ -386,7 +386,7 @@ void tst_QTextLayout::forcedBreaks()
QCOMPARE(line.textStart(), pos);
QCOMPARE(line.textLength(),2);
QCOMPARE(qRound(line.naturalTextWidth()),testFont.pixelSize());
QCOMPARE((int) line.height(), testFont.pixelSize() + 1); // + 1 baseline
QCOMPARE((int) line.height(), testFont.pixelSize());
QCOMPARE(line.xToCursor(0), line.textStart());
pos += line.textLength();
@ -395,7 +395,7 @@ void tst_QTextLayout::forcedBreaks()
QCOMPARE(line.textStart(),pos);
QCOMPARE(line.textLength(),1);
QCOMPARE(qRound(line.naturalTextWidth()), 0);
QCOMPARE((int) line.height(), testFont.pixelSize() + 1); // + 1 baseline
QCOMPARE((int) line.height(), testFont.pixelSize());
QCOMPARE(line.xToCursor(0), line.textStart());
pos += line.textLength();
@ -404,7 +404,7 @@ void tst_QTextLayout::forcedBreaks()
QCOMPARE(line.textStart(),pos);
QCOMPARE(line.textLength(),2);
QCOMPARE(qRound(line.naturalTextWidth()),testFont.pixelSize());
QCOMPARE(qRound(line.height()), testFont.pixelSize() + 1); // + 1 baseline
QCOMPARE(qRound(line.height()), testFont.pixelSize());
QCOMPARE(line.xToCursor(0), line.textStart());
pos += line.textLength();
@ -413,7 +413,7 @@ void tst_QTextLayout::forcedBreaks()
QCOMPARE(line.textStart(),pos);
QCOMPARE(line.textLength(),1);
QCOMPARE(qRound(line.naturalTextWidth()), testFont.pixelSize());
QCOMPARE((int) line.height(), testFont.pixelSize() + 1); // + 1 baseline
QCOMPARE((int) line.height(), testFont.pixelSize());
QCOMPARE(line.xToCursor(0), line.textStart());
}