Add text ranges to QGlyphRunPrivate

This is an enabler for using the QGlyphRun in the selection
code of the scene graph node. In this case, we need to
know exactly which of the characters in the text are represented
by the glyph run, as a single range of text may result in
several glyph runs.

Change-Id: Ie8ec942693dceea45ab548f6cefc4f78e4c6d524
Task-number: QTBUG-41808
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
bb10
Eskil Abrahamsen Blomfeldt 2014-10-08 11:28:23 +02:00
parent b883cee471
commit 183d04de90
2 changed files with 68 additions and 7 deletions

View File

@ -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();

View File

@ -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);
}