From 9af60b1b04a877c70f78ced137a6886b403b25f6 Mon Sep 17 00:00:00 2001 From: Jaeun Choi Date: Thu, 13 Nov 2014 10:04:00 +0900 Subject: [PATCH] Evas masking: Use alpha mask in SW engine draw functions Work done by Jaeun Choi, rebased & squashed by jpeg. This commit introduces changes to the low-level draw functions of the SW engine considering the existence of an alpha mask image. Features: - Font masking (TEXT, TEXTBLOCK), - Rectangle masking, - Image masking (all image scaling functions should be handled). The mask image itself is not yet set in the draw context (see following commits). @feature Signed-off-by: Jean-Philippe Andre --- src/lib/evas/common/evas_font_compress.c | 37 +++ src/lib/evas/common/evas_rectangle.h | 2 +- src/lib/evas/common/evas_rectangle_main.c | 39 ++- src/lib/evas/common/evas_scale_main.h | 4 +- src/lib/evas/common/evas_scale_sample.c | 230 ++++++++++++++---- src/lib/evas/common/evas_scale_smooth.c | 20 +- .../evas/common/evas_scale_smooth_scaler.c | 2 +- .../common/evas_scale_smooth_scaler_down.c | 18 +- .../common/evas_scale_smooth_scaler_downx.c | 35 ++- .../evas_scale_smooth_scaler_downx_downy.c | 35 ++- .../common/evas_scale_smooth_scaler_downy.c | 35 ++- .../evas/common/evas_scale_smooth_scaler_up.c | 70 +++++- src/lib/evas/include/evas_common_private.h | 2 + .../engines/software_generic/evas_engine.c | 35 ++- 14 files changed, 471 insertions(+), 93 deletions(-) diff --git a/src/lib/evas/common/evas_font_compress.c b/src/lib/evas/common/evas_font_compress.c index 86babd9410..6c84aa4de3 100644 --- a/src/lib/evas/common/evas_font_compress.c +++ b/src/lib/evas/common/evas_font_compress.c @@ -524,6 +524,43 @@ evas_common_font_glyph_draw(RGBA_Font_Glyph *fg, } free(src8); } + else if (dc->clip.mask) + { + RGBA_Gfx_Func func; + DATA8 *src8, *mask; + DATA32 *buf, *ptr, *buf_ptr; + RGBA_Image *im = dc->clip.mask; + int row; + + buf = alloca(sizeof(DATA32) * w * h); + + // Step 1: alpha glyph drawing + src8 = evas_common_font_glyph_uncompress(fg, NULL, NULL); + if (!src8) return; + + // Step 2: color blending to buffer + func = evas_common_gfx_func_composite_mask_color_span_get(col, dst_image->cache_entry.flags.alpha, 1, EVAS_RENDER_COPY); + for (row = y1; row < y2; row++) + { + buf_ptr = buf + (row * w) + x1; + DATA8 *s = src8 + (row * w) + x1; + func(NULL, s, col, buf_ptr, x2 - x1); + } + free(src8); + + // Step 3: masking to destination + func = evas_common_gfx_func_composite_pixel_mask_span_get(im->cache_entry.flags.alpha, im->cache_entry.flags.alpha_sparse, dst_image->cache_entry.flags.alpha, dst_pitch, dc->render_op); + for (row = y1; row < y2; row++) + { + mask = im->image.data8 + + (y + row - dc->clip.mask_y) * im->cache_entry.w + + (x + x1 - dc->clip.mask_x); + + ptr = dst + (x + x1) + ((y + row) * dst_pitch); + buf_ptr = buf + (row * w) + x1; + func(buf_ptr, mask, 0, ptr, x2 - x1); + } + } else { // build fast multiply + mask color tables to avoid compute. this works diff --git a/src/lib/evas/common/evas_rectangle.h b/src/lib/evas/common/evas_rectangle.h index 289188f58f..e79afd586d 100644 --- a/src/lib/evas/common/evas_rectangle.h +++ b/src/lib/evas/common/evas_rectangle.h @@ -10,7 +10,7 @@ EAPI void evas_common_rectangle_draw (RGBA_Image *dst, RGBA_Draw_Context *dc, in EAPI void evas_common_rectangle_draw_do(const Cutout_Rects *reuse, const Eina_Rectangle *clip, RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h); EAPI Eina_Bool evas_common_rectangle_draw_prepare(Cutout_Rects **reuse, const RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h); -EAPI void evas_common_rectangle_rgba_draw (RGBA_Image *dst, DATA32 color, int render_op, int x, int y, int w, int h); +EAPI void evas_common_rectangle_rgba_draw (RGBA_Image *dst, DATA32 color, int render_op, int x, int y, int w, int h, RGBA_Image *mask_ie, int mask_x, int mask_y); #endif /* _EVAS_RECTANGLE_H */ diff --git a/src/lib/evas/common/evas_rectangle_main.c b/src/lib/evas/common/evas_rectangle_main.c index 68a5ffc720..d952f41e49 100644 --- a/src/lib/evas/common/evas_rectangle_main.c +++ b/src/lib/evas/common/evas_rectangle_main.c @@ -110,6 +110,8 @@ rectangle_draw_internal(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, in RGBA_Gfx_Func func; int yy; DATA32 *ptr; + DATA8 *mask; + RGBA_Image *mask_ie = dc->clip.mask; if (!dst->image.data) return; RECTS_CLIP_TO_RECT(x, y, w, h, dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h); @@ -132,29 +134,54 @@ rectangle_draw_internal(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, in # endif #endif { - func = evas_common_gfx_func_composite_color_span_get(dc->col.col, dst->cache_entry.flags.alpha, w, dc->render_op); + if (mask_ie) + func = evas_common_gfx_func_composite_mask_color_span_get(dc->col.col, dst->cache_entry.flags.alpha, w, dc->render_op); + else + func = evas_common_gfx_func_composite_color_span_get(dc->col.col, dst->cache_entry.flags.alpha, w, dc->render_op); ptr = dst->image.data + (y * dst->cache_entry.w) + x; for (yy = 0; yy < h; yy++) { - func(NULL, NULL, dc->col.col, ptr, w); + if (mask_ie) + { + mask = mask_ie->image.data8 + + (y + yy - dc->clip.mask_y) * mask_ie->cache_entry.w + + (x - dc->clip.mask_x); + func(NULL, mask, dc->col.col, ptr, w); + } + else + func(NULL, NULL, dc->col.col, ptr, w); - ptr += dst->cache_entry.w; + ptr += dst->cache_entry.w; } } } EAPI void -evas_common_rectangle_rgba_draw(RGBA_Image *dst, DATA32 color, int render_op, int x, int y, int w, int h) +evas_common_rectangle_rgba_draw(RGBA_Image *dst, DATA32 color, int render_op, int x, int y, int w, int h, RGBA_Image *mask_ie, int mask_x, int mask_y) { RGBA_Gfx_Func func; DATA32 *ptr; + DATA8 *mask; int yy; - func = evas_common_gfx_func_composite_color_span_get(color, dst->cache_entry.flags.alpha, w, render_op); + if (mask_ie) + func = evas_common_gfx_func_composite_mask_color_span_get(color, dst->cache_entry.flags.alpha, w, render_op); + else + func = evas_common_gfx_func_composite_color_span_get(color, dst->cache_entry.flags.alpha, w, render_op); + ptr = dst->image.data + (y * dst->cache_entry.w) + x; for (yy = 0; yy < h; yy++) { - func(NULL, NULL, color, ptr, w); + if (mask_ie) + { + mask = mask_ie->image.data8 + + (y + yy - mask_y) * mask_ie->cache_entry.w + + (x - mask_x); + func(NULL, mask, color, ptr, w); + } + else + func(NULL, NULL, color, ptr, w); + ptr += dst->cache_entry.w; } } diff --git a/src/lib/evas/common/evas_scale_main.h b/src/lib/evas/common/evas_scale_main.h index 4e606e03be..c0e1f945ec 100644 --- a/src/lib/evas/common/evas_scale_main.h +++ b/src/lib/evas/common/evas_scale_main.h @@ -13,8 +13,8 @@ EAPI void evas_common_rgba_image_scalecache_dump(void); EAPI void evas_common_scale_rgba_in_to_out_clip_sample_do (const Cutout_Rects *reuse, const Eina_Rectangle *clip, RGBA_Image *src, RGBA_Image *dst, RGBA_Draw_Context *dc, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h); EAPI void evas_common_scale_rgba_in_to_out_clip_smooth_do (const Cutout_Rects *reuse, const Eina_Rectangle *clip, RGBA_Image *src, RGBA_Image *dst, RGBA_Draw_Context *dc, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h); -EAPI void evas_common_scale_rgba_sample_draw (RGBA_Image *src, RGBA_Image *dst, int dst_clip_x, int dst_clip_y, int dst_clip_w, int dst_clip_h, DATA32 mul_col, int render_op, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h); -EAPI void evas_common_scale_rgba_smooth_draw (RGBA_Image *src, RGBA_Image *dst, int dst_clip_x, int dst_clip_y, int dst_clip_w, int dst_clip_h, DATA32 mul_col, int render_op, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h); +EAPI void evas_common_scale_rgba_sample_draw (RGBA_Image *src, RGBA_Image *dst, int dst_clip_x, int dst_clip_y, int dst_clip_w, int dst_clip_h, DATA32 mul_col, int render_op, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h, RGBA_Image *mask, int mask_x, int mask_y); +EAPI void evas_common_scale_rgba_smooth_draw (RGBA_Image *src, RGBA_Image *dst, int dst_clip_x, int dst_clip_y, int dst_clip_w, int dst_clip_h, DATA32 mul_col, int render_op, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h, RGBA_Image *mask_ie, int mask_x, int mask_y); EAPI Eina_Bool evas_common_scale_rgba_in_to_out_clip_prepare (Cutout_Rects **reuse, const RGBA_Image *src, const RGBA_Image *dst, RGBA_Draw_Context *dc, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h); #endif /* _EVAS_SCALE_MAIN_H */ diff --git a/src/lib/evas/common/evas_scale_sample.c b/src/lib/evas/common/evas_scale_sample.c index f462da5f23..86b02d8e68 100644 --- a/src/lib/evas/common/evas_scale_sample.c +++ b/src/lib/evas/common/evas_scale_sample.c @@ -59,15 +59,16 @@ evas_common_scale_rgba_in_to_out_clip_sample_do(const Cutout_Rects *reuse, } EAPI void -evas_common_scale_rgba_sample_draw(RGBA_Image *src, RGBA_Image *dst, int dst_clip_x, int dst_clip_y, int dst_clip_w, int dst_clip_h, DATA32 mul_col, int render_op, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h) +evas_common_scale_rgba_sample_draw(RGBA_Image *src, RGBA_Image *dst, int dst_clip_x, int dst_clip_y, int dst_clip_w, int dst_clip_h, DATA32 mul_col, int render_op, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h, RGBA_Image *mask_ie, int mask_x, int mask_y) { int x, y; int *lin_ptr; DATA32 *buf, *dptr; DATA32 **row_ptr; DATA32 *ptr, *dst_ptr, *src_data, *dst_data; + DATA8 *mask; int src_w, src_h, dst_w, dst_h; - RGBA_Gfx_Func func; + RGBA_Gfx_Func func, func2 = NULL; if ((!src->image.data) || (!dst->image.data)) return; if (!(RECTS_INTERSECT(dst_region_x, dst_region_y, dst_region_w, dst_region_h, @@ -198,21 +199,59 @@ evas_common_scale_rgba_sample_draw(RGBA_Image *src, RGBA_Image *dst, int dst_cli /* figure out dest start ptr */ dst_ptr = dst_data + dst_clip_x + (dst_clip_y * dst_w); - if (mul_col != 0xffffffff) - func = evas_common_gfx_func_composite_pixel_color_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, mul_col, dst->cache_entry.flags.alpha, dst_clip_w, render_op); + if (!mask_ie) + { + if (mul_col != 0xffffffff) + func = evas_common_gfx_func_composite_pixel_color_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, mul_col, dst->cache_entry.flags.alpha, dst_clip_w, render_op); + else + func = evas_common_gfx_func_composite_pixel_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, dst->cache_entry.flags.alpha, dst_clip_w, render_op); + } else - func = evas_common_gfx_func_composite_pixel_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, dst->cache_entry.flags.alpha, dst_clip_w, render_op); + { + func = evas_common_gfx_func_composite_pixel_mask_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, dst->cache_entry.flags.alpha, dst_clip_w, render_op); + if (mul_col != 0xffffffff) + func2 = evas_common_gfx_func_composite_pixel_color_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, mul_col, dst->cache_entry.flags.alpha, dst_clip_w, render_op); + } if ((dst_region_w == src_region_w) && (dst_region_h == src_region_h)) { ptr = src_data + (((dst_clip_y - dst_region_y) + src_region_y) * src_w) + ((dst_clip_x - dst_region_x) + src_region_x); - for (y = 0; y < dst_clip_h; y++) - { - /* * blend here [clip_w *] ptr -> dst_ptr * */ - func(ptr, NULL, mul_col, dst_ptr, dst_clip_w); - ptr += src_w; - dst_ptr += dst_w; + /* image masking */ + if (mask_ie) + { + if (mul_col != 0xffffffff) + buf = alloca(dst_clip_w * sizeof(DATA32)); + + for (y = 0; y < dst_clip_h; y++) + { + mask = mask_ie->image.data8 + + ((dst_clip_y - mask_y + y) * mask_ie->cache_entry.w) + + (dst_clip_x - mask_x); + + /* * blend here [clip_w *] ptr -> dst_ptr * */ + if (mul_col != 0xffffffff) + { + func2(ptr, NULL, mul_col, buf, dst_clip_w); + func(buf, mask, 0, dst_ptr, dst_clip_w); + } + else + func(ptr, mask, 0, dst_ptr, dst_clip_w); + + ptr += src_w; + dst_ptr += dst_w; + } + } + else + { + for (y = 0; y < dst_clip_h; y++) + { + /* * blend here [clip_w *] ptr -> dst_ptr * */ + func(ptr, NULL, mul_col, dst_ptr, dst_clip_w); + + ptr += src_w; + dst_ptr += dst_w; + } } } else @@ -234,20 +273,48 @@ evas_common_scale_rgba_sample_draw(RGBA_Image *src, RGBA_Image *dst, int dst_cli /* a scanline buffer */ buf = alloca(dst_clip_w * sizeof(DATA32)); - for (y = 0; y < dst_clip_h; y++) + /* image masking */ + if (mask_ie) { - dst_ptr = buf; - - for (x = 0; x < dst_clip_w; x++) + for (y = 0; y < dst_clip_h; y++) { - ptr = row_ptr[y] + lin_ptr[x]; - *dst_ptr = *ptr; - dst_ptr++; - } - /* * blend here [clip_w *] buf -> dptr * */ - func(buf, NULL, mul_col, dptr, dst_clip_w); + dst_ptr = buf; + mask = mask_ie->image.data8 + + ((dst_clip_y - mask_y + y) * mask_ie->cache_entry.w) + + (dst_clip_x - mask_x); - dptr += dst_w; + for (x = 0; x < dst_clip_w; x++) + { + ptr = row_ptr[y] + lin_ptr[x]; + *dst_ptr = *ptr; + dst_ptr++; + } + + /* * blend here [clip_w *] buf -> dptr * */ + if (mul_col != 0xffffffff) func2(buf, NULL, mul_col, buf, dst_clip_w); + func(buf, mask, 0, dptr, dst_clip_w); + + dptr += dst_w; + } + } + else + { + for (y = 0; y < dst_clip_h; y++) + { + dst_ptr = buf; + + for (x = 0; x < dst_clip_w; x++) + { + ptr = row_ptr[y] + lin_ptr[x]; + *dst_ptr = *ptr; + dst_ptr++; + } + + /* * blend here [clip_w *] buf -> dptr * */ + func(buf, NULL, mul_col, dptr, dst_clip_w); + + dptr += dst_w; + } } } } @@ -265,9 +332,10 @@ scale_rgba_in_to_out_clip_sample_internal(RGBA_Image *src, RGBA_Image *dst, DATA32 *buf, *dptr; DATA32 **row_ptr; DATA32 *ptr, *dst_ptr, *src_data, *dst_data; + DATA8 *mask; int dst_clip_x, dst_clip_y, dst_clip_w, dst_clip_h; int src_w, src_h, dst_w, dst_h; - RGBA_Gfx_Func func; + RGBA_Gfx_Func func, func2 = NULL; if (!(RECTS_INTERSECT(dst_region_x, dst_region_y, dst_region_w, dst_region_h, 0, 0, dst->cache_entry.w, dst->cache_entry.h))) return EINA_FALSE; @@ -395,10 +463,19 @@ scale_rgba_in_to_out_clip_sample_internal(RGBA_Image *src, RGBA_Image *dst, /* figure out dest start ptr */ dst_ptr = dst_data + dst_clip_x + (dst_clip_y * dst_w); - if (dc->mul.use) - func = evas_common_gfx_func_composite_pixel_color_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, dc->mul.col, dst->cache_entry.flags.alpha, dst_clip_w, dc->render_op); + if (!dc->clip.mask) + { + if (dc->mul.use) + func = evas_common_gfx_func_composite_pixel_color_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, dc->mul.col, dst->cache_entry.flags.alpha, dst_clip_w, dc->render_op); + else + func = evas_common_gfx_func_composite_pixel_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, dst->cache_entry.flags.alpha, dst_clip_w, dc->render_op); + } else - func = evas_common_gfx_func_composite_pixel_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, dst->cache_entry.flags.alpha, dst_clip_w, dc->render_op); + { + func = evas_common_gfx_func_composite_pixel_mask_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, dst->cache_entry.flags.alpha, dst_clip_w, dc->render_op); + if (dc->mul.use) + func2 = evas_common_gfx_func_composite_pixel_color_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, dc->mul.col, dst->cache_entry.flags.alpha, dst_clip_w, dc->render_op); + } if ((dst_region_w == src_region_w) && (dst_region_h == src_region_h)) { @@ -427,13 +504,44 @@ scale_rgba_in_to_out_clip_sample_internal(RGBA_Image *src, RGBA_Image *dst, #endif { ptr = src_data + ((dst_clip_y - dst_region_y + src_region_y) * src_w) + (dst_clip_x - dst_region_x) + src_region_x; - for (y = 0; y < dst_clip_h; y++) - { - /* * blend here [clip_w *] ptr -> dst_ptr * */ - func(ptr, NULL, dc->mul.col, dst_ptr, dst_clip_w); - ptr += src_w; - dst_ptr += dst_w; + /* image masking */ + if (dc->clip.mask) + { + RGBA_Image *im = dc->clip.mask; + + if (dc->mul.use) + buf = alloca(dst_clip_w * sizeof(DATA32)); + + for (y = 0; y < dst_clip_h; y++) + { + mask = im->image.data8 + + ((dst_clip_y - dc->clip.mask_y + y) * im->cache_entry.w) + + (dst_clip_x - dc->clip.mask_x); + + /* * blend here [clip_w *] ptr -> dst_ptr * */ + if (dc->mul.use) + { + func2(ptr, NULL, dc->mul.col, buf, dst_clip_w); + func(buf, mask, 0, dst_ptr, dst_clip_w); + } + else + func(ptr, mask, 0, dst_ptr, dst_clip_w); + + ptr += src_w; + dst_ptr += dst_w; + } + } + else + { + for (y = 0; y < dst_clip_h; y++) + { + /* * blend here [clip_w *] ptr -> dst_ptr * */ + func(ptr, NULL, dc->mul.col, dst_ptr, dst_clip_w); + + ptr += src_w; + dst_ptr += dst_w; + } } } } @@ -454,7 +562,8 @@ scale_rgba_in_to_out_clip_sample_internal(RGBA_Image *src, RGBA_Image *dst, #ifdef DIRECT_SCALE if ((!src->cache_entry.flags.alpha) && (!dst->cache_entry.flags.alpha) && - (!dc->mul.use)) + (!dc->mul.use) && + (!dc->clip.mask)) { for (y = 0; y < dst_clip_h; y++) { @@ -475,19 +584,50 @@ scale_rgba_in_to_out_clip_sample_internal(RGBA_Image *src, RGBA_Image *dst, { /* a scanline buffer */ buf = alloca(dst_clip_w * sizeof(DATA32)); - for (y = 0; y < dst_clip_h; y++) - { - dst_ptr = buf; - for (x = 0; x < dst_clip_w; x++) - { - ptr = row_ptr[y] + lin_ptr[x]; - *dst_ptr = *ptr; - dst_ptr++; - } - /* * blend here [clip_w *] buf -> dptr * */ - func(buf, NULL, dc->mul.col, dptr, dst_clip_w); - dptr += dst_w; + /* image masking */ + if (dc->clip.mask) + { + RGBA_Image *im = dc->clip.mask; + + for (y = 0; y < dst_clip_h; y++) + { + dst_ptr = buf; + mask = im->image.data8 + + ((dst_clip_y - dc->clip.mask_y + y) * im->cache_entry.w) + + (dst_clip_x - dc->clip.mask_x); + + for (x = 0; x < dst_clip_w; x++) + { + ptr = row_ptr[y] + lin_ptr[x]; + *dst_ptr = *ptr; + dst_ptr++; + } + + /* * blend here [clip_w *] buf -> dptr * */ + if (dc->mul.use) func2(buf, NULL, dc->mul.col, buf, dst_clip_w); + func(buf, mask, 0, dptr, dst_clip_w); + + dptr += dst_w; + } + } + else + { + for (y = 0; y < dst_clip_h; y++) + { + dst_ptr = buf; + for (x = 0; x < dst_clip_w; x++) + { + ptr = row_ptr[y] + lin_ptr[x]; + *dst_ptr = *ptr; + dst_ptr++; + } + + /* * blend here [clip_w *] buf -> dptr * */ + func(buf, NULL, dc->mul.col, dptr, dst_clip_w); + + dptr += dst_w; + } } } } diff --git a/src/lib/evas/common/evas_scale_smooth.c b/src/lib/evas/common/evas_scale_smooth.c index a1957f1e3f..781c13d1df 100644 --- a/src/lib/evas/common/evas_scale_smooth.c +++ b/src/lib/evas/common/evas_scale_smooth.c @@ -148,7 +148,8 @@ evas_common_scale_rgba_in_to_out_clip_smooth_mmx(RGBA_Image *src, RGBA_Image *ds clip_x, clip_y, clip_w, clip_h, mul_col, dc->render_op, src_region_x, src_region_y, src_region_w, src_region_h, - dst_region_x, dst_region_y, dst_region_w, dst_region_h); + dst_region_x, dst_region_y, dst_region_w, dst_region_h, + dc->clip.mask, dc->clip.mask_x, dc->clip.mask_y); return EINA_TRUE; } @@ -188,7 +189,8 @@ evas_common_scale_rgba_in_to_out_clip_smooth_neon(RGBA_Image *src, RGBA_Image *d clip_x, clip_y, clip_w, clip_h, mul_col, dc->render_op, src_region_x, src_region_y, src_region_w, src_region_h, - dst_region_x, dst_region_y, dst_region_w, dst_region_h); + dst_region_x, dst_region_y, dst_region_w, dst_region_h, + dc->clip.mask, dc->clip.mask_x, dc->clip.mask_y); return EINA_TRUE; } @@ -227,7 +229,8 @@ evas_common_scale_rgba_in_to_out_clip_smooth_c(RGBA_Image *src, RGBA_Image *dst, clip_x, clip_y, clip_w, clip_h, mul_col, dc->render_op, src_region_x, src_region_y, src_region_w, src_region_h, - dst_region_x, dst_region_y, dst_region_w, dst_region_h); + dst_region_x, dst_region_y, dst_region_w, dst_region_h, + dc->clip.mask, dc->clip.mask_x, dc->clip.mask_y); return EINA_TRUE; } @@ -265,7 +268,7 @@ evas_common_scale_rgba_in_to_out_clip_smooth(RGBA_Image *src, RGBA_Image *dst, } EAPI void -evas_common_scale_rgba_smooth_draw(RGBA_Image *src, RGBA_Image *dst, int dst_clip_x, int dst_clip_y, int dst_clip_w, int dst_clip_h, DATA32 mul_col, int render_op, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h) +evas_common_scale_rgba_smooth_draw(RGBA_Image *src, RGBA_Image *dst, int dst_clip_x, int dst_clip_y, int dst_clip_w, int dst_clip_h, DATA32 mul_col, int render_op, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h, RGBA_Image *mask_ie, int mask_x, int mask_y) { #ifdef BUILD_MMX int mmx, sse, sse2; @@ -277,7 +280,8 @@ evas_common_scale_rgba_smooth_draw(RGBA_Image *src, RGBA_Image *dst, int dst_cli dst_clip_x, dst_clip_y, dst_clip_w, dst_clip_h, mul_col, render_op, src_region_x, src_region_y, src_region_w, src_region_h, - dst_region_x, dst_region_y, dst_region_w, dst_region_h); + dst_region_x, dst_region_y, dst_region_w, dst_region_h, + mask_ie, mask_x, mask_y); else #endif #ifdef BUILD_NEON @@ -287,7 +291,8 @@ evas_common_scale_rgba_smooth_draw(RGBA_Image *src, RGBA_Image *dst, int dst_cli dst_clip_x, dst_clip_y, dst_clip_w, dst_clip_h, mul_col, render_op, src_region_x, src_region_y, src_region_w, src_region_h, - dst_region_x, dst_region_y, dst_region_w, dst_region_h); + dst_region_x, dst_region_y, dst_region_w, dst_region_h, + mask_ie, mask_x, mask_y); else #endif _evas_common_scale_rgba_in_to_out_clip_smooth_c @@ -295,7 +300,8 @@ evas_common_scale_rgba_smooth_draw(RGBA_Image *src, RGBA_Image *dst, int dst_cli dst_clip_x, dst_clip_y, dst_clip_w, dst_clip_h, mul_col, render_op, src_region_x, src_region_y, src_region_w, src_region_h, - dst_region_x, dst_region_y, dst_region_w, dst_region_h); + dst_region_x, dst_region_y, dst_region_w, dst_region_h, + mask_ie, mask_x, mask_y); } EAPI void diff --git a/src/lib/evas/common/evas_scale_smooth_scaler.c b/src/lib/evas/common/evas_scale_smooth_scaler.c index 67dd1d6289..0eea1626fc 100644 --- a/src/lib/evas/common/evas_scale_smooth_scaler.c +++ b/src/lib/evas/common/evas_scale_smooth_scaler.c @@ -1,5 +1,5 @@ void -SCALE_FUNC(RGBA_Image *src, RGBA_Image *dst, int dst_clip_x, int dst_clip_y, int dst_clip_w, int dst_clip_h, DATA32 mul_col, int render_op, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h) +SCALE_FUNC(RGBA_Image *src, RGBA_Image *dst, int dst_clip_x, int dst_clip_y, int dst_clip_w, int dst_clip_h, DATA32 mul_col, int render_op, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h, RGBA_Image *mask_ie, int mask_x, int mask_y) { DATA32 *dst_ptr; int src_w, src_h, dst_w, dst_h; diff --git a/src/lib/evas/common/evas_scale_smooth_scaler_down.c b/src/lib/evas/common/evas_scale_smooth_scaler_down.c index 057e526205..9d0bae3836 100644 --- a/src/lib/evas/common/evas_scale_smooth_scaler_down.c +++ b/src/lib/evas/common/evas_scale_smooth_scaler_down.c @@ -5,7 +5,7 @@ int *yapoints, *yapp; DATA32 *buf, *src_data; - RGBA_Gfx_Func func; + RGBA_Gfx_Func func, func2 = NULL; src_data = src->image.data; @@ -18,10 +18,20 @@ /* a scanline buffer */ buf = alloca(dst_clip_w * sizeof(DATA32)); - if (mul_col != 0xffffffff) - func = evas_common_gfx_func_composite_pixel_color_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, mul_col, dst->cache_entry.flags.alpha, dst_clip_w, render_op); + if (!mask_ie) + { + if (mul_col != 0xffffffff) + func = evas_common_gfx_func_composite_pixel_color_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, mul_col, dst->cache_entry.flags.alpha, dst_clip_w, render_op); + else + func = evas_common_gfx_func_composite_pixel_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, dst->cache_entry.flags.alpha, dst_clip_w, render_op); + } else - func = evas_common_gfx_func_composite_pixel_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, dst->cache_entry.flags.alpha, dst_clip_w, render_op); + { + func = evas_common_gfx_func_composite_pixel_mask_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, dst->cache_entry.flags.alpha, dst_clip_w, render_op); + if (mul_col != 0xffffffff) + func2 = evas_common_gfx_func_composite_pixel_color_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, mul_col, dst->cache_entry.flags.alpha, dst_clip_w, render_op); + } + /* scaling down vertically */ if ((dst_region_w >= src_region_w) && (dst_region_h < src_region_h)) diff --git a/src/lib/evas/common/evas_scale_smooth_scaler_downx.c b/src/lib/evas/common/evas_scale_smooth_scaler_downx.c index 6ef45e5f35..a73731e1a1 100644 --- a/src/lib/evas/common/evas_scale_smooth_scaler_downx.c +++ b/src/lib/evas/common/evas_scale_smooth_scaler_downx.c @@ -1,10 +1,12 @@ { int Cx, j; DATA32 *pix, *dptr, *pbuf, **yp; + DATA8 *mask; int r, g, b, a, rr, gg, bb, aa; int *xp, xap, yap, pos; //int dyy, dxx; int w = dst_clip_w; + int y; dptr = dst_ptr; pos = (src_region_y * src_w) + src_region_x; @@ -19,6 +21,7 @@ if (src->cache_entry.flags.alpha) { + y = 0; while (dst_clip_h--) { while (dst_clip_w--) @@ -82,7 +85,18 @@ xp++; xapp++; } - func(buf, NULL, mul_col, dptr, w); + if (!mask_ie) + func(buf, NULL, mul_col, dptr, w); + else + { + mask = mask_ie->image.data8 + + ((dst_clip_y - mask_y + y) * mask_ie->cache_entry.w) + + (dst_clip_x - mask_x); + + if (mul_col != 0xffffffff) func2(buf, NULL, mul_col, buf, w); + func(buf, mask, 0, dptr, w); + } + y++; pbuf = buf; dptr += dst_w; dst_clip_w = w; @@ -95,8 +109,9 @@ { #ifdef DIRECT_SCALE if ((!src->cache_entry.flags.alpha) && - (!dst->cache_entry.flags.alpha) && - (mul_col == 0xffffffff)) + (!dst->cache_entry.flags.alpha) && + (mul_col == 0xffffffff) && + (!mask_ie)) { while (dst_clip_h--) { @@ -165,6 +180,7 @@ else #endif { + y = 0; while (dst_clip_h--) { while (dst_clip_w--) @@ -221,7 +237,18 @@ xp++; xapp++; } - func(buf, NULL, mul_col, dptr, w); + if (!mask_ie) + func(buf, NULL, mul_col, dptr, w); + else + { + mask = mask_ie->image.data8 + + ((dst_clip_y - mask_y + y) * mask_ie->cache_entry.w) + + (dst_clip_x - mask_x); + + if (mul_col != 0xffffffff) func2(buf, NULL, mul_col, buf, w); + func(buf, mask, 0, dptr, w); + } + y++; pbuf = buf; dptr += dst_w; dst_clip_w = w; diff --git a/src/lib/evas/common/evas_scale_smooth_scaler_downx_downy.c b/src/lib/evas/common/evas_scale_smooth_scaler_downx_downy.c index d186ce1e2b..84fed3faf3 100644 --- a/src/lib/evas/common/evas_scale_smooth_scaler_downx_downy.c +++ b/src/lib/evas/common/evas_scale_smooth_scaler_downx_downy.c @@ -1,8 +1,10 @@ { int Cx, Cy, i, j; DATA32 *dptr, *sptr, *pix, *pbuf; + DATA8 *mask; int a, r, g, b, rx, gx, bx, ax; int xap, yap, pos; + int y; //int dyy, dxx; DATA32 **yp; @@ -24,6 +26,7 @@ #if 1 if (src->cache_entry.flags.alpha) { + y = 0; while (dst_clip_h--) { Cy = *yapp >> 16; @@ -131,7 +134,18 @@ xp++; xapp++; } - func(buf, NULL, mul_col, dptr, w); + if (!mask_ie) + func(buf, NULL, mul_col, dptr, w); + else + { + mask = mask_ie->image.data8 + + ((dst_clip_y - mask_y + y) * mask_ie->cache_entry.w) + + (dst_clip_x - mask_x); + + if (mul_col != 0xffffffff) func2(buf, NULL, mul_col, buf, w); + func(buf, mask, 0, dptr, w); + } + y++; pbuf = buf; dptr += dst_w; dst_clip_w = w; @@ -144,8 +158,9 @@ { #ifdef DIRECT_SCALE if ((!src->cache_entry.flags.alpha) && - (!dst->cache_entry.flags.alpha) && - (mul_col == 0xffffffff)) + (!dst->cache_entry.flags.alpha) && + (mul_col == 0xffffffff) && + (!mask_ie)) { while (dst_clip_h--) { @@ -252,6 +267,7 @@ else #endif { + y = 0; while (dst_clip_h--) { Cy = *yapp >> 16; @@ -347,7 +363,18 @@ xp++; xapp++; } - func(buf, NULL, mul_col, dptr, w); + if (!mask_ie) + func(buf, NULL, mul_col, dptr, w); + else + { + mask = mask_ie->image.data8 + + ((dst_clip_y - mask_y + y) * mask_ie->cache_entry.w) + + (dst_clip_x - mask_x); + + if (mul_col != 0xffffffff) func2(buf, NULL, mul_col, buf, w); + func(buf, mask, 0, dptr, w); + } + y++; pbuf = buf; dptr += dst_w; dst_clip_w = w; diff --git a/src/lib/evas/common/evas_scale_smooth_scaler_downy.c b/src/lib/evas/common/evas_scale_smooth_scaler_downy.c index 7e1c741f2e..733c2a41ba 100644 --- a/src/lib/evas/common/evas_scale_smooth_scaler_downy.c +++ b/src/lib/evas/common/evas_scale_smooth_scaler_downy.c @@ -1,10 +1,12 @@ { int Cy, j; DATA32 *dptr, *pix, *pbuf, **yp; + DATA8 *mask; int r, g, b, a, rr, gg, bb, aa; int *xp, xap, yap, pos; //int dyy, dxx; int w = dst_clip_w; + int y; dptr = dst_ptr; pos = (src_region_y * src_w) + src_region_x; @@ -19,6 +21,7 @@ if (src->cache_entry.flags.alpha) { + y = 0; while (dst_clip_h--) { Cy = *yapp >> 16; @@ -83,7 +86,18 @@ xp++; xapp++; } - func(buf, NULL, mul_col, dptr, w); + if (!mask_ie) + func(buf, NULL, mul_col, dptr, w); + else + { + mask = mask_ie->image.data8 + + ((dst_clip_y - mask_y + y) * mask_ie->cache_entry.w) + + (dst_clip_x - mask_x); + + if (mul_col != 0xffffffff) func2(buf, NULL, mul_col, buf, w); + func(buf, mask, 0, dptr, w); + } + y++; pbuf = buf; dptr += dst_w; dst_clip_w = w; @@ -96,8 +110,9 @@ { #ifdef DIRECT_SCALE if ((!src->cache_entry.flags.alpha) && - (!dst->cache_entry.flags.alpha) && - (mul_col == 0xffffffff)) + (!dst->cache_entry.flags.alpha) && + (mul_col == 0xffffffff) && + (!mask_ie)) { while (dst_clip_h--) { @@ -166,6 +181,7 @@ else #endif { + y = 0; while (dst_clip_h--) { Cy = *yapp >> 16; @@ -223,7 +239,18 @@ xp++; xapp++; } - func(buf, NULL, mul_col, dptr, w); + if (!mask_ie) + func(buf, NULL, mul_col, dptr, w); + else + { + mask = mask_ie->image.data8 + + ((dst_clip_y - mask_y + y) * mask_ie->cache_entry.w) + + (dst_clip_x - mask_x); + + if (mul_col != 0xffffffff) func2(buf, NULL, mul_col, buf, w); + func(buf, mask, 0, dptr, w); + } + y++; pbuf = buf; dptr += dst_w; dst_clip_w = w; diff --git a/src/lib/evas/common/evas_scale_smooth_scaler_up.c b/src/lib/evas/common/evas_scale_smooth_scaler_up.c index 44bfbfa12d..56060f8a07 100644 --- a/src/lib/evas/common/evas_scale_smooth_scaler_up.c +++ b/src/lib/evas/common/evas_scale_smooth_scaler_up.c @@ -10,7 +10,8 @@ DATA32 *psrc, *pdst, *pdst_end; DATA32 *buf, *pbuf, *pbuf_end; - RGBA_Gfx_Func func = NULL; + DATA8 *mask; + RGBA_Gfx_Func func = NULL, func2 = NULL; /* check value to make overflow(only check value related with overflow) */ if ((src_region_w > SCALE_SIZE_MAX) || @@ -19,7 +20,7 @@ /* a scanline buffer */ pdst = dst_ptr; // it's been set at (dst_clip_x, dst_clip_y) pdst_end = pdst + (dst_clip_h * dst_w); - if (mul_col == 0xffffffff) + if (mul_col == 0xffffffff && !mask_ie) { if ((render_op == _EVAS_RENDER_BLEND) && !src->cache_entry.flags.alpha) { direct_scale = 1; buf_step = dst->cache_entry.w; } @@ -33,10 +34,19 @@ if (!direct_scale) { buf = alloca(dst_clip_w * sizeof(DATA32)); - if (mul_col != 0xffffffff) - func = evas_common_gfx_func_composite_pixel_color_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, mul_col, dst->cache_entry.flags.alpha, dst_clip_w, render_op); - else - func = evas_common_gfx_func_composite_pixel_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, dst->cache_entry.flags.alpha, dst_clip_w, render_op); + if (!mask_ie) + { + if (mul_col != 0xffffffff) + func = evas_common_gfx_func_composite_pixel_color_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, mul_col, dst->cache_entry.flags.alpha, dst_clip_w, render_op); + else + func = evas_common_gfx_func_composite_pixel_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, dst->cache_entry.flags.alpha, dst_clip_w, render_op); + } + else + { + func = evas_common_gfx_func_composite_pixel_mask_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, dst->cache_entry.flags.alpha, dst_clip_w, render_op); + if (mul_col != 0xffffffff) + func2 = evas_common_gfx_func_composite_pixel_color_span_get(src->cache_entry.flags.alpha, src->cache_entry.flags.alpha_sparse, mul_col, dst->cache_entry.flags.alpha, dst_clip_w, render_op); + } } else buf = pdst; @@ -61,6 +71,7 @@ if (drh == srh) { int sxx0 = sxx; + int y = 0; psrc = src->image.data + (src_w * (sry + cy)) + srx; while (pdst < pdst_end) { @@ -99,7 +110,20 @@ } /* * blend here [clip_w *] buf -> dptr * */ if (!direct_scale) - func(buf, NULL, mul_col, pdst, dst_clip_w); + { + if (!mask_ie) + func(buf, NULL, mul_col, pdst, dst_clip_w); + else + { + mask = mask_ie->image.data8 + + ((dst_clip_y - mask_y + y) * mask_ie->cache_entry.w) + + (dst_clip_x - mask_x); + + if (mul_col != 0xffffffff) func2(buf, NULL, mul_col, buf, dst_clip_w); + func(buf, mask, 0, pdst, dst_clip_w); + } + y++; + } pdst += dst_w; psrc += src_w; @@ -111,6 +135,7 @@ else if (drw == srw) { DATA32 *ps = src->image.data + (src_w * sry) + srx + cx; + int y = 0; while (pdst < pdst_end) { @@ -149,7 +174,20 @@ } /* * blend here [clip_w *] buf -> dptr * */ if (!direct_scale) - func(buf, NULL, mul_col, pdst, dst_clip_w); + { + if (!mask_ie) + func(buf, NULL, mul_col, pdst, dst_clip_w); + else + { + mask = mask_ie->image.data8 + + ((dst_clip_y - mask_y + y) * mask_ie->cache_entry.w) + + (dst_clip_x - mask_x); + + if (mul_col != 0xffffffff) func2(buf, NULL, mul_col, buf, dst_clip_w); + func(buf, mask, 0, pdst, dst_clip_w); + } + y++; + } pdst += dst_w; syy += dsyy; buf += buf_step; @@ -160,6 +198,7 @@ { DATA32 *ps = src->image.data + (src_w * sry) + srx; int sxx0 = sxx; + int y = 0; while (pdst < pdst_end) { @@ -277,7 +316,20 @@ } /* * blend here [clip_w *] buf -> dptr * */ if (!direct_scale) - func(buf, NULL, mul_col, pdst, dst_clip_w); + { + if (!mask_ie) + func(buf, NULL, mul_col, pdst, dst_clip_w); + else + { + mask = mask_ie->image.data8 + + ((dst_clip_y - mask_y + y) * mask_ie->cache_entry.w) + + (dst_clip_x - mask_x); + + if (mul_col != 0xffffffff) func2(buf, NULL, mul_col, buf, dst_clip_w); + func(buf, mask, 0, pdst, dst_clip_w); + } + y++; + } pdst += dst_w; syy += dsyy; diff --git a/src/lib/evas/include/evas_common_private.h b/src/lib/evas/include/evas_common_private.h index e9a25f474c..8f01bf0536 100644 --- a/src/lib/evas/include/evas_common_private.h +++ b/src/lib/evas/include/evas_common_private.h @@ -700,6 +700,8 @@ struct _RGBA_Draw_Context } col; struct RGBA_Draw_Context_clip { int x, y, w, h; + void *mask; + int mask_x, mask_y; Eina_Bool use : 1; } clip; Cutout_Rects cutout; diff --git a/src/modules/evas/engines/software_generic/evas_engine.c b/src/modules/evas/engines/software_generic/evas_engine.c index ac9e086b0d..673924c50e 100644 --- a/src/modules/evas/engines/software_generic/evas_engine.c +++ b/src/modules/evas/engines/software_generic/evas_engine.c @@ -296,6 +296,8 @@ struct _Evas_Thread_Command_Rect DATA32 color; int render_op; int x, y, w, h; + void *mask; + int mask_x, mask_y; }; struct _Evas_Thread_Command_Line @@ -327,6 +329,8 @@ struct _Evas_Thread_Command_Image DATA32 mul_col; int render_op; int smooth; + void *mask; + int mask_x, mask_y; }; struct _Evas_Thread_Command_Font @@ -341,9 +345,11 @@ struct _Evas_Thread_Command_Font void *gl_draw; void *font_ext_data; DATA32 col; - Eina_Bool clip_use : 1; Eina_Rectangle clip_rect, ext; int im_w, im_h; + void *mask; + int mask_x, mask_y; + Eina_Bool clip_use : 1; }; struct _Evas_Thread_Command_Map @@ -525,7 +531,8 @@ _draw_thread_rectangle_draw(void *data) evas_common_rectangle_rgba_draw(rect->surface, rect->color, rect->render_op, - rect->x, rect->y, rect->w, rect->h); + rect->x, rect->y, rect->w, rect->h, + rect->mask, rect->mask_x, rect->mask_y); eina_mempool_free(_mp_command_rect, rect); } @@ -548,6 +555,9 @@ _draw_rectangle_thread_cmd(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, cr->y = y; cr->w = w; cr->h = h; + cr->mask = dc->clip.mask; + cr->mask_x = dc->clip.mask_x; + cr->mask_y = dc->clip.mask_y; evas_thread_cmd_enqueue(_draw_thread_rectangle_draw, cr); } @@ -1239,14 +1249,16 @@ _draw_thread_image_draw(void *data) image->clip.x, image->clip.y, image->clip.w, image->clip.h, image->mul_col, image->render_op, image->src.x, image->src.y, image->src.w, image->src.h, - image->dst.x, image->dst.y, image->dst.w, image->dst.h); + image->dst.x, image->dst.y, image->dst.w, image->dst.h, + image->mask, image->mask_x, image->mask_y); else evas_common_scale_rgba_sample_draw (image->image, image->surface, image->clip.x, image->clip.y, image->clip.w, image->clip.h, image->mul_col, image->render_op, image->src.x, image->src.y, image->src.w, image->src.h, - image->dst.x, image->dst.y, image->dst.w, image->dst.h); + image->dst.x, image->dst.y, image->dst.w, image->dst.h, + image->mask, image->mask_x, image->mask_y); eina_mempool_free(_mp_command_image, image); } @@ -1289,6 +1301,9 @@ _image_draw_thread_cmd(RGBA_Image *src, RGBA_Image *dst, RGBA_Draw_Context *dc, cr->mul_col = dc->mul.use ? dc->mul.col : 0xffffffff; cr->render_op = dc->render_op; cr->smooth = smooth; + cr->mask = dc->clip.mask; + cr->mask_x = dc->clip.mask_x; + cr->mask_y = dc->clip.mask_y; evas_thread_cmd_enqueue(_draw_thread_image_draw, cr); @@ -1429,13 +1444,15 @@ _map_image_draw(RGBA_Image *src, RGBA_Image *dst, RGBA_Draw_Context *dc, int src clip_x, clip_y, clip_w, clip_h, mul_col, dc->render_op, src_x, src_y, src_w, src_h, - dst_x, dst_y, dst_w, dst_h); + dst_x, dst_y, dst_w, dst_h, + dc->clip.mask, dc->clip.mask_x, dc->clip.mask_y); else evas_common_scale_rgba_sample_draw(src, dst, clip_x, clip_y, clip_w, clip_h, mul_col, dc->render_op, src_x, src_y, src_w, src_h, - dst_x, dst_y, dst_w, dst_h); + dst_x, dst_y, dst_w, dst_h, + dc->clip.mask, dc->clip.mask_x, dc->clip.mask_y); } static Eina_Bool @@ -2152,6 +2169,9 @@ _draw_thread_font_draw(void *data) dc.clip.y = font->clip_rect.y; dc.clip.w = font->clip_rect.w; dc.clip.h = font->clip_rect.h; + dc.clip.mask = font->mask; + dc.clip.mask_x = font->mask_x; + dc.clip.mask_y = font->mask_y; evas_common_font_rgba_draw (font->dst, &dc, @@ -2186,6 +2206,9 @@ _font_draw_thread_cmd(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, Evas EINA_RECTANGLE_SET(&cf->ext, ext_x, ext_y, ext_w, ext_h); cf->im_w = im_w; cf->im_h = im_h; + cf->mask = dc->clip.mask; + cf->mask_x = dc->clip.mask_x; + cf->mask_y = dc->clip.mask_y; evas_thread_cmd_enqueue(_draw_thread_font_draw, cf);