Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas
Dir : e17/libs/evas/src/modules/engines/software_16 Modified Files: evas_soft16.h evas_soft16_dither_mask.c evas_soft16_font.c evas_soft16_image_scaled_sampled.c evas_soft16_image_unscaled.c evas_soft16_rectangle.c evas_soft16_scanline_blend.c Log Message: Major rework of blit operations to use pre-multiplied colors. I wrote the first version thinking on regular, non-pre multiplied colors, but raster pointed out that all color data is pre-multiplied inside Evas. I was blaming 16bpp for low quality graphics, but it turned out that was an error with my usage. If you experienced grayish colors when using transparency, or white turning into black while fading out, then these should be fixed now. Now everything looks better, brighter! :-) Expedite shows no performance regressions, but I'd like to see more tests on that. Please report any issue. =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- evas_soft16.h 3 Aug 2007 23:11:56 -0000 1.8 +++ evas_soft16.h 10 Oct 2007 19:22:26 -0000 1.9 @@ -12,6 +12,8 @@ ((((rgb) & RGB_565_UNPACKED_MASK) | \ ((rgb) & RGB_565_UNPACKED_MASK) >> 16) & 0xffff) #define RGB_565_UNPACKED_BLEND(a, b, alpha) \ + ((b) + (a) - ((((b) * (alpha)) >> 5) & RGB_565_UNPACKED_MASK)) +#define RGB_565_UNPACKED_BLEND_UNMUL(a, b, alpha) \ ((b) + ((((a) - (b)) * (alpha)) >> 5)) #define RGB_565_FROM_COMPONENTS(r, g, b) \ =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16_dither_mask.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- evas_soft16_dither_mask.c 20 Jul 2007 17:29:31 -0000 1.2 +++ evas_soft16_dither_mask.c 10 Oct 2007 19:22:26 -0000 1.3 @@ -142,29 +142,48 @@ _soft16_convert_from_rgba_pt(const DATA32 *src, DATA16 *dst, DATA8 *alpha, const int x, const int y) { - DATA8 orig_r, orig_g, orig_b, orig_a, r, g, b, a, dith5, dith6, dith; + DATA8 orig_r, orig_g, orig_b, orig_a; orig_r = R_VAL(src); orig_g = G_VAL(src); orig_b = B_VAL(src); orig_a = A_VAL(src); - r = orig_r >> 3; - g = orig_g >> 2; - b = orig_b >> 3; - a = orig_a >> 3; - - dith = dither_table[x & S16_DM_MSK][y & S16_DM_MSK]; - dith5 = dith >> S16_DM_SHF(5); - dith6 = dith >> S16_DM_SHF(6); - - if (((orig_r - (r << 3)) >= dith5) && (r < 0x1f)) r++; - if (((orig_g - (g << 2)) >= dith6) && (g < 0x3f)) g++; - if (((orig_b - (b << 3)) >= dith5) && (b < 0x1f)) b++; - if (((orig_a - (a << 3)) >= dith5) && (a < 0x1f)) a++; + if (orig_a == 255) + { + DATA8 dith5, dith6, dith, r, g, b; - *dst = (r << 11) | (g << 5) | b; - *alpha = a; + dith = dither_table[x & S16_DM_MSK][y & S16_DM_MSK]; + dith5 = dith >> S16_DM_SHF(5); + dith6 = dith >> S16_DM_SHF(6); + + r = orig_r >> 3; + g = orig_g >> 2; + b = orig_b >> 3; + + if (((orig_r - (r << 3)) >= dith5) && (r < 0x1f)) r++; + if (((orig_g - (g << 2)) >= dith6) && (g < 0x3f)) g++; + if (((orig_b - (b << 3)) >= dith5) && (b < 0x1f)) b++; + + *dst = (r << 11) | (g << 5) | b; + *alpha = 31; + } + else if (orig_a == 0) + { + *dst = 0; + *alpha = 0; + } + else + { + DATA8 r, g, b, a; + r = orig_r >> 3; + g = orig_g >> 2; + b = orig_b >> 3; + a = (orig_a >> 3) + 1; + + *dst = (r << 11) | (g << 5) | b; + *alpha = a; + } } static inline void =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16_font.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- evas_soft16_font.c 20 Jun 2007 19:10:15 -0000 1.2 +++ evas_soft16_font.c 10 Oct 2007 19:22:26 -0000 1.3 @@ -1,4 +1,5 @@ #include "evas_soft16.h" +#include "evas_soft16_scanline_blend.c" static inline void _glyph_pt_mask_solid_solid(DATA16 *dst, @@ -6,15 +7,15 @@ const DATA32 rgb565_unpack, const DATA8 *mask) { - DATA8 alpha = *mask; + DATA8 alpha = *mask >> 3; - if (alpha == 255) *dst = rgb565; - else if (alpha > 8) + if (alpha == 31) *dst = rgb565; + else if (alpha > 0) { DATA32 d; d = RGB_565_UNPACK(*dst); - d = RGB_565_UNPACKED_BLEND(rgb565_unpack, d, alpha >> 3); + d = RGB_565_UNPACKED_BLEND_UNMUL(rgb565_unpack, d, alpha); *dst = RGB_565_PACK(d); } } @@ -51,29 +52,24 @@ static inline void _glyph_pt_mask_transp_solid(DATA16 *dst, - const DATA32 rgb565_unpack, - const DATA8 rel_alpha, + DATA32 rgb565_unpack, + DATA8 alpha, const DATA8 *mask) { - DATA32 d; - DATA8 alpha; + DATA32 a, b; + int rel_alpha; - if (*mask == 255) alpha = rel_alpha >> 3; - else if (*mask == 0) return; - else - { - /* doing multiply to avoid too much error, it's acceptable to do: - * alpha - (max_alpha - rel_alpha) - * on images because error is not that important/noticeable, but - * on texts, with many edges, it's unacceptable. - */ - alpha = (*mask * rel_alpha) >> 11; - if (alpha == 0) return; - } - - d = RGB_565_UNPACK(*dst); - d = RGB_565_UNPACKED_BLEND(rgb565_unpack, d, alpha); - *dst = RGB_565_PACK(d); + rel_alpha = *mask >> 3; + alpha = (alpha * rel_alpha) >> 5; + if (alpha == 0) + return; + + alpha++; + + a = ((rgb565_unpack * rel_alpha) >> 5) & RGB_565_UNPACKED_MASK; + b = RGB_565_UNPACK(*dst); + b = RGB_565_UNPACKED_BLEND(a, b, alpha); + *dst = RGB_565_PACK(b); } static inline void @@ -143,10 +139,10 @@ } static inline void -_glyph_scaline(Soft16_Image *dst, const DATA8 *p_mask, - const Evas_Rectangle ext, int dx, int dy, int max_x, int max_y, - int w, DATA8 alpha, const DATA16 rgb565, - const DATA32 rgb565_unpack) +_glyph_scanline(Soft16_Image *dst, const DATA8 *p_mask, + const Evas_Rectangle ext, int dx, int dy, int max_x, int max_y, + int w, DATA8 alpha, const DATA16 rgb565, + const DATA32 rgb565_unpack) { int size, in_x, in_w; DATA16 *p_pixels; @@ -171,7 +167,7 @@ if (size > 1) { - if (alpha == 255) + if (alpha == 31) _glyph_scanline_mask_solid_solid (p_pixels, size, rgb565, rgb565_unpack, p_mask); else if (alpha != 0) @@ -180,7 +176,7 @@ } else if (size == 1) { - if (alpha == 255) + if (alpha == 31) _glyph_pt_mask_solid_solid(p_pixels, rgb565, rgb565_unpack, p_mask); else if (alpha != 0) _glyph_pt_mask_transp_solid(p_pixels, rgb565_unpack, alpha, p_mask); @@ -201,8 +197,8 @@ max_y = ext.y + ext.h; for (i = 0; i < bh; i++, bitmap += bpitch) - _glyph_scaline(dst, bitmap, ext, x, y + i, max_x, max_y, bw, - alpha, rgb565, rgb565_unpack); + _glyph_scanline(dst, bitmap, ext, x, y + i, max_x, max_y, bw, + alpha, rgb565, rgb565_unpack); } static inline void @@ -244,8 +240,8 @@ for (i = 0; i < bh; i++, bitmap += bpitch) { _glyph_create_mask_line(mask, bitmap, bw); - _glyph_scaline(dst, mask, ext, x, y + i, max_x, max_y, bw, - alpha, rgb565, rgb565_unpack); + _glyph_scanline(dst, mask, ext, x, y + i, max_x, max_y, bw, + alpha, rgb565, rgb565_unpack); } } @@ -255,17 +251,23 @@ int x, int y) { const DATA8 *bitmap; - DATA8 alpha; + DATA8 alpha, r, g, b; DATA16 rgb565; Evas_Rectangle ext; int bpitch, bw, bh; - alpha = A_VAL(&dc->col.col); - if (alpha < 8) return; /* precision is 5 bits, 3 bits lost */ + alpha = A_VAL(&dc->col.col) >> 3; + if (alpha == 0) return; /* precision is 5 bits, 3 bits lost */ + + r = R_VAL(&dc->col.col) >> 3; + g = G_VAL(&dc->col.col) >> 2; + b = B_VAL(&dc->col.col) >> 3; + + if (r > alpha) r = alpha; + if (g > (alpha << 1)) g = (alpha << 1); + if (b > alpha) b = alpha; - rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col), - G_VAL(&dc->col.col), - B_VAL(&dc->col.col)); + rgb565 = (r << 11) | (g << 5) | b; bitmap = fg->glyph_out->bitmap.buffer; bh = fg->glyph_out->bitmap.rows; =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16_image_scaled_sampled.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- evas_soft16_image_scaled_sampled.c 17 Sep 2007 21:11:43 -0000 1.2 +++ evas_soft16_image_scaled_sampled.c 10 Oct 2007 19:22:26 -0000 1.3 @@ -111,14 +111,11 @@ Soft16_Image *dst, RGBA_Draw_Context *dc, int dst_offset, int w, int h, - int *offset_x, int *offset_y) + int *offset_x, int *offset_y, + DATA8 alpha) { 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; + int y, w_align; w_align = w & ~7; @@ -141,7 +138,7 @@ UNROLL8({ _soft16_pt_blend_solid_solid_mul_alpha - (d, s[offset_x[x]], rel_alpha); + (d, s[offset_x[x]], alpha); x++; d++; }); @@ -149,7 +146,7 @@ for (; x < w; x++, d++) _soft16_pt_blend_solid_solid_mul_alpha - (d, s[offset_x[x]], rel_alpha); + (d, s[offset_x[x]], alpha); } } @@ -158,14 +155,11 @@ Soft16_Image *dst, RGBA_Draw_Context *dc, int dst_offset, int w, int h, - int *offset_x, int *offset_y) + int *offset_x, int *offset_y, + DATA8 alpha) { 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; + int y, w_align; w_align = w & ~7; @@ -193,7 +187,7 @@ UNROLL8({ int off_x = offset_x[x]; _soft16_pt_blend_transp_solid_mul_alpha - (d, s[off_x], a[off_x], rel_alpha); + (d, s[off_x], a[off_x], alpha); x++; d++; }); @@ -201,7 +195,7 @@ for (; x < w; x++, d++) _soft16_pt_blend_transp_solid_mul_alpha - (d, s[offset_x[x]], a[offset_x[x]], rel_alpha); + (d, s[offset_x[x]], a[offset_x[x]], alpha); } } @@ -209,14 +203,14 @@ _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) + int *offset_x, int *offset_y, DATA8 a) { 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); + (src, dst, dc, dst_offset, w, h, offset_x, offset_y, a); 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); + (src, dst, dc, dst_offset, w, h, offset_x, offset_y, a); else fprintf(stderr, "Unsupported draw of scaled images src->have_alpha=%d, " @@ -229,27 +223,18 @@ Soft16_Image *dst, RGBA_Draw_Context *dc, int dst_offset, int w, int h, - int *offset_x, int *offset_y) + int *offset_x, int *offset_y, + DATA8 r, DATA8 g, DATA8 b, + DATA8 alpha) { 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++; + int y, w_align; w_align = w & ~7; dst_itr = dst->pixels + dst_offset; - if (rel_alpha == 31) + if (alpha == 31) for (y = 0; y < h; y++, dst_itr += dst->stride) { DATA16 *d, *s; @@ -297,7 +282,7 @@ UNROLL8({ _soft16_pt_blend_solid_solid_mul_color_transp - (d, s[offset_x[x]], rel_alpha, r, g, b); + (d, s[offset_x[x]], alpha, r, g, b); x++; d++; }); @@ -305,7 +290,7 @@ for (; x < w; x++, d++) _soft16_pt_blend_solid_solid_mul_color_transp - (d, s[offset_x[x]], rel_alpha, r, g, b); + (d, s[offset_x[x]], alpha, r, g, b); } } @@ -314,28 +299,18 @@ Soft16_Image *dst, RGBA_Draw_Context *dc, int dst_offset, int w, int h, - int *offset_x, int *offset_y) + int *offset_x, int *offset_y, + DATA8 r, DATA8 g, DATA8 b, + DATA8 alpha) { 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++; + int y, w_align; w_align = w & ~7; dst_itr = dst->pixels + dst_offset; - if (rel_alpha == 0) + if (alpha == 31) for (y = 0; y < h; y++, dst_itr += dst->stride) { DATA16 *d, *s; @@ -393,7 +368,7 @@ 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); + (d, s[off_x], a[off_x], alpha, r, g, b); x++; d++; }); @@ -401,7 +376,7 @@ 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); + (d, s[offset_x[x]], a[offset_x[x]], alpha, r, g, b); } } @@ -409,14 +384,15 @@ _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) + int *offset_x, int *offset_y, + DATA8 r, DATA8 g, DATA8 b, DATA8 a) { 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); + (src, dst, dc, dst_offset, w, h, offset_x, offset_y, r, g, b, a); 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); + (src, dst, dc, dst_offset, w, h, offset_x, offset_y, r, g, b, a); else fprintf(stderr, "Unsupported draw of scaled images src->have_alpha=%d, " @@ -428,16 +404,15 @@ _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) + int *offset_x, int *offset_y, DATA8 r, DATA8 g, + DATA8 b, DATA8 a) { - 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))) + if ((a == r) && (a == (g >> 1)) && (a == b)) _soft16_image_draw_scaled_mul_alpha - (src, dst, dc, dst_offset, w, h, offset_x, offset_y); + (src, dst, dc, dst_offset, w, h, offset_x, offset_y, a); else _soft16_image_draw_scaled_mul_color - (src, dst, dc, dst_offset, w, h, offset_x, offset_y); + (src, dst, dc, dst_offset, w, h, offset_x, offset_y, r, g, b, a); } void @@ -448,6 +423,31 @@ const Evas_Rectangle cr) { int x, y, dst_offset, *offset_x, *offset_y; + DATA16 mul_rgb565; + DATA8 r, g, b, a; + + if (!dc->mul.use) + { + r = b = a = 31; + g = 63; + mul_rgb565 = 0xffff; + } + else + { + a = A_VAL(&dc->mul.col) >> 3; + if (a == 0) + return; + + r = R_VAL(&dc->mul.col) >> 3; + g = G_VAL(&dc->mul.col) >> 2; + b = B_VAL(&dc->mul.col) >> 3; + + if (r > a) r = a; + if (g > (a << 1)) g = (a << 1); + if (b > a) b = a; + + mul_rgb565 = (r << 11) || (g << 5) | b; + } /* pre-calculated scale tables */ offset_x = alloca(cr.w * sizeof(*offset_x)); @@ -461,10 +461,11 @@ dst_offset = cr.x + (cr.y * dst->stride); - if ((!dc->mul.use) || (dc->mul.col == 0xffffffff)) + + if (mul_rgb565 == 0xffff) _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) + else _soft16_image_draw_scaled_mul - (src, dst, dc, dst_offset, cr.w, cr.h, offset_x, offset_y); + (src, dst, dc, dst_offset, cr.w, cr.h, offset_x, offset_y, r, g, b, a); } =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16_image_unscaled.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- evas_soft16_image_unscaled.c 21 Jun 2007 19:57:56 -0000 1.1 +++ evas_soft16_image_unscaled.c 10 Oct 2007 19:22:26 -0000 1.2 @@ -72,22 +72,17 @@ RGBA_Draw_Context *dc, int src_offset, int dst_offset, - int w, int h) + int w, int h, DATA8 a) { DATA16 *src_itr, *dst_itr; - int y, rel_alpha; + int y; src_itr = src->pixels + src_offset; dst_itr = dst->pixels + dst_offset; - rel_alpha = A_VAL(&dc->mul.col) >> 3; - if ((rel_alpha < 1) || (rel_alpha > 31)) return; - rel_alpha = 31 - rel_alpha; - for (y = 0; y < h; y++) { - _soft16_scanline_blend_solid_solid_mul_alpha(src_itr, dst_itr, w, - rel_alpha); + _soft16_scanline_blend_solid_solid_mul_alpha(src_itr, dst_itr, w, a); src_itr += src->stride; dst_itr += dst->stride; } @@ -99,25 +94,21 @@ RGBA_Draw_Context *dc, int src_offset, int dst_offset, - int w, int h) + int w, int h, DATA8 a) { DATA16 *src_itr, *dst_itr; DATA8 *alpha_itr; - int y, rel_alpha; + int y; src_itr = src->pixels + src_offset; alpha_itr = src->alpha + src_offset; dst_itr = dst->pixels + dst_offset; - rel_alpha = A_VAL(&dc->mul.col) >> 3; - if ((rel_alpha < 1) || (rel_alpha > 31)) return; - rel_alpha = 31 - rel_alpha; - for (y = 0; y < h; y++) { _soft16_scanline_blend_transp_solid_mul_alpha(src_itr, alpha_itr, - dst_itr, w, rel_alpha); + dst_itr, w, a); src_itr += src->stride; alpha_itr += src->stride; dst_itr += dst->stride; @@ -128,14 +119,14 @@ _soft16_image_draw_unscaled_mul_alpha(Soft16_Image *src, Soft16_Image *dst, RGBA_Draw_Context *dc, int src_offset, int dst_offset, - int width, int height) + int width, int height, DATA8 a) { if (src->have_alpha && (!dst->have_alpha)) _soft16_image_draw_unscaled_transp_solid_mul_alpha - (src, dst, dc, src_offset, dst_offset, width, height); + (src, dst, dc, src_offset, dst_offset, width, height, a); else if ((!src->have_alpha) && (!dst->have_alpha)) _soft16_image_draw_unscaled_solid_solid_mul_alpha - (src, dst, dc, src_offset, dst_offset, width, height); + (src, dst, dc, src_offset, dst_offset, width, height, a); else fprintf(stderr, "Unsupported draw of unscaled images src->have_alpha=%d, " @@ -149,26 +140,16 @@ RGBA_Draw_Context *dc, int src_offset, int dst_offset, - int w, int h) + int w, int h, DATA8 r, + DATA8 g, DATA8 b, DATA8 a) { DATA16 *src_itr, *dst_itr; - int y, rel_alpha, r, g, b; + int y; src_itr = src->pixels + src_offset; dst_itr = dst->pixels + dst_offset; - 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++; - - if (rel_alpha == 31) + if (a == 31) for (y = 0; y < h; y++) { _soft16_scanline_blend_solid_solid_mul_color_solid @@ -180,7 +161,7 @@ for (y = 0; y < h; y++) { _soft16_scanline_blend_solid_solid_mul_color_transp - (src_itr, dst_itr, w, rel_alpha, r, g, b); + (src_itr, dst_itr, w, a, r, g, b); src_itr += src->stride; dst_itr += dst->stride; } @@ -192,30 +173,19 @@ RGBA_Draw_Context *dc, int src_offset, int dst_offset, - int w, int h) + int w, int h, DATA8 r, + DATA8 g, DATA8 b, DATA8 a) { DATA16 *src_itr, *dst_itr; DATA8 *alpha_itr; - int y, rel_alpha, r, g, b; + int y; src_itr = src->pixels + src_offset; alpha_itr = src->alpha + src_offset; dst_itr = dst->pixels + dst_offset; - 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++; - - if (rel_alpha == 0) + if (a == 31) for (y = 0; y < h; y++) { _soft16_scanline_blend_transp_solid_mul_color_solid @@ -228,7 +198,7 @@ for (y = 0; y < h; y++) { _soft16_scanline_blend_transp_solid_mul_color_transp - (src_itr, alpha_itr, dst_itr, w, rel_alpha, r, g, b); + (src_itr, alpha_itr, dst_itr, w, a, r, g, b); src_itr += src->stride; alpha_itr += src->stride; dst_itr += dst->stride; @@ -239,14 +209,15 @@ _soft16_image_draw_unscaled_mul_color(Soft16_Image *src, Soft16_Image *dst, RGBA_Draw_Context *dc, int src_offset, int dst_offset, - int width, int height) + int width, int height, + DATA8 r, DATA8 g, DATA8 b, DATA8 a) { if (src->have_alpha && (!dst->have_alpha)) - _soft16_image_draw_unscaled_transp_solid_mul_color - (src, dst, dc, src_offset, dst_offset, width, height); + _soft16_image_draw_unscaled_transp_solid_mul_color + (src, dst, dc, src_offset, dst_offset, width, height, r, g, b, a); else if ((!src->have_alpha) && (!dst->have_alpha)) - _soft16_image_draw_unscaled_solid_solid_mul_color - (src, dst, dc, src_offset, dst_offset, width, height); + _soft16_image_draw_unscaled_solid_solid_mul_color + (src, dst, dc, src_offset, dst_offset, width, height, r, g, b, a); else fprintf(stderr, "Unsupported draw of unscaled images src->have_alpha=%d, " @@ -258,16 +229,16 @@ _soft16_image_draw_unscaled_mul(Soft16_Image *src, Soft16_Image *dst, RGBA_Draw_Context *dc, int src_offset, int dst_offset, - int width, int height) + int width, int height, DATA8 r, DATA8 g, + DATA8 b, DATA8 a) { - 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))) + if ((a == r) && (a == (g >> 1)) && (a == b)) _soft16_image_draw_unscaled_mul_alpha(src, dst, dc, src_offset, - dst_offset, width, height); + dst_offset, width, height, a); else _soft16_image_draw_unscaled_mul_color(src, dst, dc, src_offset, - dst_offset, width, height); + dst_offset, width, height, + r, g, b, a); } void @@ -278,16 +249,42 @@ const Evas_Rectangle cr) { int src_offset_rows, src_offset, dst_offset; + DATA16 mul_rgb565; + DATA8 r, g, b, a; + + if (!dc->mul.use) + { + r = b = a = 31; + g = 63; + mul_rgb565 = 0xffff; + } + else + { + a = A_VAL(&dc->mul.col) >> 3; + if (a == 0) + return; + + r = R_VAL(&dc->mul.col) >> 3; + g = G_VAL(&dc->mul.col) >> 2; + b = B_VAL(&dc->mul.col) >> 3; + + if (r > a) r = a; + if (g > (a << 1)) g = (a << 1); + if (b > a) b = a; + + mul_rgb565 = (r << 11) || (g << 5) | b; + } + src_offset_rows = (cr.y - dr.y) + sr.y; src_offset = (src_offset_rows * src->stride) + (cr.x - dr.x) + sr.x; dst_offset = cr.x + (cr.y * dst->stride); - if ((!dc->mul.use) || (dc->mul.col == 0xffffffff)) + if (mul_rgb565 == 0xffff) _soft16_image_draw_unscaled_no_mul(src, dst, dc, src_offset, dst_offset, cr.w, cr.h); - else if (dc->mul.col != 0x00000000) + else _soft16_image_draw_unscaled_mul(src, dst, dc, src_offset, dst_offset, - cr.w, cr.h); + cr.w, cr.h, r, g, b, a); } =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16_rectangle.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- evas_soft16_rectangle.c 20 Jun 2007 19:10:15 -0000 1.1 +++ evas_soft16_rectangle.c 10 Oct 2007 19:22:26 -0000 1.2 @@ -42,6 +42,7 @@ G_VAL(&dc->col.col), B_VAL(&dc->col.col)); rgb565 = RGB_565_UNPACK(rgb565); + alpha++; for (i = 0; i < h; i++, dst_itr += dst->stride) _soft16_scanline_fill_transp_solid(dst_itr, w, rgb565, alpha); =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16_scanline_blend.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- evas_soft16_scanline_blend.c 20 Jun 2007 20:50:34 -0000 1.2 +++ evas_soft16_scanline_blend.c 10 Oct 2007 19:22:26 -0000 1.3 @@ -18,6 +18,9 @@ else if (alpha != 0) { DATA32 a, b; + + DATA32 dst = *p_dst; + a = RGB_565_UNPACK(src); b = RGB_565_UNPACK(*p_dst); b = RGB_565_UNPACKED_BLEND(a, b, alpha); @@ -103,15 +106,18 @@ static inline void _soft16_pt_blend_transp_solid_mul_alpha(DATA16 *p_dst, DATA16 src, DATA8 alpha, DATA8 rel_alpha) { - /* rel_alpha is always > 0, so (alpha - rel_alpha) is always < 31 */ - if (alpha > rel_alpha) - { - DATA32 a, b; - a = RGB_565_UNPACK(src); - b = RGB_565_UNPACK(*p_dst); - b = RGB_565_UNPACKED_BLEND(a, b, alpha - rel_alpha); - *p_dst = RGB_565_PACK(b); - } + DATA32 a, b; + + alpha = (alpha * rel_alpha) >> 5; + if (alpha == 0) + return; + + alpha++; + + a = ((RGB_565_UNPACK(src) * rel_alpha) >> 5) & RGB_565_UNPACKED_MASK; + b = RGB_565_UNPACK(*p_dst); + b = RGB_565_UNPACKED_BLEND(a, b, alpha); + *p_dst = RGB_565_PACK(b); } static inline void @@ -181,7 +187,7 @@ DATA32 a, b; a = RGB_565_UNPACK(src); b = RGB_565_UNPACK(*p_dst); - b = RGB_565_UNPACKED_BLEND(a, b, rel_alpha); + b = RGB_565_UNPACKED_BLEND_UNMUL(a, b, rel_alpha); *p_dst = RGB_565_PACK(b); } @@ -217,19 +223,23 @@ static inline void _soft16_pt_blend_transp_solid_mul_color_transp(DATA16 *p_dst, DATA16 src, DATA8 alpha, DATA8 rel_alpha, DATA16 r, DATA16 g, DATA16 b) { - /* rel_alpha is always > 0, so (alpha - rel_alpha) is always < 31 */ - if (alpha > rel_alpha) - { - int r1, g1, b1; - DATA32 rgb, d; - r1 = ((((src) >> 11) & 0x1f) * r) >> 8; - g1 = ((((src) >> 5) & 0x3f) * g) >> 8; - b1 = (((src) & 0x1f) * b) >> 8; - rgb = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK; - d = RGB_565_UNPACK(*p_dst); - d = RGB_565_UNPACKED_BLEND(rgb, d, alpha - rel_alpha); - *p_dst = RGB_565_PACK(d); - } + DATA32 rgb, d; + int r1, g1, b1; + + alpha = (alpha * rel_alpha) >> 5; + if (alpha == 0) + return; + + alpha++; + + r1 = ((((src) >> 11) & 0x1f) * r) >> 5; + g1 = ((((src) >> 5) & 0x3f) * g) >> 6; + b1 = (((src) & 0x1f) * b) >> 5; + rgb = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK; + d = RGB_565_UNPACK(*p_dst); + d = RGB_565_UNPACKED_BLEND(rgb, d, alpha); + + *p_dst = RGB_565_PACK(d); } static inline void @@ -300,9 +310,9 @@ int r1, g1, b1; DATA32 rgb, d; - r1 = ((((src) >> 11) & 0x1f) * r) >> 8; - g1 = ((((src) >> 5) & 0x3f) * g) >> 8; - b1 = (((src) & 0x1f) * b) >> 8; + r1 = ((((src) >> 11) & 0x1f) * r) >> 5; + g1 = ((((src) >> 5) & 0x3f) * g) >> 6; + b1 = (((src) & 0x1f) * b) >> 5; rgb = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK; d = RGB_565_UNPACK(*p_dst); @@ -341,15 +351,15 @@ * Blend operations with extra multiply color */ static inline void -_soft16_pt_blend_transp_solid_mul_color_solid(DATA16 *p_dst, DATA16 src, DATA8 alpha, DATA16 r, DATA16 g, DATA16 b) +_soft16_pt_blend_transp_solid_mul_color_solid(DATA16 *p_dst, DATA16 src, DATA8 alpha, DATA8 r, DATA8 g, DATA8 b) { int r1, g1, b1; if (alpha == 0) return; - r1 = ((((src >> 11) & 0x1f) * r) >> 8) & 0x1f; - g1 = ((((src >> 5) & 0x3f) * g) >> 8) & 0x3f; - b1 = (((src & 0x1f) * b) >> 8) & 0x1f; + r1 = ((((src >> 11) & 0x1f) * r) >> 5) & 0x1f; + g1 = ((((src >> 5) & 0x3f) * g) >> 6) & 0x3f; + b1 = (((src & 0x1f) * b) >> 5) & 0x1f; if (alpha == 31) *p_dst = (r1 << 11) | (g1 << 5) | b1; else @@ -430,15 +440,15 @@ { int r1, g1, b1; - r1 = ((((src >> 11) & 0x1f) * r) >> 8) & 0x1f; - g1 = ((((src >> 5) & 0x3f) * g) >> 8) & 0x3f; - b1 = (((src & 0x1f) * b) >> 8) & 0x1f; + r1 = ((((src >> 11) & 0x1f) * r) >> 5) & 0x1f; + g1 = ((((src >> 5) & 0x3f) * g) >> 6) & 0x3f; + b1 = (((src & 0x1f) * b) >> 5) & 0x1f; *p_dst = (r1 << 11) | (g1 << 5) | b1; } static inline void -_soft16_scanline_blend_solid_solid_mul_color_solid(DATA16 *src, DATA16 *dst, int size, DATA16 r, DATA16 g, DATA16 b) +_soft16_scanline_blend_solid_solid_mul_color_solid(DATA16 *src, DATA16 *dst, int size, DATA8 r, DATA8 g, DATA8 b) { DATA16 *start, *end; ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/ _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs