diff options
author | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com> | 2011-11-24 13:48:19 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-01-24 13:03:03 +0100 |
commit | 47a5c708bf4e555cb8febef583f32c99f7d8ea1e (patch) | |
tree | 722842be890fe711a353759b100ac50bef9c2648 /src/quick/items | |
parent | 635d0a7cf6601b2e46e0eed21a648934bc471c6d (diff) |
Add support for shared glyph cache
Use a shared graphics cache to back the distance fields if
it is available.
Change-Id: Id5e6e7a28e38e349d787e66016b2d0faebc791d7
Reviewed-by: Jiang Jiang <jiang.jiang@nokia.com>
Diffstat (limited to 'src/quick/items')
-rw-r--r-- | src/quick/items/qquicktext.cpp | 27 | ||||
-rw-r--r-- | src/quick/items/qquicktext_p.h | 1 | ||||
-rw-r--r-- | src/quick/items/qquicktext_p_p.h | 7 | ||||
-rw-r--r-- | src/quick/items/qquicktextedit.cpp | 20 | ||||
-rw-r--r-- | src/quick/items/qquicktextedit_p.h | 1 | ||||
-rw-r--r-- | src/quick/items/qquicktextedit_p_p.h | 9 | ||||
-rw-r--r-- | src/quick/items/qquicktextinput.cpp | 30 | ||||
-rw-r--r-- | src/quick/items/qquicktextinput_p.h | 1 | ||||
-rw-r--r-- | src/quick/items/qquicktextinput_p_p.h | 8 | ||||
-rw-r--r-- | src/quick/items/qquicktextnode.cpp | 5 | ||||
-rw-r--r-- | src/quick/items/qquicktextnode_p.h | 3 |
11 files changed, 102 insertions, 10 deletions
diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp index d7b069a1fc..82232ab0ea 100644 --- a/src/quick/items/qquicktext.cpp +++ b/src/quick/items/qquicktext.cpp @@ -85,7 +85,7 @@ QQuickTextPrivate::QQuickTextPrivate() disableDistanceField(false), internalWidthUpdate(false), requireImplicitWidth(false), truncated(false), hAlignImplicit(true), rightToLeftText(false), layoutTextElided(false), richTextAsImage(false), textureImageCacheDirty(false), textHasChanged(true), - naturalWidth(0), doc(0), elipsisLayout(0), textLine(0), nodeType(NodeIsNull) + naturalWidth(0), doc(0), elipsisLayout(0), textLine(0), nodeType(NodeIsNull), updateType(UpdatePaintNode) #if defined(Q_OS_MAC) , layoutThread(0), paintingThread(0) @@ -371,6 +371,7 @@ void QQuickTextPrivate::updateSize() q->setImplicitSize(0, fontHeight); paintedSize = QSize(0, fontHeight); emit q->paintedSizeChanged(); + updateType = UpdatePaintNode; q->update(); return; } @@ -445,6 +446,7 @@ void QQuickTextPrivate::updateSize() paintedSize = size; emit q->paintedSizeChanged(); } + updateType = UpdatePaintNode; q->update(); } @@ -898,6 +900,7 @@ void QQuickTextPrivate::checkImageCache() imageCacheDirty = false; textureImageCacheDirty = true; + updateType = UpdatePaintNode; q->update(); } @@ -1325,8 +1328,10 @@ void QQuickText::setStyle(QQuickText::TextStyle style) return; // changing to/from Normal requires the boundingRect() to change - if (isComponentComplete() && (d->style == Normal || style == Normal)) + if (isComponentComplete() && (d->style == Normal || style == Normal)) { + d->updateType = QQuickTextPrivate::UpdatePaintNode; update(); + } d->style = style; d->markDirty(); emit styleChanged(d->style); @@ -1842,6 +1847,14 @@ geomChangeDone: QQuickItem::geometryChanged(newGeometry, oldGeometry); } +void QQuickText::triggerPreprocess() +{ + Q_D(QQuickText); + if (d->updateType == QQuickTextPrivate::UpdateNone) + d->updateType = QQuickTextPrivate::UpdatePreprocess; + update(); +} + QSGNode *QQuickText::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data) { Q_UNUSED(data); @@ -1852,6 +1865,14 @@ QSGNode *QQuickText::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data return 0; } + if (!d->updateType != QQuickTextPrivate::UpdatePaintNode && oldNode != 0) { + // Update done in preprocess() in the nodes + d->updateType = QQuickTextPrivate::UpdateNone; + return oldNode; + } + + d->updateType = QQuickTextPrivate::UpdateNone; + QRectF bounds = boundingRect(); // We need to make sure the layout is done in the current thread @@ -1902,7 +1923,7 @@ QSGNode *QQuickText::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data QQuickTextNode *node = 0; if (!oldNode || d->nodeType != QQuickTextPrivate::NodeIsText) { delete oldNode; - node = new QQuickTextNode(QQuickItemPrivate::get(this)->sceneGraphContext()); + node = new QQuickTextNode(QQuickItemPrivate::get(this)->sceneGraphContext(), this); d->nodeType = QQuickTextPrivate::NodeIsText; } else { node = static_cast<QQuickTextNode *>(oldNode); diff --git a/src/quick/items/qquicktext_p.h b/src/quick/items/qquicktext_p.h index d204cf1535..46197258c8 100644 --- a/src/quick/items/qquicktext_p.h +++ b/src/quick/items/qquicktext_p.h @@ -211,6 +211,7 @@ protected: private Q_SLOTS: void q_imagesLoaded(); + void triggerPreprocess(); private: Q_DISABLE_COPY(QQuickText) diff --git a/src/quick/items/qquicktext_p_p.h b/src/quick/items/qquicktext_p_p.h index efe9b23d04..dda24a0a68 100644 --- a/src/quick/items/qquicktext_p_p.h +++ b/src/quick/items/qquicktext_p_p.h @@ -161,6 +161,13 @@ public: }; NodeType nodeType; + enum UpdateType { + UpdateNone, + UpdatePreprocess, + UpdatePaintNode + }; + UpdateType updateType; + #if defined(Q_OS_MAC) QList<QRectF> linesRects; QThread *layoutThread; diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp index 9daead9ea7..37c76c09a3 100644 --- a/src/quick/items/qquicktextedit.cpp +++ b/src/quick/items/qquicktextedit.cpp @@ -1609,11 +1609,27 @@ void QQuickTextEdit::updateImageCache(const QRectF &) } +void QQuickTextEdit::triggerPreprocess() +{ + Q_D(QQuickTextEdit); + if (d->updateType == QQuickTextEditPrivate::UpdateNone) + d->updateType = QQuickTextEditPrivate::UpdateOnlyPreprocess; + update(); +} + QSGNode *QQuickTextEdit::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *updatePaintNodeData) { Q_UNUSED(updatePaintNodeData); Q_D(QQuickTextEdit); + if (d->updateType != QQuickTextEditPrivate::UpdatePaintNode && oldNode != 0) { + // Update done in preprocess() in the nodes + d->updateType = QQuickTextEditPrivate::UpdateNone; + return oldNode; + } + + d->updateType = QQuickTextEditPrivate::UpdateNone; + QSGNode *currentNode = oldNode; if (d->richText && d->useImageFallback) { QSGImageNode *node = 0; @@ -1651,7 +1667,7 @@ QSGNode *QQuickTextEdit::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData * QQuickTextNode *node = 0; if (oldNode == 0 || d->nodeType != QQuickTextEditPrivate::NodeIsText) { delete oldNode; - node = new QQuickTextNode(QQuickItemPrivate::get(this)->sceneGraphContext()); + node = new QQuickTextNode(QQuickItemPrivate::get(this)->sceneGraphContext(), this); d->nodeType = QQuickTextEditPrivate::NodeIsText; currentNode = node; } else { @@ -1962,6 +1978,7 @@ void QQuickTextEdit::updateDocument() if (isComponentComplete()) { updateImageCache(); + d->updateType = QQuickTextEditPrivate::UpdatePaintNode; update(); } } @@ -1971,6 +1988,7 @@ void QQuickTextEdit::updateCursor() Q_D(QQuickTextEdit); if (isComponentComplete()) { updateImageCache(d->control->cursorRect()); + d->updateType = QQuickTextEditPrivate::UpdatePaintNode; update(); } } diff --git a/src/quick/items/qquicktextedit_p.h b/src/quick/items/qquicktextedit_p.h index 08729bf5ef..8d268ea6f8 100644 --- a/src/quick/items/qquicktextedit_p.h +++ b/src/quick/items/qquicktextedit_p.h @@ -290,6 +290,7 @@ private Q_SLOTS: void updateCursor(); void q_updateAlignment(); void updateSize(); + void triggerPreprocess(); private: void updateTotalLines(); diff --git a/src/quick/items/qquicktextedit_p_p.h b/src/quick/items/qquicktextedit_p_p.h index 6605f7fc88..f8996c95ee 100644 --- a/src/quick/items/qquicktextedit_p_p.h +++ b/src/quick/items/qquicktextedit_p_p.h @@ -78,7 +78,7 @@ public: 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) + lineCount(0), yoff(0), nodeType(NodeIsNull), texture(0), updateType(UpdatePaintNode) { } @@ -143,6 +143,13 @@ public: NodeType nodeType; QSGTexture *texture; QPixmap pixmapCache; + + enum UpdateType { + UpdateNone, + UpdateOnlyPreprocess, + UpdatePaintNode + }; + UpdateType updateType; }; QT_END_NAMESPACE diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp index 16106be43b..237db3537d 100644 --- a/src/quick/items/qquicktextinput.cpp +++ b/src/quick/items/qquicktextinput.cpp @@ -328,6 +328,7 @@ void QQuickTextInput::setColor(const QColor &c) if (c != d->color) { d->color = c; d->textLayoutDirty = true; + d->updateType = QQuickTextInputPrivate::UpdatePaintNode; update(); emit colorChanged(c); } @@ -355,6 +356,7 @@ void QQuickTextInput::setSelectionColor(const QColor &color) d->m_palette.setColor(QPalette::Highlight, d->selectionColor); if (d->hasSelectedText()) { d->textLayoutDirty = true; + d->updateType = QQuickTextInputPrivate::UpdatePaintNode; update(); } emit selectionColorChanged(color); @@ -380,6 +382,7 @@ void QQuickTextInput::setSelectedTextColor(const QColor &color) d->m_palette.setColor(QPalette::HighlightedText, d->selectedTextColor); if (d->hasSelectedText()) { d->textLayoutDirty = true; + d->updateType = QQuickTextInputPrivate::UpdatePaintNode; update(); } emit selectedTextColorChanged(color); @@ -642,6 +645,7 @@ void QQuickTextInput::setCursorVisible(bool on) return; d->cursorVisible = on; d->setCursorBlinkPeriod(on ? qApp->styleHints()->cursorFlashTime() : 0); + d->updateType = QQuickTextInputPrivate::UpdatePaintNode; update(); emit cursorVisibleChanged(d->cursorVisible); } @@ -1621,14 +1625,30 @@ void QQuickTextInputPrivate::updateVerticalScroll() textLayoutDirty = true; } +void QQuickTextInput::triggerPreprocess() +{ + Q_D(QQuickTextInput); + if (d->updateType == QQuickTextInputPrivate::UpdateNone) + d->updateType = QQuickTextInputPrivate::UpdateOnlyPreprocess; + update(); +} + QSGNode *QQuickTextInput::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data) { Q_UNUSED(data); Q_D(QQuickTextInput); + if (d->updateType != QQuickTextInputPrivate::UpdatePaintNode && oldNode != 0) { + // Update done in preprocess() in the nodes + d->updateType = QQuickTextInputPrivate::UpdateNone; + return oldNode; + } + + d->updateType = QQuickTextInputPrivate::UpdateNone; + QQuickTextNode *node = static_cast<QQuickTextNode *>(oldNode); if (node == 0) - node = new QQuickTextNode(QQuickItemPrivate::get(this)->sceneGraphContext()); + node = new QQuickTextNode(QQuickItemPrivate::get(this)->sceneGraphContext(), this); d->textNode = node; if (!d->textLayoutDirty) { @@ -2408,6 +2428,7 @@ void QQuickTextInput::updateCursorRectangle() d->updateHorizontalScroll(); d->updateVerticalScroll(); + d->updateType = QQuickTextInputPrivate::UpdatePaintNode; update(); emit cursorRectangleChanged(); if (d->cursorItem) { @@ -2421,6 +2442,7 @@ void QQuickTextInput::selectionChanged() { Q_D(QQuickTextInput); d->textLayoutDirty = true; //TODO: Only update rect in selection + d->updateType = QQuickTextInputPrivate::UpdatePaintNode; update(); emit selectedTextChanged(); @@ -2584,6 +2606,7 @@ void QQuickTextInputPrivate::updateLayout() m_ascent = qRound(firstLine.ascent()); textLayoutDirty = true; + updateType = UpdatePaintNode; q->update(); q->setImplicitSize(qCeil(boundingRect.width()), qCeil(boundingRect.height())); @@ -3788,8 +3811,10 @@ void QQuickTextInputPrivate::setCursorBlinkPeriod(int msec) m_blinkStatus = 1; } else { m_blinkTimer = 0; - if (m_blinkStatus == 1) + if (m_blinkStatus == 1) { + updateType = UpdatePaintNode; q->update(); + } } m_blinkPeriod = msec; } @@ -3809,6 +3834,7 @@ void QQuickTextInput::timerEvent(QTimerEvent *event) Q_D(QQuickTextInput); if (event->timerId() == d->m_blinkTimer) { d->m_blinkStatus = !d->m_blinkStatus; + d->updateType = QQuickTextInputPrivate::UpdatePaintNode; update(); } else if (event->timerId() == d->m_deleteAllTimer) { killTimer(d->m_deleteAllTimer); diff --git a/src/quick/items/qquicktextinput_p.h b/src/quick/items/qquicktextinput_p.h index e2f7d9eaeb..92d09c3efd 100644 --- a/src/quick/items/qquicktextinput_p.h +++ b/src/quick/items/qquicktextinput_p.h @@ -324,6 +324,7 @@ private Q_SLOTS: void updateCursorRectangle(); void q_canPasteChanged(); void q_updateAlignment(); + void triggerPreprocess(); private: Q_DECLARE_PRIVATE(QQuickTextInput) diff --git a/src/quick/items/qquicktextinput_p_p.h b/src/quick/items/qquicktextinput_p_p.h index 980bf1dea6..1fc55658e6 100644 --- a/src/quick/items/qquicktextinput_p_p.h +++ b/src/quick/items/qquicktextinput_p_p.h @@ -128,6 +128,7 @@ public: , m_acceptableInput(1) , m_blinkStatus(0) , m_passwordEchoEditing(false) + , updateType(UpdatePaintNode) { } @@ -256,6 +257,13 @@ public: uint m_blinkStatus : 1; uint m_passwordEchoEditing; + enum UpdateType { + UpdateNone, + UpdateOnlyPreprocess, + UpdatePaintNode + }; + UpdateType updateType; + static inline QQuickTextInputPrivate *get(QQuickTextInput *t) { return t->d_func(); } diff --git a/src/quick/items/qquicktextnode.cpp b/src/quick/items/qquicktextnode.cpp index 8811bb3d77..2f72b0c8fe 100644 --- a/src/quick/items/qquicktextnode.cpp +++ b/src/quick/items/qquicktextnode.cpp @@ -69,8 +69,8 @@ QT_BEGIN_NAMESPACE /*! Creates an empty QQuickTextNode */ -QQuickTextNode::QQuickTextNode(QSGContext *context) - : m_context(context), m_cursorNode(0) +QQuickTextNode::QQuickTextNode(QSGContext *context, QQuickItem *ownerElement) + : m_context(context), m_cursorNode(0), m_ownerElement(ownerElement) { #if defined(QML_RUNTIME_TESTING) description = QLatin1String("text"); @@ -131,6 +131,7 @@ QSGGlyphNode *QQuickTextNode::addGlyphs(const QPointF &position, const QGlyphRun QSGNode *parentNode) { QSGGlyphNode *node = m_context->createGlyphNode(); + node->setOwnerElement(m_ownerElement); node->setGlyphs(position + QPointF(0, glyphs.rawFont().ascent()), glyphs); node->setStyle(style); node->setStyleColor(styleColor); diff --git a/src/quick/items/qquicktextnode_p.h b/src/quick/items/qquicktextnode_p.h index 6d407f0767..f64933b09f 100644 --- a/src/quick/items/qquicktextnode_p.h +++ b/src/quick/items/qquicktextnode_p.h @@ -74,7 +74,7 @@ public: }; Q_DECLARE_FLAGS(Decorations, Decoration) - QQuickTextNode(QSGContext *); + QQuickTextNode(QSGContext *, QQuickItem *ownerElement); ~QQuickTextNode(); static bool isComplexRichText(QTextDocument *); @@ -103,6 +103,7 @@ private: QSGContext *m_context; QSGSimpleRectNode *m_cursorNode; QList<QSGTexture *> m_textures; + QQuickItem *m_ownerElement; }; QT_END_NAMESPACE |