jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=4bff14676ebe2ab981e9c10c2d6746cb3ec2737c

commit 4bff14676ebe2ab981e9c10c2d6746cb3ec2737c
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Mon Dec 22 20:29:27 2014 +0900

    Evas masking: Fix mask blend functions (SW engine)
    
    The selected op func was not performing the correct operation,
    thus producing rendering artifacts. These functions should not
    be used anywhere except in case of masking... which was not an
    available option earlier.
    
    It was doing (wrong):
    dst = interp(mask, src, dst)
    
    Instead of (correct):
    dst = dst + (1 - mask) * src
    
    NOTE:
    This commit also disables MMX, SSE3 & NEON implementations of
    pixel_mask blend operations, since they are also broken.
---
 .../common/evas_op_blend/op_blend_master_sse3.c    |  4 ++--
 .../common/evas_op_blend/op_blend_pixel_mask_.c    | 24 +---------------------
 .../evas_op_blend/op_blend_pixel_mask_i386.c       | 17 +++++++++++----
 .../evas_op_blend/op_blend_pixel_mask_neon.c       |  9 ++++++++
 .../evas_op_blend/op_blend_pixel_mask_sse3.c       | 16 +++++++++++++++
 src/lib/evas/common/evas_op_blend_main_.c          |  4 ++--
 6 files changed, 43 insertions(+), 31 deletions(-)

diff --git a/src/lib/evas/common/evas_op_blend/op_blend_master_sse3.c 
b/src/lib/evas/common/evas_op_blend/op_blend_master_sse3.c
index 667838e..2947b8b 100644
--- a/src/lib/evas/common/evas_op_blend/op_blend_master_sse3.c
+++ b/src/lib/evas/common/evas_op_blend/op_blend_master_sse3.c
@@ -31,7 +31,7 @@ evas_common_op_blend_init_sse3(void)
 
    init_blend_pixel_span_funcs_sse3();
    init_blend_pixel_color_span_funcs_sse3();
-   init_blend_pixel_mask_span_funcs_sse3();
+   init_blend_pixel_mask_span_funcs_sse3(); // FIXME
    init_blend_color_span_funcs_sse3();
    init_blend_mask_color_span_funcs_sse3();
 
@@ -49,7 +49,7 @@ evas_common_op_blend_rel_init_sse3(void)
 #ifdef BUILD_SSE3
    init_blend_rel_pixel_span_funcs_sse3();
    init_blend_rel_pixel_color_span_funcs_sse3();
-   init_blend_rel_pixel_mask_span_funcs_sse3();
+   init_blend_rel_pixel_mask_span_funcs_sse3(); // FIXME
    init_blend_rel_color_span_funcs_sse3();
    init_blend_rel_mask_color_span_funcs_sse3();
 
diff --git a/src/lib/evas/common/evas_op_blend/op_blend_pixel_mask_.c 
b/src/lib/evas/common/evas_op_blend/op_blend_pixel_mask_.c
index 78ff716..2ac4f89 100644
--- a/src/lib/evas/common/evas_op_blend/op_blend_pixel_mask_.c
+++ b/src/lib/evas/common/evas_op_blend/op_blend_pixel_mask_.c
@@ -25,29 +25,7 @@ _op_blend_p_mas_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, 
int l) {
                      });
 }
 
-static void
-_op_blend_pas_mas_dp(DATA32 *s, DATA8 *m, DATA32 c EINA_UNUSED, DATA32 *d, int 
l) {
-   DATA32 *e;
-   int alpha;
-   UNROLL8_PLD_WHILE(d, l, e,
-                     {
-                        alpha = *m;
-                        switch(alpha)
-                          {
-                          case 0:
-                             break;
-                          case 255:
-                             *d = *s;
-                             break;
-                          default:
-                             alpha++;
-                             *d = INTERP_256(alpha, *s, *d);
-                             break;
-                          }
-                        m++;  s++;  d++;
-                     });
-}
-
+#define _op_blend_pas_mas_dp _op_blend_p_mas_dp
 #define _op_blend_pan_mas_dp _op_blend_pas_mas_dp
 
 #define _op_blend_p_mas_dpan _op_blend_p_mas_dp
