diff options
author | Julien <jbrianceau@nds.com> | 2012-08-30 09:21:01 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-09-03 08:37:50 +0200 |
commit | a36efc37a1941a4b4cb239fa2ca0bc12ab7569ec (patch) | |
tree | e2cfe2fe7c01dec88e616120d4defc50e167b8c0 /src/gui | |
parent | ec57b20b65a3c5fa6fa0b225f4b52cfebf053194 (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.cpp | 22 |
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); |