summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJocelyn Turcotte <jocelyn.turcotte@nokia.com>2010-05-25 18:19:14 (GMT)
committerJocelyn Turcotte <jocelyn.turcotte@nokia.com>2010-05-31 16:23:05 (GMT)
commit032fb3d54eaaa1fa36ec45b37f5f7356b1137830 (patch)
tree127dc0c3555003432aaa8add2b73385b24c74c4d /src
parent33fddc2adf95b56d8309ef9bc11408252140a085 (diff)
downloadQt-032fb3d54eaaa1fa36ec45b37f5f7356b1137830.zip
Qt-032fb3d54eaaa1fa36ec45b37f5f7356b1137830.tar.gz
Qt-032fb3d54eaaa1fa36ec45b37f5f7356b1137830.tar.bz2
Add the Qt::TextBypassShaping flag.
This allows quick layouting especially with Windows fonts which contain heavy OpenType logic. On regular latin text the visual compromize is the loss of kerning, justification, capitalization, word spacing and letter spacing support. Reviewed-by: Simon Hausmann Reviewed-by: Eskil
Diffstat (limited to 'src')
-rw-r--r--src/corelib/global/qnamespace.h3
-rw-r--r--src/gui/painting/qpainter.cpp17
-rw-r--r--src/gui/text/qfontmetrics.cpp25
-rw-r--r--src/gui/text/qfontmetrics.h1
-rw-r--r--src/gui/text/qtextengine.cpp6
-rw-r--r--src/gui/text/qtextengine_p.h1
6 files changed, 52 insertions, 1 deletions
diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h
index 08674d2..52a24de 100644
--- a/src/corelib/global/qnamespace.h
+++ b/src/corelib/global/qnamespace.h
@@ -236,7 +236,8 @@ public:
TextJustificationForced = 0x10000,
TextForceLeftToRight = 0x20000,
TextForceRightToLeft = 0x40000,
- TextLongestVariant = 0x80000
+ TextLongestVariant = 0x80000,
+ TextBypassShaping = 0x100000
#if defined(QT3_SUPPORT) && !defined(Q_MOC_RUN)
,SingleLine = TextSingleLine,
diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp
index 657229a..54e0aa3 100644
--- a/src/gui/painting/qpainter.cpp
+++ b/src/gui/painting/qpainter.cpp
@@ -5937,6 +5937,23 @@ void QPainter::drawText(const QPointF &p, const QString &str, int tf, int justif
if (!d->engine || str.isEmpty() || pen().style() == Qt::NoPen)
return;
+ if (tf & Qt::TextBypassShaping) {
+ // Skip harfbuzz complex shaping, shape using glyph advances only
+ int len = str.length();
+ int numGlyphs = len;
+ QVarLengthGlyphLayoutArray glyphs(len);
+ QFontEngine *fontEngine = d->state->font.d->engineForScript(QUnicodeTables::Common);
+ if (!fontEngine->stringToCMap(str.data(), len, &glyphs, &numGlyphs, 0)) {
+ glyphs.resize(numGlyphs);
+ if (!fontEngine->stringToCMap(str.data(), len, &glyphs, &numGlyphs, 0))
+ Q_ASSERT_X(false, Q_FUNC_INFO, "stringToCMap shouldn't fail twice");
+ }
+
+ QTextItemInt gf(glyphs, &d->state->font, fontEngine);
+ drawTextItem(p, gf);
+ return;
+ }
+
QStackTextEngine engine(str, d->state->font);
engine.option.setTextDirection(d->state->layoutDirection);
if (tf & (Qt::TextForceLeftToRight|Qt::TextForceRightToLeft)) {
diff --git a/src/gui/text/qfontmetrics.cpp b/src/gui/text/qfontmetrics.cpp
index 5163c94..d02e841 100644
--- a/src/gui/text/qfontmetrics.cpp
+++ b/src/gui/text/qfontmetrics.cpp
@@ -526,6 +526,14 @@ int QFontMetrics::rightBearing(QChar ch) const
*/
int QFontMetrics::width(const QString &text, int len) const
{
+ return width(text, len, 0);
+}
+
+/*!
+ \internal
+*/
+int QFontMetrics::width(const QString &text, int len, int flags) const
+{
int pos = text.indexOf(QLatin1Char('\x9c'));
if (pos != -1) {
len = (len < 0) ? pos : qMin(pos, len);
@@ -535,6 +543,23 @@ int QFontMetrics::width(const QString &text, int len) const
if (len == 0)
return 0;
+ if (flags & Qt::TextBypassShaping) {
+ // Skip harfbuzz complex shaping, only use advances
+ int numGlyphs = len;
+ QVarLengthGlyphLayoutArray glyphs(numGlyphs);
+ QFontEngine *engine = d->engineForScript(QUnicodeTables::Common);
+ if (!engine->stringToCMap(text.data(), len, &glyphs, &numGlyphs, 0)) {
+ glyphs.resize(numGlyphs);
+ if (!engine->stringToCMap(text.data(), len, &glyphs, &numGlyphs, 0))
+ Q_ASSERT_X(false, Q_FUNC_INFO, "stringToCMap shouldn't fail twice");
+ }
+
+ QFixed width;
+ for (int i = 0; i < numGlyphs; ++i)
+ width += glyphs.advances_x[i];
+ return qRound(width);
+ }
+
QStackTextEngine layout(text, d.data());
layout.ignoreBidi = true;
return qRound(layout.width(0, len));
diff --git a/src/gui/text/qfontmetrics.h b/src/gui/text/qfontmetrics.h
index dca4b93..2518b54 100644
--- a/src/gui/text/qfontmetrics.h
+++ b/src/gui/text/qfontmetrics.h
@@ -89,6 +89,7 @@ public:
int leftBearing(QChar) const;
int rightBearing(QChar) const;
int width(const QString &, int len = -1) const;
+ int width(const QString &, int len, int flags) const;
int width(QChar) const;
int charWidth(const QString &str, int pos) const;
diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp
index 6359672..3486264 100644
--- a/src/gui/text/qtextengine.cpp
+++ b/src/gui/text/qtextengine.cpp
@@ -2648,6 +2648,12 @@ QTextItemInt::QTextItemInt(const QScriptItem &si, QFont *font, const QTextCharFo
flags |= QTextItem::StrikeOut;
}
+QTextItemInt::QTextItemInt(const QGlyphLayout &g, QFont *font, QFontEngine *fe)
+ : flags(0), justified(false), underlineStyle(QTextCharFormat::NoUnderline),
+ num_chars(0), chars(0), logClusters(0), f(font), fontEngine(fe), glyphs(g)
+{
+}
+
QTextItemInt QTextItemInt::midItem(QFontEngine *fontEngine, int firstGlyphIndex, int numGlyphs) const
{
QTextItemInt ti = *this;
diff --git a/src/gui/text/qtextengine_p.h b/src/gui/text/qtextengine_p.h
index d92148f..00b1392 100644
--- a/src/gui/text/qtextengine_p.h
+++ b/src/gui/text/qtextengine_p.h
@@ -311,6 +311,7 @@ public:
logClusters(0), f(0), fontEngine(0)
{}
QTextItemInt(const QScriptItem &si, QFont *font, const QTextCharFormat &format = QTextCharFormat());
+ QTextItemInt(const QGlyphLayout &g, QFont *font, QFontEngine *fe);
/// copy the structure items, adjusting the glyphs arrays to the right subarrays.
/// the width of the returned QTextItemInt is not adjusted, for speed reasons