diff --git a/src/lib/evas/common/evas_op_blend/op_blend_pixel_mask_i386.c 
b/src/lib/evas/common/evas_op_blend/op_blend_pixel_mask_i386.c
index 8c960d2..9494ce6 100644
--- a/src/lib/evas/common/evas_op_blend/op_blend_pixel_mask_i386.c
+++ b/src/lib/evas/common/evas_op_blend/op_blend_pixel_mask_i386.c
@@ -1,6 +1,10 @@
 /* blend pixel x mask --> dst */
 
 #ifdef BUILD_MMX
+
+// FIXME: These functions most likely don't perform the correct operation.
+// Test them with masks and images.
+#if 0
 static void
 _op_blend_pas_mas_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c EINA_UNUSED, DATA32 *d, 
int l) {
    DATA32 *e = d + l;
@@ -62,8 +66,13 @@ _op_blend_pan_mas_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c 
EINA_UNUSED, DATA32 *d, i
        m++;  s++;  d++;
      }
 }
+#else
+// FIXME
+#define _op_blend_p_mas_dp_mmx NULL
+#define _op_blend_pas_mas_dp_mmx _op_blend_p_mas_dp_mmx
+#endif
 
-#define _op_blend_p_mas_dp_mmx _op_blend_pas_mas_dp_mmx
+#define _op_blend_pan_mas_dp_mmx _op_blend_pas_mas_dp_mmx
 
 #define _op_blend_p_mas_dpan_mmx _op_blend_p_mas_dp_mmx
 #define _op_blend_pan_mas_dpan_mmx _op_blend_pan_mas_dp_mmx
@@ -128,9 +137,9 @@ init_blend_pixel_mask_pt_funcs_mmx(void)
 
 #ifdef BUILD_MMX
 
-#define _op_blend_rel_p_mas_dpan_mmx _op_blend_p_mas_dpan_mmx
-#define _op_blend_rel_pas_mas_dpan_mmx _op_blend_pas_mas_dpan_mmx
-#define _op_blend_rel_pan_mas_dpan_mmx _op_blend_pan_mas_dpan_mmx
+#define _op_blend_rel_p_mas_dpan_mmx NULL
+#define _op_blend_rel_pas_mas_dpan_mmx _op_blend_rel_p_mas_dpan_mmx
+#define _op_blend_rel_pan_mas_dpan_mmx _op_blend_rel_pas_mas_dpan_mmx
 
 static void
 init_blend_rel_pixel_mask_span_funcs_mmx(void)
diff --git a/src/lib/evas/common/evas_op_blend/op_blend_pixel_mask_neon.c 
b/src/lib/evas/common/evas_op_blend/op_blend_pixel_mask_neon.c
index d36e714..0c1029b 100644
--- a/src/lib/evas/common/evas_op_blend/op_blend_pixel_mask_neon.c
+++ b/src/lib/evas/common/evas_op_blend/op_blend_pixel_mask_neon.c
@@ -1,6 +1,10 @@
 /* blend pixel x mask --> dst */
 
+// FIXME: These functions most likely don't perform the correct operation.
+// Test them with masks and images.
+
 #ifdef BUILD_NEON
+#if 0
 static void
 _op_blend_pas_mas_dp_neon(DATA32 *s, DATA8 *m, DATA32 c EINA_UNUSED, DATA32 
*d, int l) {
    DATA32 *e;
@@ -46,6 +50,11 @@ _op_blend_pan_mas_dp_neon(DATA32 *s, DATA8 *m, DATA32 c 
EINA_UNUSED, DATA32 *d,
                         m++;  s++;  d++;
                      });
 }
+#else
+// FIXME
+#define _op_blend_pas_mas_dp_neon NULL
+#define _op_blend_pan_mas_dp_neon NULL
+#endif
 
 #define _op_blend_p_mas_dp_neon _op_blend_pas_mas_dp_neon
 
