Skip to content

Commit 7783b04

Browse files
author
Qt Continuous Integration System
committed
Merge branch '4.7' of scm.dev.nokia.troll.no:qt/oslo-staging-2 into 4.7-integration
* '4.7' of scm.dev.nokia.troll.no:qt/oslo-staging-2: Add new exported symbol to QtGuiu.def Handle uppercase 'E' when parsing numbers in SVGs. Let QTextLine decide its own x position in QPainter Support text decoration in QML when using static text back-end Fix missing color in text when using static text back-end in QML
2 parents b47fcc4 + e945c50 commit 7783b04

File tree

8 files changed

+54
-37
lines changed

8 files changed

+54
-37
lines changed

src/declarative/graphicsitems/qdeclarativetextlayout.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ void QDeclarativeTextLayout::clearLayout()
299299
QTextLayout::clearLayout();
300300
}
301301

302-
void QDeclarativeTextLayout::prepare()
302+
void QDeclarativeTextLayout::prepare(QPainter *painter)
303303
{
304304
if (!d || !d->cached) {
305305

@@ -308,6 +308,7 @@ void QDeclarativeTextLayout::prepare()
308308

309309
InertTextPainter *itp = inertTextPainter();
310310
itp->device.begin(d);
311+
itp->painter.setPen(painter->pen());
311312
QTextLayout::draw(&itp->painter, QPointF(0, 0));
312313

313314
glyph_t *glyphPool = d->glyphs.data();
@@ -326,6 +327,12 @@ void QDeclarativeTextLayout::prepare()
326327
}
327328
}
328329

330+
// Defined in qpainter.cpp
331+
extern Q_GUI_EXPORT void qt_draw_decoration_for_glyphs(QPainter *painter, const glyph_t *glyphArray,
332+
const QFixedPoint *positions, int glyphCount,
333+
QFontEngine *fontEngine, const QFont &font,
334+
const QTextCharFormat &charFormat);
335+
329336
void QDeclarativeTextLayout::draw(QPainter *painter, const QPointF &p)
330337
{
331338
QPainterPrivate *priv = QPainterPrivate::get(painter);
@@ -340,7 +347,7 @@ void QDeclarativeTextLayout::draw(QPainter *painter, const QPointF &p)
340347
return;
341348
}
342349

343-
prepare();
350+
prepare(painter);
344351

345352
int itemCount = d->items.count();
346353

@@ -371,6 +378,10 @@ void QDeclarativeTextLayout::draw(QPainter *painter, const QPointF &p)
371378
currentColor = item.color;
372379
}
373380
priv->extended->drawStaticTextItem(&item);
381+
382+
qt_draw_decoration_for_glyphs(painter, item.glyphs, item.glyphPositions,
383+
item.numGlyphs, item.fontEngine(), painter->font(),
384+
QTextCharFormat());
374385
}
375386
if (currentColor != oldPen.color())
376387
painter->setPen(oldPen);

src/declarative/graphicsitems/qdeclarativetextlayout_p.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class QDeclarativeTextLayout : public QTextLayout
6161
void beginLayout();
6262
void clearLayout();
6363

64-
void prepare();
64+
void prepare(QPainter *);
6565
void draw(QPainter *, const QPointF & = QPointF());
6666

6767
private:

src/gui/painting/qpainter.cpp

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,10 @@ static void drawTextItemDecoration(QPainter *painter, const QPointF &pos, const
9595
const QTextItem::RenderFlags flags, qreal width,
9696
const QTextCharFormat &charFormat);
9797
// Helper function to calculate left most position, width and flags for decoration drawing
98-
static void drawDecorationForGlyphs(QPainter *painter, const glyph_t *glyphArray,
99-
const QFixedPoint *positions, int glyphCount,
100-
QFontEngine *fontEngine, const QFont &font,
101-
const QTextCharFormat &charFormat);
98+
Q_GUI_EXPORT void qt_draw_decoration_for_glyphs(QPainter *painter, const glyph_t *glyphArray,
99+
const QFixedPoint *positions, int glyphCount,
100+
QFontEngine *fontEngine, const QFont &font,
101+
const QTextCharFormat &charFormat);
102102

103103
static inline QGradient::CoordinateMode coordinateMode(const QBrush &brush)
104104
{
@@ -5937,9 +5937,9 @@ void QPainter::drawStaticText(const QPointF &topLeftPosition, const QStaticText
59375937
}
59385938
d->extended->drawStaticTextItem(item);
59395939

5940-
drawDecorationForGlyphs(this, item->glyphs, item->glyphPositions,
5941-
item->numGlyphs, item->fontEngine(), staticText_d->font,
5942-
QTextCharFormat());
5940+
qt_draw_decoration_for_glyphs(this, item->glyphs, item->glyphPositions,
5941+
item->numGlyphs, item->fontEngine(), staticText_d->font,
5942+
QTextCharFormat());
59435943
}
59445944
if (currentColor != oldPen.color())
59455945
setPen(oldPen);
@@ -6383,10 +6383,10 @@ static void drawTextItemDecoration(QPainter *painter, const QPointF &pos, const
63836383
painter->setBrush(oldBrush);
63846384
}
63856385

