OSDN Git Service

fix build of QTextEngine with strict iterators
authorIvailo Monev <xakepa10@laimg.moc>
Mon, 20 May 2019 14:59:04 +0000 (14:59 +0000)
committerIvailo Monev <xakepa10@laimg.moc>
Mon, 20 May 2019 14:59:04 +0000 (14:59 +0000)
Signed-off-by: Ivailo Monev <xakepa10@laimg.moc>
src/core/tools/qtextboundaryfinder.cpp
src/gui/text/qtextengine.cpp
src/gui/text/qtextengine_p.h

index 7b59988..7eac180 100644 (file)
@@ -304,7 +304,7 @@ int QTextBoundaryFinder::toPreviousBoundary()
         return d->pos;
     }
 
-    if (d->pos <= 0 || d->pos > d->length) {
+    if (d->pos <= 0 || d->pos >= d->length) {
         d->pos = -1;
         return d->pos;
     }
@@ -350,14 +350,14 @@ bool QTextBoundaryFinder::isAtBoundary() const
         return true;
 
     switch(d->type) {
-    case QTextBoundaryFinder::Grapheme:
-        return !d->string[d->pos].isLetterOrNumber();
-    case QTextBoundaryFinder::Word:
-        return d->string[d->pos].isSpace();
-    case QTextBoundaryFinder::Line:
-        return (d->pos > 0) ? d->string[d->pos].category() == QChar::Separator_Line : true;
-    case QTextBoundaryFinder::Sentence:
-        return d->string[d->pos].isPunct();
+        case QTextBoundaryFinder::Grapheme:
+            return !d->string[d->pos].isLetterOrNumber();
+        case QTextBoundaryFinder::Word:
+            return d->string[d->pos].isSpace();
+        case QTextBoundaryFinder::Line:
+            return (d->pos > 0) ? d->string[d->pos].category() == QChar::Separator_Line : true;
+        case QTextBoundaryFinder::Sentence:
+            return d->string[d->pos].isPunct();
     }
     return false;
 }
index a236997..40b7c5a 100644 (file)
@@ -2403,61 +2403,19 @@ QString QTextEngine::elidedText(Qt::TextElideMode mode, const QFixed &width, int
     return layoutData->string;
 }
 
-namespace {
-struct QScriptItemComparator {
-    bool operator()(const QScriptItem &a, const QScriptItem &b) { return a.position < b.position; }
-    bool operator()(int p, const QScriptItem &b) { return p < b.position; }
-    //bool operator()(const QScriptItem &a, int p) { return a.position < p; }
-};
-}
-
 void QTextEngine::setBoundary(int strPos) const
 {
     if (strPos <= 0 || strPos >= layoutData->string.length())
         return;
-
-    const QScriptItem* it = qUpperBound(layoutData->items.constBegin(), layoutData->items.constEnd(),
-                                        strPos, QScriptItemComparator());
-    Q_ASSERT(it > layoutData->items.constBegin());
-    --it;
-    if (it->position == strPos) {
-        // already a split at the requested position
-        return;
-    }
-    splitItem(it - layoutData->items.constBegin(), strPos - it->position);
-}
-
-void QTextEngine::splitItem(int item, int pos) const
-{
-    if (pos <= 0)
+    const int item = findItem(strPos);
+    if (item < 0)
         return;
 
-    layoutData->items.insert(item + 1, layoutData->items[item]);
-    QScriptItem &oldItem = layoutData->items[item];
-    QScriptItem &newItem = layoutData->items[item+1];
-    newItem.position += pos;
-
-    if (oldItem.num_glyphs) {
-        // already shaped, break glyphs aswell
-        int breakGlyph = logClusters(&oldItem)[pos];
-
-        newItem.num_glyphs = oldItem.num_glyphs - breakGlyph;
-        oldItem.num_glyphs = breakGlyph;
-        newItem.glyph_data_offset = oldItem.glyph_data_offset + breakGlyph;
-
-        for (int i = 0; i < newItem.num_glyphs; i++)
-            logClusters(&newItem)[i] -= breakGlyph;
-
-        QFixed w = 0;
-        const QGlyphLayout g = shapedGlyphs(&oldItem);
-        for(int j = 0; j < breakGlyph; ++j)
-            w += g.advances_x[j] * !g.attributes[j].dontPrint;
-
-        newItem.width = oldItem.width - w;
-        oldItem.width = w;
+    QScriptItem newItem = layoutData->items.at(item);
+    if (newItem.position != strPos) {
+        newItem.position = strPos;
+        layoutData->items.insert(item + 1, newItem);
     }
-
-//     qDebug("split at position %d itempos=%d", pos, item);
 }
 
 QFixed QTextEngine::calculateTabWidth(int item, QFixed x) const
index 567f14b..2568735 100644 (file)
@@ -612,7 +612,6 @@ private:
     void addRequiredBoundaries() const;
     void shapeText(int item) const;
     void shapeTextWithHarfbuzz(int item) const;
-    void splitItem(int item, int pos) const;
 
     void resolveAdditionalFormats() const;
     int endOfLine(int lineNum);