jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=0740010a061d15a4ecaa00dc21c10301e0af4847

commit 0740010a061d15a4ecaa00dc21c10301e0af4847
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Tue Jan 17 16:13:35 2017 +0900

    evas filters: Move blend to software_generic (1/8)
    
    This is an attempt at refactoring the filters code so I can
    later implement GL support. This patch adds a few extra changes
    to remove avoid calling functions of libevas from the software
    engine: use the draw functions from static_libs/draw rather
    than evas_common APIs.
---
 src/Makefile_Evas.am                               | 16 +++--
 src/lib/evas/common/evas_font_compress.c           |  4 +-
 src/lib/evas/filters/evas_filter.c                 | 78 +++++++++++++---------
 src/lib/evas/filters/evas_filter_mask.c            | 12 ++--
 src/lib/evas/filters/evas_filter_private.h         | 13 +++-
 src/lib/evas/filters/evas_filter_transform.c       |  4 +-
 src/lib/evas/include/evas_filter.h                 |  1 -
 src/lib/evas/include/evas_private.h                |  6 ++
 .../evas/engines/software_generic/evas_engine.c    | 47 ++++++++++++-
 .../engines/software_generic/evas_engine_filter.h  |  8 +++
 .../software_generic}/filters/evas_filter_blend.c  | 50 ++++++--------
 src/static_libs/draw/draw.h                        |  9 +--
 src/static_libs/draw/draw_alpha_main.c             |  8 +--
 src/static_libs/draw/draw_main.c                   | 12 ++--
 14 files changed, 176 insertions(+), 92 deletions(-)

diff --git a/src/Makefile_Evas.am b/src/Makefile_Evas.am
index a1f3789..bb037ff 100644
--- a/src/Makefile_Evas.am
+++ b/src/Makefile_Evas.am
@@ -592,7 +592,6 @@ lib/evas/common/evas_op_sub/op_sub_pixel_mask_i386.c
 lib_evas_libevas_la_SOURCES += \
 lib/evas/canvas/evas_filter_mixin.c \
 lib/evas/filters/evas_filter.c \
-lib/evas/filters/evas_filter_blend.c \
 lib/evas/filters/evas_filter_blur.c \
 lib/evas/filters/evas_filter_bump.c \
 lib/evas/filters/evas_filter_curve.c \
@@ -616,6 +615,10 @@ lib/evas/filters/blur/blur_box_rgba_i386.c \
 lib/evas/filters/blur/blur_box_rgba_sse3.c \
 lib/evas/filters/blur/blur_box_rgba_neon.c
 
+GFX_FILTER_SW_FILES = \
+modules/evas/engines/software_generic/evas_engine_filter.h \
+modules/evas/engines/software_generic/filters/evas_filter_blend.c \
+$(NULL)
 
 ### Engine Ector stuff
 
@@ -641,9 +644,11 @@ 
modules/evas/engines/software_generic/Evas_Engine_Software_Shared.h \
 modules/evas/engines/software_generic/evas_native_tbm.c \
 modules/evas/engines/software_generic/evas_native_dmabuf.c \
 modules/evas/engines/software_generic/evas_ector_software_buffer.c \
-modules/evas/engines/software_generic/evas_native_common.h
+modules/evas/engines/software_generic/evas_native_common.h \
+$(GFX_FILTER_SW_FILES)
 lib_evas_libevas_la_LIBADD +=
-lib_evas_libevas_la_CPPFLAGS += -I$(top_srcdir)/src/lib/ector
+lib_evas_libevas_la_CPPFLAGS += -I$(top_srcdir)/src/lib/ector \
+-I$(top_srcdir)/src/lib/evas/filters
 else
 enginesoftwaregenericpkgdir = 
$(libdir)/evas/modules/engines/software_generic/$(MODULE_ARCH)
 enginesoftwaregenericpkg_LTLIBRARIES = 
modules/evas/engines/software_generic/module.la
@@ -660,10 +665,13 @@ 
modules/evas/engines/software_generic/Evas_Engine_Software_Shared.h \
 modules/evas/engines/software_generic/evas_native_tbm.c \
 modules/evas/engines/software_generic/evas_native_dmabuf.c \
 modules/evas/engines/software_generic/evas_ector_software_buffer.c \
-modules/evas/engines/software_generic/evas_native_common.h
+modules/evas/engines/software_generic/evas_native_common.h \
+$(GFX_FILTER_SW_FILES)
+
 modules_evas_engines_software_generic_module_la_CPPFLAGS = 
-I$(top_builddir)/src/lib/efl \
 -I$(top_srcdir)/src/lib/evas/include \
 -I$(top_srcdir)/src/lib/evas/cserve2 \
+-I$(top_srcdir)/src/lib/evas/filters \
 -I$(top_builddir)/src/modules/evas/engines/software_generic \
 @EVAS_CFLAGS@
 modules_evas_engines_software_generic_module_la_LIBADD = @USE_EVAS_LIBS@
