qpa: incorrect rendering when stretching and clipping
authorJulien <jbrianceau@nds.com>
Thu, 30 Aug 2012 07:21:01 +0000 (09:21 +0200)
committerQt by Nokia <qt-info@nokia.com>
Mon, 3 Sep 2012 06:37:50 +0000 (08:37 +0200)
When using QBlittable with SourceOverScaledPixmapCapability, rendering
through clipAndDrawPixmap is incorrect when stretching: source pixmap
rectangle has to be corrected using scaling factor.

Change-Id: I7026987f5c47094a4578c0da4ccb67a0241d64bd
Reviewed-by: Sergio Ahumada <sergio.ahumada@nokia.com>
Reviewed-by: Julien BRIANCEAU <jbrianceau@nds.com>
Reviewed-by: Jørgen Lind <jorgen.lind@nokia.com>
src/gui/painting/qpaintengine_blitter.cpp

index ed087d8..d4e0a59 100644 (file)
@@ -333,11 +333,23 @@ void QBlitterPaintEnginePrivate::clipAndDrawPixmap(const QRectF &clip,
         return;
     QRectF source = sr;
     if (intersectedRect.size() != target.size()) {
-        qreal deltaTop = target.top() - intersectedRect.top();
-        qreal deltaLeft = target.left() - intersectedRect.left();
-        qreal deltaBottom = target.bottom() - intersectedRect.bottom();
-        qreal deltaRight = target.right() - intersectedRect.right();
-        source.adjust(-deltaLeft, -deltaTop, -deltaRight, -deltaBottom);
+        if (sr.size() == target.size()) {
+            // no resize
+            qreal deltaTop = target.top() - intersectedRect.top();
+            qreal deltaLeft = target.left() - intersectedRect.left();
+            qreal deltaBottom = target.bottom() - intersectedRect.bottom();
+            qreal deltaRight = target.right() - intersectedRect.right();
+            source.adjust(-deltaLeft, -deltaTop, -deltaRight, -deltaBottom);
+        } else {
+            // resize case
+            qreal hFactor = sr.size().width() / target.size().width();
+            qreal vFactor = sr.size().height() / target.size().height();
+            qreal deltaTop = (target.top() - intersectedRect.top()) * vFactor;
+            qreal deltaLeft = (target.left() - intersectedRect.left()) * hFactor;
+            qreal deltaBottom = (target.bottom() - intersectedRect.bottom()) * vFactor;
+            qreal deltaRight = (target.right() - intersectedRect.right()) * hFactor;
+            source.adjust(-deltaLeft, -deltaTop, -deltaRight, -deltaBottom);
+        }
     }
     pmData->unmarkRasterOverlay(intersectedRect);
     pmData->blittable()->drawPixmap(intersectedRect, pm, source);