From e45c4387ae16627d61e30a58ae901d888d375aa7 Mon Sep 17 00:00:00 2001 From: Jiang Jiang Date: Thu, 4 Nov 2010 15:18:57 +0100 Subject: Fix bidi PDF mark support in Core Text shaper When Core Text shaping a string like LRE ... PDF, it won't leave a zero width glyph for the PDF mark, it is not consistent with HarfBuzz and will cause issues in our text engine (the last glyph of the string will be considered as a ligature). This hack appended such a zero width glyph to fix that. Reviewed-by: Eskil --- src/gui/text/qfontengine_mac.mm | 18 ++++++++++++++++++ tests/auto/qcomplextext/tst_qcomplextext.cpp | 16 ++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/gui/text/qfontengine_mac.mm b/src/gui/text/qfontengine_mac.mm index 51e18ec..3c6f3b2 100644 --- a/src/gui/text/qfontengine_mac.mm +++ b/src/gui/text/qfontengine_mac.mm @@ -252,6 +252,11 @@ bool QCoreTextFontEngineMulti::stringToCMap(const QChar *str, int len, QGlyphLay continue; Q_ASSERT((CTRunGetStatus(run) & kCTRunStatusRightToLeft) == rtl); + CFRange stringRange = CTRunGetStringRange(run); + UniChar endGlyph = CFStringGetCharacterAtIndex(cfstring, stringRange.location + stringRange.length - 1); + bool endWithPDF = QChar::direction(endGlyph) == QChar::DirPDF; + if (endWithPDF) + glyphCount++; if (!outOBounds && outGlyphs + glyphCount - initialGlyph > *nglyphs) { outOBounds = true; @@ -264,6 +269,9 @@ bool QCoreTextFontEngineMulti::stringToCMap(const QChar *str, int len, QGlyphLay CTFontRef runFont = static_cast(CFDictionaryGetValue(runAttribs, NSFontAttributeName)); const uint fontIndex = (fontIndexForFont(runFont) << 24); //NSLog(@"Run Font Name = %@", CTFontCopyFamilyName(runFont)); + if (endWithPDF) + glyphCount--; + QVarLengthArray cgglyphs(0); const CGGlyph *tmpGlyphs = CTRunGetGlyphsPtr(run); if (!tmpGlyphs) { @@ -331,6 +339,16 @@ bool QCoreTextFontEngineMulti::stringToCMap(const QChar *str, int len, QGlyphLay (fontDef.styleStrategy & QFont::ForceIntegerMetrics) ? QFixed::fromReal(lastGlyphAdvance.width).round() : QFixed::fromReal(lastGlyphAdvance.width); + + if (endWithPDF) { + logClusters[stringRange.location + stringRange.length - 1] = glyphCount; + outGlyphs[glyphCount] = 0xFFFF; + outAdvances_x[glyphCount] = 0; + outAdvances_y[glyphCount] = 0; + outAttributes[glyphCount].clusterStart = true; + outAttributes[glyphCount].dontPrint = true; + glyphCount++; + } } outGlyphs += glyphCount; outAttributes += glyphCount; diff --git a/tests/auto/qcomplextext/tst_qcomplextext.cpp b/tests/auto/qcomplextext/tst_qcomplextext.cpp index fa8a2d1..c66d452 100644 --- a/tests/auto/qcomplextext/tst_qcomplextext.cpp +++ b/tests/auto/qcomplextext/tst_qcomplextext.cpp @@ -45,6 +45,7 @@ #if !defined(Q_WS_MAC) #include +#include #include #include "bidireorderstring.h" @@ -69,6 +70,7 @@ private slots: void bidiReorderString_data(); void bidiReorderString(); void bidiCursor_qtbug2795(); + void bidiCursor_PDF(); }; tst_QComplexText::tst_QComplexText() @@ -183,6 +185,20 @@ void tst_QComplexText::bidiCursor_qtbug2795() QVERIFY(x1 == x2); } +void tst_QComplexText::bidiCursor_PDF() +{ + QString str = QString::fromUtf8("\342\200\252hello\342\200\254"); + QTextLayout layout(str); + + layout.beginLayout(); + QTextLine line = layout.createLine(); + layout.endLayout(); + + int size = str.size(); + + QVERIFY(line.cursorToX(size) == line.cursorToX(size - 1)); +} + QTEST_MAIN(tst_QComplexText) #include "tst_qcomplextext.moc" -- cgit v0.12