diff --git a/src/lib/evas/common/evas_font_compress.c 
b/src/lib/evas/common/evas_font_compress.c
index e923e17..3a0e90c 100644
--- a/src/lib/evas/common/evas_font_compress.c
+++ b/src/lib/evas/common/evas_font_compress.c
@@ -508,8 +508,8 @@ evas_common_font_glyph_draw(RGBA_Font_Glyph *fg,
         // FIXME: Font draw not optimized for Alpha targets! SLOW!
         // This is not pretty :)
 
-        Alpha_Gfx_Func func;
         DATA8 *src8, *dst8;
+        Draw_Func_Alpha func;
         int row;
 
         if (EINA_UNLIKELY(x < 0))
@@ -534,7 +534,7 @@ evas_common_font_glyph_draw(RGBA_Font_Glyph *fg,
           {
              DATA8 *d = dst8 + ((row - y1) * dst_pitch);
              DATA8 *s = src8 + (row * w) + x1;
-             func(s, d, x2 - x1);
+             func(d, s, x2 - x1);
           }
         free(src8);
      }
diff --git a/src/lib/evas/filters/evas_filter.c 
b/src/lib/evas/filters/evas_filter.c
index 9438a4e..5ff5a7b 100644
--- a/src/lib/evas/filters/evas_filter.c
+++ b/src/lib/evas/filters/evas_filter.c
@@ -61,6 +61,7 @@ evas_filter_context_new(Evas_Public_Data *evas, Eina_Bool 
async, void *user_data
    ctx->evas = evas;
    ctx->async = async;
    ctx->user_data = user_data;
+   ctx->buffer_scaled_get = &evas_filter_buffer_scaled_get;
 
    return ctx;
 }
@@ -1489,8 +1490,19 @@ _filter_name_get(int mode)
 #endif
 
 static Eina_Bool
+_engine_gfx_filter_func(Evas_Filter_Command *cmd)
+{
+   // This should be temporary porting code, when moving filter implementations
+   // from here to the engine. Ideally the filters should be in ector though.
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(cmd->ENFN->gfx_filter_process, EINA_FALSE);
+   return cmd->ENFN->gfx_filter_process(cmd->ENDT, cmd);
+}
+
+static Eina_Bool
 _filter_command_run(Evas_Filter_Command *cmd)
 {
+   Evas_Filter_Support support = EVAS_FILTER_SUPPORT_NONE;
    Evas_Filter_Apply_Func func = NULL;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(cmd->output, EINA_FALSE);
@@ -1515,41 +1527,43 @@ _filter_command_run(Evas_Filter_Command *cmd)
         return EINA_FALSE;
      }
 
-   //func = cmd->ENFN->filter_command_func_get(cmd);
-   // FIXME: Must call engine function, not CPU directly.
+   if (cmd->ENFN->gfx_filter_supports)
+     support = cmd->ENFN->gfx_filter_supports(cmd->ENDT, cmd);
 
-   switch (cmd->mode)
+   if (support != EVAS_FILTER_SUPPORT_NONE)
      {
-      case EVAS_FILTER_MODE_BLEND:
-        func = evas_filter_blend_cpu_func_get(cmd);
-        break;
-      case EVAS_FILTER_MODE_BLUR:
-        func = evas_filter_blur_cpu_func_get(cmd);
-        break;
-      case EVAS_FILTER_MODE_CURVE:
-        func = evas_filter_curve_cpu_func_get(cmd);
-        break;
-      case EVAS_FILTER_MODE_DISPLACE:
-        func = evas_filter_displace_cpu_func_get(cmd);
-        break;
-      case EVAS_FILTER_MODE_FILL:
-        func = evas_filter_fill_cpu_func_get(cmd);
-        break;
-      case EVAS_FILTER_MODE_MASK:
-        func = evas_filter_mask_cpu_func_get(cmd);
-        break;
-      case EVAS_FILTER_MODE_BUMP:
-        func = evas_filter_bump_map_cpu_func_get(cmd);
-        break;
-      case EVAS_FILTER_MODE_TRANSFORM:
-        func = evas_filter_transform_cpu_func_get(cmd);
-        break;
-      default:
-        CRI("Invalid filter mode.");
-        break;
+        func = &_engine_gfx_filter_func;
+     }
+   else
+     {
+        switch (cmd->mode)
+          {
+           case EVAS_FILTER_MODE_BLUR:
+             func = evas_filter_blur_cpu_func_get(cmd);
+             break;
+           case EVAS_FILTER_MODE_CURVE:
+             func = evas_filter_curve_cpu_func_get(cmd);
+             break;
+           case EVAS_FILTER_MODE_DISPLACE:
+             func = evas_filter_displace_cpu_func_get(cmd);
+             break;
+           case EVAS_FILTER_MODE_FILL:
+             func = evas_filter_fill_cpu_func_get(cmd);
+             break;
+           case EVAS_FILTER_MODE_MASK:
+             func = evas_filter_mask_cpu_func_get(cmd);
+             break;
+           case EVAS_FILTER_MODE_BUMP:
+             func = evas_filter_bump_map_cpu_func_get(cmd);
+             break;
+           case EVAS_FILTER_MODE_TRANSFORM:
+             func = evas_filter_transform_cpu_func_get(cmd);
+             break;
+           default:
+             CRI("Invalid filter mode.");
+             break;
+          }
      }
-
-   // END OF FIXME
 
    if (!func)
      {
diff --git a/src/lib/evas/filters/evas_filter_mask.c 
b/src/lib/evas/filters/evas_filter_mask.c
index c13493c..230cb32 100644
--- a/src/lib/evas/filters/evas_filter_mask.c
+++ b/src/lib/evas/filters/evas_filter_mask.c
@@ -67,7 +67,7 @@ _mask_cpu_alpha_alpha_alpha(Evas_Filter_Command *cmd)
    unsigned int src_len = 0, src_stride, msk_len = 0, msk_stride, dst_len = 0, 
dst_stride;
    Efl_Gfx_Render_Op render_op = cmd->draw.rop;
    Evas_Filter_Buffer *msk_fb;
-   Alpha_Gfx_Func func;
+   Draw_Func_Alpha func;
    uint8_t *src_map = NULL, *dst, *dst_map = NULL, *msk, *msk_map = NULL;
    int w, h, mw, mh, x, y, my;
    int stepsize, stepcount, step;
@@ -134,12 +134,12 @@ _mask_cpu_alpha_alpha_alpha(Evas_Filter_Command *cmd)
         dst = dst_map + (y * dst_stride);
 
         for (step = 0; step < stepcount; step++, dst += stepsize)
-          func(msk, dst, stepsize);
+          func(dst, msk, stepsize);
 
         x = stepsize * stepcount;
         if (x < w)
           {
-             func(msk, dst, w - x);
+             func(dst, msk, w - x);
           }
      }
 
@@ -274,7 +274,7 @@ _mask_cpu_alpha_alpha_rgba(Evas_Filter_Command *cmd)
    uint8_t *src, *msk, *span, *src_map = NULL, *msk_map = NULL, *dst_map = 
NULL;
    Evas_Filter_Buffer *msk_fb;
    RGBA_Gfx_Func func;
-   Alpha_Gfx_Func span_func;
+   Draw_Func_Alpha span_func;
    uint32_t *dst;
    uint32_t color;
    Efl_Gfx_Render_Op op = cmd->draw.rop;
@@ -335,7 +335,7 @@ _mask_cpu_alpha_alpha_rgba(Evas_Filter_Command *cmd)
         for (step = 0; step < stepcount; step++, dst += stepsize, src += 
stepsize)
           {
              memcpy(span, msk, stepsize * sizeof(uint8_t));
-             span_func(src, span, stepsize);
+             span_func(span, src, stepsize);
              func(NULL, span, color, dst, stepsize);
           }
 
@@ -343,7 +343,7 @@ _mask_cpu_alpha_alpha_rgba(Evas_Filter_Command *cmd)
         if (x < w)
           {
              memcpy(span, msk, (w - x) * sizeof(uint8_t));
-             span_func(src, span, w - x);
+             span_func(span, src, w - x);
              func(NULL, span, color, dst, w -x);
           }
      }
