summaryrefslogtreecommitdiffstats
path: root/src/gui/text
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@nokia.com>2010-07-15 15:16:42 (GMT)
committerThiago Macieira <thiago.macieira@nokia.com>2010-07-15 15:16:42 (GMT)
commit4e0d2169790f91348c59432f651878e604923dae (patch)
tree157936b07bdcda675741f689d570db543dac4302 /src/gui/text
parent8106f716043c22d71ff3dcdf9cd8a4db258fa81f (diff)
parent84f984b24400aed7cc72fdf432a076f98bc142a2 (diff)
downloadQt-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.cpp41
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);
}