Fix bilinear sampling of more than 8x rotated transforms

The check for 8x zoom was inverted and checked for 1/8x zoom.

Change-Id: I45156db709bab6b702769c2a70d4d2af51b5533a
Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
This commit is contained in:
Allan Sandfeld Jensen 2016-11-25 18:29:49 +01:00
parent 1155ca10f8
commit 94b83ae142
3 changed files with 13 additions and 4 deletions

View File

@ -2231,7 +2231,7 @@ static const uint * QT_FASTCALL fetchTransformedBilinearARGB32PM(uint *buffer, c
}
}
} else { //rotation
if (std::abs(data->m11) > 8 || std::abs(data->m22) > 8) {
if (std::abs(data->m11) < (1./8.) || std::abs(data->m22) < (1./8.)) {
//if we are zooming more than 8 times, we use 8bit precision for the position.
while (b < end) {
int x1 = (fx >> 16);
@ -2717,7 +2717,7 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper
layout->convertToARGB32PM(buf1, buf1, len * 2, clut, 0);
layout->convertToARGB32PM(buf2, buf2, len * 2, clut, 0);
if (std::abs(data->m11) > 8 || std::abs(data->m22) > 8) {
if (std::abs(data->m11) < (1./8.) || std::abs(data->m22) < (1./8.)) {
//if we are zooming more than 8 times, we use 8bit precision for the position.
for (int i = 0; i < len; ++i) {
int distx = (fracX & 0x0000ffff) >> 8;

View File

@ -22,9 +22,10 @@ end_block
resetMatrix
translate 340 120
setRenderHint SmoothPixmapTransformation
repeat_block drawing
resetMatrix
drawText 50 240 "Normal X form"
drawText 270 240 "Smooth xform"
drawText 50 240 "Normal Xform"
drawText 270 240 "Smooth Xform"

View File

@ -0,0 +1,8 @@
# Version: 1
# CheckVsReference: 1%
setRenderHint SmoothPixmapTransformation
translate 400 -120
rotate 45
scale 400 400
drawImage solid2x2.png 0 0