Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas
Dir : e17/libs/evas/src/modules/engines/software_16 Modified Files: evas_soft16_main.c Log Message: Implement image scale. =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16_main.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- evas_soft16_main.c 20 Jun 2007 19:10:15 -0000 1.6 +++ evas_soft16_main.c 21 Jun 2007 19:56:32 -0000 1.7 @@ -396,6 +396,9 @@ return 1; } +/*********************************************************************** + * Unscaled + **********************************************************************/ static void _soft16_image_draw_unscaled_solid_solid(Soft16_Image *src, Soft16_Image *dst, RGBA_Draw_Context *dc, @@ -687,21 +690,482 @@ cr.w, cr.h); } +/*********************************************************************** + * Scaled + ***********************************************************************/ +static void +_soft16_image_draw_scaled_solid_solid(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y) +{ + DATA16 *dst_itr; + int y, w_align; + + w_align = w & ~7; + + dst_itr = dst->pixels + dst_offset; + for (y = 0; y < h; y++, dst_itr += dst->stride) + { + DATA16 *d, *s; + int x; + + s = src->pixels + offset_y[y]; + pld(s, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(offset_x + x, 32); + + UNROLL8({ + _soft16_pt_blend_solid_solid(d, s[offset_x[x]]); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_solid_solid(d, s[offset_x[x]]); + } +} +static void +_soft16_image_draw_scaled_transp_solid(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y) +{ + DATA16 *dst_itr; + int y, w_align; + + w_align = w & ~7; + + dst_itr = dst->pixels + dst_offset; + for (y = 0; y < h; y++, dst_itr += dst->stride) + { + DATA16 *d, *s; + DATA8 *a; + int x; + + s = src->pixels + offset_y[y]; + a = src->alpha + offset_y[y]; + pld(s, 0); + pld(a, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(a, 8); + pld(offset_x + x, 32); + + UNROLL8({ + int off_x = offset_x[x]; + _soft16_pt_blend_transp_solid(d, s[off_x], a[off_x]); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_transp_solid(d, s[offset_x[x]], a[offset_x[x]]); + } +} + +static inline void +_soft16_image_draw_scaled_no_mul(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y) +{ + if (src->have_alpha && (!dst->have_alpha)) + _soft16_image_draw_scaled_transp_solid + (src, dst, dc, dst_offset, w, h, offset_x, offset_y); + else if ((!src->have_alpha) && (!dst->have_alpha)) + _soft16_image_draw_scaled_solid_solid + (src, dst, dc, dst_offset, w, h, offset_x, offset_y); + else + fprintf(stderr, + "Unsupported draw of scaled images src->have_alpha=%d, " + "dst->have_alpha=%d, WITHOUT COLOR MUL\n", + src->have_alpha, dst->have_alpha); +} + +static void +_soft16_image_draw_scaled_solid_solid_mul_alpha(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y) +{ + DATA16 *dst_itr; + int y, w_align, rel_alpha; + + rel_alpha = A_VAL(&dc->mul.col) >> 3; + if ((rel_alpha < 1) || (rel_alpha > 31)) return; + rel_alpha = 31 - rel_alpha; + + w_align = w & ~7; + + dst_itr = dst->pixels + dst_offset; + for (y = 0; y < h; y++, dst_itr += dst->stride) + { + DATA16 *d, *s; + int x; + + s = src->pixels + offset_y[y]; + pld(s, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(offset_x + x, 32); + + UNROLL8({ + _soft16_pt_blend_solid_solid_mul_alpha + (d, s[offset_x[x]], rel_alpha); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_solid_solid_mul_alpha + (d, s[offset_x[x]], rel_alpha); + } +} + +static void +_soft16_image_draw_scaled_transp_solid_mul_alpha(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y) +{ + DATA16 *dst_itr; + int y, w_align, rel_alpha; + + rel_alpha = A_VAL(&dc->mul.col) >> 3; + if ((rel_alpha < 1) || (rel_alpha > 31)) return; + rel_alpha = 31 - rel_alpha; + + w_align = w & ~7; + + dst_itr = dst->pixels + dst_offset; + for (y = 0; y < h; y++, dst_itr += dst->stride) + { + DATA16 *d, *s; + DATA8 *a; + int x; + + s = src->pixels + offset_y[y]; + a = src->alpha + offset_y[y]; + pld(s, 0); + pld(a, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(a, 8); + pld(offset_x + x, 32); + + UNROLL8({ + int off_x = offset_x[x]; + _soft16_pt_blend_transp_solid_mul_alpha + (d, s[off_x], a[off_x], rel_alpha); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_transp_solid_mul_alpha + (d, s[offset_x[x]], a[offset_x[x]], rel_alpha); + } +} + +static inline void +_soft16_image_draw_scaled_mul_alpha(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y) +{ + if (src->have_alpha && (!dst->have_alpha)) + _soft16_image_draw_scaled_transp_solid_mul_alpha + (src, dst, dc, dst_offset, w, h, offset_x, offset_y); + else if ((!src->have_alpha) && (!dst->have_alpha)) + _soft16_image_draw_scaled_solid_solid_mul_alpha + (src, dst, dc, dst_offset, w, h, offset_x, offset_y); + else + fprintf(stderr, + "Unsupported draw of scaled images src->have_alpha=%d, " + "dst->have_alpha=%d, WITH ALPHA MUL %d\n", + src->have_alpha, dst->have_alpha, A_VAL(&dc->mul.col)); +} + +static void +_soft16_image_draw_scaled_solid_solid_mul_color(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y) +{ + DATA16 *dst_itr; + int y, w_align, rel_alpha, r, g, b; + + rel_alpha = A_VAL(&dc->mul.col) >> 3; + if ((rel_alpha < 1) || (rel_alpha > 31)) return; + + r = R_VAL(&dc->mul.col); + g = G_VAL(&dc->mul.col); + b = B_VAL(&dc->mul.col); + /* we'll divide by 256 to make it faster, try to improve things a bit */ + if (r > 127) r++; + if (g > 127) g++; + if (b > 127) b++; + + w_align = w & ~7; + + dst_itr = dst->pixels + dst_offset; + + if (rel_alpha == 31) + for (y = 0; y < h; y++, dst_itr += dst->stride) + { + DATA16 *d, *s; + int x; + + s = src->pixels + offset_y[y]; + pld(s, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(offset_x + x, 32); + + UNROLL8({ + _soft16_pt_blend_solid_solid_mul_color_solid + (d, s[offset_x[x]], r, g, b); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_solid_solid_mul_color_solid + (d, s[offset_x[x]], r, g, b); + } + else + for (y = 0; y < h; y++, dst_itr += dst->stride) + { + DATA16 *d, *s; + int x; + + s = src->pixels + offset_y[y]; + pld(s, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(offset_x + x, 32); + + UNROLL8({ + _soft16_pt_blend_solid_solid_mul_color_transp + (d, s[offset_x[x]], rel_alpha, r, g, b); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_solid_solid_mul_color_transp + (d, s[offset_x[x]], rel_alpha, r, g, b); + } +} + +static void +_soft16_image_draw_scaled_transp_solid_mul_color(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y) +{ + DATA16 *dst_itr; + int y, w_align, rel_alpha, r, g, b; + + rel_alpha = A_VAL(&dc->mul.col) >> 3; + if ((rel_alpha < 1) || (rel_alpha > 31)) return; + rel_alpha = 31 - rel_alpha; + + r = R_VAL(&dc->mul.col); + g = G_VAL(&dc->mul.col); + b = B_VAL(&dc->mul.col); + /* we'll divide by 256 to make it faster, try to improve things a bit */ + if (r > 127) r++; + if (g > 127) g++; + if (b > 127) b++; + + w_align = w & ~7; + + dst_itr = dst->pixels + dst_offset; + + if (rel_alpha == 0) + for (y = 0; y < h; y++, dst_itr += dst->stride) + { + DATA16 *d, *s; + DATA8 *a; + int x; + + s = src->pixels + offset_y[y]; + a = src->alpha + offset_y[y]; + pld(s, 0); + pld(a, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(a, 8); + pld(offset_x + x, 32); + + UNROLL8({ + int off_x = offset_x[x]; + _soft16_pt_blend_transp_solid_mul_color_solid + (d, s[off_x], a[off_x], r, g, b); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_transp_solid_mul_color_solid + (d, s[offset_x[x]], a[offset_x[x]], r, g, b); + } + else + { + DATA16 *d, *s; + DATA8 *a; + int x; + + s = src->pixels + offset_y[y]; + a = src->alpha + offset_y[y]; + pld(s, 0); + pld(a, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(a, 8); + pld(offset_x + x, 32); + + UNROLL8({ + int off_x = offset_x[x]; + _soft16_pt_blend_transp_solid_mul_color_transp + (d, s[off_x], a[off_x], rel_alpha, r, g, b); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_transp_solid_mul_color_transp + (d, s[offset_x[x]], a[offset_x[x]], rel_alpha, r, g, b); + } +} + +static inline void +_soft16_image_draw_scaled_mul_color(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y) +{ + if (src->have_alpha && (!dst->have_alpha)) + _soft16_image_draw_scaled_transp_solid_mul_color + (src, dst, dc, dst_offset, w, h, offset_x, offset_y); + else if ((!src->have_alpha) && (!dst->have_alpha)) + _soft16_image_draw_scaled_solid_solid_mul_color + (src, dst, dc, dst_offset, w, h, offset_x, offset_y); + else + fprintf(stderr, + "Unsupported draw of scaled images src->have_alpha=%d, " + "dst->have_alpha=%d, WITH COLOR MUL 0x%08x\n", + src->have_alpha, dst->have_alpha, dc->mul.col); +} + +static inline void +_soft16_image_draw_scaled_mul(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y) +{ + if ((A_VAL(&dc->mul.col) == R_VAL(&dc->mul.col)) && + (A_VAL(&dc->mul.col) == G_VAL(&dc->mul.col)) && + (A_VAL(&dc->mul.col) == B_VAL(&dc->mul.col))) + _soft16_image_draw_scaled_mul_alpha + (src, dst, dc, dst_offset, w, h, offset_x, offset_y); + else + _soft16_image_draw_scaled_mul_color + (src, dst, dc, dst_offset, w, h, offset_x, offset_y); +} + +static void +_soft16_image_draw_scaled(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + const Evas_Rectangle sr, + const Evas_Rectangle dr, + const Evas_Rectangle cr) +{ + int x, y, dst_offset, *offset_x, *offset_y; + + /* pre-calculated scale tables */ + offset_x = alloca(cr.w * sizeof(*offset_x)); + for (x = 0; x < cr.w; x++) + offset_x[x] = (((x + cr.x - dr.x) * sr.w) / dr.w) + sr.x; + + offset_y = alloca(cr.h * sizeof(*offset_y)); + for (y = 0; y < cr.h; y++) + offset_y[y] = (((((y + cr.y - dr.y) * sr.h) / dr.h) + sr.y) + * src->stride); + + dst_offset = cr.x + (cr.y * dst->stride); + + if ((!dc->mul.use) || (dc->mul.col == 0xffffffff)) + _soft16_image_draw_scaled_no_mul + (src, dst, dc, dst_offset, cr.w, cr.h, offset_x, offset_y); + else if (dc->mul.col != 0x00000000) + _soft16_image_draw_scaled_mul + (src, dst, dc, dst_offset, cr.w, cr.h, offset_x, offset_y); +} + static void _soft16_image_draw_sampled_int(Soft16_Image *src, Soft16_Image *dst, RGBA_Draw_Context *dc, Evas_Rectangle sr, Evas_Rectangle dr) { Evas_Rectangle cr; -/* Scanline_Func func; */ - int x, y; - int *lin_ptr; - DATA16 *buf, *dptr; - DATA16 **row_ptr = NULL; - DATA16 *ptr, *dst_ptr, *src_data, *dst_data; - DATA8 *bufa, *daptr; - DATA8 **rowa_ptr = NULL; - DATA8 *aptr, *dsta_ptr, *srca_data, *dsta_data; if (!(RECTS_INTERSECT(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->w, dst->h))) return; @@ -712,128 +1176,15 @@ if (!_soft16_adjust_areas(&sr, src->w, src->h, &dr, dst->w, dst->h, &cr)) return; - src_data = src->pixels; - srca_data = src->alpha; - dst_data = dst->pixels; - dsta_data = dst->alpha; - - /* figure out dest start ptr */ - dst_ptr = dst_data + cr.x + (cr.y * dst->stride); - dsta_ptr = dsta_data + cr.x + (cr.y * dst->stride); - -/* func = _soft16_scanline_copy; */ -/* if (( src->alpha) && ( dst->alpha)) func = _soft16_scanline_blend; */ -/* else if (( src->alpha) && (!dst->alpha)) func = _soft16_scanline_blend; */ -/* else if ((!src->alpha) && ( dst->alpha)) func = _soft16_scanline_copy; */ -/* else if ((!src->alpha) && (!dst->alpha)) func = _soft16_scanline_copy; */ - - /* not being scaled at all */ if ((dr.w == sr.w) && (dr.h == sr.h)) _soft16_image_draw_unscaled(src, dst, dc, sr, dr, cr); -#if 0 else - { - /* allocate scale lookup tables */ - lin_ptr = alloca(cr.w * sizeof(int)); - row_ptr = alloca(cr.h * sizeof(DATA16 *)); - rowa_ptr = alloca(cr.h * sizeof(DATA8 *)); - - /* fill scale tables */ - for (x = 0; x < cr.w; x++) - lin_ptr[x] = (((x + cr.x - dr.x) * sr.w) / dr.w) + sr.x; - for (y = 0; y < cr.h; y++) - { - row_ptr[y] = src_data + - (((((y + cr.y - dr.y) * sr.h) / - dr.h) + sr.y) * src->stride); - rowa_ptr[y] = srca_data + - (((((y + cr.y - dr.y) * sr.h) / - dr.h) + sr.y) * src->stride); - } - /* scale to dst */ - dptr = dst_ptr; - daptr = dsta_ptr; - if ((!(src->alpha)) && (!(dst->alpha)) && (!dc->mul.use)) - { - for (y = 0; y < cr.h; y++) - { - dst_ptr = dptr; - for (x = 0; x < cr.w; x++) - { - ptr = row_ptr[y] + lin_ptr[x]; - *dst_ptr = *ptr; - dst_ptr++; - } - dptr += dst->stride; - } - } - else - { - /* a scanline buffer */ - buf = alloca(cr.w * sizeof(DATA16) * 2); - if (src->alpha) - { - bufa = alloca(cr.w * sizeof(DATA8) * 2); - for (y = 0; y < cr.h; y++) - { - dst_ptr = dptr; - for (x = 0; x < cr.w; x++) - { - ptr = row_ptr[y] + lin_ptr[x]; - aptr = rowa_ptr[y] + lin_ptr[x]; - BLEND(ptr, aptr, dst_ptr); - dst_ptr++; - } -/* - dst_ptr = buf; - dsta_ptr = bufa; - for (x = 0; x < cr.w; x++) - { - ptr = row_ptr[y] + lin_ptr[x]; - *dst_ptr = *ptr; - dst_ptr++; - - aptr = rowa_ptr[y] + lin_ptr[x]; - *dsta_ptr = *aptr; - dsta_ptr++; - } - func(buf, bufa, NULL, dc->mul.col, dptr, cr.w); - */ - dptr += dst->stride; - } - } - else - { - for (y = 0; y < cr.h; y++) - { - dst_ptr = dptr; - for (x = 0; x < cr.w; x++) - { - ptr = row_ptr[y] + lin_ptr[x]; - *dst_ptr = *ptr; - dst_ptr++; - } -/* - dst_ptr = buf; - for (x = 0; x < cr.w; x++) - { - ptr = row_ptr[y] + lin_ptr[x]; - *dst_ptr = *ptr; - dst_ptr++; - } - func(buf, NULL, NULL, dc->mul.col, dptr, cr.w); - */ - dptr += dst->stride; - } - } - } - } -#endif + _soft16_image_draw_scaled(src, dst, dc, sr, dr, cr); } void soft16_image_draw(Soft16_Image *src, Soft16_Image *dst, - RGBA_Draw_Context *dc, + RGBA_Draw_Context *dc, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs