Enlightenment CVS committal Author : raster Project : e17 Module : libs/evas
Dir : e17/libs/evas/src/lib/engines/common Modified Files: evas_blend_pixel_pixel.c evas_scale_sample.c evas_scale_smooth_scaler_downx.c evas_scale_smooth_scaler_downx_downy.c evas_scale_smooth_scaler_downy.c evas_scale_smooth_scaler_up.c Log Message: 1. buffer test really wqasnt being very fair - time to be fair. 2. be able to skip a copy in certain cases when scaling - should improve speed in several situations - evas is defintiely not optimal :) =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/engines/common/evas_blend_pixel_pixel.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -3 -r1.24 -r1.25 --- evas_blend_pixel_pixel.c 22 Jan 2006 10:48:51 -0000 1.24 +++ evas_blend_pixel_pixel.c 23 Jan 2006 07:57:30 -0000 1.25 @@ -277,7 +277,7 @@ evas_common_copy_pixels_rgba_to_rgba_sse(DATA32 *src, DATA32 *dst, int len) { DATA32 *src_ptr, *dst_ptr, *dst_end_ptr; - + dst_end_ptr = dst + len; dst_end_ptr -= 15; src_ptr = src; =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/engines/common/evas_scale_sample.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- evas_scale_sample.c 22 May 2005 02:49:49 -0000 1.3 +++ evas_scale_sample.c 23 Jan 2006 07:57:30 -0000 1.4 @@ -351,10 +351,6 @@ } else { - /* a scanline buffer */ - buf = malloc(dst_clip_w * sizeof(DATA32)); - if (!buf) goto no_buf; - /* fill scale tables */ for (x = 0; x < dst_clip_w; x++) lin_ptr[x] = (((x + dst_clip_x - dst_region_x) * src_region_w) / dst_region_w) + src_region_x; @@ -363,20 +359,46 @@ + src_region_y) * src_w); /* scale to dst */ dptr = dst_ptr; - for (y = 0; y < dst_clip_h; y++) +#ifdef DIRECT_SCALE + if ((!(src->flags & RGBA_IMAGE_HAS_ALPHA)) && + (!(dst->flags & RGBA_IMAGE_HAS_ALPHA))) { - dst_ptr = buf; - for (x = 0; x < dst_clip_w; x++) + for (y = 0; y < dst_clip_h; y++) + { + dst_ptr = dptr; + for (x = 0; x < dst_clip_w; x++) + { + ptr = row_ptr[y] + lin_ptr[x]; + *dst_ptr = *ptr; + dst_ptr++; + } + /* * blend here [clip_w *] buf -> dptr * */ +// func(buf, dptr, dst_clip_w); + dptr += dst_w; + } + } + else +#endif + { + /* a scanline buffer */ + buf = malloc(dst_clip_w * sizeof(DATA32)); + if (!buf) goto no_buf; + + for (y = 0; y < dst_clip_h; y++) { - ptr = row_ptr[y] + lin_ptr[x]; - *dst_ptr = *ptr; - dst_ptr++; + dst_ptr = buf; + for (x = 0; x < dst_clip_w; x++) + { + ptr = row_ptr[y] + lin_ptr[x]; + *dst_ptr = *ptr; + dst_ptr++; + } + /* * blend here [clip_w *] buf -> dptr * */ + func(buf, dptr, dst_clip_w); + dptr += dst_w; } - /* * blend here [clip_w *] buf -> dptr * */ - func(buf, dptr, dst_clip_w); - dptr += dst_w; + free(buf); } - free(buf); } } =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/engines/common/evas_scale_smooth_scaler_downx.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- evas_scale_smooth_scaler_downx.c 3 Dec 2005 09:27:52 -0000 1.3 +++ evas_scale_smooth_scaler_downx.c 23 Jan 2006 07:57:30 -0000 1.4 @@ -95,71 +95,149 @@ } else { - while (dst_clip_h--) +#ifdef DIRECT_SCALE + if ((!(src->flags & RGBA_IMAGE_HAS_ALPHA)) && + (!(dst->flags & RGBA_IMAGE_HAS_ALPHA)) && + (!dc->mod.use) && (!dc->mul.use)) { - while (dst_clip_w--) + while (dst_clip_h--) { - Cx = *xapp >> 16; - xap = *xapp & 0xffff; - pix = *yp + *xp + pos; - - r = (R_VAL(pix) * xap) >> 10; - g = (G_VAL(pix) * xap) >> 10; - b = (B_VAL(pix) * xap) >> 10; - for (j = (1 << 14) - xap; j > Cx; j -= Cx) + pbuf = dptr; + while (dst_clip_w--) { - pix++; - r += (R_VAL(pix) * Cx) >> 10; - g += (G_VAL(pix) * Cx) >> 10; - b += (B_VAL(pix) * Cx) >> 10; + Cx = *xapp >> 16; + xap = *xapp & 0xffff; + pix = *yp + *xp + pos; + + r = (R_VAL(pix) * xap) >> 10; + g = (G_VAL(pix) * xap) >> 10; + b = (B_VAL(pix) * xap) >> 10; + 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; } - if (j > 0) - { - pix++; - r += (R_VAL(pix) * j) >> 10; - g += (G_VAL(pix) * j) >> 10; - b += (B_VAL(pix) * j) >> 10; + if (j > 0) + { + pix++; + r += (R_VAL(pix) * j) >> 10; + g += (G_VAL(pix) * j) >> 10; + b += (B_VAL(pix) * j) >> 10; + } + if ((yap = *yapp) > 0) + { + pix = *yp + *xp + src_w + pos; + rr = (R_VAL(pix) * xap) >> 10; + gg = (G_VAL(pix) * xap) >> 10; + bb = (B_VAL(pix) * xap) >> 10; + 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; + } + if (j > 0) + { + pix++; + rr += (R_VAL(pix) * j) >> 10; + gg += (G_VAL(pix) * j) >> 10; + bb += (B_VAL(pix) * j) >> 10; + } + r += ((rr - r) * yap) >> 8; + g += ((gg - g) * yap) >> 8; + b += ((bb - b) * yap) >> 8; + } + *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4); + xp++; xapp++; } - if ((yap = *yapp) > 0) +/* + if (dc->mod.use) + func_cmod(buf, dptr, w, dc->mod.r, dc->mod.g, dc->mod.b, dc->mod.a); + else if (dc->mul.use) + func_mul(buf, dptr, w, dc->mul.col); + else + func(buf, dptr, w); + pbuf = buf; + */ + + dptr += dst_w; dst_clip_w = w; + yp++; yapp++; + xp = xpoints + dxx; + xapp = xapoints + dxx; + } + } + else +#endif + { + while (dst_clip_h--) + { + while (dst_clip_w--) { - pix = *yp + *xp + src_w + pos; - rr = (R_VAL(pix) * xap) >> 10; - gg = (G_VAL(pix) * xap) >> 10; - bb = (B_VAL(pix) * xap) >> 10; + Cx = *xapp >> 16; + xap = *xapp & 0xffff; + pix = *yp + *xp + pos; + + r = (R_VAL(pix) * xap) >> 10; + g = (G_VAL(pix) * xap) >> 10; + b = (B_VAL(pix) * xap) >> 10; 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; + r += (R_VAL(pix) * Cx) >> 10; + g += (G_VAL(pix) * Cx) >> 10; + b += (B_VAL(pix) * Cx) >> 10; } if (j > 0) { pix++; - rr += (R_VAL(pix) * j) >> 10; - gg += (G_VAL(pix) * j) >> 10; - bb += (B_VAL(pix) * j) >> 10; - } - r += ((rr - r) * yap) >> 8; - g += ((gg - g) * yap) >> 8; - b += ((bb - b) * yap) >> 8; + r += (R_VAL(pix) * j) >> 10; + g += (G_VAL(pix) * j) >> 10; + b += (B_VAL(pix) * j) >> 10; + } + if ((yap = *yapp) > 0) + { + pix = *yp + *xp + src_w + pos; + rr = (R_VAL(pix) * xap) >> 10; + gg = (G_VAL(pix) * xap) >> 10; + bb = (B_VAL(pix) * xap) >> 10; + 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; + } + if (j > 0) + { + pix++; + rr += (R_VAL(pix) * j) >> 10; + gg += (G_VAL(pix) * j) >> 10; + bb += (B_VAL(pix) * j) >> 10; + } + r += ((rr - r) * yap) >> 8; + g += ((gg - g) * yap) >> 8; + b += ((bb - b) * yap) >> 8; + } + *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4); + xp++; xapp++; } - *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4); - xp++; xapp++; - } - - if (dc->mod.use) - func_cmod(buf, dptr, w, dc->mod.r, dc->mod.g, dc->mod.b, dc->mod.a); - else if (dc->mul.use) - func_mul(buf, dptr, w, dc->mul.col); - else - func(buf, dptr, w); + + if (dc->mod.use) + func_cmod(buf, dptr, w, dc->mod.r, dc->mod.g, dc->mod.b, dc->mod.a); + else if (dc->mul.use) + func_mul(buf, dptr, w, dc->mul.col); + else + func(buf, dptr, w); - pbuf = buf; - dptr += dst_w; dst_clip_w = w; - yp++; yapp++; - xp = xpoints + dxx; - xapp = xapoints + dxx; + pbuf = buf; + dptr += dst_w; dst_clip_w = w; + yp++; yapp++; + xp = xpoints + dxx; + xapp = xapoints + dxx; + } } } } =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/engines/common/evas_scale_smooth_scaler_downx_downy.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- evas_scale_smooth_scaler_downx_downy.c 3 Dec 2005 09:27:52 -0000 1.3 +++ evas_scale_smooth_scaler_downx_downy.c 23 Jan 2006 07:57:30 -0000 1.4 @@ -144,46 +144,26 @@ } else { - while (dst_clip_h--) +#ifdef DIRECT_SCALE + if ((!(src->flags & RGBA_IMAGE_HAS_ALPHA)) && + (!(dst->flags & RGBA_IMAGE_HAS_ALPHA)) && + (!dc->mod.use) && (!dc->mul.use)) { - Cy = *yapp >> 16; - yap = *yapp & 0xffff; - - while (dst_clip_w--) + while (dst_clip_h--) { - Cx = *xapp >> 16; - xap = *xapp & 0xffff; - - sptr = *yp + *xp + pos; - pix = sptr; - sptr += src_w; - - 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) - { - rx += (R_VAL(pix) * Cx) >> 9; - gx += (G_VAL(pix) * Cx) >> 9; - bx += (B_VAL(pix) * Cx) >> 9; - pix++; - } - if (i > 0) - { - rx += (R_VAL(pix) * i) >> 9; - gx += (G_VAL(pix) * i) >> 9; - bx += (B_VAL(pix) * i) >> 9; - } - - r = (rx * yap) >> 14; - g = (gx * yap) >> 14; - b = (bx * yap) >> 14; - - for (j = (1 << 14) - yap; j > Cy; j -= Cy) + Cy = *yapp >> 16; + yap = *yapp & 0xffff; + + pbuf = dptr; + while (dst_clip_w--) { + Cx = *xapp >> 16; + xap = *xapp & 0xffff; + + sptr = *yp + *xp + pos; pix = sptr; sptr += src_w; + rx = (R_VAL(pix) * xap) >> 9; gx = (G_VAL(pix) * xap) >> 9; bx = (B_VAL(pix) * xap) >> 9; @@ -201,15 +181,98 @@ gx += (G_VAL(pix) * i) >> 9; bx += (B_VAL(pix) * i) >> 9; } - - r += (rx * Cy) >> 14; - g += (gx * Cy) >> 14; - b += (bx * Cy) >> 14; + + r = (rx * yap) >> 14; + g = (gx * yap) >> 14; + b = (bx * yap) >> 14; + + for (j = (1 << 14) - yap; j > Cy; j -= Cy) + { + pix = sptr; + sptr += src_w; + 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) + { + rx += (R_VAL(pix) * Cx) >> 9; + gx += (G_VAL(pix) * Cx) >> 9; + bx += (B_VAL(pix) * Cx) >> 9; + pix++; + } + if (i > 0) + { + rx += (R_VAL(pix) * i) >> 9; + gx += (G_VAL(pix) * i) >> 9; + bx += (B_VAL(pix) * i) >> 9; + } + + r += (rx * Cy) >> 14; + g += (gx * Cy) >> 14; + b += (bx * Cy) >> 14; + } + if (j > 0) + { + pix = sptr; + sptr += src_w; + 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) + { + rx += (R_VAL(pix) * Cx) >> 9; + gx += (G_VAL(pix) * Cx) >> 9; + bx += (B_VAL(pix) * Cx) >> 9; + pix++; + } + if (i > 0) + { + rx += (R_VAL(pix) * i) >> 9; + gx += (G_VAL(pix) * i) >> 9; + bx += (B_VAL(pix) * i) >> 9; + } + + r += (rx * j) >> 14; + g += (gx * j) >> 14; + b += (bx * j) >> 14; + } + *pbuf++ = ARGB_JOIN(0xff, r >> 5, g >> 5, b >> 5); + xp++; xapp++; } - if (j > 0) +/* + if (dc->mod.use) + func_cmod(buf, dptr, w, dc->mod.r, dc->mod.g, dc->mod.b, dc->mod.a); + else if (dc->mul.use) + func_mul(buf, dptr, w, dc->mul.col); + else + func(buf, dptr, w); + pbuf = dptr; + */ + dptr += dst_w; dst_clip_w = w; + xp = xpoints + dxx; + xapp = xapoints + dxx; + yp++; yapp++; + } + } + else +#endif + { + while (dst_clip_h--) + { + Cy = *yapp >> 16; + yap = *yapp & 0xffff; + + while (dst_clip_w--) { + Cx = *xapp >> 16; + xap = *xapp & 0xffff; + + sptr = *yp + *xp + pos; pix = sptr; sptr += src_w; + rx = (R_VAL(pix) * xap) >> 9; gx = (G_VAL(pix) * xap) >> 9; bx = (B_VAL(pix) * xap) >> 9; @@ -227,27 +290,80 @@ gx += (G_VAL(pix) * i) >> 9; bx += (B_VAL(pix) * i) >> 9; } - - r += (rx * j) >> 14; - g += (gx * j) >> 14; - b += (bx * j) >> 14; + + r = (rx * yap) >> 14; + g = (gx * yap) >> 14; + b = (bx * yap) >> 14; + + for (j = (1 << 14) - yap; j > Cy; j -= Cy) + { + pix = sptr; + sptr += src_w; + 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) + { + rx += (R_VAL(pix) * Cx) >> 9; + gx += (G_VAL(pix) * Cx) >> 9; + bx += (B_VAL(pix) * Cx) >> 9; + pix++; + } + if (i > 0) + { + rx += (R_VAL(pix) * i) >> 9; + gx += (G_VAL(pix) * i) >> 9; + bx += (B_VAL(pix) * i) >> 9; + } + + r += (rx * Cy) >> 14; + g += (gx * Cy) >> 14; + b += (bx * Cy) >> 14; + } + if (j > 0) + { + pix = sptr; + sptr += src_w; + 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) + { + rx += (R_VAL(pix) * Cx) >> 9; + gx += (G_VAL(pix) * Cx) >> 9; + bx += (B_VAL(pix) * Cx) >> 9; + pix++; + } + if (i > 0) + { + rx += (R_VAL(pix) * i) >> 9; + gx += (G_VAL(pix) * i) >> 9; + bx += (B_VAL(pix) * i) >> 9; + } + + r += (rx * j) >> 14; + g += (gx * j) >> 14; + b += (bx * j) >> 14; + } + *pbuf++ = ARGB_JOIN(0xff, r >> 5, g >> 5, b >> 5); + xp++; xapp++; } - *pbuf++ = ARGB_JOIN(0xff, r >> 5, g >> 5, b >> 5); - xp++; xapp++; - } - - if (dc->mod.use) - func_cmod(buf, dptr, w, dc->mod.r, dc->mod.g, dc->mod.b, dc->mod.a); - else if (dc->mul.use) - func_mul(buf, dptr, w, dc->mul.col); - else - func(buf, dptr, w); - pbuf = buf; - dptr += dst_w; dst_clip_w = w; - xp = xpoints + dxx; - xapp = xapoints + dxx; - yp++; yapp++; + if (dc->mod.use) + func_cmod(buf, dptr, w, dc->mod.r, dc->mod.g, dc->mod.b, dc->mod.a); + else if (dc->mul.use) + func_mul(buf, dptr, w, dc->mul.col); + else + func(buf, dptr, w); + + pbuf = buf; + dptr += dst_w; dst_clip_w = w; + xp = xpoints + dxx; + xapp = xapoints + dxx; + yp++; yapp++; + } } } #else =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/engines/common/evas_scale_smooth_scaler_downy.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- evas_scale_smooth_scaler_downy.c 3 Dec 2005 09:27:52 -0000 1.3 +++ evas_scale_smooth_scaler_downy.c 23 Jan 2006 07:57:30 -0000 1.4 @@ -96,72 +96,150 @@ } else { - while (dst_clip_h--) +#ifdef DIRECT_SCALE + if ((!(src->flags & RGBA_IMAGE_HAS_ALPHA)) && + (!(dst->flags & RGBA_IMAGE_HAS_ALPHA)) && + (!dc->mod.use) && (!dc->mul.use)) { - Cy = *yapp >> 16; - yap = *yapp & 0xffff; - - while (dst_clip_w--) + while (dst_clip_h--) { - pix = *yp + *xp + pos; - - r = (R_VAL(pix) * yap) >> 10; - g = (G_VAL(pix) * yap) >> 10; - b = (B_VAL(pix) * yap) >> 10; - for (j = (1 << 14) - yap; j > Cy; j -= Cy) + Cy = *yapp >> 16; + yap = *yapp & 0xffff; + + pbuf = dptr; + while (dst_clip_w--) { - pix += src_w; - r += (R_VAL(pix) * Cy) >> 10; - g += (G_VAL(pix) * Cy) >> 10; - b += (B_VAL(pix) * Cy) >> 10; - } - if (j > 0) - { - pix += src_w; - r += (R_VAL(pix) * j) >> 10; - g += (G_VAL(pix) * j) >> 10; - b += (B_VAL(pix) * j) >> 10; + pix = *yp + *xp + pos; + + r = (R_VAL(pix) * yap) >> 10; + g = (G_VAL(pix) * yap) >> 10; + b = (B_VAL(pix) * yap) >> 10; + for (j = (1 << 14) - yap; j > Cy; j -= Cy) + { + pix += src_w; + r += (R_VAL(pix) * Cy) >> 10; + g += (G_VAL(pix) * Cy) >> 10; + b += (B_VAL(pix) * Cy) >> 10; + } + if (j > 0) + { + pix += src_w; + r += (R_VAL(pix) * j) >> 10; + g += (G_VAL(pix) * j) >> 10; + b += (B_VAL(pix) * j) >> 10; + } + if ((xap = *xapp) > 0) + { + pix = *yp + *xp + 1 + pos; + rr = (R_VAL(pix) * yap) >> 10; + gg = (G_VAL(pix) * yap) >> 10; + bb = (B_VAL(pix) * yap) >> 10; + for (j = (1 << 14) - yap; j > Cy; j -= Cy) + { + pix += src_w; + rr += (R_VAL(pix) * Cy) >> 10; + gg += (G_VAL(pix) * Cy) >> 10; + bb += (B_VAL(pix) * Cy) >> 10; + } + if (j > 0) + { + pix += src_w; + rr += (R_VAL(pix) * j) >> 10; + gg += (G_VAL(pix) * j) >> 10; + bb += (B_VAL(pix) * j) >> 10; + } + r += ((rr - r) * xap) >> 8; + g += ((gg - g) * xap) >> 8; + b += ((bb - b) * xap) >> 8; + } + *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4); + xp++; xapp++; } - if ((xap = *xapp) > 0) +/* + if (dc->mod.use) + func_cmod(buf, dptr, w, dc->mod.r, dc->mod.g, dc->mod.b, dc->mod.a); + else if (dc->mul.use) + func_mul(buf, dptr, w, dc->mul.col); + else + func(buf, dptr, w); + pbuf = buf; + */ + dptr += dst_w; dst_clip_w = w; + yp++; yapp++; + xp = xpoints + dxx; + xapp = xapoints + dxx; + } + } + else +#endif + { + while (dst_clip_h--) + { + Cy = *yapp >> 16; + yap = *yapp & 0xffff; + + while (dst_clip_w--) { - pix = *yp + *xp + 1 + pos; - rr = (R_VAL(pix) * yap) >> 10; - gg = (G_VAL(pix) * yap) >> 10; - bb = (B_VAL(pix) * yap) >> 10; + pix = *yp + *xp + pos; + + r = (R_VAL(pix) * yap) >> 10; + g = (G_VAL(pix) * yap) >> 10; + b = (B_VAL(pix) * yap) >> 10; for (j = (1 << 14) - yap; j > Cy; j -= Cy) { pix += src_w; - rr += (R_VAL(pix) * Cy) >> 10; - gg += (G_VAL(pix) * Cy) >> 10; - bb += (B_VAL(pix) * Cy) >> 10; + r += (R_VAL(pix) * Cy) >> 10; + g += (G_VAL(pix) * Cy) >> 10; + b += (B_VAL(pix) * Cy) >> 10; } if (j > 0) { pix += src_w; - rr += (R_VAL(pix) * j) >> 10; - gg += (G_VAL(pix) * j) >> 10; - bb += (B_VAL(pix) * j) >> 10; - } - r += ((rr - r) * xap) >> 8; - g += ((gg - g) * xap) >> 8; - b += ((bb - b) * xap) >> 8; + r += (R_VAL(pix) * j) >> 10; + g += (G_VAL(pix) * j) >> 10; + b += (B_VAL(pix) * j) >> 10; + } + if ((xap = *xapp) > 0) + { + pix = *yp + *xp + 1 + pos; + rr = (R_VAL(pix) * yap) >> 10; + gg = (G_VAL(pix) * yap) >> 10; + bb = (B_VAL(pix) * yap) >> 10; + for (j = (1 << 14) - yap; j > Cy; j -= Cy) + { + pix += src_w; + rr += (R_VAL(pix) * Cy) >> 10; + gg += (G_VAL(pix) * Cy) >> 10; + bb += (B_VAL(pix) * Cy) >> 10; + } + if (j > 0) + { + pix += src_w; + rr += (R_VAL(pix) * j) >> 10; + gg += (G_VAL(pix) * j) >> 10; + bb += (B_VAL(pix) * j) >> 10; + } + r += ((rr - r) * xap) >> 8; + g += ((gg - g) * xap) >> 8; + b += ((bb - b) * xap) >> 8; + } + *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4); + xp++; xapp++; } - *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4); - xp++; xapp++; + + if (dc->mod.use) + func_cmod(buf, dptr, w, dc->mod.r, dc->mod.g, dc->mod.b, dc->mod.a); + else if (dc->mul.use) + func_mul(buf, dptr, w, dc->mul.col); + else + func(buf, dptr, w); + + pbuf = buf; + dptr += dst_w; dst_clip_w = w; + yp++; yapp++; + xp = xpoints + dxx; + xapp = xapoints + dxx; } - - if (dc->mod.use) - func_cmod(buf, dptr, w, dc->mod.r, dc->mod.g, dc->mod.b, dc->mod.a); - else if (dc->mul.use) - func_mul(buf, dptr, w, dc->mul.col); - else - func(buf, dptr, w); - - pbuf = buf; - dptr += dst_w; dst_clip_w = w; - yp++; yapp++; - xp = xpoints + dxx; - xapp = xapoints + dxx; } } } =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/engines/common/evas_scale_smooth_scaler_up.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- evas_scale_smooth_scaler_up.c 3 Dec 2005 09:27:52 -0000 1.3 +++ evas_scale_smooth_scaler_up.c 23 Jan 2006 07:57:30 -0000 1.4 @@ -22,7 +22,7 @@ /* a scanline buffer */ line_buf = evas_common_image_line_buffer_obtain(dst_clip_w); if (!line_buf) - goto done_scale_up; + goto done_scale_up; buf = line_buf->image->data; src_data = src->image->data; @@ -245,58 +245,114 @@ DATA8 p2r = 0, p2g = 0, p2b = 0; DATA32 *lptr1, *lptr2; - while (dst_clip_h--) +#ifdef DIRECT_SCALE + if ((!(src->flags & RGBA_IMAGE_HAS_ALPHA)) && + (!(dst->flags & RGBA_IMAGE_HAS_ALPHA)) && + (!dc->mod.use) && (!dc->mul.use)) { - lptr1 = *rp; - lptr2 = lptr1 + src_w; - if (lptr2 > src_end) lptr2 = lptr1; - k = *iy; - dst_ptr = buf; - - lp = lin_ptr; ix = interp_x; - ptr = lptr1 + *lp; - ptr2 = lptr2 + *lp; - p2r = R_VAL(ptr) + ((k * (R_VAL(ptr2) - R_VAL(ptr))) >> 8); - p2g = G_VAL(ptr) + ((k * (G_VAL(ptr2) - G_VAL(ptr))) >> 8); - p2b = B_VAL(ptr) + ((k * (B_VAL(ptr2) - B_VAL(ptr))) >> 8); - px = -1; - while (dst_clip_w--) + while (dst_clip_h--) { - if (px != *lp) + lptr1 = *rp; + lptr2 = lptr1 + src_w; + if (lptr2 > src_end) lptr2 = lptr1; + k = *iy; + dst_ptr = dptr; + + lp = lin_ptr; ix = interp_x; + ptr = lptr1 + *lp; + ptr2 = lptr2 + *lp; + p2r = R_VAL(ptr) + ((k * (R_VAL(ptr2) - R_VAL(ptr))) >> 8); + p2g = G_VAL(ptr) + ((k * (G_VAL(ptr2) - G_VAL(ptr))) >> 8); + p2b = B_VAL(ptr) + ((k * (B_VAL(ptr2) - B_VAL(ptr))) >> 8); + px = -1; + while (dst_clip_w--) { - px = *lp; - - ptr2 = lptr1 + px + 1; - ptr4 = lptr2 + px + 1; - if (px >= (src_w - 1)) + if (px != *lp) { - ptr2--; - ptr4--; + px = *lp; + + ptr2 = lptr1 + px + 1; + ptr4 = lptr2 + px + 1; + if (px >= (src_w - 1)) + { + ptr2--; + ptr4--; + } + p1r = p2r; + p1g = p2g; + p1b = p2b; + p2r = R_VAL(ptr2) + ((k * (R_VAL(ptr4) - R_VAL(ptr2))) >> 8); + p2g = G_VAL(ptr2) + ((k * (G_VAL(ptr4) - G_VAL(ptr2))) >> 8); + p2b = B_VAL(ptr2) + ((k * (B_VAL(ptr4) - B_VAL(ptr2))) >> 8); } - p1r = p2r; - p1g = p2g; - p1b = p2b; - p2r = R_VAL(ptr2) + ((k * (R_VAL(ptr4) - R_VAL(ptr2))) >> 8); - p2g = G_VAL(ptr2) + ((k * (G_VAL(ptr4) - G_VAL(ptr2))) >> 8); - p2b = B_VAL(ptr2) + ((k * (B_VAL(ptr4) - B_VAL(ptr2))) >> 8); + i = *ix; + R_VAL(dst_ptr) = p1r + ((i * (p2r - p1r)) >> 8); + G_VAL(dst_ptr) = p1g + ((i * (p2g - p1g)) >> 8); + B_VAL(dst_ptr) = p1b + ((i * (p2b - p1b)) >> 8); + A_VAL(dst_ptr) = 0xff; + + dst_ptr++; ix++; lp++; } - i = *ix; - R_VAL(dst_ptr) = p1r + ((i * (p2r - p1r)) >> 8); - G_VAL(dst_ptr) = p1g + ((i * (p2g - p1g)) >> 8); - B_VAL(dst_ptr) = p1b + ((i * (p2b - p1b)) >> 8); - A_VAL(dst_ptr) = 0xff; - - dst_ptr++; ix++; lp++; + dst_clip_w = w; ix = interp_x; lp = lin_ptr; + dptr += dst_w; iy++; rp++; + } + } + else +#endif + { + while (dst_clip_h--) + { + lptr1 = *rp; + lptr2 = lptr1 + src_w; + if (lptr2 > src_end) lptr2 = lptr1; + k = *iy; + dst_ptr = buf; + + lp = lin_ptr; ix = interp_x; + ptr = lptr1 + *lp; + ptr2 = lptr2 + *lp; + p2r = R_VAL(ptr) + ((k * (R_VAL(ptr2) - R_VAL(ptr))) >> 8); + p2g = G_VAL(ptr) + ((k * (G_VAL(ptr2) - G_VAL(ptr))) >> 8); + p2b = B_VAL(ptr) + ((k * (B_VAL(ptr2) - B_VAL(ptr))) >> 8); + px = -1; + while (dst_clip_w--) + { + if (px != *lp) + { + px = *lp; + + ptr2 = lptr1 + px + 1; + ptr4 = lptr2 + px + 1; + if (px >= (src_w - 1)) + { + ptr2--; + ptr4--; + } + p1r = p2r; + p1g = p2g; + p1b = p2b; + p2r = R_VAL(ptr2) + ((k * (R_VAL(ptr4) - R_VAL(ptr2))) >> 8); + p2g = G_VAL(ptr2) + ((k * (G_VAL(ptr4) - G_VAL(ptr2))) >> 8); + p2b = B_VAL(ptr2) + ((k * (B_VAL(ptr4) - B_VAL(ptr2))) >> 8); + } + i = *ix; + R_VAL(dst_ptr) = p1r + ((i * (p2r - p1r)) >> 8); + G_VAL(dst_ptr) = p1g + ((i * (p2g - p1g)) >> 8); + B_VAL(dst_ptr) = p1b + ((i * (p2b - p1b)) >> 8); + A_VAL(dst_ptr) = 0xff; + + dst_ptr++; ix++; lp++; + } + dst_clip_w = w; ix = interp_x; lp = lin_ptr; + /* * blend here [clip_w *] buf -> dptr * */ + if (dc->mod.use) + func_cmod(buf, dptr, dst_clip_w, dc->mod.r, dc->mod.g, dc->mod.b, dc->mod.a); + else if (dc->mul.use) + func_mul(buf, dptr, dst_clip_w, dc->mul.col); + else + func(buf, dptr, dst_clip_w); + dptr += dst_w; iy++; rp++; } - dst_clip_w = w; ix = interp_x; lp = lin_ptr; - /* * blend here [clip_w *] buf -> dptr * */ - if (dc->mod.use) - func_cmod(buf, dptr, dst_clip_w, dc->mod.r, dc->mod.g, dc->mod.b, dc->mod.a); - else if (dc->mul.use) - func_mul(buf, dptr, dst_clip_w, dc->mul.col); - else - func(buf, dptr, dst_clip_w); - dptr += dst_w; iy++; rp++; } } #else @@ -304,7 +360,7 @@ { int k, px, a, i; DATA32 *lptr1, *lptr2; - + while (dst_clip_h--) { @@ -416,104 +472,206 @@ { int k, px, i; DATA32 *lptr1, *lptr2; - - while (dst_clip_h--) + +#ifdef DIRECT_SCALE + if ((!(src->flags & RGBA_IMAGE_HAS_ALPHA)) && + (!(dst->flags & RGBA_IMAGE_HAS_ALPHA)) && + (!dc->mod.use) && (!dc->mul.use)) { - lptr1 = *rp; - lptr2 = lptr1 + src_w; - if (lptr2 > src_end) lptr2 = lptr1; - k = *iy / 2; - dst_ptr = buf; - - /* mm5 = k */ - movd_m2r(k, mm5); - punpcklwd_r2r(mm5, mm5); - punpckldq_r2r(mm5, mm5); - - lp = lin_ptr; ix = interp_x; - ptr = lptr1 + *lp; - ptr2 = lptr2 + *lp; - /* right edge */ - movd_m2r(*ptr, mm1); - pxor_r2r(mm7, mm7); - punpcklbw_r2r(mm7, mm1); - - movd_m2r(*ptr2, mm2); - pxor_r2r(mm7, mm7); - punpcklbw_r2r(mm7, mm2); - - psubsw_r2r(mm1, mm2); - pmullw_r2r(mm5, mm2); - psraw_i2r(7, mm2); - - paddsw_r2r(mm2, mm1); - /* mm1 = right edge */ - - px = -1; - while (dst_clip_w--) + while (dst_clip_h--) { - /* if we have a new pair of horizontal pixels to */ - /* interpolate between them vertically */ - if (px != *lp) + lptr1 = *rp; + lptr2 = lptr1 + src_w; + if (lptr2 > src_end) lptr2 = lptr1; + k = *iy / 2; + dst_ptr = dptr; + + /* mm5 = k */ + movd_m2r(k, mm5); + punpcklwd_r2r(mm5, mm5); + punpckldq_r2r(mm5, mm5); + + lp = lin_ptr; ix = interp_x; + ptr = lptr1 + *lp; + ptr2 = lptr2 + *lp; + /* right edge */ + movd_m2r(*ptr, mm1); + pxor_r2r(mm7, mm7); + punpcklbw_r2r(mm7, mm1); + + movd_m2r(*ptr2, mm2); + pxor_r2r(mm7, mm7); + punpcklbw_r2r(mm7, mm2); + + psubsw_r2r(mm1, mm2); + pmullw_r2r(mm5, mm2); + psraw_i2r(7, mm2); + + paddsw_r2r(mm2, mm1); + /* mm1 = right edge */ + + px = -1; + while (dst_clip_w--) { - px = *lp; - - ptr2 = lptr1 + px + 1; - ptr4 = lptr2 + px + 1; - if (px >= (src_w - 1)) + /* if we have a new pair of horizontal pixels to */ + /* interpolate between them vertically */ + if (px != *lp) { - ptr2--; - ptr4--; + px = *lp; + + ptr2 = lptr1 + px + 1; + ptr4 = lptr2 + px + 1; + if (px >= (src_w - 1)) + { + ptr2--; + ptr4--; + } + movq_r2r(mm1, mm0); + + /* right edge */ + movd_m2r(*ptr2, mm1); + pxor_r2r(mm7, mm7); + punpcklbw_r2r(mm7, mm1); + + movd_m2r(*ptr4, mm2); + pxor_r2r(mm7, mm7); + punpcklbw_r2r(mm7, mm2); + + psubsw_r2r(mm1, mm2); + pmullw_r2r(mm5, mm2); + psraw_i2r(7, mm2); + + paddsw_r2r(mm2, mm1); + /* mm1 = right edge */ } - movq_r2r(mm1, mm0); - /* right edge */ - movd_m2r(*ptr2, mm1); - pxor_r2r(mm7, mm7); - punpcklbw_r2r(mm7, mm1); - - movd_m2r(*ptr4, mm2); - pxor_r2r(mm7, mm7); - punpcklbw_r2r(mm7, mm2); - - psubsw_r2r(mm1, mm2); - pmullw_r2r(mm5, mm2); - psraw_i2r(7, mm2); + i = *ix / 2; + + movq_r2r(mm1, mm4); + + movd_m2r(i, mm2); + punpcklwd_r2r(mm2, mm2); + punpckldq_r2r(mm2, mm2); - paddsw_r2r(mm2, mm1); - /* mm1 = right edge */ + movq_r2r(mm0, mm3); + + psubsw_r2r(mm3, mm4); + pmullw_r2r(mm2, mm4); + psraw_i2r(7, mm4); + paddsw_r2r(mm4, mm3); + + packuswb_r2r(mm3, mm3); + /* blend mm3... */ + movd_r2m(mm3, *dst_ptr); + + dst_ptr++; ix++; lp++; } + /* * blend here [clip_w *] buf -> dptr * */ + dst_clip_w = w; ix = interp_x; lp = lin_ptr; + dptr += dst_w; iy++; rp++; + } + } + else +#endif + { + while (dst_clip_h--) + { + lptr1 = *rp; + lptr2 = lptr1 + src_w; + if (lptr2 > src_end) lptr2 = lptr1; + k = *iy / 2; + dst_ptr = buf; + + /* mm5 = k */ + movd_m2r(k, mm5); + punpcklwd_r2r(mm5, mm5); + punpckldq_r2r(mm5, mm5); + + lp = lin_ptr; ix = interp_x; + ptr = lptr1 + *lp; + ptr2 = lptr2 + *lp; + /* right edge */ + movd_m2r(*ptr, mm1); + pxor_r2r(mm7, mm7); + punpcklbw_r2r(mm7, mm1); + + movd_m2r(*ptr2, mm2); + pxor_r2r(mm7, mm7); + punpcklbw_r2r(mm7, mm2); + + psubsw_r2r(mm1, mm2); + pmullw_r2r(mm5, mm2); + psraw_i2r(7, mm2); - i = *ix / 2; - - movq_r2r(mm1, mm4); - - movd_m2r(i, mm2); - punpcklwd_r2r(mm2, mm2); - punpckldq_r2r(mm2, mm2); - - movq_r2r(mm0, mm3); - - psubsw_r2r(mm3, mm4); - pmullw_r2r(mm2, mm4); - psraw_i2r(7, mm4); - paddsw_r2r(mm4, mm3); - - packuswb_r2r(mm3, mm3); - /* blend mm3... */ - movd_r2m(mm3, *dst_ptr); + paddsw_r2r(mm2, mm1); + /* mm1 = right edge */ - dst_ptr++; ix++; lp++; + px = -1; + while (dst_clip_w--) + { + /* if we have a new pair of horizontal pixels to */ + /* interpolate between them vertically */ + if (px != *lp) + { + px = *lp; + + ptr2 = lptr1 + px + 1; + ptr4 = lptr2 + px + 1; + if (px >= (src_w - 1)) + { + ptr2--; + ptr4--; + } + movq_r2r(mm1, mm0); + + /* right edge */ + movd_m2r(*ptr2, mm1); + pxor_r2r(mm7, mm7); + punpcklbw_r2r(mm7, mm1); + + movd_m2r(*ptr4, mm2); + pxor_r2r(mm7, mm7); + punpcklbw_r2r(mm7, mm2); + + psubsw_r2r(mm1, mm2); + pmullw_r2r(mm5, mm2); + psraw_i2r(7, mm2); + + paddsw_r2r(mm2, mm1); + /* mm1 = right edge */ + } + + i = *ix / 2; + + movq_r2r(mm1, mm4); + + movd_m2r(i, mm2); + punpcklwd_r2r(mm2, mm2); + punpckldq_r2r(mm2, mm2); + + movq_r2r(mm0, mm3); + + psubsw_r2r(mm3, mm4); + pmullw_r2r(mm2, mm4); + psraw_i2r(7, mm4); + paddsw_r2r(mm4, mm3); + + packuswb_r2r(mm3, mm3); + /* blend mm3... */ + movd_r2m(mm3, *dst_ptr); + + dst_ptr++; ix++; lp++; + } + /* * blend here [clip_w *] buf -> dptr * */ + dst_clip_w = w; ix = interp_x; lp = lin_ptr; + if (dc->mod.use) + func_cmod(buf, dptr, dst_clip_w, dc->mod.r, dc->mod.g, dc->mod.b, dc->mod.a); + else if (dc->mul.use) + func_mul(buf, dptr, dst_clip_w, dc->mul.col); + else + func(buf, dptr, dst_clip_w); + dptr += dst_w; iy++; rp++; } - /* * blend here [clip_w *] buf -> dptr * */ - dst_clip_w = w; ix = interp_x; lp = lin_ptr; - if (dc->mod.use) - func_cmod(buf, dptr, dst_clip_w, dc->mod.r, dc->mod.g, dc->mod.b, dc->mod.a); - else if (dc->mul.use) - func_mul(buf, dptr, dst_clip_w, dc->mul.col); - else - func(buf, dptr, dst_clip_w); - dptr += dst_w; iy++; rp++; } } #endif ------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Do you grep through log files for problems? Stop! Download the new AJAX search engine that makes searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! http://sel.as-us.falkag.net/sel?cmd=lnk&kid=103432&bid=230486&dat=121642 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs