diff options
Diffstat (limited to 'src/gui/text')
-rw-r--r-- | src/gui/text/qdistancefield.cpp | 12 | ||||
-rw-r--r-- | src/gui/text/qfont.cpp | 5 | ||||
-rw-r--r-- | src/gui/text/qfont.h | 8 | ||||
-rw-r--r-- | src/gui/text/qfontengine.cpp | 4 | ||||
-rw-r--r-- | src/gui/text/qfontengine_p.h | 6 | ||||
-rw-r--r-- | src/gui/text/qfontmetrics.cpp | 2 | ||||
-rw-r--r-- | src/gui/text/qfontsubset.cpp | 8 | ||||
-rw-r--r-- | src/gui/text/qstatictext.h | 2 | ||||
-rw-r--r-- | src/gui/text/qtextdocument.cpp | 2 | ||||
-rw-r--r-- | src/gui/text/qtextdocument_p.cpp | 2 | ||||
-rw-r--r-- | src/gui/text/qtextengine.cpp | 87 | ||||
-rw-r--r-- | src/gui/text/qtextengine_p.h | 17 | ||||
-rw-r--r-- | src/gui/text/qtextformat.cpp | 40 | ||||
-rw-r--r-- | src/gui/text/qtexthtmlparser.cpp | 14 | ||||
-rw-r--r-- | src/gui/text/qtexthtmlparser_p.h | 1 | ||||
-rw-r--r-- | src/gui/text/qtextlayout.cpp | 58 | ||||
-rw-r--r-- | src/gui/text/qtextoption.cpp | 33 | ||||
-rw-r--r-- | src/gui/text/qtextoption.h | 14 |
18 files changed, 201 insertions, 114 deletions
diff --git a/src/gui/text/qdistancefield.cpp b/src/gui/text/qdistancefield.cpp index 064c2aca7f..af13b96c32 100644 --- a/src/gui/text/qdistancefield.cpp +++ b/src/gui/text/qdistancefield.cpp @@ -436,7 +436,7 @@ static void drawPolygons(qint32 *bits, int width, int height, const QPoint *vert const quint32 *indices, int indexCount, qint32 value) { Q_ASSERT(indexCount != 0); - typedef QVarLengthArray<quint8, 16> ScanLine; + typedef QVarLengthArray<quint16, 16> ScanLine; QVarLengthArray<ScanLine, 128> scans(height); int first = 0; for (int i = 1; i < indexCount; ++i) { @@ -461,16 +461,16 @@ static void drawPolygons(qint32 *bits, int width, int height, const QPoint *vert for (int y = fromY; y < toY; ++y) { quint32 c = quint32(x >> 8); if (c < quint32(width)) - scans[y].append(quint8(c)); + scans[y].append(quint16(c)); x += dx; } } for (int i = 0; i < height; ++i) { - quint8 *scanline = scans[i].data(); + quint16 *scanline = scans[i].data(); int size = scans[i].size(); for (int j = 1; j < size; ++j) { int k = j; - quint8 value = scanline[k]; + quint16 value = scanline[k]; for (; k != 0 && value < scanline[k - 1]; --k) scanline[k] = scanline[k - 1]; scanline[k] = value; @@ -478,7 +478,7 @@ static void drawPolygons(qint32 *bits, int width, int height, const QPoint *vert qint32 *line = bits + i * width; int j = 0; for (; j + 1 < size; j += 2) { - for (quint8 x = scanline[j]; x < scanline[j + 1]; ++x) + for (quint16 x = scanline[j]; x < scanline[j + 1]; ++x) line[x] = value; } if (j < size) { @@ -516,7 +516,7 @@ static void makeDistanceField(QDistanceFieldData *data, const QPainterPath &path for (int i = 0; i < imgWidth * imgHeight; ++i) bits[i] = exteriorColor; - const qreal angleStep = qreal(15 * 3.141592653589793238 / 180); + const qreal angleStep = qDegreesToRadians(qreal(15)); const QPoint rotation(qRound(qCos(angleStep) * 0x4000), qRound(qSin(angleStep) * 0x4000)); // 2:14 signed diff --git a/src/gui/text/qfont.cpp b/src/gui/text/qfont.cpp index 806ede88e2..438cd3de3a 100644 --- a/src/gui/text/qfont.cpp +++ b/src/gui/text/qfont.cpp @@ -1324,6 +1324,11 @@ QFont::StyleHint QFont::styleHint() const looking font that contains the character. The NoFontMerging flag disables this feature. Please note that enabling this flag will not prevent Qt from automatically picking a suitable font when the selected font does not support the writing system of the text. + \value PreferNoShaping Sometimes, a font will apply complex rules to a set of characters in + order to display them correctly. In some writing systems, such as Brahmic scripts, this is + required in order for the text to be legible, but in e.g. Latin script, it is merely + a cosmetic feature. The PreferNoShaping flag will disable all such features when they + are not required, which will improve performance in most cases. Any of these may be OR-ed with one of these flags: diff --git a/src/gui/text/qfont.h b/src/gui/text/qfont.h index 6f0dd27fbe..9c250c82c3 100644 --- a/src/gui/text/qfont.h +++ b/src/gui/text/qfont.h @@ -68,6 +68,7 @@ public: Monospace, Fantasy }; + Q_ENUM(StyleHint) enum StyleStrategy { PreferDefault = 0x0001, @@ -82,6 +83,7 @@ public: OpenGLCompatible = 0x0200, ForceIntegerMetrics = 0x0400, NoSubpixelAntialias = 0x0800, + PreferNoShaping = 0x1000, NoFontMerging = 0x8000 }; Q_ENUM(StyleStrategy) @@ -92,6 +94,7 @@ public: PreferVerticalHinting = 2, PreferFullHinting = 3 }; + Q_ENUM(HintingPreference) // Mapping OpenType weight value. enum Weight { @@ -105,12 +108,14 @@ public: ExtraBold = 81, // 800 Black = 87 // 900 }; + Q_ENUM(Weight) enum Style { StyleNormal, StyleItalic, StyleOblique }; + Q_ENUM(Style) enum Stretch { AnyStretch = 0, @@ -124,6 +129,7 @@ public: ExtraExpanded = 150, UltraExpanded = 200 }; + Q_ENUM(Stretch) enum Capitalization { MixedCase, @@ -132,11 +138,13 @@ public: SmallCaps, Capitalize }; + Q_ENUM(Capitalization) enum SpacingType { PercentageSpacing, AbsoluteSpacing }; + Q_ENUM(SpacingType) enum ResolveProperties { FamilyResolved = 0x0001, diff --git a/src/gui/text/qfontengine.cpp b/src/gui/text/qfontengine.cpp index 596c79fd05..e4f9b8b9d4 100644 --- a/src/gui/text/qfontengine.cpp +++ b/src/gui/text/qfontengine.cpp @@ -359,10 +359,8 @@ bool QFontEngine::supportsScript(QChar::Script script) const // ### TODO: This only works for scripts that require OpenType. More generally // for scripts that do not require OpenType we should just look at the list of // supported writing systems in the font's OS/2 table. - if (!((script >= QChar::Script_Syriac && script <= QChar::Script_Sinhala) - || script == QChar::Script_Khmer || script == QChar::Script_Nko)) { + if (!scriptRequiresOpenType(script)) return true; - } #if QT_CONFIG(harfbuzz) if (qt_useHarfbuzzNG()) { diff --git a/src/gui/text/qfontengine_p.h b/src/gui/text/qfontengine_p.h index 514e9424b2..1ae2e86a93 100644 --- a/src/gui/text/qfontengine_p.h +++ b/src/gui/text/qfontengine_p.h @@ -242,6 +242,12 @@ public: void *harfbuzzFace() const; bool supportsScript(QChar::Script script) const; + inline static bool scriptRequiresOpenType(QChar::Script script) + { + return ((script >= QChar::Script_Syriac && script <= QChar::Script_Sinhala) + || script == QChar::Script_Khmer || script == QChar::Script_Nko); + } + virtual int getPointInOutline(glyph_t glyph, int flags, quint32 point, QFixed *xpos, QFixed *ypos, quint32 *nPoints); void clearGlyphCache(const void *key); diff --git a/src/gui/text/qfontmetrics.cpp b/src/gui/text/qfontmetrics.cpp index 8067969f56..5675d6921d 100644 --- a/src/gui/text/qfontmetrics.cpp +++ b/src/gui/text/qfontmetrics.cpp @@ -541,6 +541,7 @@ int QFontMetrics::width(const QString &text, int len, int flags) const if (len == 0) return 0; +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) if (flags & Qt::TextBypassShaping) { // Skip complex shaping, only use advances int numGlyphs = len; @@ -554,6 +555,7 @@ int QFontMetrics::width(const QString &text, int len, int flags) const width += glyphs.advances[i]; return qRound(width); } +#endif QStackTextEngine layout(text, QFont(d.data())); return qRound(layout.width(0, len)); diff --git a/src/gui/text/qfontsubset.cpp b/src/gui/text/qfontsubset.cpp index 92eeaf7919..f5fc562e13 100644 --- a/src/gui/text/qfontsubset.cpp +++ b/src/gui/text/qfontsubset.cpp @@ -136,7 +136,7 @@ QByteArray QFontSubset::widthArray() const QByteArray width; QPdf::ByteStream s(&width); - QFixed scale = QFixed(1000)/emSquare; + const qreal scale = 1000.0/emSquare.toInt(); QFixed defWidth = widths[0]; //qDebug("defWidth=%d, scale=%f", defWidth.toInt(), scale.toReal()); @@ -145,7 +145,7 @@ QByteArray QFontSubset::widthArray() const defWidth = 0; } if (defWidth > 0) { - s << "/DW " << (defWidth*scale).toInt(); + s << "/DW " << qRound(defWidth.toInt() * scale); } else { s << "/W ["; for (int g = 0; g < nGlyphs();) { @@ -174,11 +174,11 @@ QByteArray QFontSubset::widthArray() const if (endnonlinear > start) { s << start << '['; for (int i = start; i < endnonlinear; ++i) - s << (widths[i]*scale).toInt(); + s << qRound(widths[i].toInt() * scale); s << "]\n"; } if (startLinear) - s << startLinear << g - 1 << (widths[startLinear]*scale).toInt() << '\n'; + s << startLinear << g - 1 << qRound(widths[startLinear].toInt() * scale) << '\n'; } s << "]\n"; } diff --git a/src/gui/text/qstatictext.h b/src/gui/text/qstatictext.h index 00dfccc144..e6a196d865 100644 --- a/src/gui/text/qstatictext.h +++ b/src/gui/text/qstatictext.h @@ -62,7 +62,7 @@ public: }; QStaticText(); - QStaticText(const QString &text); + explicit QStaticText(const QString &text); QStaticText(const QStaticText &other); #ifdef Q_COMPILER_RVALUE_REFS QStaticText &operator=(QStaticText &&other) Q_DECL_NOTHROW { swap(other); return *this; } diff --git a/src/gui/text/qtextdocument.cpp b/src/gui/text/qtextdocument.cpp index f8215f92e9..db0650d154 100644 --- a/src/gui/text/qtextdocument.cpp +++ b/src/gui/text/qtextdocument.cpp @@ -71,7 +71,7 @@ QT_BEGIN_NAMESPACE -Q_CORE_EXPORT unsigned int qt_int_sqrt(unsigned int n); +Q_CORE_EXPORT Q_DECL_CONST_FUNCTION unsigned int qt_int_sqrt(unsigned int n); /*! Returns \c true if the string \a text is likely to be rich text; diff --git a/src/gui/text/qtextdocument_p.cpp b/src/gui/text/qtextdocument_p.cpp index 7341fa8e83..66e038122c 100644 --- a/src/gui/text/qtextdocument_p.cpp +++ b/src/gui/text/qtextdocument_p.cpp @@ -203,7 +203,7 @@ QTextDocumentPrivate::QTextDocumentPrivate() inContentsChange = false; blockCursorAdjustment = false; - defaultTextOption.setTabStop(80); // same as in qtextengine.cpp + defaultTextOption.setTabStopDistance(80); // same as in qtextengine.cpp defaultTextOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); defaultCursorMoveStyle = Qt::LogicalMoveStyle; diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp index 4d24fb50af..faddb3552d 100644 --- a/src/gui/text/qtextengine.cpp +++ b/src/gui/text/qtextengine.cpp @@ -1005,20 +1005,53 @@ void QTextEngine::shapeText(int item) const QFontEngine *fontEngine = this->fontEngine(si, &si.ascent, &si.descent, &si.leading); + bool kerningEnabled; + bool letterSpacingIsAbsolute; + bool shapingEnabled; + QFixed letterSpacing, wordSpacing; +#ifndef QT_NO_RAWFONT + if (useRawFont) { + QTextCharFormat f = format(&si); + kerningEnabled = f.fontKerning(); + shapingEnabled = QFontEngine::scriptRequiresOpenType(QChar::Script(si.analysis.script)) + || (f.fontStyleStrategy() & QFont::PreferNoShaping) == 0; + wordSpacing = QFixed::fromReal(f.fontWordSpacing()); + letterSpacing = QFixed::fromReal(f.fontLetterSpacing()); + letterSpacingIsAbsolute = true; + } else +#endif + { + QFont font = this->font(si); + kerningEnabled = font.d->kerning; + shapingEnabled = QFontEngine::scriptRequiresOpenType(QChar::Script(si.analysis.script)) + || (font.d->request.styleStrategy & QFont::PreferNoShaping) == 0; + letterSpacingIsAbsolute = font.d->letterSpacingIsAbsolute; + letterSpacing = font.d->letterSpacing; + wordSpacing = font.d->wordSpacing; + + if (letterSpacingIsAbsolute && letterSpacing.value()) + letterSpacing *= font.d->dpi / qt_defaultDpiY(); + } + // split up the item into parts that come from different font engines // k * 3 entries, array[k] == index in string, array[k + 1] == index in glyphs, array[k + 2] == engine index QVector<uint> itemBoundaries; itemBoundaries.reserve(24); - if (fontEngine->type() == QFontEngine::Multi) { + + QGlyphLayout initialGlyphs = availableGlyphs(&si); + int nGlyphs = initialGlyphs.numGlyphs; + if (fontEngine->type() == QFontEngine::Multi || !shapingEnabled) { // ask the font engine to find out which glyphs (as an index in the specific font) // to use for the text in one item. - QGlyphLayout initialGlyphs = availableGlyphs(&si); - - int nGlyphs = initialGlyphs.numGlyphs; - QFontEngine::ShaperFlags shaperFlags(QFontEngine::GlyphIndicesOnly); + QFontEngine::ShaperFlags shaperFlags = + shapingEnabled + ? QFontEngine::GlyphIndicesOnly + : QFontEngine::ShaperFlag(0); if (!fontEngine->stringToCMap(reinterpret_cast<const QChar *>(string), itemLength, &initialGlyphs, &nGlyphs, shaperFlags)) Q_UNREACHABLE(); + } + if (fontEngine->type() == QFontEngine::Multi) { uint lastEngine = ~0u; for (int i = 0, glyph_pos = 0; i < itemLength; ++i, ++glyph_pos) { const uint engineIdx = initialGlyphs.glyphs[glyph_pos] >> 24; @@ -1046,35 +1079,29 @@ void QTextEngine::shapeText(int item) const itemBoundaries.append(0); } - bool kerningEnabled; - bool letterSpacingIsAbsolute; - QFixed letterSpacing, wordSpacing; -#ifndef QT_NO_RAWFONT - if (useRawFont) { - QTextCharFormat f = format(&si); - kerningEnabled = f.fontKerning(); - wordSpacing = QFixed::fromReal(f.fontWordSpacing()); - letterSpacing = QFixed::fromReal(f.fontLetterSpacing()); - letterSpacingIsAbsolute = true; - } else -#endif - { - QFont font = this->font(si); - kerningEnabled = font.d->kerning; - letterSpacingIsAbsolute = font.d->letterSpacingIsAbsolute; - letterSpacing = font.d->letterSpacing; - wordSpacing = font.d->wordSpacing; + if (Q_UNLIKELY(!shapingEnabled)) { + ushort *log_clusters = logClusters(&si); - if (letterSpacingIsAbsolute && letterSpacing.value()) - letterSpacing *= font.d->dpi / qt_defaultDpiY(); - } + int glyph_pos = 0; + for (int i = 0; i < itemLength; ++i, ++glyph_pos) { + log_clusters[i] = glyph_pos; + initialGlyphs.attributes[glyph_pos].clusterStart = true; + if (QChar::isHighSurrogate(string[i]) + && i + 1 < itemLength + && QChar::isLowSurrogate(string[i + 1])) { + ++i; + log_clusters[i] = glyph_pos; + } + } + si.num_glyphs = glyph_pos; #if QT_CONFIG(harfbuzz) - if (Q_LIKELY(qt_useHarfbuzzNG())) + } else if (Q_LIKELY(qt_useHarfbuzzNG())) { si.num_glyphs = shapeTextWithHarfbuzzNG(si, string, itemLength, fontEngine, itemBoundaries, kerningEnabled, letterSpacing != 0); - else #endif - si.num_glyphs = shapeTextWithHarfbuzz(si, string, itemLength, fontEngine, itemBoundaries, kerningEnabled); + } else { + si.num_glyphs = shapeTextWithHarfbuzz(si, string, itemLength, fontEngine, itemBoundaries, kerningEnabled); + } if (Q_UNLIKELY(si.num_glyphs == 0)) { Q_UNREACHABLE(); // ### report shaping errors somehow return; @@ -3016,7 +3043,7 @@ QFixed QTextEngine::calculateTabWidth(int item, QFixed x) const } } } - QFixed tab = QFixed::fromReal(option.tabStop()); + QFixed tab = QFixed::fromReal(option.tabStopDistance()); if (tab <= 0) tab = 80; // default tab *= dpiScale; diff --git a/src/gui/text/qtextengine_p.h b/src/gui/text/qtextengine_p.h index f49e2638f5..89f1328241 100644 --- a/src/gui/text/qtextengine_p.h +++ b/src/gui/text/qtextengine_p.h @@ -323,13 +323,9 @@ public: QFontEngine *fontEngine; }; -struct Q_AUTOTEST_EXPORT QScriptItem +struct QScriptItem { - inline QScriptItem() - : position(0), - num_glyphs(0), descent(-1), ascent(-1), leading(-1), width(-1), - glyph_data_offset(0) {} - inline QScriptItem(int p, const QScriptAnalysis &a) + Q_DECL_CONSTEXPR QScriptItem(int p, QScriptAnalysis a) Q_DECL_NOTHROW : position(p), analysis(a), num_glyphs(0), descent(-1), ascent(-1), leading(-1), width(-1), glyph_data_offset(0) {} @@ -342,11 +338,12 @@ struct Q_AUTOTEST_EXPORT QScriptItem QFixed leading; QFixed width; int glyph_data_offset; - QFixed height() const { return ascent + descent; } + Q_DECL_CONSTEXPR QFixed height() const Q_DECL_NOTHROW { return ascent + descent; } +private: + friend class QVector<QScriptItem>; + QScriptItem() {}; // for QVector, don't use }; - - -Q_DECLARE_TYPEINFO(QScriptItem, Q_MOVABLE_TYPE); +Q_DECLARE_TYPEINFO(QScriptItem, Q_PRIMITIVE_TYPE); typedef QVector<QScriptItem> QScriptItemArray; diff --git a/src/gui/text/qtextformat.cpp b/src/gui/text/qtextformat.cpp index 36e0a77bd0..8fe474af2c 100644 --- a/src/gui/text/qtextformat.cpp +++ b/src/gui/text/qtextformat.cpp @@ -164,24 +164,25 @@ QDataStream &operator>>(QDataStream &stream, QTextLength &length) } #endif // QT_NO_DATASTREAM -class QTextFormatPrivate : public QSharedData +namespace { +struct Property { -public: - QTextFormatPrivate() : hashDirty(true), fontDirty(true), hashValue(0) {} + inline Property(qint32 k, const QVariant &v) : key(k), value(v) {} + inline Property() {} - struct Property - { - inline Property(qint32 k, const QVariant &v) : key(k), value(v) {} - inline Property() {} + qint32 key = -1; + QVariant value; - qint32 key; - QVariant value; + inline bool operator==(const Property &other) const + { return key == other.key && value == other.value; } +}; +} +Q_DECLARE_TYPEINFO(Property, Q_MOVABLE_TYPE); - inline bool operator==(const Property &other) const - { return key == other.key && value == other.value; } - inline bool operator!=(const Property &other) const - { return key != other.key || value != other.value; } - }; +class QTextFormatPrivate : public QSharedData +{ +public: + QTextFormatPrivate() : hashDirty(true), fontDirty(true), hashValue(0) {} inline uint hash() const { @@ -263,7 +264,6 @@ private: friend QDataStream &operator<<(QDataStream &, const QTextFormat &); friend QDataStream &operator>>(QDataStream &, QTextFormat &); }; -Q_DECLARE_TYPEINFO(QTextFormatPrivate::Property, Q_MOVABLE_TYPE); static inline uint hash(const QColor &color) { @@ -845,10 +845,10 @@ void QTextFormat::merge(const QTextFormat &other) QTextFormatPrivate *d = this->d; - const QVector<QTextFormatPrivate::Property> &otherProps = other.d->props; + const QVector<QT_PREPEND_NAMESPACE(Property)> &otherProps = other.d->props; d->props.reserve(d->props.size() + otherProps.size()); for (int i = 0; i < otherProps.count(); ++i) { - const QTextFormatPrivate::Property &p = otherProps.at(i); + const QT_PREPEND_NAMESPACE(Property) &p = otherProps.at(i); d->insertProperty(p.key, p.value); } } @@ -1333,9 +1333,9 @@ bool QTextFormat::operator==(const QTextFormat &rhs) const \value DashDotLine Dashs and dots are drawn using Qt::DashDotLine. \value DashDotDotLine Underlines draw drawn using Qt::DashDotDotLine. \value WaveUnderline The text is underlined using a wave shaped line. - \value SpellCheckUnderline The underline is drawn depending on the QStyle::SH_SpellCeckUnderlineStyle - style hint of the QApplication style. By default this is mapped to - WaveUnderline, on \macos it is mapped to DashDotLine. + \value SpellCheckUnderline The underline is drawn depending on the SpellCheckUnderlineStyle + theme hint of QPlatformTheme. By default this is mapped to + WaveUnderline, on \macos it is mapped to DotLine. \sa Qt::PenStyle */ diff --git a/src/gui/text/qtexthtmlparser.cpp b/src/gui/text/qtexthtmlparser.cpp index da4e21728f..be10efad8d 100644 --- a/src/gui/text/qtexthtmlparser.cpp +++ b/src/gui/text/qtexthtmlparser.cpp @@ -493,7 +493,7 @@ static QString quoteNewline(const QString &s) QTextHtmlParserNode::QTextHtmlParserNode() : parent(0), id(Html_unknown), - cssFloat(QTextFrameFormat::InFlow), hasOwnListStyle(false), hasOwnLineHeightType(false), + cssFloat(QTextFrameFormat::InFlow), hasOwnListStyle(false), hasOwnLineHeightType(false), hasLineHeightMultiplier(false), hasCssListIndent(false), isEmptyParagraph(false), isTextFrame(false), isRootFrame(false), displayMode(QTextHtmlElement::DisplayInline), hasHref(false), listStyle(QTextListFormat::ListStyleUndefined), imageWidth(-1), imageHeight(-1), tableBorder(0), @@ -1216,6 +1216,11 @@ void QTextHtmlParserNode::applyCssDeclarations(const QVector<QCss::Declaration> else lineHeightType = QTextBlockFormat::SingleHeight; + if (hasLineHeightMultiplier) { + qreal lineHeight = blockFormat.lineHeight() / 100.0; + blockFormat.setProperty(QTextBlockFormat::LineHeight, lineHeight); + } + blockFormat.setProperty(QTextBlockFormat::LineHeightType, lineHeightType); hasOwnLineHeightType = true; } @@ -1227,9 +1232,14 @@ void QTextHtmlParserNode::applyCssDeclarations(const QVector<QCss::Declaration> lineHeightType = QTextBlockFormat::MinimumHeight; } else { bool ok; - QString value = decl.d->values.first().toString(); + QCss::Value cssValue = decl.d->values.first(); + QString value = cssValue.toString(); lineHeight = value.toDouble(&ok); if (ok) { + if (!hasOwnLineHeightType && cssValue.type == QCss::Value::Number) { + lineHeight *= 100.0; + hasLineHeightMultiplier = true; + } lineHeightType = QTextBlockFormat::ProportionalHeight; } else { lineHeight = 0.0; diff --git a/src/gui/text/qtexthtmlparser_p.h b/src/gui/text/qtexthtmlparser_p.h index 77bfa685c0..73dac38b82 100644 --- a/src/gui/text/qtexthtmlparser_p.h +++ b/src/gui/text/qtexthtmlparser_p.h @@ -173,6 +173,7 @@ struct QTextHtmlParserNode { uint cssFloat : 2; uint hasOwnListStyle : 1; uint hasOwnLineHeightType : 1; + uint hasLineHeightMultiplier : 1; uint hasCssListIndent : 1; uint isEmptyParagraph : 1; uint isTextFrame : 1; diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp index cc91c107f9..066f258ea3 100644 --- a/src/gui/text/qtextlayout.cpp +++ b/src/gui/text/qtextlayout.cpp @@ -167,7 +167,7 @@ QRectF QTextInlineObject::rect() const */ qreal QTextInlineObject::width() const { - return eng->layoutData->items[itm].width.toReal(); + return eng->layoutData->items.at(itm).width.toReal(); } /*! @@ -177,7 +177,7 @@ qreal QTextInlineObject::width() const */ qreal QTextInlineObject::ascent() const { - return eng->layoutData->items[itm].ascent.toReal(); + return eng->layoutData->items.at(itm).ascent.toReal(); } /*! @@ -187,7 +187,7 @@ qreal QTextInlineObject::ascent() const */ qreal QTextInlineObject::descent() const { - return eng->layoutData->items[itm].descent.toReal(); + return eng->layoutData->items.at(itm).descent.toReal(); } /*! @@ -198,7 +198,7 @@ qreal QTextInlineObject::descent() const */ qreal QTextInlineObject::height() const { - return eng->layoutData->items[itm].height().toReal(); + return eng->layoutData->items.at(itm).height().toReal(); } /*! @@ -924,7 +924,7 @@ QRectF QTextLayout::boundingRect() const QFixed ymin = d->lines.at(0).y; for (int i = 0; i < d->lines.size(); ++i) { - const QScriptLine &si = d->lines[i]; + const QScriptLine &si = d->lines.at(i); xmin = qMin(xmin, si.x); ymin = qMin(ymin, si.y); QFixed lineWidth = si.width < QFIXED_MAX ? qMax(si.width, si.textWidth) : si.textWidth; @@ -1052,9 +1052,9 @@ QList<QGlyphRun> QTextLayout::glyphRuns(int from, int length) const QHash<QPair<QFontEngine *, int>, QGlyphRun> glyphRunHash; for (int i=0; i<d->lines.size(); ++i) { - if (d->lines[i].from > from + length) + if (d->lines.at(i).from > from + length) break; - else if (d->lines[i].from + d->lines[i].length >= from) { + else if (d->lines.at(i).from + d->lines[i].length >= from) { QList<QGlyphRun> glyphRuns = QTextLine(i, d).glyphRuns(from, length); for (int j = 0; j < glyphRuns.size(); j++) { @@ -1115,7 +1115,7 @@ void QTextLayout::draw(QPainter *p, const QPointF &pos, const QVector<FormatRang int lastLine = d->lines.size(); for (int i = 0; i < d->lines.size(); ++i) { QTextLine l(i, d); - const QScriptLine &sl = d->lines[i]; + const QScriptLine &sl = d->lines.at(i); if (sl.y > clipe) { lastLine = i; @@ -1137,7 +1137,7 @@ void QTextLayout::draw(QPainter *p, const QPointF &pos, const QVector<FormatRang region.setFillRule(Qt::WindingFill); for (int line = firstLine; line < lastLine; ++line) { - const QScriptLine &sl = d->lines[line]; + const QScriptLine &sl = d->lines.at(line); QTextLine tl(line, d); QRectF lineRect(tl.naturalTextRect()); @@ -1302,7 +1302,7 @@ void QTextLayout::drawCursor(QPainter *p, const QPointF &pos, int cursorPosition return; QTextLine l(line, d); - const QScriptLine &sl = d->lines[line]; + const QScriptLine &sl = d->lines.at(line); qreal x = position.x() + l.cursorToX(cursorPosition); @@ -1415,7 +1415,7 @@ void QTextLayout::drawCursor(QPainter *p, const QPointF &pos, int cursorPosition */ QRectF QTextLine::rect() const { - const QScriptLine& sl = eng->lines[index]; + const QScriptLine& sl = eng->lines.at(index); return QRectF(sl.x.toReal(), sl.y.toReal(), sl.width.toReal(), sl.height().toReal()); } @@ -1424,7 +1424,7 @@ QRectF QTextLine::rect() const */ QRectF QTextLine::naturalTextRect() const { - const QScriptLine& sl = eng->lines[index]; + const QScriptLine& sl = eng->lines.at(index); QFixed x = sl.x + eng->alignLine(sl); QFixed width = sl.textWidth; @@ -1441,7 +1441,7 @@ QRectF QTextLine::naturalTextRect() const */ qreal QTextLine::x() const { - return eng->lines[index].x.toReal(); + return eng->lines.at(index).x.toReal(); } /*! @@ -1451,7 +1451,7 @@ qreal QTextLine::x() const */ qreal QTextLine::y() const { - return eng->lines[index].y.toReal(); + return eng->lines.at(index).y.toReal(); } /*! @@ -1461,7 +1461,7 @@ qreal QTextLine::y() const */ qreal QTextLine::width() const { - return eng->lines[index].width.toReal(); + return eng->lines.at(index).width.toReal(); } @@ -1472,7 +1472,7 @@ qreal QTextLine::width() const */ qreal QTextLine::ascent() const { - return eng->lines[index].ascent.toReal(); + return eng->lines.at(index).ascent.toReal(); } /*! @@ -1482,7 +1482,7 @@ qreal QTextLine::ascent() const */ qreal QTextLine::descent() const { - return eng->lines[index].descent.toReal(); + return eng->lines.at(index).descent.toReal(); } /*! @@ -1494,7 +1494,7 @@ qreal QTextLine::descent() const */ qreal QTextLine::height() const { - return eng->lines[index].height().ceil().toReal(); + return eng->lines.at(index).height().ceil().toReal(); } /*! @@ -1506,7 +1506,7 @@ qreal QTextLine::height() const */ qreal QTextLine::leading() const { - return eng->lines[index].leading.toReal(); + return eng->lines.at(index).leading.toReal(); } /*! @@ -1541,7 +1541,7 @@ void QTextLine::setLeadingIncluded(bool included) */ bool QTextLine::leadingIncluded() const { - return eng->lines[index].leadingIncluded; + return eng->lines.at(index).leadingIncluded; } /*! @@ -1551,7 +1551,7 @@ bool QTextLine::leadingIncluded() const */ qreal QTextLine::naturalTextWidth() const { - return eng->lines[index].textWidth.toReal(); + return eng->lines.at(index).textWidth.toReal(); } /*! @@ -1566,7 +1566,7 @@ qreal QTextLine::naturalTextWidth() const */ qreal QTextLine::horizontalAdvance() const { - return eng->lines[index].textAdvance.toReal(); + return eng->lines.at(index).textAdvance.toReal(); } /*! @@ -1832,7 +1832,7 @@ void QTextLine::layout_helper(int maxGlyphs) lbh.softHyphenWidth = 0; if (newItem != item) { item = newItem; - const QScriptItem ¤t = eng->layoutData->items[item]; + const QScriptItem ¤t = eng->layoutData->items.at(item); if (!current.num_glyphs) { eng->shape(item); attributes = eng->attributes(); @@ -1850,7 +1850,7 @@ void QTextLine::layout_helper(int maxGlyphs) QFixed::fromReal(fontEngine->minRightBearing())); } } - const QScriptItem ¤t = eng->layoutData->items[item]; + const QScriptItem ¤t = eng->layoutData->items.at(item); lbh.tmpData.leading = qMax(lbh.tmpData.leading + lbh.tmpData.ascent, current.leading + current.ascent) - qMax(lbh.tmpData.ascent, @@ -2093,7 +2093,7 @@ void QTextLine::setPosition(const QPointF &pos) */ QPointF QTextLine::position() const { - return QPointF(eng->lines[index].x.toReal(), eng->lines[index].y.toReal()); + return QPointF(eng->lines.at(index).x.toReal(), eng->lines.at(index).y.toReal()); } // ### DOC: I have no idea what this means/does. @@ -2109,7 +2109,7 @@ QPointF QTextLine::position() const */ int QTextLine::textStart() const { - return eng->lines[index].from; + return eng->lines.at(index).from; } /*! @@ -2121,9 +2121,9 @@ int QTextLine::textLength() const { if (eng->option.flags() & QTextOption::ShowLineAndParagraphSeparators && eng->block.isValid() && index == eng->lines.count()-1) { - return eng->lines[index].length - 1; + return eng->lines.at(index).length - 1; } - return eng->lines[index].length + eng->lines[index].trailingSpaces; + return eng->lines.at(index).length + eng->lines.at(index).trailingSpaces; } static void setPenAndDrawBackground(QPainter *p, const QPen &defaultPen, const QTextCharFormat &chf, const QRectF &r) @@ -2247,7 +2247,7 @@ static QGlyphRun glyphRunWithInfo(QFontEngine *fontEngine, */ QList<QGlyphRun> QTextLine::glyphRuns(int from, int length) const { - const QScriptLine &line = eng->lines[index]; + const QScriptLine &line = eng->lines.at(index); if (line.length == 0) return QList<QGlyphRun>(); diff --git a/src/gui/text/qtextoption.cpp b/src/gui/text/qtextoption.cpp index 87e31eeb2c..2a16f50f33 100644 --- a/src/gui/text/qtextoption.cpp +++ b/src/gui/text/qtextoption.cpp @@ -144,7 +144,7 @@ QTextOption &QTextOption::operator=(const QTextOption &o) Sets the tab positions for the text layout to those specified by \a tabStops. - \sa tabArray(), setTabStop(), setTabs() + \sa tabArray(), setTabStopDistance(), setTabs() */ void QTextOption::setTabArray(const QList<qreal> &tabStops) { @@ -332,22 +332,45 @@ QList<QTextOption::Tab> QTextOption::tabs() const \sa flags() */ +#if QT_DEPRECATED_SINCE(5, 10) /*! \fn qreal QTextOption::tabStop() const + \deprecated in Qt 5.10. Use tabStopDistance() instead. Returns the distance in device units between tab stops. Convenient function for the above method - \sa setTabStop(), tabArray(), setTabs(), tabs() + \sa setTabStopDistance(), tabArray(), setTabs(), tabs() */ /*! \fn void QTextOption::setTabStop(qreal tabStop) + \deprecated in Qt 5.10. Use setTabStopDistance() instead. Sets the default distance in device units between tab stops to the value specified by \a tabStop. - \sa tabStop(), setTabArray(), setTabs(), tabs() + \sa tabStopDistance(), setTabArray(), setTabs(), tabs() +*/ +#endif + +/*! + \fn qreal QTextOption::tabStopDistance() const + \since 5.10 + + Returns the distance in device units between tab stops. + + \sa setTabStopDistance(), tabArray(), setTabs(), tabs() +*/ + +/*! + \fn void QTextOption::setTabStopDistance(qreal tabStopDistance) + \since 5.10 + + Sets the default distance in device units between tab stops to the value specified + by \a tabStopDistance. + + \sa tabStopDistance(), setTabArray(), setTabs(), tabs() */ /*! @@ -426,7 +449,7 @@ QList<QTextOption::Tab> QTextOption::tabs() const \fn void setTabs(const QList<Tab> &tabStops) Set the Tab properties to \a tabStops. - \sa tabStop(), tabs() + \sa tabStopDistance(), tabs() */ /*! @@ -434,7 +457,7 @@ QList<QTextOption::Tab> QTextOption::tabs() const \fn QList<QTextOption::Tab> QTextOption::tabs() const Returns a list of tab positions defined for the text layout. - \sa tabStop(), setTabs(), setTabStop() + \sa tabStopDistance(), setTabs(), setTabStop() */ diff --git a/src/gui/text/qtextoption.h b/src/gui/text/qtextoption.h index 9ef9cee9bb..8b57278633 100644 --- a/src/gui/text/qtextoption.h +++ b/src/gui/text/qtextoption.h @@ -117,8 +117,13 @@ public: inline void setFlags(Flags flags); inline Flags flags() const { return Flags(f); } - inline void setTabStop(qreal tabStop); - inline qreal tabStop() const { return tab; } +#if QT_DEPRECATED_SINCE(5, 10) + QT_DEPRECATED inline void setTabStop(qreal tabStop); + QT_DEPRECATED inline qreal tabStop() const { return tabStopDistance(); } +#endif + + inline void setTabStopDistance(qreal tabStopDistance); + inline qreal tabStopDistance() const { return tab; } void setTabArray(const QList<qreal> &tabStops); QList<qreal> tabArray() const; @@ -149,7 +154,12 @@ inline void QTextOption::setAlignment(Qt::Alignment aalignment) inline void QTextOption::setFlags(Flags aflags) { f = aflags; } +#if QT_DEPRECATED_SINCE(5, 10) inline void QTextOption::setTabStop(qreal atabStop) +{ setTabStopDistance(atabStop); } +#endif + +inline void QTextOption::setTabStopDistance(qreal atabStop) { tab = atabStop; } QT_END_NAMESPACE |