浏览代码

VTextEdit: bug fix

Le Tan 7 年之前
父节点
当前提交
f9820cf709
共有 2 个文件被更改,包括 32 次插入30 次删除
  1. 28 28
      src/vtextdocumentlayout.cpp
  2. 4 2
      src/vtextdocumentlayoutdata.h

+ 28 - 28
src/vtextdocumentlayout.cpp

@@ -84,7 +84,7 @@ void VTextDocumentLayout::blockRangeFromRect(const QRectF &p_rect,
     QTextBlock block = document()->firstBlock();
     while (block.isValid()) {
         const BlockLayoutInfo *info = VTextBlockData::layoutInfo(block);
-        Q_ASSERT(info->hasOffset());
+        V_ASSERT(info->hasOffset());
 
         if (info->top() == y
             || (info->top() < y && info->bottom() >= y)) {
@@ -103,7 +103,7 @@ void VTextDocumentLayout::blockRangeFromRect(const QRectF &p_rect,
     y += p_rect.height();
     while (block.isValid()) {
         const BlockLayoutInfo *info = VTextBlockData::layoutInfo(block);
-        Q_ASSERT(info->hasOffset());
+        V_ASSERT(info->hasOffset());
 
         if (info->bottom() > y) {
             p_last = block.blockNumber();
@@ -140,7 +140,7 @@ void VTextDocumentLayout::blockRangeFromRectBS(const QRectF &p_rect,
     p_last = document()->blockCount() - 1;
     while (block.isValid()) {
         const BlockLayoutInfo *tinfo = VTextBlockData::layoutInfo(block);
-        Q_ASSERT(tinfo->hasOffset());
+        V_ASSERT(tinfo->hasOffset());
 
         if (tinfo->bottom() > y) {
             p_last = block.blockNumber();
@@ -164,7 +164,7 @@ int VTextDocumentLayout::findBlockByPosition(const QPointF &p_point) const
             return -1;
         }
 
-        Q_ASSERT(info->hasOffset());
+        V_ASSERT(info->hasOffset());
         if (info->top() <= y && info->bottom() > y) {
             // Found it.
             return mid;
@@ -203,7 +203,7 @@ void VTextDocumentLayout::draw(QPainter *p_painter, const PaintContext &p_contex
 
     while (block.isValid()) {
         const BlockLayoutInfo *info = VTextBlockData::layoutInfo(block);
-        Q_ASSERT(info->hasOffset());
+        V_ASSERT(info->hasOffset());
 
         const QRectF &rect = info->m_rect;
         QTextLayout *layout = block.layout();
@@ -339,7 +339,7 @@ QVector<QTextLayout::FormatRange> VTextDocumentLayout::formatRangeFromSelection(
             // a position to specify the line. that's more convenience in usage.
             QTextLayout::FormatRange o;
             QTextLine l = p_block.layout()->lineForTextPosition(range.cursor.position() - blpos);
-            Q_ASSERT(l.isValid());
+            V_ASSERT(l.isValid());
             o.start = l.textStart();
             o.length = l.textLength();
             if (o.start + o.length == bllen - 1) {
@@ -363,7 +363,7 @@ int VTextDocumentLayout::hitTest(const QPointF &p_point, Qt::HitTestAccuracy p_a
     }
 
     QTextBlock block = document()->findBlockByNumber(bn);
-    Q_ASSERT(block.isValid());
+    V_ASSERT(block.isValid());
     QTextLayout *layout = block.layout();
     int off = 0;
     QPointF pos = p_point - QPointF(m_margin, VTextBlockData::layoutInfo(block)->top());
@@ -494,7 +494,7 @@ void VTextDocumentLayout::clearBlockLayout(QTextBlock &p_block)
 void VTextDocumentLayout::layoutBlock(const QTextBlock &p_block)
 {
     QTextDocument *doc = document();
-    Q_ASSERT(m_margin == doc->documentMargin());
+    V_ASSERT(m_margin == doc->documentMargin());
 
     QTextLayout *tl = p_block.layout();
     QTextOption option = doc->defaultTextOption();
@@ -529,9 +529,10 @@ void VTextDocumentLayout::layoutBlock(const QTextBlock &p_block)
 void VTextDocumentLayout::updateOffsetBefore(const QTextBlock &p_block)
 {
     BlockLayoutInfo *info = VTextBlockData::layoutInfo(p_block);
-    Q_ASSERT(!info->isNull());
+    V_ASSERT(!info->isNull());
 
-    if (p_block.blockNumber() == 0) {
+    const int blockNum = p_block.blockNumber();
+    if (blockNum == 0) {
         info->m_offset = 0;
     } else {
         QTextBlock blk = p_block.previous();
@@ -554,26 +555,25 @@ void VTextDocumentLayout::updateOffsetBefore(const QTextBlock &p_block)
             // Now we reach a block with offset.
             qreal offset = pinfo->bottom();
             blk = blk.next();
-            while (blk.isValid()) {
+            while (blk.isValid() && blk.blockNumber() <= blockNum) {
                 BlockLayoutInfo *ninfo = VTextBlockData::layoutInfo(blk);
+                Q_ASSERT(!ninfo->isNull());
                 ninfo->m_offset = offset;
-                if (blk.blockNumber() == p_block.blockNumber()) {
-                    break;
-                }
-
                 offset = ninfo->bottom();
                 blk = blk.next();
             }
+
+            break;
         }
 
-        Q_ASSERT(info->hasOffset());
+        V_ASSERT(info->hasOffset());
     }
 }
 
 void VTextDocumentLayout::updateOffsetAfter(const QTextBlock &p_block)
 {
     BlockLayoutInfo *info = VTextBlockData::layoutInfo(p_block);
-    Q_ASSERT(info->hasOffset());
+    V_ASSERT(info->hasOffset());
     qreal offset = info->bottom();
     QTextBlock blk = p_block.next();
     while (blk.isValid()) {
@@ -599,7 +599,7 @@ qreal VTextDocumentLayout::layoutLines(const QTextBlock &p_block,
                                        qreal p_availableWidth,
                                        qreal p_height)
 {
-    Q_ASSERT(p_block.isValid());
+    V_ASSERT(p_block.isValid());
 
     // Handle block inline image.
     bool hasInlineImages = false;
@@ -696,18 +696,18 @@ void VTextDocumentLayout::finishBlockLayout(const QTextBlock &p_block,
                                             const QVector<Marker> &p_markers,
                                             const QVector<ImagePaintInfo> &p_images)
 {
-    Q_ASSERT(p_block.isValid());
+    V_ASSERT(p_block.isValid());
     ImagePaintInfo ipi;
     BlockLayoutInfo *info = VTextBlockData::layoutInfo(p_block);
-    Q_ASSERT(info->isNull());
+    V_ASSERT(info->isNull());
     info->reset();
     info->m_rect = blockRectFromTextLayout(p_block, &ipi);
-    Q_ASSERT(!info->m_rect.isNull());
+    V_ASSERT(!info->m_rect.isNull());
 
     bool hasImage = false;
     if (ipi.isValid()) {
-        Q_ASSERT(p_markers.isEmpty());
-        Q_ASSERT(p_images.isEmpty());
+        V_ASSERT(p_markers.isEmpty());
+        V_ASSERT(p_images.isEmpty());
         info->m_images.append(ipi);
         hasImage = true;
     } else if (!p_markers.isEmpty()) {
@@ -749,7 +749,7 @@ void VTextDocumentLayout::updateDocumentSize()
     QTextBlock blk = document()->firstBlock();
     while (blk.isValid()) {
         const BlockLayoutInfo *ninfo = VTextBlockData::layoutInfo(blk);
-        Q_ASSERT(ninfo->hasOffset());
+        V_ASSERT(ninfo->hasOffset());
         if (m_width < ninfo->m_rect.width()) {
             m_width = ninfo->m_rect.width();
             m_maximumWidthBlockNumber = blk.blockNumber();
@@ -787,7 +787,7 @@ QRectF VTextDocumentLayout::blockRectFromTextLayout(const QTextBlock &p_block,
     // Handle block non-inline image.
     if (m_blockImageEnabled) {
         VTextBlockData *blockData = VTextBlockData::blockData(p_block);
-        Q_ASSERT(blockData);
+        V_ASSERT(blockData);
         const QVector<VPreviewInfo *> &info = blockData->getPreviews();
         if (info.size() == 1) {
             const VPreviewedImageInfo& img = info.first()->m_imageInfo;
@@ -1013,7 +1013,7 @@ qreal VTextDocumentLayout::fetchInlineImagesForOneLine(const QVector<VPreviewInf
 
     for (int i = 0; i < p_info.size(); ++i) {
         const VPreviewedImageInfo &img = p_info[i]->m_imageInfo;
-        Q_ASSERT(img.m_inline);
+        V_ASSERT(img.m_inline);
 
         if (img.m_startPos >= start && img.m_startPos < end) {
             // Start of a new image.
@@ -1098,8 +1098,8 @@ int VTextDocumentLayout::getTextWidthWithinTextLine(const QTextLayout *p_layout,
                                                     int p_length)
 {
     QTextLine line = p_layout->lineForTextPosition(p_pos);
-    Q_ASSERT(line.isValid());
-    Q_ASSERT(p_pos + p_length <= line.textStart() + line.textLength());
+    V_ASSERT(line.isValid());
+    V_ASSERT(p_pos + p_length <= line.textStart() + line.textLength());
     return line.cursorToX(p_pos + p_length) - line.cursorToX(p_pos);
 }
 

+ 4 - 2
src/vtextdocumentlayoutdata.h

@@ -1,6 +1,8 @@
 #ifndef VTEXTDOCUMENTLAYOUTDATA_H
 #define VTEXTDOCUMENTLAYOUTDATA_H
 
+#include "utils/vutils.h"
+
 // Denote the start and end position of a marker line.
 struct Marker
 {
@@ -57,13 +59,13 @@ struct BlockLayoutInfo
 
     qreal top() const
     {
-        Q_ASSERT(hasOffset());
+        V_ASSERT(hasOffset());
         return m_offset;
     }
 
     qreal bottom() const
     {
-        Q_ASSERT(hasOffset());
+        V_ASSERT(hasOffset());
         return m_offset + m_rect.height();
     }