diff --git a/src/lib/blend.c b/src/lib/blend.c index 7b0c07d..08e0153 100644 --- a/src/lib/blend.c +++ b/src/lib/blend.c @@ -1944,8 +1944,7 @@ __imlib_BlendImageToImage(ImlibImage * im_src, ImlibImage * im_dst, hh = h; /* scale the imagedata for this LINESIZE lines chunk of image */ - __imlib_Scale(scaleinfo, aa, im_src->has_alpha, - im_src->data, buf, dxx, dyy + y, + __imlib_Scale(scaleinfo, aa, im_src->has_alpha, buf, dxx, dyy + y, 0, 0, dw, hh, dw, im_src->w); __imlib_BlendRGBAToData(buf, dw, hh, diff --git a/src/lib/scale.c b/src/lib/scale.c index 1630261..9307553 100644 --- a/src/lib/scale.c +++ b/src/lib/scale.c @@ -11,9 +11,8 @@ /*\ NB: If you change this, don't forget asm_scale.S \*/ struct _imlib_scale_info { int *xpoints; - int *ypoints; - int *xapoints; - int *yapoints; + uint32_t **ypoints; + int *xapoints, *yapoints; int xup_yup; uint32_t *pix_assert; }; @@ -23,13 +22,84 @@ struct _imlib_scale_info { #define INV_YAP (256 - yapoints[dyy + y]) #define YAP (yapoints[dyy + y]) +static uint32_t ** +__imlib_CalcYPoints(uint32_t * src, int sw, int sh, int dh, int b1, int b2) +{ + uint32_t **p; + int i; + int val, inc, rv = 0; + + if (dh < 0) + { + dh = -dh; + rv = 1; + } + + p = malloc(dh * sizeof(uint32_t *)); + if (!p) + return NULL; + + val = MIN(sh, dh); + inc = b1 + b2; + if (val < inc) + { + b1 = (val * b1 + inc / 2) / inc; + b2 = val - b1; + } + + /* Border 1 */ + val = 0; + inc = 1 << 16; + for (i = 0; i < b1; i++) + { + p[i] = src + (val >> 16) * sw; + val += inc; + } + + /* Center */ + if (dh > (b1 + b2)) + { + val = (b1 << 16); + inc = ((sh - b1 - b2) << 16) / (dh - (b1 + b2)); + for (; i < dh - b2; i++) + { + p[i] = src + (val >> 16) * sw; + val += inc; + } + } + + /* Border 2 */ + val = (sh - b2) << 16; + inc = 1 << 16; + for (; i < b2; i++) + { + p[i] = src + (val >> 16) * sw; + val += inc; + } + + if (rv) + for (i = dh / 2; --i >= 0;) + { + uint32_t *tmp = p[i]; + + p[i] = p[dh - i - 1]; + p[dh - i - 1] = tmp; + } + + return p; +} + static int * -__imlib_CalcPoints(int sw, int dw_, int b1, int b2, bool aa, int up) +__imlib_CalcXPoints(int sw, int dw, int b1, int b2) { int *p, i; - int val, inc, dw, ss, dd, corr; + int val, inc, rv = 0; - dw = (dw_ >= 0) ? dw_ : -dw_; + if (dw < 0) + { + dw = -dw; + rv = 1; + } p = malloc(dw * sizeof(int)); if (!p) @@ -44,39 +114,36 @@ __imlib_CalcPoints(int sw, int dw_, int b1, int b2, bool aa, int up) } /* Border 1 */ + val = 0; + inc = 1 << 16; for (i = 0; i < b1; i++) - p[i] = i; + { + p[i] = val >> 16; + val += inc; + } /* Center */ - ss = sw - (b1 + b2); - dd = dw - (b1 + b2); - if (dd > 0) + if (i < dw - b2) { - if (aa && dd > 1) + val = (b1 << 16); + inc = ((sw - b1 - b2) << 16) / (dw - (b1 + b2)); + for (; i < dw - b2; i++) { - corr = (up) ? 1 : 0; - val = b1 << 16; - inc = ((ss - corr) << 16) / (dd - corr); - for (; i < dw - b2; i++) - { - p[i] = val >> 16; - val += inc; - } - } - else - { - for (i = 0; i < dd; i++) - p[b1 + i] = b1 + (i * ss) / dd; - i = dw - b2; + p[i] = val >> 16; + val += inc; } } /* Border 2 */ - val = sw - b2; + val = (sw - b2) << 16; + inc = 1 << 16; for (; i < dw; i++) - p[i] = val++; + { + p[i] = val >> 16; + val += inc; + } - if (dw_ < 0) + if (rv) for (i = dw / 2; --i >= 0;) { int tmp = p[i]; @@ -89,18 +156,22 @@ __imlib_CalcPoints(int sw, int dw_, int b1, int b2, bool aa, int up) } static int * -__imlib_CalcApoints(int sw, int dw_, int b1, int b2, int up) +__imlib_CalcApoints(int s, int d, int b1, int b2, int up) { - int *p, i; - int val, inc, dw, ss, dd, corr; + int *p, i, rv = 0; + int val, inc; - dw = (dw_ >= 0) ? dw_ : -dw_; + if (d < 0) + { + rv = 1; + d = -d; + } - p = malloc(dw * sizeof(int)); + p = malloc(d * sizeof(int)); if (!p) return NULL; - val = MIN(sw, dw); + val = MIN(s, d); inc = b1 + b2; if (val < inc) { @@ -108,8 +179,6 @@ __imlib_CalcApoints(int sw, int dw_, int b1, int b2, int up) b2 = val - b1; } - ss = sw - (b1 + b2); - dd = dw - (b1 + b2); if (up) { /* Scaling up */ @@ -119,22 +188,25 @@ __imlib_CalcApoints(int sw, int dw_, int b1, int b2, int up) p[i] = 0; /* Center */ - if (dd > 0) + if (d > (b1 + b2)) { - corr = (dd > 1) ? 1 : 0; - ss -= corr; - dd -= corr; + int ss, dd; + + ss = s - b1 - b2; + dd = d - b1 - b2; val = 0; inc = (ss << 16) / dd; - for (; i < dw - b2; i++) + for (; i < d - b2; i++) { p[i] = (val >> 8) - ((val >> 8) & 0xffffff00); + if (((val >> 16) + b1) >= (s - 1)) + p[i] = 0; val += inc; } } /* Border 2 */ - for (; i < dw; i++) + for (; i < d; i++) p[i] = 0; } else @@ -146,14 +218,16 @@ __imlib_CalcApoints(int sw, int dw_, int b1, int b2, int up) p[i] = (1 << (16 + 14)) + (1 << 14); /* Center */ - if (dd > 0) + if (d > (b1 + b2)) { - int ap, Cp; + int ss, dd, ap, Cp; + ss = s - (b1 + b2); + dd = d - (b1 + b2); val = 0; inc = (ss << 16) / dd; Cp = ((dd << 14) / ss) + 1; - for (; i < dw - b2; i++) + for (; i < d - b2; i++) { ap = ((0x100 - ((val >> 8) & 0xff)) * Cp) >> 8; p[i] = ap | (Cp << 16); @@ -162,18 +236,18 @@ __imlib_CalcApoints(int sw, int dw_, int b1, int b2, int up) } /* Border 2 */ - for (; i < dw; i++) + for (; i < d; i++) p[i] = (1 << (16 + 14)) + (1 << 14); } - if (dw_ < 0) + if (rv) { - for (i = dw / 2; --i >= 0;) + for (i = d / 2; --i >= 0;) { int tmp = p[i]; - p[i] = p[dw - i - 1]; - p[dw - i - 1] = tmp; + p[i] = p[d - i - 1]; + p[d - i - 1] = tmp; } } @@ -212,48 +286,37 @@ __imlib_CalcScaleInfo(ImlibImage * im, int sw, int sh, int dw, int dh, bool aa) isi->xup_yup = (abs(dw) >= sw) + ((abs(dh) >= sh) << 1); - isi->xpoints = __imlib_CalcPoints(im->w, scw, - im->border.left, im->border.right, - aa, isi->xup_yup & 1); + isi->xpoints = __imlib_CalcXPoints(im->w, scw, + im->border.left, im->border.right); if (!isi->xpoints) - goto bail; - - isi->ypoints = __imlib_CalcPoints(im->h, sch, - im->border.top, im->border.bottom, - aa, isi->xup_yup & 2); + return __imlib_FreeScaleInfo(isi); + isi->ypoints = __imlib_CalcYPoints(im->data, im->w, im->h, sch, + im->border.top, im->border.bottom); if (!isi->ypoints) - goto bail; - + return __imlib_FreeScaleInfo(isi); if (aa) { - isi->xapoints = __imlib_CalcApoints(im->w, scw, - im->border.left, im->border.right, - isi->xup_yup & 1); + isi->xapoints = __imlib_CalcApoints(im->w, scw, im->border.left, + im->border.right, isi->xup_yup & 1); if (!isi->xapoints) - goto bail; - - isi->yapoints = __imlib_CalcApoints(im->h, sch, - im->border.top, im->border.bottom, + return __imlib_FreeScaleInfo(isi); + isi->yapoints = __imlib_CalcApoints(im->h, sch, im->border.top, + im->border.bottom, isi->xup_yup & 2); if (!isi->yapoints) - goto bail; + return __imlib_FreeScaleInfo(isi); } - return isi; - - bail: - return __imlib_FreeScaleInfo(isi); } /* scale by pixel sampling only */ static void -__imlib_ScaleSampleRGBA(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, - int dxx, int dyy, int dx, int dy, int dw, int dh, - int dow, int sow) +__imlib_ScaleSampleRGBA(ImlibScaleInfo * isi, uint32_t * dest, int dxx, int dyy, + int dx, int dy, int dw, int dh, int dow) { uint32_t *sptr, *dptr; int x, y, end; - int *ypoints = isi->ypoints; + uint32_t **ypoints = isi->ypoints; int *xpoints = isi->xpoints; /* whats the last pixel on the line so we stop there */ @@ -262,9 +325,9 @@ __imlib_ScaleSampleRGBA(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, for (y = 0; y < dh; y++) { /* get the pointer to the start of the destination scanline */ - dptr = dest + dx + (y + dy) * dow; + dptr = dest + dx + ((y + dy) * dow); /* calculate the source line we'll scan from */ - sptr = srce + ypoints[dyy + y] * sow; + sptr = ypoints[dyy + y]; /* go thru the scanline and copy across */ for (x = dxx; x < end; x++) *dptr++ = sptr[xpoints[x]]; @@ -275,13 +338,12 @@ __imlib_ScaleSampleRGBA(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, /* scale by area sampling */ static void -__imlib_ScaleAARGBA(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, - int dxx, int dyy, int dx, int dy, int dw, int dh, int dow, - int sow) +__imlib_ScaleAARGBA(ImlibScaleInfo * isi, uint32_t * dest, int dxx, int dyy, + int dx, int dy, int dw, int dh, int dow, int sow) { uint32_t *sptr, *dptr; int x, y, end; - int *ypoints; + uint32_t **ypoints; int *xpoints; int *xapoints; int *yapoints; @@ -307,8 +369,8 @@ __imlib_ScaleAARGBA(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, for (y = 0; y < dh; y++) { /* calculate the source line we'll scan from */ - sptr = srce + ypoints[dyy + y] * sow; - dptr = dest + dx + (y + dy) * dow; + dptr = dest + dx + ((y + dy) * dow); + sptr = ypoints[dyy + y]; if (YAP > 0) { for (x = dxx; x < end; x++) @@ -317,9 +379,9 @@ __imlib_ScaleAARGBA(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, int rr, gg, bb, aa; uint32_t *pix; - pix = sptr + xpoints[x]; if (XAP > 0) { + pix = ypoints[dyy + y] + xpoints[x]; r = R_VAL(pix) * INV_XAP; g = G_VAL(pix) * INV_XAP; b = B_VAL(pix) * INV_XAP; @@ -347,6 +409,7 @@ __imlib_ScaleAARGBA(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, } else { + pix = ypoints[dyy + y] + xpoints[x]; r = R_VAL(pix) * INV_YAP; g = G_VAL(pix) * INV_YAP; b = B_VAL(pix) * INV_YAP; @@ -371,9 +434,9 @@ __imlib_ScaleAARGBA(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, int r, g, b, a; uint32_t *pix; - pix = sptr + xpoints[x]; if (XAP > 0) { + pix = ypoints[dyy + y] + xpoints[x]; r = R_VAL(pix) * INV_XAP; g = G_VAL(pix) * INV_XAP; b = B_VAL(pix) * INV_XAP; @@ -390,9 +453,7 @@ __imlib_ScaleAARGBA(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, *dptr++ = PIXEL_ARGB(a, r, g, b); } else - { - *dptr++ = *pix; - } + *dptr++ = sptr[xpoints[x]]; } } } @@ -411,11 +472,10 @@ __imlib_ScaleAARGBA(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, Cy = YAP >> 16; yap = YAP & 0xffff; - sptr = srce + ypoints[dyy + y] * sow; - dptr = dest + dx + (y + dy) * dow; + dptr = dest + dx + ((y + dy) * dow); for (x = dxx; x < end; x++) { - pix = sptr + xpoints[x]; + pix = ypoints[dyy + y] + xpoints[x]; r = (R_VAL(pix) * yap) >> 10; g = (G_VAL(pix) * yap) >> 10; b = (B_VAL(pix) * yap) >> 10; @@ -439,7 +499,7 @@ __imlib_ScaleAARGBA(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, assert(pix < isi->pix_assert); if (XAP > 0) { - pix = sptr + xpoints[x] + 1; + pix = ypoints[dyy + y] + xpoints[x] + 1; rr = (R_VAL(pix) * yap) >> 10; gg = (G_VAL(pix) * yap) >> 10; bb = (B_VAL(pix) * yap) >> 10; @@ -477,7 +537,8 @@ __imlib_ScaleAARGBA(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, b >>= 4; a >>= 4; } - *dptr++ = PIXEL_ARGB(a, r, g, b); + *dptr = PIXEL_ARGB(a, r, g, b); + dptr++; } } } @@ -492,14 +553,13 @@ __imlib_ScaleAARGBA(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, for (y = 0; y < dh; y++) { - sptr = srce + ypoints[dyy + y] * sow; - dptr = dest + dx + (y + dy) * dow; + dptr = dest + dx + ((y + dy) * dow); for (x = dxx; x < end; x++) { Cx = XAP >> 16; xap = XAP & 0xffff; - pix = sptr + xpoints[x]; + pix = ypoints[dyy + y] + xpoints[x]; r = (R_VAL(pix) * xap) >> 10; g = (G_VAL(pix) * xap) >> 10; b = (B_VAL(pix) * xap) >> 10; @@ -523,7 +583,7 @@ __imlib_ScaleAARGBA(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, assert(pix < isi->pix_assert); if (YAP > 0) { - pix = sptr + xpoints[x] + sow; + pix = ypoints[dyy + y] + xpoints[x] + sow; rr = (R_VAL(pix) * xap) >> 10; gg = (G_VAL(pix) * xap) >> 10; bb = (B_VAL(pix) * xap) >> 10; @@ -561,7 +621,8 @@ __imlib_ScaleAARGBA(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, b >>= 4; a >>= 4; } - *dptr++ = PIXEL_ARGB(a, r, g, b); + *dptr = PIXEL_ARGB(a, r, g, b); + dptr++; } } } @@ -579,30 +640,30 @@ __imlib_ScaleAARGBA(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, Cy = YAP >> 16; yap = YAP & 0xffff; - dptr = dest + dx + (y + dy) * dow; + dptr = dest + dx + ((y + dy) * dow); for (x = dxx; x < end; x++) { Cx = XAP >> 16; xap = XAP & 0xffff; - sptr = srce + ypoints[dyy + y] * sow + xpoints[x]; + sptr = ypoints[dyy + y] + xpoints[x]; pix = sptr; sptr += sow; rx = (R_VAL(pix) * xap) >> 9; gx = (G_VAL(pix) * xap) >> 9; bx = (B_VAL(pix) * xap) >> 9; ax = (A_VAL(pix) * xap) >> 9; + pix++; for (i = (1 << 14) - xap; i > Cx; i -= Cx) { - pix++; rx += (R_VAL(pix) * Cx) >> 9; gx += (G_VAL(pix) * Cx) >> 9; bx += (B_VAL(pix) * Cx) >> 9; ax += (A_VAL(pix) * Cx) >> 9; + pix++; } if (i > 0) { - pix++; rx += (R_VAL(pix) * i) >> 9; gx += (G_VAL(pix) * i) >> 9; bx += (B_VAL(pix) * i) >> 9; @@ -622,17 +683,17 @@ __imlib_ScaleAARGBA(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, gx = (G_VAL(pix) * xap) >> 9; bx = (B_VAL(pix) * xap) >> 9; ax = (A_VAL(pix) * xap) >> 9; + pix++; for (i = (1 << 14) - xap; i > Cx; i -= Cx) { - pix++; rx += (R_VAL(pix) * Cx) >> 9; gx += (G_VAL(pix) * Cx) >> 9; bx += (B_VAL(pix) * Cx) >> 9; ax += (A_VAL(pix) * Cx) >> 9; + pix++; } if (i > 0) { - pix++; rx += (R_VAL(pix) * i) >> 9; gx += (G_VAL(pix) * i) >> 9; bx += (B_VAL(pix) * i) >> 9; @@ -651,17 +712,17 @@ __imlib_ScaleAARGBA(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, gx = (G_VAL(pix) * xap) >> 9; bx = (B_VAL(pix) * xap) >> 9; ax = (A_VAL(pix) * xap) >> 9; + pix++; for (i = (1 << 14) - xap; i > Cx; i -= Cx) { - pix++; rx += (R_VAL(pix) * Cx) >> 9; gx += (G_VAL(pix) * Cx) >> 9; bx += (B_VAL(pix) * Cx) >> 9; ax += (A_VAL(pix) * Cx) >> 9; + pix++; } if (i > 0) { - pix++; rx += (R_VAL(pix) * i) >> 9; gx += (G_VAL(pix) * i) >> 9; bx += (B_VAL(pix) * i) >> 9; @@ -686,13 +747,12 @@ __imlib_ScaleAARGBA(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, /* scale by area sampling - IGNORE the ALPHA byte*/ static void -__imlib_ScaleAARGB(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, - int dxx, int dyy, int dx, int dy, int dw, int dh, int dow, - int sow) +__imlib_ScaleAARGB(ImlibScaleInfo * isi, uint32_t * dest, int dxx, int dyy, + int dx, int dy, int dw, int dh, int dow, int sow) { uint32_t *sptr, *dptr; int x, y, end; - int *ypoints; + uint32_t **ypoints; int *xpoints; int *xapoints; int *yapoints; @@ -718,19 +778,19 @@ __imlib_ScaleAARGB(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, for (y = 0; y < dh; y++) { /* calculate the source line we'll scan from */ - sptr = srce + ypoints[dyy + y] * sow; - dptr = dest + dx + (y + dy) * dow; + dptr = dest + dx + ((y + dy) * dow); + sptr = ypoints[dyy + y]; if (YAP > 0) { for (x = dxx; x < end; x++) { - int r, g, b; - int rr, gg, bb; + int r = 0, g = 0, b = 0; + int rr = 0, gg = 0, bb = 0; uint32_t *pix; - pix = sptr + xpoints[x]; if (XAP > 0) { + pix = ypoints[dyy + y] + xpoints[x]; r = R_VAL(pix) * INV_XAP; g = G_VAL(pix) * INV_XAP; b = B_VAL(pix) * INV_XAP; @@ -753,6 +813,7 @@ __imlib_ScaleAARGB(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, } else { + pix = ypoints[dyy + y] + xpoints[x]; r = R_VAL(pix) * INV_YAP; g = G_VAL(pix) * INV_YAP; b = B_VAL(pix) * INV_YAP; @@ -774,9 +835,9 @@ __imlib_ScaleAARGB(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, int r = 0, g = 0, b = 0; uint32_t *pix; - pix = sptr + xpoints[x]; if (XAP > 0) { + pix = ypoints[dyy + y] + xpoints[x]; r = R_VAL(pix) * INV_XAP; g = G_VAL(pix) * INV_XAP; b = B_VAL(pix) * INV_XAP; @@ -790,9 +851,7 @@ __imlib_ScaleAARGB(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, *dptr++ = PIXEL_ARGB(0xff, r, g, b); } else - { - *dptr++ = *pix; - } + *dptr++ = sptr[xpoints[x]]; } } } @@ -811,44 +870,43 @@ __imlib_ScaleAARGB(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, Cy = YAP >> 16; yap = YAP & 0xffff; - sptr = srce + ypoints[dyy + y] * sow; - dptr = dest + dx + (y + dy) * dow; + dptr = dest + dx + ((y + dy) * dow); for (x = dxx; x < end; x++) { - pix = sptr + xpoints[x]; + pix = ypoints[dyy + y] + xpoints[x]; r = (R_VAL(pix) * yap) >> 10; g = (G_VAL(pix) * yap) >> 10; b = (B_VAL(pix) * yap) >> 10; + pix += sow; for (j = (1 << 14) - yap; j > Cy; j -= Cy) { - pix += sow; r += (R_VAL(pix) * Cy) >> 10; g += (G_VAL(pix) * Cy) >> 10; b += (B_VAL(pix) * Cy) >> 10; + pix += sow; } if (j > 0) { - pix += sow; r += (R_VAL(pix) * j) >> 10; g += (G_VAL(pix) * j) >> 10; b += (B_VAL(pix) * j) >> 10; } if (XAP > 0) { - pix = sptr + xpoints[x] + 1; + pix = ypoints[dyy + y] + xpoints[x] + 1; rr = (R_VAL(pix) * yap) >> 10; gg = (G_VAL(pix) * yap) >> 10; bb = (B_VAL(pix) * yap) >> 10; + pix += sow; for (j = (1 << 14) - yap; j > Cy; j -= Cy) { - pix += sow; rr += (R_VAL(pix) * Cy) >> 10; gg += (G_VAL(pix) * Cy) >> 10; bb += (B_VAL(pix) * Cy) >> 10; + pix += sow; } if (j > 0) { - pix += sow; rr += (R_VAL(pix) * j) >> 10; gg += (G_VAL(pix) * j) >> 10; bb += (B_VAL(pix) * j) >> 10; @@ -866,7 +924,8 @@ __imlib_ScaleAARGB(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, g >>= 4; b >>= 4; } - *dptr++ = PIXEL_ARGB(0xff, r, g, b); + *dptr = PIXEL_ARGB(0xff, r, g, b); + dptr++; } } } @@ -881,47 +940,46 @@ __imlib_ScaleAARGB(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, for (y = 0; y < dh; y++) { - sptr = srce + ypoints[dyy + y] * sow; - dptr = dest + dx + (y + dy) * dow; + dptr = dest + dx + ((y + dy) * dow); for (x = dxx; x < end; x++) { Cx = XAP >> 16; xap = XAP & 0xffff; - pix = sptr + xpoints[x]; + pix = ypoints[dyy + y] + xpoints[x]; r = (R_VAL(pix) * xap) >> 10; g = (G_VAL(pix) * xap) >> 10; b = (B_VAL(pix) * xap) >> 10; + pix++; for (j = (1 << 14) - xap; j > Cx; j -= Cx) { - pix++; r += (R_VAL(pix) * Cx) >> 10; g += (G_VAL(pix) * Cx) >> 10; b += (B_VAL(pix) * Cx) >> 10; + pix++; } if (j > 0) { - pix++; r += (R_VAL(pix) * j) >> 10; g += (G_VAL(pix) * j) >> 10; b += (B_VAL(pix) * j) >> 10; } if (YAP > 0) { - pix = sptr + xpoints[x] + sow; + pix = ypoints[dyy + y] + xpoints[x] + sow; rr = (R_VAL(pix) * xap) >> 10; gg = (G_VAL(pix) * xap) >> 10; bb = (B_VAL(pix) * xap) >> 10; + pix++; for (j = (1 << 14) - xap; j > Cx; j -= Cx) { - pix++; rr += (R_VAL(pix) * Cx) >> 10; gg += (G_VAL(pix) * Cx) >> 10; bb += (B_VAL(pix) * Cx) >> 10; + pix++; } if (j > 0) { - pix++; rr += (R_VAL(pix) * j) >> 10; gg += (G_VAL(pix) * j) >> 10; bb += (B_VAL(pix) * j) >> 10; @@ -939,7 +997,8 @@ __imlib_ScaleAARGB(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, g >>= 4; b >>= 4; } - *dptr++ = PIXEL_ARGB(0xff, r, g, b); + *dptr = PIXEL_ARGB(0xff, r, g, b); + dptr++; } } } @@ -957,28 +1016,28 @@ __imlib_ScaleAARGB(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, Cy = YAP >> 16; yap = YAP & 0xffff; - dptr = dest + dx + (y + dy) * dow; + dptr = dest + dx + ((y + dy) * dow); for (x = dxx; x < end; x++) { Cx = XAP >> 16; xap = XAP & 0xffff; - sptr = srce + ypoints[dyy + y] * sow + xpoints[x]; + sptr = ypoints[dyy + y] + xpoints[x]; pix = sptr; sptr += sow; rx = (R_VAL(pix) * xap) >> 9; gx = (G_VAL(pix) * xap) >> 9; bx = (B_VAL(pix) * xap) >> 9; + pix++; for (i = (1 << 14) - xap; i > Cx; i -= Cx) { - pix++; rx += (R_VAL(pix) * Cx) >> 9; gx += (G_VAL(pix) * Cx) >> 9; bx += (B_VAL(pix) * Cx) >> 9; + pix++; } if (i > 0) { - pix++; rx += (R_VAL(pix) * i) >> 9; gx += (G_VAL(pix) * i) >> 9; bx += (B_VAL(pix) * i) >> 9; @@ -995,16 +1054,16 @@ __imlib_ScaleAARGB(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, rx = (R_VAL(pix) * xap) >> 9; gx = (G_VAL(pix) * xap) >> 9; bx = (B_VAL(pix) * xap) >> 9; + pix++; for (i = (1 << 14) - xap; i > Cx; i -= Cx) { - pix++; rx += (R_VAL(pix) * Cx) >> 9; gx += (G_VAL(pix) * Cx) >> 9; bx += (B_VAL(pix) * Cx) >> 9; + pix++; } if (i > 0) { - pix++; rx += (R_VAL(pix) * i) >> 9; gx += (G_VAL(pix) * i) >> 9; bx += (B_VAL(pix) * i) >> 9; @@ -1020,16 +1079,16 @@ __imlib_ScaleAARGB(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, rx = (R_VAL(pix) * xap) >> 9; gx = (G_VAL(pix) * xap) >> 9; bx = (B_VAL(pix) * xap) >> 9; + pix++; for (i = (1 << 14) - xap; i > Cx; i -= Cx) { - pix++; rx += (R_VAL(pix) * Cx) >> 9; gx += (G_VAL(pix) * Cx) >> 9; bx += (B_VAL(pix) * Cx) >> 9; + pix++; } if (i > 0) { - pix++; rx += (R_VAL(pix) * i) >> 9; gx += (G_VAL(pix) * i) >> 9; bx += (B_VAL(pix) * i) >> 9; @@ -1051,19 +1110,16 @@ __imlib_ScaleAARGB(ImlibScaleInfo * isi, uint32_t * srce, uint32_t * dest, void __imlib_Scale(ImlibScaleInfo * isi, bool aa, bool alpha, - uint32_t * srce, uint32_t * dest, int dxx, int dyy, int dx, - int dy, int dw, int dh, int dow, int sow) + uint32_t * dest, int dxx, int dyy, int dx, int dy, + int dw, int dh, int dow, int sow) { if (aa) { if (alpha) - __imlib_ScaleAARGBA(isi, srce, dest, dxx, dyy, dx, dy, dw, dh, - dow, sow); + __imlib_ScaleAARGBA(isi, dest, dxx, dyy, dx, dy, dw, dh, dow, sow); else - __imlib_ScaleAARGB(isi, srce, dest, dxx, dyy, dx, dy, dw, dh, - dow, sow); + __imlib_ScaleAARGB(isi, dest, dxx, dyy, dx, dy, dw, dh, dow, sow); } else - __imlib_ScaleSampleRGBA(isi, srce, dest, dxx, dyy, dx, dy, dw, dh, - dow, sow); + __imlib_ScaleSampleRGBA(isi, dest, dxx, dyy, dx, dy, dw, dh, dow); } diff --git a/src/lib/scale.h b/src/lib/scale.h index a21d21c..118967a 100644 --- a/src/lib/scale.h +++ b/src/lib/scale.h @@ -11,7 +11,7 @@ ImlibScaleInfo *__imlib_CalcScaleInfo(ImlibImage * im, ImlibScaleInfo *__imlib_FreeScaleInfo(ImlibScaleInfo * isi); void __imlib_Scale(ImlibScaleInfo * isi, bool aa, bool alpha, - uint32_t * srce, uint32_t * dest, + uint32_t * dest, int dxx, int dyy, int dx, int dy, int dw, int dh, int dow, int sow); diff --git a/src/lib/x11_rend.c b/src/lib/x11_rend.c index a451800..8fd83ef 100644 --- a/src/lib/x11_rend.c +++ b/src/lib/x11_rend.c @@ -380,7 +380,7 @@ __imlib_RenderImage(const ImlibContextX11 * x11, ImlibImage * im, { /* scale the imagedata for this LINESIZE lines chunk of image data */ __imlib_Scale(scaleinfo, antialias, im->has_alpha, - im->data, buf, (sx * dw) / sw, + buf, (sx * dw) / sw, ((sy * dh) / sh) + y, 0, 0, dw, hh, dw, im->w); jump = 0; pointer = buf;