diff options
author | Alex Blasche <alexander.blasche@digia.com> | 2014-09-22 11:22:17 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@digia.com> | 2014-09-25 17:20:12 +0200 |
commit | 342533864b4ea6dda62bf35dfb265303a967f8b3 (patch) | |
tree | 14f1397f280f4aa8af82fcdf54e99dbf1b9267f5 | |
parent | a72d585f9b3327d301a605e9500058670ed7a5f5 (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.cpp | 25 |
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; |