From 6a62d2b5a9cda4ba5e56fa4fa340a2b0a957bcc0 Mon Sep 17 00:00:00 2001 From: Yann Bodson Date: Wed, 15 Feb 2012 11:06:30 +1000 Subject: Remove pixmap text caching in TextEdit element Task-number: QTBUG-24278 Change-Id: Ida9014aceba93c023c88538969dff7e72ef5a6d8 Reviewed-by: Michael Brasser Reviewed-by: Andrew den Exter --- src/quick/items/qquicktextedit.cpp | 84 +++--------------------------------- src/quick/items/qquicktextedit_p.h | 1 - src/quick/items/qquicktextedit_p_p.h | 15 +------ 3 files changed, 8 insertions(+), 92 deletions(-) (limited to 'src') diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp index b9ff18e3d3..fba84e6fde 100644 --- a/src/quick/items/qquicktextedit.cpp +++ b/src/quick/items/qquicktextedit.cpp @@ -58,14 +58,10 @@ #include #include #include -#include #include QT_BEGIN_NAMESPACE -DEFINE_BOOL_CONFIG_OPTION(qmlDisableDistanceField, QML_DISABLE_DISTANCEFIELD) -DEFINE_BOOL_CONFIG_OPTION(qmlEnableImageCache, QML_ENABLE_TEXT_IMAGE_CACHE) - /*! \qmlclass TextEdit QQuickTextEdit \inqmlmodule QtQuick 2 @@ -267,7 +263,6 @@ void QQuickTextEdit::setText(const QString &text) #else d->control->setPlainText(text); #endif - d->useImageFallback = qmlEnableImageCache(); } else { d->control->setPlainText(text); } @@ -334,7 +329,6 @@ void QQuickTextEdit::setTextFormat(TextFormat format) } else if (!wasRich && d->richText) { d->control->setHtml(!d->textCached ? d->control->toPlainText() : d->text); updateSize(); - d->useImageFallback = qmlEnableImageCache(); } #endif @@ -1155,9 +1149,6 @@ void QQuickTextEdit::componentComplete() QQuickImplicitSizeItem::componentComplete(); d->document->setBaseUrl(baseUrl(), d->richText); - if (d->richText) - d->useImageFallback = qmlEnableImageCache(); - if (d->dirty) { d->determineHorizontalAlignment(); d->updateDefaultTextOption(); @@ -1580,37 +1571,6 @@ QVariant QQuickTextEdit::inputMethodQuery(Qt::InputMethodQuery property) const } -void QQuickTextEdit::updateImageCache(const QRectF &) -{ - Q_D(QQuickTextEdit); - - // Do we really need the image cache? - if (!d->richText || !d->useImageFallback) { - if (!d->pixmapCache.isNull()) - d->pixmapCache = QPixmap(); - return; - } - - if (width() != d->pixmapCache.width() || height() != d->pixmapCache.height()) - d->pixmapCache = QPixmap(width(), height()); - - if (d->pixmapCache.isNull()) - return; - - // ### Use supplied rect, clear area and update only this part (for cursor updates) - QRectF bounds = QRectF(0, 0, width(), height()); - d->pixmapCache.fill(Qt::transparent); - { - QPainter painter(&d->pixmapCache); - - painter.setRenderHint(QPainter::TextAntialiasing); - painter.translate(0, d->yoff); - - d->control->drawContents(&painter, bounds); - } - -} - void QQuickTextEdit::triggerPreprocess() { Q_D(QQuickTextEdit); @@ -1633,30 +1593,7 @@ QSGNode *QQuickTextEdit::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData * d->updateType = QQuickTextEditPrivate::UpdateNone; QSGNode *currentNode = oldNode; - if (d->richText && d->useImageFallback) { - QSGImageNode *node = 0; - if (oldNode == 0 || d->nodeType != QQuickTextEditPrivate::NodeIsTexture) { - delete oldNode; - node = QQuickItemPrivate::get(this)->sceneGraphContext()->createImageNode(); - d->texture = new QSGPlainTexture(); - d->nodeType = QQuickTextEditPrivate::NodeIsTexture; - currentNode = node; - } else { - node = static_cast(oldNode); - } - - qobject_cast(d->texture)->setImage(d->pixmapCache.toImage()); - node->setTexture(0); - node->setTexture(d->texture); - - node->setTargetRect(QRectF(0, 0, d->pixmapCache.width(), d->pixmapCache.height())); - node->setSourceRect(QRectF(0, 0, 1, 1)); - node->setHorizontalWrapMode(QSGTexture::ClampToEdge); - node->setVerticalWrapMode(QSGTexture::ClampToEdge); - node->setFiltering(QSGTexture::Linear); // Nonsmooth text just ugly, so don't do that.. - node->update(); - - } else if (oldNode == 0 || d->documentDirty) { + if (oldNode == 0 || d->documentDirty) { d->documentDirty = false; #if defined(Q_OS_MAC) @@ -1667,10 +1604,8 @@ QSGNode *QQuickTextEdit::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData * #endif QQuickTextNode *node = 0; - if (oldNode == 0 || d->nodeType != QQuickTextEditPrivate::NodeIsText) { - delete oldNode; + if (oldNode == 0) { node = new QQuickTextNode(QQuickItemPrivate::get(this)->sceneGraphContext(), this); - d->nodeType = QQuickTextEditPrivate::NodeIsText; currentNode = node; } else { node = static_cast(oldNode); @@ -1696,7 +1631,7 @@ QSGNode *QQuickTextEdit::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData * #endif } - if (d->nodeType == QQuickTextEditPrivate::NodeIsText && d->cursorComponent == 0 && !isReadOnly()) { + if (d->cursorComponent == 0 && !isReadOnly()) { QQuickTextNode *node = static_cast(currentNode); QColor color = (!d->cursorVisible || !d->control->cursorOn()) @@ -1983,7 +1918,6 @@ void QQuickTextEdit::updateDocument() d->documentDirty = true; if (isComponentComplete()) { - updateImageCache(); d->updateType = QQuickTextEditPrivate::UpdatePaintNode; update(); } @@ -1993,7 +1927,6 @@ void QQuickTextEdit::updateCursor() { Q_D(QQuickTextEdit); if (isComponentComplete()) { - updateImageCache(d->control->cursorRect()); d->updateType = QQuickTextEditPrivate::UpdatePaintNode; update(); } @@ -2045,16 +1978,11 @@ void QQuickTextEditPrivate::updateDefaultTextOption() QTextOption::WrapMode oldWrapMode = opt.wrapMode(); opt.setWrapMode(QTextOption::WrapMode(wrapMode)); + opt.setUseDesignMetrics(true); - bool oldUseDesignMetrics = opt.useDesignMetrics(); - bool useDesignMetrics = !qmlDisableDistanceField(); - opt.setUseDesignMetrics(useDesignMetrics); - - if (oldWrapMode == opt.wrapMode() - && oldAlignment == opt.alignment() - && oldUseDesignMetrics == useDesignMetrics) { + if (oldWrapMode == opt.wrapMode() && oldAlignment == opt.alignment()) return; - } + document->setDefaultTextOption(opt); } diff --git a/src/quick/items/qquicktextedit_p.h b/src/quick/items/qquicktextedit_p.h index d4aeaa5109..0db85bb5fa 100644 --- a/src/quick/items/qquicktextedit_p.h +++ b/src/quick/items/qquicktextedit_p.h @@ -296,7 +296,6 @@ private Q_SLOTS: private: void updateTotalLines(); - void updateImageCache(const QRectF &rect = QRectF()); protected: virtual void geometryChanged(const QRectF &newGeometry, diff --git a/src/quick/items/qquicktextedit_p_p.h b/src/quick/items/qquicktextedit_p_p.h index ead74a282f..665aa02839 100644 --- a/src/quick/items/qquicktextedit_p_p.h +++ b/src/quick/items/qquicktextedit_p_p.h @@ -58,7 +58,6 @@ #include "qquickimplicitsizeitem_p_p.h" #include -#include QT_BEGIN_NAMESPACE class QTextLayout; @@ -73,12 +72,12 @@ public: : color("black"), hAlign(QQuickTextEdit::AlignLeft), vAlign(QQuickTextEdit::AlignTop), documentDirty(true), dirty(false), richText(false), cursorVisible(false), focusOnPress(true), persistentSelection(false), requireImplicitWidth(false), selectByMouse(false), canPaste(false), - canPasteValid(false), hAlignImplicit(true), rightToLeftText(false), useImageFallback(false), + canPasteValid(false), hAlignImplicit(true), rightToLeftText(false), textCached(false), textMargin(0.0), lastSelectionStart(0), lastSelectionEnd(0), cursorComponent(0), cursor(0), format(QQuickTextEdit::PlainText), document(0), wrapMode(QQuickTextEdit::NoWrap), mouseSelectionMode(QQuickTextEdit::SelectCharacters), - lineCount(0), yoff(0), nodeType(NodeIsNull), texture(0), updateType(UpdatePaintNode) + lineCount(0), yoff(0), updateType(UpdatePaintNode) { } @@ -118,7 +117,6 @@ public: bool canPasteValid:1; bool hAlignImplicit:1; bool rightToLeftText:1; - bool useImageFallback:1; bool textCached:1; qreal textMargin; @@ -135,15 +133,6 @@ public: int yoff; QSize contentSize; - enum NodeType { - NodeIsNull, - NodeIsTexture, - NodeIsText - }; - NodeType nodeType; - QSGTexture *texture; - QPixmap pixmapCache; - enum UpdateType { UpdateNone, UpdateOnlyPreprocess, -- cgit v1.2.3