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; --