diff options
-rw-r--r-- | src/gui/text/qglyphrun_p.h | 7 | ||||
-rw-r--r-- | src/gui/text/qtextlayout.cpp | 70 |
2 files changed, 69 insertions, 8 deletions
diff --git a/src/gui/text/qglyphrun_p.h b/src/gui/text/qglyphrun_p.h index c9554d0d6d..d18d7129f9 100644 --- a/src/gui/text/qglyphrun_p.h +++ b/src/gui/text/qglyphrun_p.h @@ -63,6 +63,8 @@ public: , glyphIndexDataSize(0) , glyphPositionData(glyphPositions.constData()) , glyphPositionDataSize(0) + , textRangeStart(-1) + , textRangeEnd(-1) { } @@ -77,6 +79,8 @@ public: , glyphIndexDataSize(other.glyphIndexDataSize) , glyphPositionData(other.glyphPositionData) , glyphPositionDataSize(other.glyphPositionDataSize) + , textRangeStart(other.textRangeStart) + , textRangeEnd(other.textRangeEnd) { } @@ -93,6 +97,9 @@ public: const QPointF *glyphPositionData; int glyphPositionDataSize; + int textRangeStart; + int textRangeEnd; + static QGlyphRunPrivate *get(const QGlyphRun &glyphRun) { return glyphRun.d.data(); diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp index eafd98d234..adc5663299 100644 --- a/src/gui/text/qtextlayout.cpp +++ b/src/gui/text/qtextlayout.cpp @@ -2027,12 +2027,39 @@ static void setPenAndDrawBackground(QPainter *p, const QPen &defaultPen, const Q } #if !defined(QT_NO_RAWFONT) -static QGlyphRun glyphRunWithInfo(QFontEngine *fontEngine, const QGlyphLayout &glyphLayout, - const QPointF &pos, const QGlyphRun::GlyphRunFlags &flags, - const QFixed &selectionX, const QFixed &selectionWidth) -{ +static QGlyphRun glyphRunWithInfo(QFontEngine *fontEngine, + const QGlyphLayout &glyphLayout, + const QPointF &pos, + const QGlyphRun::GlyphRunFlags &flags, + const QFixed &selectionX, + const QFixed &selectionWidth, + int glyphsStart, + int glyphsEnd, + unsigned short *logClusters, + int textPosition, + int textLength) +{ + Q_ASSERT(logClusters != 0); + QGlyphRun glyphRun; + QGlyphRunPrivate *d = QGlyphRunPrivate::get(glyphRun); + + int rangeStart = textPosition; + while (*logClusters != glyphsStart && rangeStart < textPosition + textLength) { + ++logClusters; + ++rangeStart; + } + + int rangeEnd = rangeStart; + while (*logClusters != glyphsEnd && rangeEnd < textPosition + textLength) { + ++logClusters; + ++rangeEnd; + } + + d->textRangeStart = rangeStart; + d->textRangeEnd = rangeEnd; + // Make a font for this particular engine QRawFont font; QRawFontPrivate *fontD = QRawFontPrivate::get(font); @@ -2219,7 +2246,16 @@ QList<QGlyphRun> QTextLine::glyphRuns(int from, int length) const subFlags |= QGlyphRun::SplitLigature; glyphRuns.append(glyphRunWithInfo(multiFontEngine->engine(which), - subLayout, pos, subFlags, x, width)); + subLayout, + pos, + subFlags, + x, + width, + glyphsStart + start, + glyphsStart + end, + logClusters, + iterator.itemStart, + iterator.itemLength)); for (int i = 0; i < subLayout.numGlyphs; ++i) pos.rx() += subLayout.advances[i].toReal(); @@ -2238,14 +2274,32 @@ QList<QGlyphRun> QTextLine::glyphRuns(int from, int length) const subFlags |= QGlyphRun::SplitLigature; QGlyphRun glyphRun = glyphRunWithInfo(multiFontEngine->engine(which), - subLayout, pos, subFlags, x, width); + subLayout, + pos, + subFlags, + x, + width, + glyphsStart + start, + glyphsStart + end, + logClusters, + iterator.itemStart, + iterator.itemLength); if (!glyphRun.isEmpty()) glyphRuns.append(glyphRun); } else { if (startsInsideLigature || endsInsideLigature) flags |= QGlyphRun::SplitLigature; - QGlyphRun glyphRun = glyphRunWithInfo(mainFontEngine, glyphLayout, pos, flags, x, - width); + QGlyphRun glyphRun = glyphRunWithInfo(mainFontEngine, + glyphLayout, + pos, + flags, + x, + width, + glyphsStart, + glyphsEnd, + logClusters, + iterator.itemStart, + iterator.itemLength); if (!glyphRun.isEmpty()) glyphRuns.append(glyphRun); } |