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_render_phase1_object_mapped_had_restack(Phase1_Context *p1ctx,
|
||||||
Evas_Object_Protected_Data *obj,
|
Evas_Object_Protected_Data *obj,
|
||||||
Eina_Bool map,
|
Eina_Bool map,
|
||||||
Eina_Bool obj_changed)
|
Eina_Bool obj_changed,
|
||||||
|
int level)
|
||||||
{
|
{
|
||||||
Evas_Object *eo_obj = obj->object;
|
Evas_Object *eo_obj = obj->object;
|
||||||
|
(void) level;
|
||||||
|
|
||||||
RD(level, " had map - restack objs\n");
|
RD(level, " had map - restack objs\n");
|
||||||
_evas_render_prev_cur_clip_cache_add(p1ctx->e, obj);
|
_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))
|
else if (EINA_UNLIKELY(hmap && !can_map))
|
||||||
_evas_render_phase1_object_mapped_had_restack(p1ctx, obj, 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 */
|
/* handle normal rendering. this object knows how to handle maps */
|
||||||
if (obj_changed)
|
if (obj_changed)
|
||||||
|
@ -2370,16 +2372,11 @@ evas_render_mask_subrender(Evas_Public_Data *evas,
|
||||||
Evas_Object_Protected_Data *prev_mask,
|
Evas_Object_Protected_Data *prev_mask,
|
||||||
int level, Eina_Bool do_async)
|
int level, Eina_Bool do_async)
|
||||||
{
|
{
|
||||||
int x, y, w, h, r, g, b, a;
|
int x, y, w, h, r, g, b, a, cr, cg, cb, ca;
|
||||||
Eina_Bool is_image, done = EINA_FALSE;
|
Eina_Bool is_image, done = EINA_FALSE, restore_state = EINA_FALSE;
|
||||||
void *ctx;
|
void *ctx;
|
||||||
|
|
||||||
if (!mask) return;
|
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);
|
eina_evlog("+mask_subrender", mask->object, 0.0, NULL);
|
||||||
RD(level, "evas_render_mask_subrender(%p, prev: %p, %s)\n",
|
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;
|
g = mask->cur->color.g;
|
||||||
b = mask->cur->color.b;
|
b = mask->cur->color.b;
|
||||||
a = mask->cur->color.a;
|
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)
|
EINA_COW_STATE_WRITE_BEGIN(mask, state_write, cur)
|
||||||
{
|
{
|
||||||
state_write->color.r = 255;
|
state_write->color.r = 255;
|
||||||
state_write->color.g = 255;
|
state_write->color.g = 255;
|
||||||
state_write->color.b = 255;
|
state_write->color.b = 255;
|
||||||
state_write->color.a = 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);
|
EINA_COW_STATE_WRITE_END(mask, state_write, cur);
|
||||||
}
|
}
|
||||||
|
@ -2580,7 +2587,7 @@ evas_render_mask_subrender(Evas_Public_Data *evas,
|
||||||
end:
|
end:
|
||||||
EINA_COW_WRITE_END(evas_object_mask_cow, mask->mask, mdata);
|
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)
|
EINA_COW_STATE_WRITE_BEGIN(mask, state_write, cur)
|
||||||
{
|
{
|
||||||
|
@ -2588,6 +2595,10 @@ end:
|
||||||
state_write->color.g = g;
|
state_write->color.g = g;
|
||||||
state_write->color.b = b;
|
state_write->color.b = b;
|
||||||
state_write->color.a = a;
|
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);
|
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_size_set(obj, 4, 4);
|
||||||
evas_object_image_colorspace_set(obj, EVAS_COLORSPACE_ARGB8888);
|
evas_object_image_colorspace_set(obj, EVAS_COLORSPACE_ARGB8888);
|
||||||
evas_object_image_data_copy_set(obj, ref_data[0]);
|
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_geometry_set(obj, 0, 0, W, H);
|
||||||
evas_object_show(obj);
|
evas_object_show(obj);
|
||||||
AUTODEL(obj);
|
|
||||||
|
|
||||||
ecore_evas_manual_render(ee);
|
ecore_evas_manual_render(ee);
|
||||||
refdata[0] = calloc(W * H, 4);
|
refdata[0] = calloc(W * H, 4);
|
||||||
memcpy(refdata[0], ecore_evas_buffer_pixels_get(ee), 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_copy_set(obj, ref_data[1]);
|
||||||
|
evas_object_image_data_update_add(obj, 0, 0, 4, 4);
|
||||||
ecore_evas_manual_render(ee);
|
ecore_evas_manual_render(ee);
|
||||||
refdata[1] = calloc(W * H, 4);
|
refdata[1] = calloc(W * H, 4);
|
||||||
memcpy(refdata[1], ecore_evas_buffer_pixels_get(ee), W * H * 4);
|
memcpy(refdata[1], ecore_evas_buffer_pixels_get(ee), W * H * 4);
|
||||||
|
evas_object_del(obj);
|
||||||
evas_object_hide(obj);
|
|
||||||
|
|
||||||
// Green background
|
// Green background
|
||||||
bg = evas_object_rectangle_add(e);
|
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_size_set(mask, 4, 4);
|
||||||
evas_object_image_colorspace_set(mask, EVAS_COLORSPACE_ARGB8888);
|
evas_object_image_colorspace_set(mask, EVAS_COLORSPACE_ARGB8888);
|
||||||
evas_object_image_data_copy_set(mask, mask_data);
|
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_geometry_set(mask, 0, 0, W, H);
|
||||||
evas_object_clip_set(rect, mask);
|
evas_object_clip_set(rect, mask);
|
||||||
evas_object_show(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);
|
evas_object_color_set(mask, 0x80, 0x80, 0x80, 0x80);
|
||||||
ecore_evas_manual_render(ee);
|
ecore_evas_manual_render(ee);
|
||||||
memcpy(data, ecore_evas_buffer_pixels_get(ee), W * H * 4);
|
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);
|
fail_if(_bgra_compare(data, refdata[1], W, H) != 0);
|
||||||
|
|
||||||
// Now try again with a clip instead - this verifies clip == mask
|
// 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_size_set(mask0, 4, 4);
|
||||||
evas_object_image_colorspace_set(mask0, EVAS_COLORSPACE_ARGB8888);
|
evas_object_image_colorspace_set(mask0, EVAS_COLORSPACE_ARGB8888);
|
||||||
evas_object_image_data_copy_set(mask0, mask_data[0]);
|
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_geometry_set(mask0, 0, 0, W, H);
|
||||||
evas_object_show(mask0);
|
evas_object_show(mask0);
|
||||||
AUTODEL(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_size_set(mask1, 4, 4);
|
||||||
evas_object_image_colorspace_set(mask1, EVAS_COLORSPACE_ARGB8888);
|
evas_object_image_colorspace_set(mask1, EVAS_COLORSPACE_ARGB8888);
|
||||||
evas_object_image_data_copy_set(mask1, mask_data[1]);
|
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_show(mask1);
|
||||||
|
|
||||||
evas_object_size_hint_expand_set(mask1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
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_size_set(obj, 4, 4);
|
||||||
evas_object_image_colorspace_set(obj, EVAS_COLORSPACE_ARGB8888);
|
evas_object_image_colorspace_set(obj, EVAS_COLORSPACE_ARGB8888);
|
||||||
evas_object_image_data_copy_set(obj, mask_data[2]);
|
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_geometry_set(obj, 0, 0, W, H);
|
||||||
evas_object_show(obj);
|
evas_object_show(obj);
|
||||||
AUTODEL(obj);
|
AUTODEL(obj);
|
||||||
|
|
Loading…
Reference in New Issue