Fix QPainter::drawGlyphs() with non-affine transformation
authorEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>
Fri, 6 May 2011 08:25:20 +0000 (10:25 +0200)
committerEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>
Fri, 6 May 2011 08:44:49 +0000 (10:44 +0200)
When the matrix has an non-affine transformation, the text will have to
be rendered using the default path-renderer. This means going through
the drawTextItem() path (since drawStaticText() has no support for those
transformations) and it also means not pre-transforming the coordinates,
since the default implementation of drawTextItem() supports
transformations.

Task-number: QTBUG-18214
Reviewed-by: Jiang Jiang
(cherry picked from commit 55446d104db77fc7994ab12352b1c08bb7b63346)

src/gui/painting/qpainter.cpp

index b7686fa..016d480 100644 (file)
@@ -5811,6 +5811,13 @@ void QPainter::drawGlyphs(const QPointF &position, const QGlyphs &glyphs)
             d->extended != 0
             ? qt_paintengine_supports_transformations(d->extended->type())
             : qt_paintengine_supports_transformations(d->engine->type());
+
+    // If the matrix is not affine, the paint engine will fall back to
+    // drawing the glyphs as paths, which in turn means we should not
+    // preprocess the glyph positions
+    if (!d->state->matrix.isAffine())
+        paintEngineSupportsTransformations = true;
+
     for (int i=0; i<count; ++i) {
         QPointF processedPosition = position + glyphPositions.at(i);
         if (!paintEngineSupportsTransformations)
@@ -5854,7 +5861,7 @@ void QPainterPrivate::drawGlyphs(quint32 *glyphArray, QFixedPoint *positions, in
 
     QFixed width = rightMost - leftMost;
 
-    if (extended != 0) {
+    if (extended != 0 && state->matrix.isAffine()) {
         QStaticTextItem staticTextItem;
         staticTextItem.color = state->pen.color();
         staticTextItem.font = state->font;