Fix clipping error on some RTL text
There was a false assumption that the bidi level of text is only used for visualizing the text, not for calculating its bounding box. But the bidi level is required for shaping (indeed many OpenType rules check for reading direction) and the glyphs used to represent a given text may be different based on its directionality. The effect would be that the bounding rect we calculated for text would sometimes be too small for RTL text, and we would end up clipping pixels. [ChangeLog][QtGui][Text] Fixed clipping errors and too small bounding rects for some right-to-left text. Task-number: QTBUG-48005 Change-Id: Idd12ae1b0033d518034b582204ba47ae41795293 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
This commit is contained in:
parent
39fb26376c
commit
098d87c63f
@ -7570,7 +7570,6 @@ start_lengthVariant:
|
|||||||
lineWidth = qMax<qreal>(0, r.width());
|
lineWidth = qMax<qreal>(0, r.width());
|
||||||
if(!wordwrap)
|
if(!wordwrap)
|
||||||
tf |= Qt::TextIncludeTrailingSpaces;
|
tf |= Qt::TextIncludeTrailingSpaces;
|
||||||
textLayout.engine()->ignoreBidi = bool(tf & Qt::TextDontPrint);
|
|
||||||
textLayout.beginLayout();
|
textLayout.beginLayout();
|
||||||
|
|
||||||
qreal leading = fm.leading();
|
qreal leading = fm.leading();
|
||||||
|
@ -556,7 +556,6 @@ int QFontMetrics::width(const QString &text, int len, int flags) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
QStackTextEngine layout(text, QFont(d.data()));
|
QStackTextEngine layout(text, QFont(d.data()));
|
||||||
layout.ignoreBidi = true;
|
|
||||||
return qRound(layout.width(0, len));
|
return qRound(layout.width(0, len));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -692,7 +691,6 @@ QRect QFontMetrics::boundingRect(const QString &text) const
|
|||||||
return QRect();
|
return QRect();
|
||||||
|
|
||||||
QStackTextEngine layout(text, QFont(d.data()));
|
QStackTextEngine layout(text, QFont(d.data()));
|
||||||
layout.ignoreBidi = true;
|
|
||||||
layout.itemize();
|
layout.itemize();
|
||||||
glyph_metrics_t gm = layout.boundingBox(0, text.length());
|
glyph_metrics_t gm = layout.boundingBox(0, text.length());
|
||||||
return QRect(qRound(gm.x), qRound(gm.y), qRound(gm.width), qRound(gm.height));
|
return QRect(qRound(gm.x), qRound(gm.y), qRound(gm.width), qRound(gm.height));
|
||||||
@ -861,7 +859,6 @@ QRect QFontMetrics::tightBoundingRect(const QString &text) const
|
|||||||
return QRect();
|
return QRect();
|
||||||
|
|
||||||
QStackTextEngine layout(text, QFont(d.data()));
|
QStackTextEngine layout(text, QFont(d.data()));
|
||||||
layout.ignoreBidi = true;
|
|
||||||
layout.itemize();
|
layout.itemize();
|
||||||
glyph_metrics_t gm = layout.tightBoundingBox(0, text.length());
|
glyph_metrics_t gm = layout.tightBoundingBox(0, text.length());
|
||||||
return QRect(qRound(gm.x), qRound(gm.y), qRound(gm.width), qRound(gm.height));
|
return QRect(qRound(gm.x), qRound(gm.y), qRound(gm.width), qRound(gm.height));
|
||||||
@ -1413,7 +1410,6 @@ qreal QFontMetricsF::width(const QString &text) const
|
|||||||
int len = (pos != -1) ? pos : text.length();
|
int len = (pos != -1) ? pos : text.length();
|
||||||
|
|
||||||
QStackTextEngine layout(text, QFont(d.data()));
|
QStackTextEngine layout(text, QFont(d.data()));
|
||||||
layout.ignoreBidi = true;
|
|
||||||
layout.itemize();
|
layout.itemize();
|
||||||
return layout.width(0, len).toReal();
|
return layout.width(0, len).toReal();
|
||||||
}
|
}
|
||||||
@ -1496,7 +1492,6 @@ QRectF QFontMetricsF::boundingRect(const QString &text) const
|
|||||||
return QRectF();
|
return QRectF();
|
||||||
|
|
||||||
QStackTextEngine layout(text, QFont(d.data()));
|
QStackTextEngine layout(text, QFont(d.data()));
|
||||||
layout.ignoreBidi = true;
|
|
||||||
layout.itemize();
|
layout.itemize();
|
||||||
glyph_metrics_t gm = layout.boundingBox(0, len);
|
glyph_metrics_t gm = layout.boundingBox(0, len);
|
||||||
return QRectF(gm.x.toReal(), gm.y.toReal(),
|
return QRectF(gm.x.toReal(), gm.y.toReal(),
|
||||||
@ -1668,7 +1663,6 @@ QRectF QFontMetricsF::tightBoundingRect(const QString &text) const
|
|||||||
return QRect();
|
return QRect();
|
||||||
|
|
||||||
QStackTextEngine layout(text, QFont(d.data()));
|
QStackTextEngine layout(text, QFont(d.data()));
|
||||||
layout.ignoreBidi = true;
|
|
||||||
layout.itemize();
|
layout.itemize();
|
||||||
glyph_metrics_t gm = layout.tightBoundingBox(0, text.length());
|
glyph_metrics_t gm = layout.tightBoundingBox(0, text.length());
|
||||||
return QRectF(gm.x.toReal(), gm.y.toReal(), gm.width.toReal(), gm.height.toReal());
|
return QRectF(gm.x.toReal(), gm.y.toReal(), gm.width.toReal(), gm.height.toReal());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user