diff options
author | Konstantin Ritt <ritt.ks@gmail.com> | 2013-03-18 18:16:40 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-03-19 18:16:41 +0100 |
commit | 0654c066d9b67e5c261b708196096311d695adcd (patch) | |
tree | d5811e73376305520364c490d7b02458355ba917 /src/gui/text/qtextlayout.cpp | |
parent | bd8630763c407f723533e4f29f24647d96a79288 (diff) |
Move QTextEngine implementation details from QTextLayout
As of now, we'll have everything related to the additional formats handling
just in a single place. Make specialData private to prevent accessing it
from outside. This helped in tracking-down several related issues:
- in format(const QScriptItem *), the resolvedFormatIndices can not be empty
at that point, so the code path is dead;
- in resolveAdditionalFormats(), testing if formats has not been indexed yet
is not needed since they are indexed just in the setter;
- in useRawFont mode, hasFormats() didn't check if QTextEngine really
has some formats, which potentially leads to formatting artifacts.
Change-Id: Id4b912888fd5a1fa83f01007170134b6386e2879
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
Diffstat (limited to 'src/gui/text/qtextlayout.cpp')
-rw-r--r-- | src/gui/text/qtextlayout.cpp | 63 |
1 files changed, 9 insertions, 54 deletions
diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp index 50908f9908..eed6758cc9 100644 --- a/src/gui/text/qtextlayout.cpp +++ b/src/gui/text/qtextlayout.cpp @@ -463,24 +463,10 @@ const QTextOption &QTextLayout::textOption() const */ void QTextLayout::setPreeditArea(int position, const QString &text) { - if (text.isEmpty()) { - if (!d->specialData) - return; - if (d->specialData->addFormats.isEmpty()) { - delete d->specialData; - d->specialData = 0; - } else { - d->specialData->preeditText = QString(); - d->specialData->preeditPosition = -1; - } - } else { - if (!d->specialData) - d->specialData = new QTextEngine::SpecialData; - d->specialData->preeditPosition = position; - d->specialData->preeditText = text; - } - d->invalidate(); - d->clearLineData(); + if (d->preeditAreaPosition() == position && d->preeditAreaText() == text) + return; + d->setPreeditArea(position, text); + if (d->block.docHandle()) d->block.docHandle()->documentChange(d->block.position(), d->block.length()); } @@ -493,7 +479,7 @@ void QTextLayout::setPreeditArea(int position, const QString &text) */ int QTextLayout::preeditAreaPosition() const { - return d->specialData ? d->specialData->preeditPosition : -1; + return d->preeditAreaPosition(); } /*! @@ -503,7 +489,7 @@ int QTextLayout::preeditAreaPosition() const */ QString QTextLayout::preeditAreaText() const { - return d->specialData ? d->specialData->preeditText : QString(); + return d->preeditAreaText(); } @@ -515,27 +501,10 @@ QString QTextLayout::preeditAreaText() const */ void QTextLayout::setAdditionalFormats(const QList<FormatRange> &formatList) { - if (formatList.isEmpty()) { - if (!d->specialData) - return; - if (d->specialData->preeditText.isEmpty()) { - delete d->specialData; - d->specialData = 0; - } else { - d->specialData->addFormats = formatList; - d->specialData->addFormatIndices.clear(); - } - } else { - if (!d->specialData) { - d->specialData = new QTextEngine::SpecialData; - d->specialData->preeditPosition = -1; - } - d->specialData->addFormats = formatList; - d->indexAdditionalFormats(); - } + d->setAdditionalFormats(formatList); + if (d->block.docHandle()) d->block.docHandle()->documentChange(d->block.position(), d->block.length()); - d->resetFontEngineCache(); } /*! @@ -545,21 +514,7 @@ void QTextLayout::setAdditionalFormats(const QList<FormatRange> &formatList) */ QList<QTextLayout::FormatRange> QTextLayout::additionalFormats() const { - QList<FormatRange> formats; - if (!d->specialData) - return formats; - - formats = d->specialData->addFormats; - - if (d->specialData->addFormatIndices.isEmpty()) - return formats; - - const QTextFormatCollection *collection = d->formats(); - - for (int i = 0; i < d->specialData->addFormatIndices.count(); ++i) - formats[i].format = collection->charFormat(d->specialData->addFormatIndices.at(i)); - - return formats; + return d->additionalFormats(); } /*! |