6386-
static void drawDecorationForGlyphs(QPainter *painter, const glyph_t *glyphArray,
6387-
const QFixedPoint *positions, int glyphCount,
6388-
QFontEngine *fontEngine, const QFont &font,
6389-
const QTextCharFormat &charFormat)
6386+
Q_GUI_EXPORT void qt_draw_decoration_for_glyphs(QPainter *painter, const glyph_t *glyphArray,
6387+
const QFixedPoint *positions, int glyphCount,
6388+
QFontEngine *fontEngine, const QFont &font,
6389+
const QTextCharFormat &charFormat)
63906390
{
63916391
if (!(font.underline() || font.strikeOut() || font.overline()))
63926392
return;
@@ -8097,12 +8097,16 @@ void qt_format_text(const QFont &fnt, const QRectF &_r,
80978097
QTextLine line = textLayout.lineAt(i);
80988098

80998099
qreal advance = line.horizontalAdvance();
8100-
if (tf & Qt::AlignRight)
8101-
xoff = r.width() - advance;
8100+
xoff = 0;
8101+
if (tf & Qt::AlignRight) {
8102+
QTextEngine *eng = textLayout.engine();
8103+
xoff = r.width() - advance -
8104+
eng->leadingSpaceWidth(eng->lines[line.lineNumber()]).toReal();
8105+
}
81028106
else if (tf & Qt::AlignHCenter)
8103-
xoff = (r.width() - advance)/2;
8107+
xoff = (r.width() - advance) / 2;
81048108

8105-
line.draw(painter, QPointF(r.x() + xoff + line.x(), r.y() + yoff));
8109+
line.draw(painter, QPointF(r.x() + xoff, r.y() + yoff));
81068110
}
81078111

81088112
if (restore) {

src/gui/text/qtextengine.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2681,6 +2681,22 @@ void QTextEngine::resolveAdditionalFormats() const
26812681
specialData->resolvedFormatIndices = indices;
26822682
}
26832683

2684+
QFixed QTextEngine::leadingSpaceWidth(const QScriptLine &line)
2685+
{
2686+
if (!line.hasTrailingSpaces
2687+
|| (option.flags() & QTextOption::IncludeTrailingSpaces)
2688+
|| !isRightToLeft())
2689+
return QFixed();
2690+
2691+
int pos = line.length;
2692+
const HB_CharAttributes *attributes = this->attributes();
2693+
if (!attributes)
2694+
return QFixed();
2695+
while (pos > 0 && attributes[line.from + pos - 1].whiteSpace)
2696+
--pos;
2697+
return width(line.from + pos, line.length - pos);
2698+
}
2699+
26842700
QStackTextEngine::QStackTextEngine(const QString &string, const QFont &f)
26852701
: QTextEngine(string, f),
26862702
_layoutData(string, _memory, MemSize)

src/gui/text/qtextengine_p.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,7 @@ class Q_GUI_EXPORT QTextEngine {
592592
QString elidedText(Qt::TextElideMode mode, const QFixed &width, int flags = 0) const;
593593

594594
void shapeLine(const QScriptLine &line);
595+
QFixed leadingSpaceWidth(const QScriptLine &line);
595596

596597
private:
597598
void setBoundary(int strPos) const;

src/gui/text/qtextlayout.cpp

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -64,23 +64,6 @@ QT_BEGIN_NAMESPACE
6464
#define SuppressText 0x5012
6565
#define SuppressBackground 0x513
6666

67-
static inline QFixed leadingSpaceWidth(QTextEngine *eng, const QScriptLine &line)
68-
{
69-
if (!line.hasTrailingSpaces
70-
|| (eng->option.flags() & QTextOption::IncludeTrailingSpaces)
71-
|| !(eng->option.alignment() & Qt::AlignRight)
72-
|| !eng->isRightToLeft())
73-
return QFixed();
74-
75-
int pos = line.length;
76-
const HB_CharAttributes *attributes = eng->attributes();
77-
if (!attributes)
78-
return QFixed();
79-
while (pos > 0 && attributes[line.from + pos - 1].whiteSpace)
80-
--pos;
81-
return eng->width(line.from + pos, line.length - pos);
82-
}
83-
8467
static QFixed alignLine(QTextEngine *eng, const QScriptLine &line)
8568
{
8669
QFixed x = 0;
@@ -91,7 +74,7 @@ static QFixed alignLine(QTextEngine *eng, const QScriptLine &line)
9174
if (align & Qt::AlignJustify && eng->isRightToLeft())
9275
align = Qt::AlignRight;
9376
if (align & Qt::AlignRight)
94-
x = line.width - (line.textAdvance + leadingSpaceWidth(eng, line));
77+
x = line.width - (line.textAdvance + eng->leadingSpaceWidth(line));
9578
else if (align & Qt::AlignHCenter)
9679
x = (line.width - line.textAdvance)/2;
9780
}

src/s60installs/eabi/QtGuiu.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12182,4 +12182,6 @@ EXPORTS
1218212182
_ZNK14QVolatileImage9constBitsEv @ 12181 NONAME
1218312183
_ZN15QGraphicsSystem22releaseCachedResourcesEv @ 12182 NONAME
1218412184
_Z32qt_s60_setPartialScreenInputModeb @ 12183 NONAME
12185+
_Z29qt_draw_decoration_for_glyphsP8QPainterPKjPK11QFixedPointiP11QFontEngineRK5QFontRK15QTextCharFormat @ 12184 NONAME
12186+
_ZNK10QTextBlock7isValidEv @ 12185 NONAME
1218512187

src/svg/qsvghandler.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,7 @@ static qreal toDouble(const QChar *&str)
584584
++str;
585585
}
586586
bool exponent = false;
587-
if (*str == QLatin1Char('e') && pos < maxLen) {
587+
if ((*str == QLatin1Char('e') || *str == QLatin1Char('E')) && pos < maxLen) {
588588
exponent = true;
589589
temp[pos++] = 'e';
590590
++str;

0 commit comments

Comments
 (0)