diff --git a/src/lib/evas/filters/evas_filter_private.h 
b/src/lib/evas/filters/evas_filter_private.h
index c9be59e..f659daa 100644
--- a/src/lib/evas/filters/evas_filter_private.h
+++ b/src/lib/evas/filters/evas_filter_private.h
@@ -109,6 +109,8 @@ extern int _evas_filter_log_dom;
 
 typedef enum _Evas_Filter_Interpolation_Mode Evas_Filter_Interpolation_Mode;
 
+typedef Evas_Filter_Buffer * 
(*evas_filter_buffer_scaled_get_func)(Evas_Filter_Context *ctx, 
Evas_Filter_Buffer *src, unsigned w, unsigned h);
+
 struct _Evas_Filter_Context
 {
    Evas_Public_Data *evas;
@@ -118,6 +120,9 @@ struct _Evas_Filter_Context
    int last_command_id;
    void *user_data; // used by textblock
 
+   // ugly hack (dlsym fail)
+   evas_filter_buffer_scaled_get_func buffer_scaled_get;
+
    // Variables changing at each run
    int w, h; // Dimensions of the input/output buffers
    int padl, padt, padr, padb; // Padding in the current input/output buffers
@@ -245,11 +250,17 @@ enum _Evas_Filter_Interpolation_Mode
    EVAS_FILTER_INTERPOLATION_MODE_LINEAR
 };
 
+enum _Evas_Filter_Support
+{
+   EVAS_FILTER_SUPPORT_NONE = 0,
+   EVAS_FILTER_SUPPORT_CPU,
+   EVAS_FILTER_SUPPORT_GL
+};
+
 void                     evas_filter_context_clear(Evas_Filter_Context *ctx);
 void                     evas_filter_context_source_set(Evas_Filter_Context 
*ctx, Evas_Object *eo_proxy, Evas_Object *eo_source, int bufid, 
Eina_Stringshare *name);
 
 /* FIXME: CPU filters entry points. Move these to the Evas Engine itself. */
