Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[qtbase] Fix rectangle shown with hindi text. Fixes JB#32619
After U+0930 U+0947 U+0902 and linefeed, an extra rectangle was rendered
with QML Text element.

Conflicts: tests/auto/gui/text/qtextscriptengine/tst_qtextscriptengine.cpp
-> changes omitted

Original commit 198009d

Fix several regressions in font selection

In Qt 5.3.0 a change was added which automatically adapts Common
script to surrounding scripts in accordance with the Unicode tr#24.

This broke *a lot* of cases of font selection because the font
selection algorithm is not prepared for handling characters with
adapted scripts. We need to disable this change for now and redo it
later with patches to font selection to avoid the regressions.

[ChangeLog][Text] Fixed several regressions in font selection when
combining different writing systems in the same text.

Task-number: QTBUG-39930
Task-number: QTBUG-39860
Change-Id: Id02b5ae2403c06542ed5d81e7c4deb2e0c7d816e
Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com>

# Conflicts:
#	tests/auto/gui/text/qtextscriptengine/tst_qtextscriptengine.cpp
  • Loading branch information
pvuorela committed Oct 12, 2015
1 parent 47b76ca commit 6ef9198
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 2 deletions.
6 changes: 6 additions & 0 deletions src/corelib/tools/qunicodetools.cpp
Expand Up @@ -688,6 +688,7 @@ Q_CORE_EXPORT void initScripts(const ushort *string, int length, uchar *scripts)
script = QChar::Script(prop->script);
}

#if 0 // ### Disabled due to regressions. The font selection algorithm is not prepared for this change.
if (Q_LIKELY(script != QChar::Script_Common)) {
// override preceding Common-s
while (sor > 0 && scripts[sor - 1] == QChar::Script_Common)
Expand All @@ -697,13 +698,16 @@ Q_CORE_EXPORT void initScripts(const ushort *string, int length, uchar *scripts)
if (sor > 0)
script = scripts[sor - 1];
}
#endif

while (sor < eor)
scripts[sor++] = script;

script = prop->script;
}
eor = length;

#if 0 // ### Disabled due to regressions. The font selection algorithm is not prepared for this change.
if (Q_LIKELY(script != QChar::Script_Common)) {
// override preceding Common-s
while (sor > 0 && scripts[sor - 1] == QChar::Script_Common)
Expand All @@ -713,6 +717,8 @@ Q_CORE_EXPORT void initScripts(const ushort *string, int length, uchar *scripts)
if (sor > 0)
script = scripts[sor - 1];
}
#endif

while (sor < eor)
scripts[sor++] = script;
}
Expand Down
2 changes: 1 addition & 1 deletion src/gui/text/qtextengine.cpp
Expand Up @@ -124,7 +124,7 @@ class Itemizer {
for (int i = start + 1; i < end; ++i) {
if (m_analysis[i].bidiLevel == m_analysis[start].bidiLevel
&& m_analysis[i].flags == m_analysis[start].flags
&& m_analysis[i].script == m_analysis[start].script
&& (m_analysis[i].script == m_analysis[start].script || m_string[i] == QLatin1Char('.'))
&& m_analysis[i].flags < QScriptAnalysis::SpaceTabOrObject
&& i - start < MaxItemLength)
continue;
Expand Down
Binary file modified tests/auto/gui/text/qglyphrun/test.ttf
Binary file not shown.
20 changes: 19 additions & 1 deletion tests/auto/gui/text/qglyphrun/tst_qglyphrun.cpp
Expand Up @@ -77,6 +77,7 @@ private slots:
void setRawData();
void setRawDataAndGetAsVector();
void boundingRect();
void mixedScripts();

private:
int m_testFontId;
Expand Down Expand Up @@ -399,7 +400,7 @@ void tst_QGlyphRun::setRawDataAndGetAsVector()
void tst_QGlyphRun::drawNonExistentGlyphs()
{
QVector<quint32> glyphIndexes;
glyphIndexes.append(3);
glyphIndexes.append(4);

QVector<QPointF> glyphPositions;
glyphPositions.append(QPointF(0, 0));
Expand Down Expand Up @@ -725,6 +726,23 @@ void tst_QGlyphRun::boundingRect()
QCOMPARE(glyphs.boundingRect(), boundingRect);
}

void tst_QGlyphRun::mixedScripts()
{
QString s;
s += QChar(0x31); // The character '1'
s += QChar(0xbc14); // Hangul character

QTextLayout layout;
layout.setFont(m_testFont);
layout.setText(s);
layout.beginLayout();
layout.createLine();
layout.endLayout();

QList<QGlyphRun> glyphRuns = layout.glyphRuns();
QCOMPARE(glyphRuns.size(), 2);
}

#endif // QT_NO_RAWFONT

QTEST_MAIN(tst_QGlyphRun)
Expand Down

0 comments on commit 6ef9198

Please sign in to comment.