diff --git a/src/lib/evas/common/evas_op_blend/op_blend_pixel_mask_sse3.c 
b/src/lib/evas/common/evas_op_blend/op_blend_pixel_mask_sse3.c
index 07f336b..6ffa3ce 100644
--- a/src/lib/evas/common/evas_op_blend/op_blend_pixel_mask_sse3.c
+++ b/src/lib/evas/common/evas_op_blend/op_blend_pixel_mask_sse3.c
@@ -2,6 +2,9 @@
 
 #ifdef BUILD_SSE3
 
+// FIXME: These functions most likely don't perform the correct operation.
+// Test them with masks and images.
+#if 0
 static void
 _op_blend_p_mas_dp_sse3(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
 
@@ -150,6 +153,12 @@ _op_blend_pas_mas_dp_sse3(DATA32 *s, DATA8 *m, DATA32 c 
EINA_UNUSED, DATA32 *d,
          m += 8; s += 8; d += 8; l -= 8;
       })
 }
+#endif
+
+// FIXME
+#define _op_blend_p_mas_dp_sse3 NULL
+#define _op_blend_pas_mas_dp_sse3 _op_blend_p_mas_dp_sse3
+// -----
 
 #define _op_blend_pan_mas_dp_sse3 _op_blend_pas_mas_dp_sse3
 
@@ -169,8 +178,10 @@ init_blend_pixel_mask_span_funcs_sse3(void)
    op_blend_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_SSE3] = 
_op_blend_pan_mas_dpan_sse3;
 }
 
+// FIXME
 #define _op_blend_pt_p_mas_dp_sse3 NULL
 #define _op_blend_pt_pan_mas_dp_sse3 NULL
+// -----
 
 #define _op_blend_pt_pas_mas_dp_sse3 _op_blend_pt_p_mas_dp_sse3
 
@@ -194,6 +205,7 @@ init_blend_pixel_mask_pt_funcs_sse3(void)
 
 /* blend_rel pixel x mask -> dst */
 
+#if 0
 static void
 _op_blend_rel_p_mas_dp_sse3(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
 
@@ -256,6 +268,10 @@ _op_blend_rel_p_mas_dp_sse3(DATA32 *s, DATA8 *m, DATA32 c, 
DATA32 *d, int l) {
          d += 8; m += 8; s += 8; l -= 8;
       })
 }
+#else
+// FIXME
+#define _op_blend_rel_p_mas_dp_sse3 NULL
+#endif
 
 #define _op_blend_rel_pas_mas_dp_sse3 _op_blend_rel_p_mas_dp_sse3
 #define _op_blend_rel_pan_mas_dp_sse3 _op_blend_rel_p_mas_dp_sse3
diff --git a/src/lib/evas/common/evas_op_blend_main_.c 
b/src/lib/evas/common/evas_op_blend_main_.c
index aff6cdb..33f7a7a 100644
--- a/src/lib/evas/common/evas_op_blend_main_.c
+++ b/src/lib/evas/common/evas_op_blend_main_.c
@@ -109,7 +109,7 @@ op_blend_init(void)
      {
         init_blend_pixel_span_funcs_mmx();
         init_blend_pixel_color_span_funcs_mmx();
-        init_blend_pixel_mask_span_funcs_mmx();
+        init_blend_pixel_mask_span_funcs_mmx(); // FIXME
         init_blend_color_span_funcs_mmx();
         init_blend_mask_color_span_funcs_mmx();
         
@@ -125,7 +125,7 @@ op_blend_init(void)
      {
         init_blend_pixel_span_funcs_neon();
         init_blend_pixel_color_span_funcs_neon();
-        init_blend_pixel_mask_span_funcs_neon();
+        init_blend_pixel_mask_span_funcs_neon(); // FIXME
         init_blend_color_span_funcs_neon();
         init_blend_mask_color_span_funcs_neon();
         

-- 


Reply via email to