-Evas_Filter_Apply_Func   evas_filter_blend_cpu_func_get(Evas_Filter_Command 
*cmd);
 Evas_Filter_Apply_Func   evas_filter_blur_cpu_func_get(Evas_Filter_Command 
*cmd);
 Evas_Filter_Apply_Func   evas_filter_bump_map_cpu_func_get(Evas_Filter_Command 
*cmd);
 Evas_Filter_Apply_Func   evas_filter_curve_cpu_func_get(Evas_Filter_Command 
*cmd);
diff --git a/src/lib/evas/filters/evas_filter_transform.c 
b/src/lib/evas/filters/evas_filter_transform.c
index 0cc3b2d..db90147 100644
--- a/src/lib/evas/filters/evas_filter_transform.c
+++ b/src/lib/evas/filters/evas_filter_transform.c
@@ -72,7 +72,7 @@ _vflip_cpu(Evas_Filter_Command *cmd)
    else if (cspace == E_ALPHA)
      {
         /* blend onto a target (alpha -> alpha) */
-        Alpha_Gfx_Func func = efl_draw_alpha_func_get(cmd->draw.rop, 
EINA_FALSE);
+        Draw_Func_Alpha func = efl_draw_alpha_func_get(cmd->draw.rop, 
EINA_FALSE);
         EINA_SAFETY_ON_NULL_GOTO(func, end);
 
         for (sy = s0, dy = d0; (dy >= d1) && (sy <= s1); sy++, dy--)
@@ -80,7 +80,7 @@ _vflip_cpu(Evas_Filter_Command *cmd)
              uint8_t* src = in + src_stride * sy;
              uint8_t* dst = out + dst_stride * dy;
 
-             func(src, dst, w);
+             func(dst, src, w);
           }
      }
    else
diff --git a/src/lib/evas/include/evas_filter.h 
b/src/lib/evas/include/evas_filter.h
index c8962c4..0c87af2 100644
--- a/src/lib/evas/include/evas_filter.h
+++ b/src/lib/evas/include/evas_filter.h
@@ -33,7 +33,6 @@
 #endif /* ! _WIN32 */
 
 typedef struct _Evas_Filter_Context Evas_Filter_Context;
-typedef struct _Evas_Filter_Command Evas_Filter_Command;
 typedef struct _Evas_Filter_Instruction Evas_Filter_Instruction;
 typedef struct _Evas_Filter_Buffer Evas_Filter_Buffer;
 typedef struct _Evas_Filter_Proxy_Binding Evas_Filter_Proxy_Binding;
diff --git a/src/lib/evas/include/evas_private.h 
b/src/lib/evas/include/evas_private.h
index 4491af6..4d6f608 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -91,10 +91,13 @@ typedef struct _Evas_Smart_Data             Evas_Smart_Data;
 typedef struct _Evas_Object_Protected_State Evas_Object_Protected_State;
 typedef struct _Evas_Object_Protected_Data  Evas_Object_Protected_Data;
 
+/* gfx filters typedef only */
 typedef struct _Evas_Filter_Program         Evas_Filter_Program;
 typedef struct _Evas_Object_Filter_Data     Evas_Object_Filter_Data;
 typedef struct _Evas_Filter_Data_Binding    Evas_Filter_Data_Binding;
 typedef struct _Evas_Pointer_Data           Evas_Pointer_Data;
+typedef struct _Evas_Filter_Command         Evas_Filter_Command;
+typedef enum _Evas_Filter_Support           Evas_Filter_Support;
 
 // 3D stuff
 
@@ -1576,6 +1579,9 @@ struct _Evas_Func
    void  (*ector_end)                    (void *data, void *context, 
Ector_Surface *ector, void *surface, void *engine_data, Eina_Bool do_async);
    void* (*ector_new)                    (void *data, void *context, 
Ector_Surface *ector, void *surface);
    void  (*ector_free)                   (void *engine_data);
+
+   Evas_Filter_Support (*gfx_filter_supports) (void *data, Evas_Filter_Command 
*cmd);
+   Eina_Bool (*gfx_filter_process)       (void *data, Evas_Filter_Command 
*cmd);
 };
 
 struct _Evas_Image_Save_Func
diff --git a/src/modules/evas/engines/software_generic/evas_engine.c 
b/src/modules/evas/engines/software_generic/evas_engine.c
index e509ea3..37fa1b9 100644
--- a/src/modules/evas/engines/software_generic/evas_engine.c
+++ b/src/modules/evas/engines/software_generic/evas_engine.c
@@ -12,6 +12,7 @@
 #include "evas_ector_buffer.eo.h"
 #include "evas_ector_software_buffer.eo.h"
 #include "draw.h"
+#include "evas_filter_private.h"
 
 #if defined HAVE_DLSYM && ! defined _WIN32
 # include <dlfcn.h>      /* dlopen,dlclose,etc */
