summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Blasche <alexander.blasche@digia.com>2014-09-22 11:22:17 +0200
committerAllan Sandfeld Jensen <allan.jensen@digia.com>2014-09-25 17:20:12 +0200
commit342533864b4ea6dda62bf35dfb265303a967f8b3 (patch)
tree14f1397f280f4aa8af82fcdf54e99dbf1b9267f5
parenta72d585f9b3327d301a605e9500058670ed7a5f5 (diff)
Fix smooth scaling of large QImages
Task-number: QTBUG-13448 Change-Id: Ie76f5b5deefabeae93ab17eb866aea303692f5ac Reviewed-by: Lars Knoll <lars.knoll@digia.com>
-rw-r--r--src/gui/painting/qimagescale.cpp25
1 files changed, 13 insertions, 12 deletions
diff --git a/src/gui/painting/qimagescale.cpp b/src/gui/painting/qimagescale.cpp
index 20a7ad41a1..4934a18747 100644
--- a/src/gui/painting/qimagescale.cpp
+++ b/src/gui/painting/qimagescale.cpp
@@ -143,8 +143,8 @@ unsigned int** QImageScale::qimageCalcYPoints(unsigned int *src,
int sw, int sh, int dh)
{
unsigned int **p;
- int i, j = 0;
- int val, inc, rv = 0;
+ int i, j = 0, rv = 0;
+ qint64 val, inc;
if(dh < 0){
dh = -dh;
@@ -154,9 +154,9 @@ unsigned int** QImageScale::qimageCalcYPoints(unsigned int *src,
int up = qAbs(dh) >= sh;
val = up ? 0x8000 * sh / dh - 0x8000 : 0;
- inc = (sh << 16) / dh;
+ inc = (((qint64)sh) << 16) / dh;
for(i = 0; i < dh; i++){
- p[j++] = src + qMax(0, val >> 16) * sw;
+ p[j++] = src + qMax(0LL, val >> 16) * sw;
val += inc;
}
if(rv){
@@ -171,8 +171,8 @@ unsigned int** QImageScale::qimageCalcYPoints(unsigned int *src,
int* QImageScale::qimageCalcXPoints(int sw, int dw)
{
- int *p, i, j = 0;
- int val, inc, rv = 0;
+ int *p, i, j = 0, rv = 0;
+ qint64 val, inc;
if(dw < 0){
dw = -dw;
@@ -182,9 +182,9 @@ int* QImageScale::qimageCalcXPoints(int sw, int dw)
int up = qAbs(dw) >= sw;
val = up ? 0x8000 * sw / dw - 0x8000 : 0;
- inc = (sw << 16) / dw;
+ inc = (((qint64)sw) << 16) / dw;
for(i = 0; i < dw; i++){
- p[j++] = qMax(0, val >> 16);
+ p[j++] = qMax(0LL, val >> 16);
val += inc;
}
@@ -210,10 +210,10 @@ int* QImageScale::qimageCalcApoints(int s, int d, int up)
/* scaling up */
if(up){
- int val, inc;
+ qint64 val, inc;
val = 0x8000 * s / d - 0x8000;
- inc = (s << 16) / d;
+ inc = (((qint64)s) << 16) / d;
for(i = 0; i < d; i++){
int pos = val >> 16;
if (pos < 0)
@@ -227,9 +227,10 @@ int* QImageScale::qimageCalcApoints(int s, int d, int up)
}
/* scaling down */
else{
- int val, inc, ap, Cp;
+ qint64 val, inc;
+ int ap, Cp;
val = 0;
- inc = (s << 16) / d;
+ inc = (((qint64)s) << 16) / d;
Cp = ((d << 14) / s) + 1;
for(i = 0; i < d; i++){
ap = ((0x100 - ((val >> 8) & 0xff)) * Cp) >> 8;