diff options
Diffstat (limited to 'src/gui/text')
-rw-r--r-- | src/gui/text/qdistancefield.cpp | 10 | ||||
-rw-r--r-- | src/gui/text/qfont.h | 7 | ||||
-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/qtextengine_p.h | 17 | ||||
-rw-r--r-- | src/gui/text/qtextformat.cpp | 34 | ||||
-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 |
10 files changed, 84 insertions, 69 deletions
diff --git a/src/gui/text/qdistancefield.cpp b/src/gui/text/qdistancefield.cpp index 064c2aca7f..746200fd9c 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) { diff --git a/src/gui/text/qfont.h b/src/gui/text/qfont.h index 6f0dd27fbe..0f2bef9152 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, @@ -92,6 +93,7 @@ public: PreferVerticalHinting = 2, PreferFullHinting = 3 }; + Q_ENUM(HintingPreference) // Mapping OpenType weight value. enum Weight { @@ -105,12 +107,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 +128,7 @@ public: ExtraExpanded = 150, UltraExpanded = 200 }; + Q_ENUM(Stretch) enum Capitalization { MixedCase, @@ -132,11 +137,13 @@ public: SmallCaps, Capitalize }; + Q_ENUM(Capitalization) enum SpacingType { PercentageSpacing, AbsoluteSpacing }; + Q_ENUM(SpacingType) enum ResolveProperties { FamilyResolved = 0x0001, 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/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..1653ac8c33 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); } } 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>(); |