diff options
author | Thiago Macieira <thiago.macieira@nokia.com> | 2010-07-15 15:16:42 (GMT) |
---|---|---|
committer | Thiago Macieira <thiago.macieira@nokia.com> | 2010-07-15 15:16:42 (GMT) |
commit | 4e0d2169790f91348c59432f651878e604923dae (patch) | |
tree | 157936b07bdcda675741f689d570db543dac4302 /src/gui/text | |
parent | 8106f716043c22d71ff3dcdf9cd8a4db258fa81f (diff) | |
parent | 84f984b24400aed7cc72fdf432a076f98bc142a2 (diff) | |
download | Qt-4e0d2169790f91348c59432f651878e604923dae.zip Qt-4e0d2169790f91348c59432f651878e604923dae.tar.gz Qt-4e0d2169790f91348c59432f651878e604923dae.tar.bz2 |
Merge remote branch 'origin/master' into qt-master-from-4.7
Conflicts:
src/opengl/qgl_p.h
Diffstat (limited to 'src/gui/text')
-rw-r--r-- | src/gui/text/qtextlayout.cpp | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp index 3bad6a5..43900c0 100644 --- a/src/gui/text/qtextlayout.cpp +++ b/src/gui/text/qtextlayout.cpp @@ -2183,13 +2183,15 @@ static void setPenAndDrawBackground(QPainter *p, const QPen &defaultPen, const Q namespace { struct GlyphInfo { - GlyphInfo(const QGlyphLayout &layout, const QPointF &position) - : glyphLayout(layout), itemPosition(position) + GlyphInfo(const QGlyphLayout &layout, const QPointF &position, + const QTextItemInt::RenderFlags &renderFlags) + : glyphLayout(layout), itemPosition(position), flags(renderFlags) { } QGlyphLayout glyphLayout; QPointF itemPosition; + QTextItem::RenderFlags flags; }; } @@ -2218,6 +2220,17 @@ QList<QGlyphs> QTextLine::glyphs() const QPointF pos(iterator.x.toReal(), y); QFont font = eng->font(si); + + QTextItem::RenderFlags flags; + if (font.overline()) + flags |= QTextItem::Overline; + if (font.underline()) + flags |= QTextItem::Underline; + if (font.strikeOut()) + flags |= QTextItem::StrikeOut; + if (si.analysis.bidiLevel % 2) + flags |= QTextItem::RightToLeft; + QGlyphLayout glyphLayout = eng->shapedGlyphs(&si).mid(iterator.glyphsStart, iterator.glyphsEnd - iterator.glyphsStart); @@ -2235,7 +2248,7 @@ QList<QGlyphs> QTextLine::glyphs() const QGlyphLayout subLayout = glyphLayout.mid(start, end - start); glyphLayoutHash.insertMulti(multiFontEngine->engine(which), - GlyphInfo(subLayout, pos)); + GlyphInfo(subLayout, pos, flags)); start = end; which = e; @@ -2243,16 +2256,16 @@ QList<QGlyphs> QTextLine::glyphs() const QGlyphLayout subLayout = glyphLayout.mid(start, end - start); glyphLayoutHash.insertMulti(multiFontEngine->engine(which), - GlyphInfo(subLayout, pos)); + GlyphInfo(subLayout, pos, flags)); } else { glyphLayoutHash.insertMulti(mainFontEngine, - GlyphInfo(glyphLayout, pos)); + GlyphInfo(glyphLayout, pos, flags)); } } } - QHash<QFontEngine *, QGlyphs> glyphsHash; + QHash<QPair<QFontEngine *, int>, QGlyphs> glyphsHash; QList<QFontEngine *> keys = glyphLayoutHash.uniqueKeys(); for (int i=0; i<keys.size(); ++i) { @@ -2265,11 +2278,17 @@ QList<QGlyphs> QTextLine::glyphs() const for (int j=0; j<glyphLayouts.size(); ++j) { const QPointF &pos = glyphLayouts.at(j).itemPosition; const QGlyphLayout &glyphLayout = glyphLayouts.at(j).glyphLayout; + const QTextItem::RenderFlags &flags = glyphLayouts.at(j).flags; + + font.setOverline(flags.testFlag(QTextItem::Overline)); + font.setUnderline(flags.testFlag(QTextItem::Underline)); + font.setStrikeOut(flags.testFlag(QTextItem::StrikeOut)); QVarLengthArray<glyph_t> glyphsArray; QVarLengthArray<QFixedPoint> positionsArray; - fontEngine->getGlyphPositions(glyphLayout, QTransform(), 0, glyphsArray, positionsArray); + fontEngine->getGlyphPositions(glyphLayout, QTransform(), flags, glyphsArray, + positionsArray); Q_ASSERT(glyphsArray.size() == positionsArray.size()); QVector<quint32> glyphs; @@ -2283,10 +2302,12 @@ QList<QGlyphs> QTextLine::glyphs() const glyphIndexes.setGlyphIndexes(glyphs); glyphIndexes.setPositions(positions); - if (!glyphsHash.contains(fontEngine)) - glyphsHash.insert(fontEngine, QGlyphs()); + QPair<QFontEngine *, int> key(fontEngine, int(flags)); + + if (!glyphsHash.contains(key)) + glyphsHash.insert(key, QGlyphs()); - QGlyphs &target = glyphsHash[fontEngine]; + QGlyphs &target = glyphsHash[key]; target += glyphIndexes; target.setFont(font); } |