diff options
Diffstat (limited to 'src/gui/painting/qemulationpaintengine.cpp')
-rw-r--r-- | src/gui/painting/qemulationpaintengine.cpp | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/src/gui/painting/qemulationpaintengine.cpp b/src/gui/painting/qemulationpaintengine.cpp index e6686e3721..0c0df0fb13 100644 --- a/src/gui/painting/qemulationpaintengine.cpp +++ b/src/gui/painting/qemulationpaintengine.cpp @@ -74,10 +74,11 @@ QPainterState *QEmulationPaintEngine::createState(QPainterState *orig) const static inline void combineXForm(QBrush *brush, const QRectF &r) { - QTransform t = brush->transform(); - t.translate(r.x(), r.y()); - t.scale(r.width(), r.height()); - brush->setTransform(t); + QTransform t(r.width(), 0, 0, r.height(), r.x(), r.y()); + if (brush->gradient() && brush->gradient()->coordinateMode() != QGradient::ObjectMode) + brush->setTransform(t * brush->transform()); // compat mode + else + brush->setTransform(brush->transform() * t); } void QEmulationPaintEngine::fill(const QVectorPath &path, const QBrush &brush) @@ -96,11 +97,19 @@ void QEmulationPaintEngine::fill(const QVectorPath &path, const QBrush &brush) if (coMode > QGradient::LogicalMode) { QBrush copy = brush; const QPaintDevice *d = real_engine->painter()->device(); - QRectF r = (coMode == QGradient::ObjectBoundingMode) ? path.controlPointRect() : QRectF(0, 0, d->width(), d->height()); + QRectF r = (coMode == QGradient::StretchToDeviceMode) ? QRectF(0, 0, d->width(), d->height()) : path.controlPointRect(); combineXForm(©, r); real_engine->fill(path, copy); return; } + } else if (style == Qt::TexturePattern) { + qreal dpr = qHasPixmapTexture(brush) ? brush.texture().devicePixelRatioF() : brush.textureImage().devicePixelRatioF(); + if (!qFuzzyCompare(dpr, 1.0)) { + QBrush copy = brush; + combineXForm(©, QRectF(0, 0, 1.0/dpr, 1.0/dpr)); + real_engine->fill(path, copy); + return; + } } real_engine->fill(path, brush); @@ -124,7 +133,7 @@ void QEmulationPaintEngine::stroke(const QVectorPath &path, const QPen &pen) QGradient::CoordinateMode coMode = brush.gradient()->coordinateMode(); if (coMode > QGradient::LogicalMode) { const QPaintDevice *d = real_engine->painter()->device(); - QRectF r = (coMode == QGradient::ObjectBoundingMode) ? path.controlPointRect() : QRectF(0, 0, d->width(), d->height()); + QRectF r = (coMode == QGradient::StretchToDeviceMode) ? QRectF(0, 0, d->width(), d->height()) : path.controlPointRect(); combineXForm(&brush, r); copy.setBrush(brush); real_engine->stroke(path, copy); @@ -166,9 +175,9 @@ void QEmulationPaintEngine::drawTextItem(const QPointF &p, const QTextItem &text QBrush copy = s->pen.brush(); const QPaintDevice *d = real_engine->painter()->device(); const QTextItemInt &ti = static_cast<const QTextItemInt &>(textItem); - QRectF r = (g.coordinateMode() == QGradient::ObjectBoundingMode) ? - QRectF(p.x(), p.y() - ti.ascent.toReal(), ti.width.toReal(), (ti.ascent + ti.descent + 1).toReal()) : - QRectF(0, 0, d->width(), d->height()); + QRectF r = (g.coordinateMode() == QGradient::StretchToDeviceMode) ? + QRectF(0, 0, d->width(), d->height()) : + QRectF(p.x(), p.y() - ti.ascent.toReal(), ti.width.toReal(), (ti.ascent + ti.descent + 1).toReal()); combineXForm(©, r); g.setCoordinateMode(QGradient::LogicalMode); QBrush brush(g); |