summaryrefslogtreecommitdiffstats
path: root/src/gui
diff options
context:
space:
mode:
authorJulien <jbrianceau@nds.com>2012-08-30 09:21:01 +0200
committerQt by Nokia <qt-info@nokia.com>2012-09-03 08:37:50 +0200
commita36efc37a1941a4b4cb239fa2ca0bc12ab7569ec (patch)
treee2cfe2fe7c01dec88e616120d4defc50e167b8c0 /src/gui
parentec57b20b65a3c5fa6fa0b225f4b52cfebf053194 (diff)
qpa: incorrect rendering when stretching and clipping
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>
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/painting/qpaintengine_blitter.cpp22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/gui/painting/qpaintengine_blitter.cpp b/src/gui/painting/qpaintengine_blitter.cpp
index ed087d833a..d4e0a5967b 100644
--- a/src/gui/painting/qpaintengine_blitter.cpp
+++ b/src/gui/painting/qpaintengine_blitter.cpp
@@ -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);