@@ -28,6 +29,7 @@
 
 #include "Evas_Engine_Software_Generic.h"
 #include "evas_native_common.h"
+#include "evas_engine_filter.h"
 
 #ifdef EVAS_GL
 //----------------------------------//
@@ -4618,6 +4620,47 @@ eng_ector_end(void *data EINA_UNUSED, void *context 
EINA_UNUSED, Ector_Surface *
 
 //------------------------------------------------//
 
+static Evas_Filter_Apply_Func
+_gfx_filter_func_get(Evas_Filter_Command *cmd)
+{
+   Evas_Filter_Apply_Func func = NULL;
+
+   switch (cmd->mode)
+     {
+      case EVAS_FILTER_MODE_BLEND:
+        func = eng_filter_blend_func_get(cmd);
+        break;
+      default:
+        return NULL;
+     }
+
+   return func;
+}
+
+static Evas_Filter_Support
+eng_gfx_filter_supports(void *data EINA_UNUSED, Evas_Filter_Command *cmd)
+{
+   if (!_gfx_filter_func_get(cmd))
+     return EVAS_FILTER_SUPPORT_NONE;
+
+   return EVAS_FILTER_SUPPORT_CPU;
+}
+
+static Eina_Bool
+eng_gfx_filter_process(void *data EINA_UNUSED, Evas_Filter_Command *cmd)
+{
+   Evas_Filter_Apply_Func func;
+
+   func = _gfx_filter_func_get(cmd);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(func, EINA_FALSE);
+
+   return func(cmd);
+}
+
+#undef FINDSYM
+
+//------------------------------------------------//
+
 /*
  *****
  **
@@ -4818,7 +4861,9 @@ static Evas_Func func =
      eng_ector_renderer_draw,
      eng_ector_end,
      eng_ector_new,
-     eng_ector_free
+     eng_ector_free,
+     eng_gfx_filter_supports,
+     eng_gfx_filter_process
    /* FUTURE software generic calls go here */
 };
 
diff --git a/src/modules/evas/engines/software_generic/evas_engine_filter.h 
b/src/modules/evas/engines/software_generic/evas_engine_filter.h
new file mode 100644
index 0000000..2b2c81d
--- /dev/null
+++ b/src/modules/evas/engines/software_generic/evas_engine_filter.h
@@ -0,0 +1,8 @@
+#ifndef EVAS_ENGINE_FILTER_H
+#define EVAS_ENGINE_FILTER_H
+
+#include "evas_filter_private.h"
+
+Evas_Filter_Apply_Func eng_filter_blend_func_get(Evas_Filter_Command *cmd);
+
+#endif // EVAS_ENGINE_FILTER_H
diff --git a/src/lib/evas/filters/evas_filter_blend.c 
b/src/modules/evas/engines/software_generic/filters/evas_filter_blend.c
similarity index 89%
rename from src/lib/evas/filters/evas_filter_blend.c
rename to src/modules/evas/engines/software_generic/filters/evas_filter_blend.c
index a8191e6..be43af9 100644
--- a/src/lib/evas/filters/evas_filter_blend.c
+++ b/src/modules/evas/engines/software_generic/filters/evas_filter_blend.c
@@ -1,6 +1,4 @@
-#include "evas_filter.h"
-#include "evas_filter_private.h"
-#include "evas_blend_private.h"
+#include "../evas_engine_filter.h"
 #include "ector_buffer.h"
 #include "draw.h"
 
