diff options
author | Samuel Rødal <samuel.rodal@nokia.com> | 2011-07-21 14:42:46 +0200 |
---|---|---|
committer | Samuel Rødal <samuel.rodal@nokia.com> | 2011-07-21 14:42:46 +0200 |
commit | 7b3b6b5afaaf1db1bfbfa9b56fa7b955a61344bd (patch) | |
tree | 8be0d601853d021434e03cef9a9cfd64b3708e92 /src/gui | |
parent | 070fc2f694beaa56fc191f1a3f6a1b9812f4ed35 (diff) | |
parent | 56defa4725508608a85e2813b85af3a7fcefefa0 (diff) |
Merge remote branch 'gerrit/master' into refactor
Conflicts:
examples/opengl/cube/main.cpp
examples/widgets/applicationicon/main.cpp
examples/widgets/orientation/main.cpp
src/gui/image/qicon.cpp
src/gui/image/qimage.h
src/gui/image/qpixmap.h
src/gui/image/qpixmap_mac.cpp
src/gui/kernel/qapplication.cpp
src/gui/kernel/qpalette.cpp
src/gui/kernel/qwidget.cpp
src/gui/styles/qmacstyle_mac.mm
src/gui/widgets/qmenubar.cpp
src/gui/widgets/qslider.cpp
src/opengl/qwindowsurface_gl.cpp
tests/auto/qvariant/qvariant.pro
tests/benchmarks/corelib/kernel/qobject/qobject.pro
tests/benchmarks/gui/animation/qanimation/qanimation.pro
tests/benchmarks/gui/graphicsview/qgraphicsanchorlayout/qgraphicsanchorlayout.pro
tests/benchmarks/gui/graphicsview/qgraphicsitem/qgraphicsitem.pro
tests/benchmarks/gui/graphicsview/qgraphicsscene/qgraphicsscene.pro
tests/benchmarks/gui/graphicsview/qgraphicsview/qgraphicsview.pro
tests/benchmarks/gui/graphicsview/qgraphicswidget/qgraphicswidget.pro
tests/benchmarks/gui/image/qimagereader/qimagereader.pro
tests/benchmarks/gui/itemviews/qtableview/qtableview.pro
tests/benchmarks/gui/kernel/qapplication/qapplication.pro
tests/benchmarks/gui/kernel/qwidget/qwidget.pro
tests/benchmarks/gui/painting/qpainter/qpainter.pro
tests/benchmarks/gui/painting/qtbench/qtbench.pro
tests/benchmarks/gui/painting/qtracebench/qtracebench.pro
tests/benchmarks/gui/text/qtext/qtext.pro
Change-Id: I4b911c795ecb29d73b6a7fd18819711b49478a30
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/image/qpixmap.h | 4 | ||||
-rw-r--r-- | src/gui/painting/qbrush.cpp | 46 | ||||
-rw-r--r-- | src/gui/painting/qpainter.cpp | 9 | ||||
-rw-r--r-- | src/gui/painting/qpen.cpp | 31 | ||||
-rw-r--r-- | src/gui/painting/qtextureglyphcache.cpp | 2 | ||||
-rw-r--r-- | src/gui/text/qfontdatabase.cpp | 10 | ||||
-rw-r--r-- | src/gui/text/qfontdatabase.h | 2 | ||||
-rw-r--r-- | src/gui/text/qfontengine.cpp | 19 | ||||
-rw-r--r-- | src/gui/text/qtextengine.cpp | 64 | ||||
-rw-r--r-- | src/gui/text/qtextengine_p.h | 4 | ||||
-rw-r--r-- | src/gui/text/qtextlayout.cpp | 8 |
11 files changed, 123 insertions, 76 deletions
diff --git a/src/gui/image/qpixmap.h b/src/gui/image/qpixmap.h index 642556e71b..66f1eda877 100644 --- a/src/gui/image/qpixmap.h +++ b/src/gui/image/qpixmap.h @@ -147,7 +147,9 @@ public: inline void scroll(int dx, int dy, int x, int y, int width, int height, QRegion *exposed = 0); void scroll(int dx, int dy, const QRect &rect, QRegion *exposed = 0); - int serialNumber() const; +#ifdef QT_DEPRECATED + QT_DEPRECATED int serialNumber() const; +#endif qint64 cacheKey() const; bool isDetached() const; diff --git a/src/gui/painting/qbrush.cpp b/src/gui/painting/qbrush.cpp index d644bbace1..429ed0b25b 100644 --- a/src/gui/painting/qbrush.cpp +++ b/src/gui/painting/qbrush.cpp @@ -112,6 +112,7 @@ QPixmap qt_pixmapForBrush(int brushStyle, bool invert) return pm; } +static void qt_cleanup_brush_pattern_image_cache(); class QBrushPatternImageCache { public: @@ -123,6 +124,7 @@ public: void init() { + qAddPostRoutine(qt_cleanup_brush_pattern_image_cache); for (int style = Qt::Dense1Pattern; style <= Qt::DiagCrossPattern; ++style) { int i = style - Qt::Dense1Pattern; m_images[i][0] = QImage(qt_patternForBrush(style, 0), 8, 8, 1, QImage::Format_MonoLSB); @@ -153,11 +155,7 @@ private: bool m_initialized; }; -static void qt_cleanup_brush_pattern_image_cache(); -Q_GLOBAL_STATIC_WITH_INITIALIZER(QBrushPatternImageCache, qt_brushPatternImageCache, - { - qAddPostRoutine(qt_cleanup_brush_pattern_image_cache); - }) +Q_GLOBAL_STATIC(QBrushPatternImageCache, qt_brushPatternImageCache) static void qt_cleanup_brush_pattern_image_cache() { @@ -339,33 +337,29 @@ struct QBrushDataPointerDeleter \sa Qt::BrushStyle, QPainter, QColor */ -#ifndef QT_NO_THREAD -// Special deleter that only deletes if the ref-count goes to zero -template <> -class QGlobalStaticDeleter<QBrushData> +class QNullBrushData { public: - QGlobalStatic<QBrushData> &globalStatic; - QGlobalStaticDeleter(QGlobalStatic<QBrushData> &_globalStatic) - : globalStatic(_globalStatic) - { } - - inline ~QGlobalStaticDeleter() + QBrushData *brush; + QNullBrushData() : brush(new QBrushData) + { + brush->ref = 1; + brush->style = Qt::BrushStyle(0); + brush->color = Qt::black; + } + ~QNullBrushData() { - if (!globalStatic.pointer->ref.deref()) - delete globalStatic.pointer; - globalStatic.pointer = 0; - globalStatic.destroyed = true; + if (!brush->ref.deref()) + delete brush; + brush = 0; } }; -#endif -Q_GLOBAL_STATIC_WITH_INITIALIZER(QBrushData, nullBrushInstance, - { - x->ref = 1; - x->style = Qt::BrushStyle(0); - x->color = Qt::black; - }) +Q_GLOBAL_STATIC(QNullBrushData, nullBrushInstance_holder) +static QBrushData *nullBrushInstance() +{ + return nullBrushInstance_holder()->brush; +} static bool qbrush_check_type(Qt::BrushStyle style) { switch (style) { diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp index d5b9f97378..e45d773169 100644 --- a/src/gui/painting/qpainter.cpp +++ b/src/gui/painting/qpainter.cpp @@ -2799,6 +2799,9 @@ void QPainter::setClipRect(const QRect &rect, Qt::ClipOperation op) return; } + if (d->state->clipOperation == Qt::NoClip && op == Qt::IntersectClip) + op = Qt::ReplaceClip; + d->state->clipRegion = rect; d->state->clipOperation = op; if (op == Qt::NoClip || op == Qt::ReplaceClip) @@ -2854,6 +2857,9 @@ void QPainter::setClipRegion(const QRegion &r, Qt::ClipOperation op) return; } + if (d->state->clipOperation == Qt::NoClip && op == Qt::IntersectClip) + op = Qt::ReplaceClip; + d->state->clipRegion = r; d->state->clipOperation = op; if (op == Qt::NoClip || op == Qt::ReplaceClip) @@ -3259,6 +3265,9 @@ void QPainter::setClipPath(const QPainterPath &path, Qt::ClipOperation op) return; } + if (d->state->clipOperation == Qt::NoClip && op == Qt::IntersectClip) + op = Qt::ReplaceClip; + d->state->clipPath = path; d->state->clipOperation = op; if (op == Qt::NoClip || op == Qt::ReplaceClip) diff --git a/src/gui/painting/qpen.cpp b/src/gui/painting/qpen.cpp index 7185f0d346..a79e3a0cd2 100644 --- a/src/gui/painting/qpen.cpp +++ b/src/gui/painting/qpen.cpp @@ -244,30 +244,25 @@ inline QPenPrivate::QPenPrivate(const QBrush &_brush, qreal _width, Qt::PenStyle static const Qt::PenCapStyle qpen_default_cap = Qt::SquareCap; static const Qt::PenJoinStyle qpen_default_join = Qt::BevelJoin; -#ifndef QT_NO_THREAD -// Special deleter that only deletes if the ref-count goes to zero -template <> -class QGlobalStaticDeleter<QPenPrivate> +class QPenDataHolder { public: - QGlobalStatic<QPenPrivate> &globalStatic; - QGlobalStaticDeleter(QGlobalStatic<QPenPrivate> &_globalStatic) - : globalStatic(_globalStatic) + QPenData *pen; + QPenDataHolder(const QBrush &brush, qreal width, Qt::PenStyle penStyle, + Qt::PenCapStyle penCapStyle, Qt::PenJoinStyle _joinStyle) + : pen(new QPenData(brush, width, penStyle, penCapStyle, _joinStyle)) { } - - inline ~QGlobalStaticDeleter() + ~QPenDataHolder() { - if (!globalStatic.pointer->ref.deref()) - delete globalStatic.pointer; - globalStatic.pointer = 0; - globalStatic.destroyed = true; + if (!pen->ref.deref()) + delete pen; + pen = 0; } }; -#endif -Q_GLOBAL_STATIC_WITH_ARGS(QPenData, defaultPenInstance, +Q_GLOBAL_STATIC_WITH_ARGS(QPenDataHolder, defaultPenInstance, (Qt::black, 0, Qt::SolidLine, qpen_default_cap, qpen_default_join)) -Q_GLOBAL_STATIC_WITH_ARGS(QPenData, nullPenInstance, +Q_GLOBAL_STATIC_WITH_ARGS(QPenDataHolder, nullPenInstance, (Qt::black, 0, Qt::NoPen, qpen_default_cap, qpen_default_join)) /*! @@ -276,7 +271,7 @@ Q_GLOBAL_STATIC_WITH_ARGS(QPenData, nullPenInstance, QPen::QPen() { - d = defaultPenInstance(); + d = defaultPenInstance()->pen; d->ref.ref(); } @@ -289,7 +284,7 @@ QPen::QPen() QPen::QPen(Qt::PenStyle style) { if (style == Qt::NoPen) { - d = nullPenInstance(); + d = nullPenInstance()->pen; d->ref.ref(); } else { d = new QPenData(Qt::black, 0, style, qpen_default_cap, qpen_default_join); diff --git a/src/gui/painting/qtextureglyphcache.cpp b/src/gui/painting/qtextureglyphcache.cpp index 53fefa4fae..665efe07f2 100644 --- a/src/gui/painting/qtextureglyphcache.cpp +++ b/src/gui/painting/qtextureglyphcache.cpp @@ -198,7 +198,7 @@ bool QTextureGlyphCache::populate(QFontEngine *fontEngine, int numGlyphs, const Coord c = { 0, 0, // will be filled in later glyph_width, glyph_height, // texture coords - metrics.x.round().truncate(), + metrics.x.truncate(), -metrics.y.truncate() }; // baseline for horizontal scripts listItemCoordinates.insert(key, c); diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp index 655042a22c..fa67dc1a8a 100644 --- a/src/gui/text/qfontdatabase.cpp +++ b/src/gui/text/qfontdatabase.cpp @@ -2239,6 +2239,16 @@ int QFontDatabase::weight(const QString &family, } +/*! \internal */ +bool QFontDatabase::hasFamily(const QString &family) const +{ + QString parsedFamily, foundry; + parseFontName(family, foundry, parsedFamily); + const QString familyAlias = resolveFontFamilyAlias(parsedFamily); + return families().contains(familyAlias, Qt::CaseInsensitive); +} + + /*! Returns the names the \a writingSystem (e.g. for displaying to the user in a dialog). diff --git a/src/gui/text/qfontdatabase.h b/src/gui/text/qfontdatabase.h index e625a4d049..994a7a4a7d 100644 --- a/src/gui/text/qfontdatabase.h +++ b/src/gui/text/qfontdatabase.h @@ -134,6 +134,8 @@ public: bool bold(const QString &family, const QString &style) const; int weight(const QString &family, const QString &style) const; + bool hasFamily(const QString &family) const; + static QString writingSystemName(WritingSystem writingSystem); static QString writingSystemSample(WritingSystem writingSystem); diff --git a/src/gui/text/qfontengine.cpp b/src/gui/text/qfontengine.cpp index f068f396d8..9d42d8ab69 100644 --- a/src/gui/text/qfontengine.cpp +++ b/src/gui/text/qfontengine.cpp @@ -1110,12 +1110,19 @@ QByteArray QFontEngine::convertToPostscriptFontFamilyName(const QByteArray &fami return f; } -Q_GLOBAL_STATIC_WITH_INITIALIZER(QVector<QRgb>, qt_grayPalette, { - x->resize(256); - QRgb *it = x->data(); - for (int i = 0; i < x->size(); ++i, ++it) - *it = 0xff000000 | i | (i<<8) | (i<<16); -}) +class QRgbGreyPalette: public QVector<QRgb> +{ +public: + QRgbGreyPalette() + { + resize(256); + QRgb *it = data(); + for (int i = 0; i < size(); ++i, ++it) + *it = 0xff000000 | i | (i<<8) | (i<<16); + } +}; + +Q_GLOBAL_STATIC(QVector<QRgb>, qt_grayPalette) const QVector<QRgb> &QFontEngine::grayPalette() { diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp index 5127fcf969..5cc3d73fb9 100644 --- a/src/gui/text/qtextengine.cpp +++ b/src/gui/text/qtextengine.cpp @@ -319,6 +319,26 @@ static void appendItems(QScriptAnalysis *analysis, int &start, int &stop, const start = stop; } +static QChar::Direction skipBoundryNeutrals(QScriptAnalysis *analysis, + const ushort *unicode, int length, + int &sor, int &eor, QBidiControl &control) +{ + QChar::Direction dir = control.basicDirection(); + int level = sor > 0 ? analysis[sor - 1].bidiLevel : control.level; + while (sor < length) { + dir = QChar::direction(unicode[sor]); + // Keep skipping DirBN as if it doesn't exist + if (dir != QChar::DirBN) + break; + analysis[sor++].bidiLevel = level; + } + + eor = sor; + if (eor == length) + dir = control.basicDirection(); + + return dir; +} // creates the next QScript items. static bool bidiItemize(QTextEngine *engine, QScriptAnalysis *analysis, QBidiControl &control) @@ -430,8 +450,7 @@ static bool bidiItemize(QTextEngine *engine, QScriptAnalysis *analysis, QBidiCon case QChar::DirAN: if (eor >= 0) { appendItems(analysis, sor, eor, control, dir); - dir = eor < length ? QChar::direction(unicode[eor]) : control.basicDirection(); - status.eor = dir; + status.eor = dir = skipBoundryNeutrals(analysis, unicode, length, sor, eor, control); } else { eor = current; status.eor = dir; } @@ -455,8 +474,7 @@ static bool bidiItemize(QTextEngine *engine, QScriptAnalysis *analysis, QBidiCon } eor = current - 1; appendItems(analysis, sor, eor, control, dir); - dir = eor < length ? QChar::direction(unicode[eor]) : control.basicDirection(); - status.eor = dir; + status.eor = dir = skipBoundryNeutrals(analysis, unicode, length, sor, eor, control); } else { if(status.eor != QChar::DirL) { appendItems(analysis, sor, eor, control, dir); @@ -2790,7 +2808,7 @@ QFixed QTextEngine::alignLine(const QScriptLine &line) if (align & Qt::AlignRight) x = line.width - (line.textAdvance + leadingSpaceWidth(line)); else if (align & Qt::AlignHCenter) - x = (line.width - (line.textAdvance + leadingSpaceWidth(line)))/2; + x = (line.width - line.textAdvance)/2 - leadingSpaceWidth(line); } return x; } @@ -2872,6 +2890,7 @@ int QTextEngine::positionInLigature(const QScriptItem *si, int end, } const HB_CharAttributes *attrs = attributes(); + logClusters = this->logClusters(si); clusterLength = getClusterLength(logClusters, attrs, 0, end, glyph_pos, &clusterStart); if (clusterLength) { @@ -3033,6 +3052,22 @@ QTextItemInt::QTextItemInt(const QScriptItem &si, QFont *font, const QTextCharFo : justified(false), underlineStyle(QTextCharFormat::NoUnderline), charFormat(format), num_chars(0), chars(0), logClusters(0), f(0), fontEngine(0) { + f = font; + fontEngine = f->d->engineForScript(si.analysis.script); + Q_ASSERT(fontEngine); + + initWithScriptItem(si); +} + +QTextItemInt::QTextItemInt(const QGlyphLayout &g, QFont *font, const QChar *chars_, int numChars, QFontEngine *fe, const QTextCharFormat &format) + : flags(0), justified(false), underlineStyle(QTextCharFormat::NoUnderline), charFormat(format), + num_chars(numChars), chars(chars_), logClusters(0), f(font), glyphs(g), fontEngine(fe) +{ +} + +// Fix up flags and underlineStyle with given info +void QTextItemInt::initWithScriptItem(const QScriptItem &si) +{ // explicitly initialize flags so that initFontAttributes can be called // multiple times on the same TextItem flags = 0; @@ -3040,13 +3075,10 @@ QTextItemInt::QTextItemInt(const QScriptItem &si, QFont *font, const QTextCharFo flags |= QTextItem::RightToLeft; ascent = si.ascent; descent = si.descent; - f = font; - fontEngine = f->d->engineForScript(si.analysis.script); - Q_ASSERT(fontEngine); - if (format.hasProperty(QTextFormat::TextUnderlineStyle)) { - underlineStyle = format.underlineStyle(); - } else if (format.boolProperty(QTextFormat::FontUnderline) + if (charFormat.hasProperty(QTextFormat::TextUnderlineStyle)) { + underlineStyle = charFormat.underlineStyle(); + } else if (charFormat.boolProperty(QTextFormat::FontUnderline) || f->d->underline) { underlineStyle = QTextCharFormat::SingleUnderline; } @@ -3055,18 +3087,12 @@ QTextItemInt::QTextItemInt(const QScriptItem &si, QFont *font, const QTextCharFo if (underlineStyle == QTextCharFormat::SingleUnderline) flags |= QTextItem::Underline; - if (f->d->overline || format.fontOverline()) + if (f->d->overline || charFormat.fontOverline()) flags |= QTextItem::Overline; - if (f->d->strikeOut || format.fontStrikeOut()) + if (f->d->strikeOut || charFormat.fontStrikeOut()) flags |= QTextItem::StrikeOut; } -QTextItemInt::QTextItemInt(const QGlyphLayout &g, QFont *font, const QChar *chars_, int numChars, QFontEngine *fe) - : flags(0), justified(false), underlineStyle(QTextCharFormat::NoUnderline), - num_chars(numChars), chars(chars_), logClusters(0), f(font), glyphs(g), fontEngine(fe) -{ -} - 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 62a2e292c4..325623fc63 100644 --- a/src/gui/text/qtextengine_p.h +++ b/src/gui/text/qtextengine_p.h @@ -314,11 +314,13 @@ public: logClusters(0), f(0), fontEngine(0) {} QTextItemInt(const QScriptItem &si, QFont *font, const QTextCharFormat &format = QTextCharFormat()); - QTextItemInt(const QGlyphLayout &g, QFont *font, const QChar *chars, int numChars, QFontEngine *fe); + QTextItemInt(const QGlyphLayout &g, QFont *font, const QChar *chars, int numChars, QFontEngine *fe, + const QTextCharFormat &format = QTextCharFormat()); /// copy the structure items, adjusting the glyphs arrays to the right subarrays. /// the width of the returned QTextItemInt is not adjusted, for speed reasons QTextItemInt midItem(QFontEngine *fontEngine, int firstGlyphIndex, int numGlyphs) const; + void initWithScriptItem(const QScriptItem &si); QFixed descent; QFixed ascent; diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp index 918ddcc280..d6eca77b00 100644 --- a/src/gui/text/qtextlayout.cpp +++ b/src/gui/text/qtextlayout.cpp @@ -2418,13 +2418,13 @@ void QTextLine::draw(QPainter *p, const QPointF &pos, const QTextLayout::FormatR unsigned short *logClusters = eng->logClusters(&si); QGlyphLayout glyphs = eng->shapedGlyphs(&si); - QTextItemInt gf(si, &f, format); - gf.glyphs = glyphs.mid(iterator.glyphsStart, iterator.glyphsEnd - iterator.glyphsStart); - gf.chars = eng->layoutData->string.unicode() + iterator.itemStart; + QTextItemInt gf(glyphs.mid(iterator.glyphsStart, iterator.glyphsEnd - iterator.glyphsStart), + &f, eng->layoutData->string.unicode() + iterator.itemStart, + iterator.itemEnd - iterator.itemStart, eng->fontEngine(si), format); gf.logClusters = logClusters + iterator.itemStart - si.position; - gf.num_chars = iterator.itemEnd - iterator.itemStart; gf.width = iterator.itemWidth; gf.justified = line.justified; + gf.initWithScriptItem(si); Q_ASSERT(gf.fontEngine); |