From e21a40de9dfdebdcd3f350aa5e5104be35058675 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Mon, 10 Nov 2014 18:16:56 +0900 Subject: [PATCH] Evas: Fix COPY op for mask+color Also, mark some functions with a FIXME as they look just wrong. COPY_REL is never used... MMX and NEON optimizations should be implemented for COPY MASK+COL. --- .../common/evas_op_copy/op_copy_mask_color_.c | 5 ++++ .../evas_op_copy/op_copy_mask_color_i386.c | 26 +++++++++++++++++++ .../evas_op_copy/op_copy_mask_color_neon.c | 14 ++++++---- 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/lib/evas/common/evas_op_copy/op_copy_mask_color_.c b/src/lib/evas/common/evas_op_copy/op_copy_mask_color_.c index 3cbecbef97..dcb4545ea2 100644 --- a/src/lib/evas/common/evas_op_copy/op_copy_mask_color_.c +++ b/src/lib/evas/common/evas_op_copy/op_copy_mask_color_.c @@ -6,6 +6,7 @@ _op_copy_mas_c_dp(DATA32 *s EINA_UNUSED, DATA8 *m, DATA32 c, DATA32 *d, int l) { int alpha; UNROLL8_PLD_WHILE(d, l, e, { + /* d = m*c */ alpha = *m; switch(alpha) { @@ -82,14 +83,17 @@ init_copy_mask_color_pt_funcs_c(void) static void _op_copy_rel_mas_c_dp(DATA32 *s EINA_UNUSED, DATA8 *m, DATA32 c, DATA32 *d, int l) { + /* FIXME: THIS FUNCTION HAS PROBABLY NEVER BEEN TESTED */ DATA32 *e; int color; UNROLL8_PLD_WHILE(d, l, e, { + /* d = (m*c)*da */ color = *m; switch(color) { case 0: + *d = 0; break; case 255: color = 1 + (*d >> 24); @@ -134,6 +138,7 @@ init_copy_rel_mask_color_span_funcs_c(void) static void _op_copy_rel_pt_mas_c_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + /* FIXME: THIS FUNCTION HAS PROBABLY NEVER BEEN TESTED */ s = 1 + (*d >> 24); s = MUL_256(s, c); *d = INTERP_256(m + 1, s, *d); diff --git a/src/lib/evas/common/evas_op_copy/op_copy_mask_color_i386.c b/src/lib/evas/common/evas_op_copy/op_copy_mask_color_i386.c index a8c85e0f7f..438132682b 100644 --- a/src/lib/evas/common/evas_op_copy/op_copy_mask_color_i386.c +++ b/src/lib/evas/common/evas_op_copy/op_copy_mask_color_i386.c @@ -3,6 +3,30 @@ #ifdef BUILD_MMX static void _op_copy_mas_c_dp_mmx(DATA32 *s EINA_UNUSED, DATA8 *m, DATA32 c, DATA32 *d, int l) { +#if 1 + DATA32 *e; + int alpha; + UNROLL8_PLD_WHILE(d, l, e, + { + /* d = m*c */ + alpha = *m; + switch(alpha) + { + case 0: + *d = 0; + break; + case 255: + *d = c; + break; + default: + alpha++; + *d = MUL_256(alpha, c); + break; + } + m++; d++; + }); +#else +#warning This MMX function looks broken. Please fixme. DATA32 *e = d + l; pxor_r2r(mm0, mm0); MOV_P2R(c, mm2, mm0) @@ -29,6 +53,7 @@ _op_copy_mas_c_dp_mmx(DATA32 *s EINA_UNUSED, DATA8 *m, DATA32 c, DATA32 *d, int } m++; d++; } +#endif } #define _op_copy_mas_cn_dp_mmx _op_copy_mas_c_dp_mmx @@ -99,6 +124,7 @@ init_copy_mask_color_pt_funcs_mmx(void) #ifdef BUILD_MMX static void _op_copy_rel_mas_c_dp_mmx(DATA32 *s EINA_UNUSED, DATA8 *m, DATA32 c, DATA32 *d, int l) { + /* FIXME: THIS FUNCTION HAS PROBABLY NEVER BEEN TESTED */ DATA32 *e = d + l; pxor_r2r(mm0, mm0); MOV_P2R(c, mm2, mm0) diff --git a/src/lib/evas/common/evas_op_copy/op_copy_mask_color_neon.c b/src/lib/evas/common/evas_op_copy/op_copy_mask_color_neon.c index 7d9a44e4b6..e5d6d57f9e 100644 --- a/src/lib/evas/common/evas_op_copy/op_copy_mask_color_neon.c +++ b/src/lib/evas/common/evas_op_copy/op_copy_mask_color_neon.c @@ -5,20 +5,22 @@ static void _op_copy_mas_c_dp_neon(DATA32 *s EINA_UNUSED, DATA8 *m, DATA32 c, DATA32 *d, int l) { // FIXME: neon-it DATA32 *e; - int color; + int alpha; UNROLL8_PLD_WHILE(d, l, e, { - color = *m; - switch(color) + /* d = m*c */ + alpha = *m; + switch(alpha) { case 0: + *d = 0; break; case 255: *d = c; break; default: - color++; - *d = INTERP_256(color, c, *d); + alpha++; + *d = MUL_256(alpha, c); break; } m++; d++; @@ -86,6 +88,7 @@ init_copy_mask_color_pt_funcs_neon(void) #ifdef BUILD_NEON static void _op_copy_rel_mas_c_dp_neon(DATA32 *s EINA_UNUSED, DATA8 *m, DATA32 c, DATA32 *d, int l) { + /* FIXME: THIS FUNCTION HAS PROBABLY NEVER BEEN TESTED */ // FIXME: neon-it DATA32 *e; int color; @@ -140,6 +143,7 @@ init_copy_rel_mask_color_span_funcs_neon(void) #ifdef BUILD_NEON static void _op_copy_rel_pt_mas_c_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + /* FIXME: THIS FUNCTION HAS PROBABLY NEVER BEEN TESTED */ s = 1 + (*d >> 24); s = MUL_256(s, c); *d = INTERP_256(m + 1, s, *d);