@@ -32,7 +30,7 @@ _image_draw_cpu_alpha_alpha(void *data EINA_UNUSED, void 
*context,
    struct Filter_Blend_Draw_Context *dc = context;
    const uint8_t *srcdata = src_map;
    uint8_t *dstdata = dst_map;
-   Alpha_Gfx_Func func;
+   Draw_Func_Alpha func;
    int y, sw, dw;
 
    EINA_SAFETY_ON_FALSE_RETURN_VAL((src_w == dst_w) && (src_h == dst_h), 
EINA_FALSE);
@@ -47,7 +45,7 @@ _image_draw_cpu_alpha_alpha(void *data EINA_UNUSED, void 
*context,
    dstdata += dst_y * dw;
    for (y = src_h; y; y--)
      {
-        func((uint8_t *) srcdata + src_x, dstdata + dst_x, src_w);
+        func(dstdata + dst_x, srcdata + src_x, src_w);
         srcdata += sw;
         dstdata += dw;
      }
@@ -67,12 +65,12 @@ _image_draw_cpu_alpha_rgba(void *data EINA_UNUSED, void 
*context,
    struct Filter_Blend_Draw_Context *dc = context;
    uint8_t *srcdata = (uint8_t *) src_map;
    uint32_t *dstdata = dst_map;
-   RGBA_Gfx_Func func;
+   RGBA_Comp_Func_Mask func;
    int y, sw, dw;
 
    EINA_SAFETY_ON_FALSE_RETURN_VAL((src_w == dst_w) && (src_h == dst_h), 
EINA_FALSE);
 
-   func = evas_common_gfx_func_composite_mask_color_span_get(dc->color, 1, 1, 
_gfx_to_evas_render_op(dc->rop));
+   func = efl_draw_func_mask_span_get(dc->rop, dc->color);
    EINA_SAFETY_ON_NULL_RETURN_VAL(func, EINA_FALSE);
 
    sw = LINELEN(src_stride, srcdata);
@@ -82,7 +80,7 @@ _image_draw_cpu_alpha_rgba(void *data EINA_UNUSED, void 
*context,
    dstdata += dst_y * dw;
    for (y = src_h; y; y--)
      {
-        func(NULL, srcdata + src_x, dc->color, dstdata + dst_x, src_w);
+        func(dstdata + dst_x, srcdata + src_x, src_w, dc->color);
         srcdata += sw;
         dstdata += dw;
      }
@@ -102,17 +100,15 @@ _image_draw_cpu_rgba_rgba(void *data EINA_UNUSED, void 
*context,
    struct Filter_Blend_Draw_Context *dc = context;
    uint32_t *srcdata = (uint32_t *) src_map;
    uint32_t *dstdata = dst_map;
-   RGBA_Gfx_Func func;
+   RGBA_Comp_Func func;
    int y, sw, dw;
 
    EINA_SAFETY_ON_FALSE_RETURN_VAL((src_w == dst_w) && (src_h == dst_h), 
EINA_FALSE);
 
    if (!dc->color)
      return EINA_TRUE;
-   else if (dc->color == 0xFFFFFFFF)
-     func = evas_common_gfx_func_composite_pixel_span_get(1, 0, 1, 1, 
_gfx_to_evas_render_op(dc->rop));
    else
-     func = evas_common_gfx_func_composite_pixel_color_span_get(1, 0, 
dc->color, 1, 1, _gfx_to_evas_render_op(dc->rop));
+     func = efl_draw_func_span_get(dc->rop, dc->color, EINA_TRUE);
    EINA_SAFETY_ON_NULL_RETURN_VAL(func, EINA_FALSE);
 
    sw = LINELEN(src_stride, srcdata);
@@ -122,7 +118,7 @@ _image_draw_cpu_rgba_rgba(void *data EINA_UNUSED, void 
*context,
    dstdata += dst_y * dw;
    for (y = src_h; y; y--)
      {
-        func(srcdata + src_x, NULL, dc->color, dstdata + dst_x, src_w);
+        func(dstdata + dst_x, srcdata + src_x, src_w, dc->color, 255);
         srcdata += sw;
         dstdata += dw;
      }
@@ -158,6 +154,8 @@ _image_draw_cpu_rgba_alpha(void *data EINA_UNUSED, void 
*context EINA_UNUSED,
    sw = LINELEN(src_stride, srcdata);
    dw = LINELEN(dst_stride, dstdata);
 
+   /* FIXME: no draw function here? */
+
    srcdata += src_y * sw;
    dstdata += dst_y * dw;
    for (y = src_h; y; y--)
@@ -203,6 +201,7 @@ _filter_blend_cpu_generic_do(Evas_Filter_Command *cmd, 
draw_func image_draw)
 
    if ((sw != dw || sh != dh) && (cmd->draw.fillmode & 
EVAS_FILTER_FILL_MODE_STRETCH_XY))
      {
+        EINA_SAFETY_ON_NULL_RETURN_VAL(cmd->ctx->buffer_scaled_get, 
EINA_FALSE);
 
         if (cmd->draw.fillmode & EVAS_FILTER_FILL_MODE_STRETCH_X)
           sw = dw;
@@ -210,7 +209,7 @@ _filter_blend_cpu_generic_do(Evas_Filter_Command *cmd, 
draw_func image_draw)
           sh = dh;
 
         BUFFERS_LOCK();
-        src_fb = evas_filter_buffer_scaled_get(cmd->ctx, cmd->input, sw, sh);
+        src_fb = cmd->ctx->buffer_scaled_get(cmd->ctx, cmd->input, sw, sh);
         BUFFERS_UNLOCK();
 
         EINA_SAFETY_ON_NULL_GOTO(src_fb, end);
@@ -272,18 +271,14 @@ _mapped_blend(void *data, void *drawctx,
    int right = 0, bottom = 0, left = 0, top = 0;
    int row, col, rows, cols;
    Eina_Bool ret = EINA_TRUE;
-   Eina_Bool debug = eina_log_domain_level_check(_evas_filter_log_dom, 6);
 
    EINA_SAFETY_ON_FALSE_RETURN_VAL((sx == 0) && (sy == 0), EINA_FALSE);
 
    if (fillmode == EVAS_FILTER_FILL_MODE_NONE)
      {
         _clip_to_target(&sx, &sy, sw, sh, dx, dy, dw, dh, &dx, &dy, &rows, 
&cols);
-        if (debug)
-          {
-             XDBG("blend: %d,%d,%d,%d --> %d,%d,%d,%d (from %dx%d to %dx%d 
+%d,%d)",
-                  0, 0, sw, sh, dx, dy, cols, rows, sw, sh, dw, dh, dx, dy);
-          }
+        XDBG("blend: %d,%d,%d,%d --> %d,%d,%d,%d (from %dx%d to %dx%d +%d,%d)",
+             0, 0, sw, sh, dx, dy, cols, rows, sw, sh, dw, dh, dx, dy);
         image_draw(data, drawctx,
                    src_map, src_stride, dst_map, dst_stride,
                    sx, sy, cols, rows, // src
@@ -418,14 +413,11 @@ _mapped_blend(void *data, void *drawctx,
                }
              if (src_w <= 0 || dst_w <= 0) break;
 
-             if (debug)
-               {
-                  XDBG("blend: [%d,%d] %d,%d,%dx%d --> %d,%d,%dx%d "
-                       "(src %dx%d, dst %dx%d)",
-                       col, row, src_x, src_y, src_w, src_h,
-                       dst_x, dst_y, dst_w, dst_h,
-                       sw, sh, dw, dh);
-               }
+             XDBG("blend: [%d,%d] %d,%d,%dx%d --> %d,%d,%dx%d "
+                  "(src %dx%d, dst %dx%d)",
+                  col, row, src_x, src_y, src_w, src_h,
+                  dst_x, dst_y, dst_w, dst_h,
+                  sw, sh, dw, dh);
              image_draw(data, drawctx,
                         src_map, src_stride, dst_map, dst_stride,
                         src_x, src_y, src_w, src_h,
@@ -437,7 +429,7 @@ _mapped_blend(void *data, void *drawctx,
 }
 
 Evas_Filter_Apply_Func
-evas_filter_blend_cpu_func_get(Evas_Filter_Command *cmd)
+eng_filter_blend_func_get(Evas_Filter_Command *cmd)
 {
    EINA_SAFETY_ON_NULL_RETURN_VAL(cmd, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(cmd->output, NULL);
diff --git a/src/static_libs/draw/draw.h b/src/static_libs/draw/draw.h
index 9f4089a..b3393d2 100644
--- a/src/static_libs/draw/draw.h
+++ b/src/static_libs/draw/draw.h
@@ -9,11 +9,12 @@
 #include "efl/interfaces/efl_gfx_types.eot.h"
 
 /* FIXME: naming convention */
+/* FIXME: mul_col & const_alpha are redondant */
 typedef void (*RGBA_Comp_Func)       (uint32_t *dest, const uint32_t *src, int 
length, uint32_t mul_col, uint32_t const_alpha);
 typedef void (*RGBA_Comp_Func_Solid) (uint32_t *dest, int length, uint32_t 
color, uint32_t const_alpha);
-typedef void (*RGBA_Comp_Func_Mask)  (uint32_t *dest, uint8_t *mask, int 
length, uint32_t color);
-typedef void (*Draw_Func_ARGB_Mix3)  (uint32_t *dest, uint32_t *src, uint32_t 
*mul, int len, uint32_t color);
-typedef void (*Alpha_Gfx_Func)       (uint8_t *src, uint8_t *dst, int len);
+typedef void (*RGBA_Comp_Func_Mask)  (uint32_t *dest, const uint8_t *mask, int 
length, uint32_t color);
+typedef void (*Draw_Func_ARGB_Mix3)  (uint32_t *dest, const uint32_t *src, 
const uint32_t *mul, int len, uint32_t color);
+typedef void (*Draw_Func_Alpha)      (uint8_t *dest, const uint8_t *src, int 
len);
 typedef Eina_Bool (*Cspace_Convert_Func) (void *dst, const void *src, int w, 
int h, int src_stride, int dst_stride, Eina_Bool has_alpha, Efl_Gfx_Colorspace 
srccs, Efl_Gfx_Colorspace dstcs);
 
 int efl_draw_init(void);
@@ -22,7 +23,7 @@ RGBA_Comp_Func       efl_draw_func_span_get         
(Efl_Gfx_Render_Op op, uint3
 RGBA_Comp_Func_Solid efl_draw_func_solid_span_get   (Efl_Gfx_Render_Op op, 
uint32_t color);
 RGBA_Comp_Func_Mask  efl_draw_func_mask_span_get    (Efl_Gfx_Render_Op op, 
uint32_t color);
 Draw_Func_ARGB_Mix3  efl_draw_func_argb_mix3_get    (Efl_Gfx_Render_Op op, 
uint32_t color);
-Alpha_Gfx_Func       efl_draw_alpha_func_get        (Efl_Gfx_Render_Op op, 
Eina_Bool has_mask);
+Draw_Func_Alpha      efl_draw_alpha_func_get        (Efl_Gfx_Render_Op op, 
Eina_Bool has_mask);
 Cspace_Convert_Func  efl_draw_convert_func_get      (Efl_Gfx_Colorspace 
origcs, Efl_Gfx_Colorspace dstcs, Eina_Bool *region_can);
 
 
diff --git a/src/static_libs/draw/draw_alpha_main.c 
b/src/static_libs/draw/draw_alpha_main.c
index ebd93e8..8424d95 100644
--- a/src/static_libs/draw/draw_alpha_main.c
+++ b/src/static_libs/draw/draw_alpha_main.c
@@ -2,7 +2,7 @@
 
 /** default op: d = d*(1-sa) + s */
 static void
-_alpha_func_blend(uint8_t *src, uint8_t *dst, int len)
+_alpha_func_blend(uint8_t *dst, const uint8_t *src, int len)
 {
    int k;
 
@@ -19,7 +19,7 @@ _alpha_func_blend(uint8_t *src, uint8_t *dst, int len)
 
 /** d = s */
 static void
-_alpha_func_copy(uint8_t *src, uint8_t *dst, int len)
+_alpha_func_copy(uint8_t *dst, const uint8_t *src, int len)
 {
    EINA_SAFETY_ON_NULL_RETURN(src);
    EINA_SAFETY_ON_NULL_RETURN(dst);
@@ -29,7 +29,7 @@ _alpha_func_copy(uint8_t *src, uint8_t *dst, int len)
 
 /** d = d*s */
 static void
-_alpha_func_mul(uint8_t *src, uint8_t *dst, int len)
+_alpha_func_mul(uint8_t *dst, const uint8_t *src, int len)
 {
    int k;
 
@@ -44,7 +44,7 @@ _alpha_func_mul(uint8_t *src, uint8_t *dst, int len)
      }
 }
 
-Alpha_Gfx_Func
+Draw_Func_Alpha
 efl_draw_alpha_func_get(Efl_Gfx_Render_Op op, Eina_Bool has_mask)
 {
    if (!has_mask)
diff --git a/src/static_libs/draw/draw_main.c b/src/static_libs/draw/draw_main.c
index 8577bea..92d2044 100644
--- a/src/static_libs/draw/draw_main.c
+++ b/src/static_libs/draw/draw_main.c
@@ -133,7 +133,7 @@ _comp_func_source(uint32_t *dest, const uint32_t *src, int 
length, uint32_t colo
  * d = d * (1-sa) + s * sa
  */
 static void
-_comp_func_mask_blend(uint32_t *dest, uint8_t *mask, int length, uint32_t 
color)
+_comp_func_mask_blend(uint32_t *dest, const uint8_t *mask, int length, 
uint32_t color)
 {
    int k;
 
@@ -149,7 +149,7 @@ _comp_func_mask_blend(uint32_t *dest, uint8_t *mask, int 
length, uint32_t color)
  * d = s * sa
  */
 static void
-_comp_func_mask_copy(uint32_t *dest, uint8_t *mask, int length, uint32_t color)
+_comp_func_mask_copy(uint32_t *dest, const uint8_t *mask, int length, uint32_t 
color)
 {
    int k;
 
@@ -163,7 +163,7 @@ _comp_func_mask_copy(uint32_t *dest, uint8_t *mask, int 
length, uint32_t color)
  * d = d * (1-wa) + w * wa
  */
 static void
-_comp_func_mix3_blend(uint32_t *dest, uint32_t *src, uint32_t *mul, int len, 
uint32_t color)
+_comp_func_mix3_blend(uint32_t *dest, const uint32_t *src, const uint32_t 
*mul, int len, uint32_t color)
 {
    int k, a;
 
@@ -178,7 +178,7 @@ _comp_func_mix3_blend(uint32_t *dest, uint32_t *src, 
uint32_t *mul, int len, uin
 
 /* d = s * m * c */
 static void
-_comp_func_mix3_copy(uint32_t *dest, uint32_t *src, uint32_t *mul, int len, 
uint32_t color)
+_comp_func_mix3_copy(uint32_t *dest, const uint32_t *src, const uint32_t *mul, 
int len, uint32_t color)
 {
    int k;
 
@@ -193,7 +193,7 @@ _comp_func_mix3_copy(uint32_t *dest, uint32_t *src, 
uint32_t *mul, int len, uint
  * d = d * (1-wa) + w * wa
  */
 static void
-_comp_func_mix3_blend_nomul(uint32_t *dest, uint32_t *src, uint32_t *mul, int 
len, uint32_t color EINA_UNUSED)
+_comp_func_mix3_blend_nomul(uint32_t *dest, const uint32_t *src, const 
uint32_t *mul, int len, uint32_t color EINA_UNUSED)
 {
    int k, a;
 
@@ -207,7 +207,7 @@ _comp_func_mix3_blend_nomul(uint32_t *dest, uint32_t *src, 
uint32_t *mul, int le
 
 /* d = s * m */
 static void
-_comp_func_mix3_copy_nomul(uint32_t *dest, uint32_t *src, uint32_t *mul, int 
len, uint32_t color EINA_UNUSED)
+_comp_func_mix3_copy_nomul(uint32_t *dest, const uint32_t *src, const uint32_t 
*mul, int len, uint32_t color EINA_UNUSED)
 {
    int k;
 

-- 


Reply via email to