forked from enlightenment/efl
evas: Fix issues with masking (make check)
After a previous patch, mask_subrender worked differently, and didn't reset the object's cache clip color. This made evas_suite fail. But also it seems some other issues creeped in and it was necessary to fix the test case by adding data_updates (mistake!) and removing an invalid draw call.
This commit is contained in:
parent
0bf269d966
commit
03eb4c6409
|
@ -757,9 +757,11 @@ static void
|
|||
_evas_render_phase1_object_mapped_had_restack(Phase1_Context *p1ctx,
|
||||
Evas_Object_Protected_Data *obj,
|
||||
Eina_Bool map,
|
||||
Eina_Bool obj_changed)
|
||||
Eina_Bool obj_changed,
|
||||
int level)
|
||||
{
|
||||
Evas_Object *eo_obj = obj->object;
|
||||
(void) level;
|
||||
|
||||
RD(level, " had map - restack objs\n");
|
||||
_evas_render_prev_cur_clip_cache_add(p1ctx->e, obj);
|
||||
|
@ -1099,7 +1101,7 @@ _evas_render_phase1_object_process(Phase1_Context *p1ctx,
|
|||
}
|
||||
else if (EINA_UNLIKELY(hmap && !can_map))
|
||||
_evas_render_phase1_object_mapped_had_restack(p1ctx, obj, map,
|
||||
obj_changed);
|
||||
obj_changed, level);
|
||||
|
||||
/* handle normal rendering. this object knows how to handle maps */
|
||||
if (obj_changed)
|
||||
|
@ -2370,16 +2372,11 @@ evas_render_mask_subrender(Evas_Public_Data *evas,
|
|||
Evas_Object_Protected_Data *prev_mask,
|
||||
int level, Eina_Bool do_async)
|
||||
{
|
||||
int x, y, w, h, r, g, b, a;
|
||||
Eina_Bool is_image, done = EINA_FALSE;
|
||||
int x, y, w, h, r, g, b, a, cr, cg, cb, ca;
|
||||
Eina_Bool is_image, done = EINA_FALSE, restore_state = EINA_FALSE;
|
||||
void *ctx;
|
||||
|
||||
if (!mask) return;
|
||||
if (!mask->mask->redraw && mask->mask->surface)
|
||||
{
|
||||
DBG("Requested mask redraw but the redraw flag is off.");
|
||||
return;
|
||||
}
|
||||
|
||||
eina_evlog("+mask_subrender", mask->object, 0.0, NULL);
|
||||
RD(level, "evas_render_mask_subrender(%p, prev: %p, %s)\n",
|
||||
|
@ -2396,14 +2393,24 @@ evas_render_mask_subrender(Evas_Public_Data *evas,
|
|||
g = mask->cur->color.g;
|
||||
b = mask->cur->color.b;
|
||||
a = mask->cur->color.a;
|
||||
if ((r != 255) || (g != 255) || (b != 255) || (a != 255))
|
||||
cr = mask->cur->cache.clip.r;
|
||||
cg = mask->cur->cache.clip.g;
|
||||
cb = mask->cur->cache.clip.b;
|
||||
ca = mask->cur->cache.clip.a;
|
||||
if ((r != 255) || (g != 255) || (b != 255) || (a != 255) ||
|
||||
(cr != 255) || (cg != 255) || (cb != 255) || (ca != 255))
|
||||
{
|
||||
restore_state = EINA_TRUE;
|
||||
EINA_COW_STATE_WRITE_BEGIN(mask, state_write, cur)
|
||||
{
|
||||
state_write->color.r = 255;
|
||||
state_write->color.g = 255;
|
||||
state_write->color.b = 255;
|
||||
state_write->color.a = 255;
|
||||
state_write->cache.clip.r = 255;
|
||||
state_write->cache.clip.g = 255;
|
||||
state_write->cache.clip.b = 255;
|
||||
state_write->cache.clip.a = 255;
|
||||
}
|
||||
EINA_COW_STATE_WRITE_END(mask, state_write, cur);
|
||||
}
|
||||
|
@ -2580,7 +2587,7 @@ evas_render_mask_subrender(Evas_Public_Data *evas,
|
|||
end:
|
||||
EINA_COW_WRITE_END(evas_object_mask_cow, mask->mask, mdata);
|
||||
|
||||
if ((r != 255) || (g != 255) || (b != 255) || (a != 255))
|
||||
if (restore_state)
|
||||
{
|
||||
EINA_COW_STATE_WRITE_BEGIN(mask, state_write, cur)
|
||||
{
|
||||
|
@ -2588,6 +2595,10 @@ end:
|
|||
state_write->color.g = g;
|
||||
state_write->color.b = b;
|
||||
state_write->color.a = a;
|
||||
state_write->cache.clip.r = cr;
|
||||
state_write->cache.clip.g = cg;
|
||||
state_write->cache.clip.b = cb;
|
||||
state_write->cache.clip.a = ca;
|
||||
}
|
||||
EINA_COW_STATE_WRITE_END(mask, state_write, cur);
|
||||
}
|
||||
|
|
|
@ -147,20 +147,20 @@ START_TEST(evas_mask_test_compare_clip)
|
|||
evas_object_image_size_set(obj, 4, 4);
|
||||
evas_object_image_colorspace_set(obj, EVAS_COLORSPACE_ARGB8888);
|
||||
evas_object_image_data_copy_set(obj, ref_data[0]);
|
||||
evas_object_image_data_update_add(obj, 0, 0, 4, 4);
|
||||
evas_object_geometry_set(obj, 0, 0, W, H);
|
||||
evas_object_show(obj);
|
||||
AUTODEL(obj);
|
||||
|
||||
ecore_evas_manual_render(ee);
|
||||
refdata[0] = calloc(W * H, 4);
|
||||
memcpy(refdata[0], ecore_evas_buffer_pixels_get(ee), W * H * 4);
|
||||
|
||||
evas_object_image_data_copy_set(obj, ref_data[1]);
|
||||
evas_object_image_data_update_add(obj, 0, 0, 4, 4);
|
||||
ecore_evas_manual_render(ee);
|
||||
refdata[1] = calloc(W * H, 4);
|
||||
memcpy(refdata[1], ecore_evas_buffer_pixels_get(ee), W * H * 4);
|
||||
|
||||
evas_object_hide(obj);
|
||||
evas_object_del(obj);
|
||||
|
||||
// Green background
|
||||
bg = evas_object_rectangle_add(e);
|
||||
|
@ -182,6 +182,7 @@ START_TEST(evas_mask_test_compare_clip)
|
|||
evas_object_image_size_set(mask, 4, 4);
|
||||
evas_object_image_colorspace_set(mask, EVAS_COLORSPACE_ARGB8888);
|
||||
evas_object_image_data_copy_set(mask, mask_data);
|
||||
evas_object_image_data_update_add(mask, 0, 0, 4, 4);
|
||||
evas_object_geometry_set(mask, 0, 0, W, H);
|
||||
evas_object_clip_set(rect, mask);
|
||||
evas_object_show(mask);
|
||||
|
@ -197,12 +198,6 @@ START_TEST(evas_mask_test_compare_clip)
|
|||
evas_object_color_set(mask, 0x80, 0x80, 0x80, 0x80);
|
||||
ecore_evas_manual_render(ee);
|
||||
memcpy(data, ecore_evas_buffer_pixels_get(ee), W * H * 4);
|
||||
|
||||
evas_object_image_data_copy_set(obj, ref_data[1]);
|
||||
evas_object_show(obj);
|
||||
ecore_evas_manual_render(ee);
|
||||
refdata[1] = calloc(W * H, 4);
|
||||
memcpy(refdata[1], ecore_evas_buffer_pixels_get(ee), W * H * 4);
|
||||
fail_if(_bgra_compare(data, refdata[1], W, H) != 0);
|
||||
|
||||
// Now try again with a clip instead - this verifies clip == mask
|
||||
|
@ -318,6 +313,7 @@ START_TEST(evas_mask_test_mask_of_mask)
|
|||
evas_object_image_size_set(mask0, 4, 4);
|
||||
evas_object_image_colorspace_set(mask0, EVAS_COLORSPACE_ARGB8888);
|
||||
evas_object_image_data_copy_set(mask0, mask_data[0]);
|
||||
evas_object_image_data_update_add(mask0, 0, 0, 4, 4);
|
||||
evas_object_geometry_set(mask0, 0, 0, W, H);
|
||||
evas_object_show(mask0);
|
||||
AUTODEL(mask0);
|
||||
|
@ -339,6 +335,7 @@ START_TEST(evas_mask_test_mask_of_mask)
|
|||
evas_object_image_size_set(mask1, 4, 4);
|
||||
evas_object_image_colorspace_set(mask1, EVAS_COLORSPACE_ARGB8888);
|
||||
evas_object_image_data_copy_set(mask1, mask_data[1]);
|
||||
evas_object_image_data_update_add(mask1, 0, 0, 4, 4);
|
||||
evas_object_show(mask1);
|
||||
|
||||
evas_object_size_hint_expand_set(mask1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
||||
|
@ -362,6 +359,7 @@ START_TEST(evas_mask_test_mask_of_mask)
|
|||
evas_object_image_size_set(obj, 4, 4);
|
||||
evas_object_image_colorspace_set(obj, EVAS_COLORSPACE_ARGB8888);
|
||||
evas_object_image_data_copy_set(obj, mask_data[2]);
|
||||
evas_object_image_data_update_add(obj, 0, 0, 4, 4);
|
||||
evas_object_geometry_set(obj, 0, 0, W, H);
|
||||
evas_object_show(obj);
|
||||
AUTODEL(obj);
|
||||
|
|
Loading…
Reference in New Issue