efl_unref(child);
}
-#ifndef HAVE_THORVG
-static void
-_draw_comp(Evas_Object_Protected_Data *obj, Efl_VG *node,
- Ector_Surface *ector, void *engine, void *output,
- void *context)
-{
- if (!efl_gfx_entity_visible_get(node)) return;
-
- if (efl_isa(node, EFL_CANVAS_VG_CONTAINER_CLASS))
- {
- Efl_Canvas_Vg_Container_Data *cd =
- efl_data_scope_get(node, EFL_CANVAS_VG_CONTAINER_CLASS);
-
- //Draw Composite Image.
- Efl_VG *child;
- Eina_List *l;
- EINA_LIST_FOREACH(cd->children, l, child)
- _draw_comp(obj, child, ector, engine, output, context);
- }
- else
- {
- Efl_Canvas_Vg_Node_Data *nd = efl_data_scope_get(node, EFL_CANVAS_VG_NODE_CLASS);
- ENFN->ector_renderer_draw(engine, output, context, nd->renderer, NULL, EINA_FALSE);
- }
-}
-
-static Ector_Buffer *
-_prepare_comp(Evas_Object_Protected_Data *obj, //vector object
- Efl_Canvas_Vg_Node* comp_target,
- void *engine, void *output, void *context,
- Ector_Surface *surface,
- Eina_Matrix3 *ptransform,
- Eina_Matrix3 *ctransform,
- int p_opacity,
- int c_opacity,
- Ector_Buffer *comp,
- Efl_Gfx_Vg_Composite_Method comp_method)
-{
-
- Efl_Canvas_Vg_Container_Data *pd = efl_data_scope_get(comp_target, MY_CLASS);
- Efl_Canvas_Vg_Node_Data *nd =
- efl_data_scope_get(comp_target, EFL_CANVAS_VG_NODE_CLASS);
- if (nd->flags == EFL_GFX_CHANGE_FLAG_NONE) return pd->comp.buffer;
- uint32_t init_buffer = 0x0;
-
- //1. Composite Size
- Eina_Size2D size;
- size.w = obj->cur->geometry.w;
- size.h = obj->cur->geometry.h;
-
- //FIXME: If composite method is SUBSTRACT or INTERSECT, buffer fills in white color(Full alpha color).
- if (pd->comp.method == EFL_GFX_VG_COMPOSITE_METHOD_MASK_SUBSTRACT ||
- pd->comp.method == EFL_GFX_VG_COMPOSITE_METHOD_MASK_INTERSECT)
- init_buffer = 0xFFFFFFFF;
-
- //2. Reusable ector buffer?
- if (pd->comp.buffer &&
- ((pd->comp.size.w != size.w) ||
- (pd->comp.size.h != size.h)))
-
- {
- if (pd->comp.pixels)
- ector_buffer_unmap(pd->comp.buffer, pd->comp.pixels, pd->comp.length);
- efl_unref(pd->comp.buffer);
- pd->comp.buffer = NULL;
- }
-
- if (!pd->comp.buffer)
- {
- pd->comp.buffer = ENFN->ector_buffer_new(ENC, obj->layer->evas->evas,
- size.w, size.h,
- EFL_GFX_COLORSPACE_ARGB8888,
- ECTOR_BUFFER_FLAG_DRAWABLE |
- ECTOR_BUFFER_FLAG_CPU_READABLE |
- ECTOR_BUFFER_FLAG_CPU_WRITABLE);
- pd->comp.size.w = size.w;
- pd->comp.size.h = size.h;
- pd->comp.vg_pd = obj;
-
- //Map
- pd->comp.pixels = ector_buffer_map(pd->comp.buffer, &pd->comp.length,
- (ECTOR_BUFFER_FLAG_DRAWABLE |
- ECTOR_BUFFER_FLAG_CPU_READABLE |
- ECTOR_BUFFER_FLAG_CPU_WRITABLE),
- 0, 0, size.w, size.h,
- EFL_GFX_COLORSPACE_ARGB8888,
- &pd->comp.stride);
- if (!pd->comp.pixels) ERR("Failed to map VG composite buffer");
-
- //If composite method is SUBSTRACT or INTERSECT, Buffer needs initialize.
- if (pd->comp.pixels &&
- (pd->comp.method == EFL_GFX_VG_COMPOSITE_METHOD_MASK_SUBSTRACT ||
- pd->comp.method == EFL_GFX_VG_COMPOSITE_METHOD_MASK_INTERSECT))
- memset(pd->comp.pixels, init_buffer, pd->comp.length);
- }
- else
- {
- if (pd->comp.pixels)
- memset(pd->comp.pixels, init_buffer, pd->comp.length);
- }
-
- if (!pd->comp.buffer) ERR("Composite Buffer is invalid");
-
- //FIXME: This code means that there is another composite container.
- if (pd->comp.method >= EFL_GFX_VG_COMPOSITE_METHOD_MASK_ADD)
- {
- Efl_Canvas_Vg_Container_Data *target_pd = pd;
- comp = pd->comp.buffer;
- for (Efl_VG *comp_target = pd->comp_target; comp_target; comp_target = target_pd->comp_target)
- {
- Efl_Canvas_Vg_Container_Data *src_pd = NULL;
- target_pd = efl_data_scope_get(comp_target, MY_CLASS);
- src_pd = efl_data_scope_get(eina_list_nth(target_pd->comp.src, 0), MY_CLASS);
- _evas_vg_render_pre(obj, comp_target,
- engine, output, context, surface,
- ctransform, c_opacity, comp, src_pd->comp.method);
- }
- }
-
- //3. Prepare Drawing shapes.
- _evas_vg_render_pre(obj, comp_target,
- engine, output, context,
- surface,
- ptransform, p_opacity, comp, comp_method);
-
- //4. Generating Composite Image.
- ector_buffer_pixels_set(surface, pd->comp.pixels, size.w, size.h, pd->comp.stride,
- EFL_GFX_COLORSPACE_ARGB8888, EINA_TRUE);
- ector_surface_reference_point_set(surface, 0, 0);
- _draw_comp(obj, comp_target, surface, engine, output, context);
-
- return pd->comp.buffer;
-}
-#else
static void
_efl_canvas_vg_container_render_pre_tvg(Evas_Object_Protected_Data *obj,
EINA_UNUSED Efl_VG *node,
if (scene) tvg_scene_push(scene, cd->scene);
else if (canvas) tvg_canvas_push(canvas, cd->scene);
}
-#endif
static void
_efl_canvas_vg_container_render_pre(Evas_Object_Protected_Data *vg_pd,
EFL_CANVAS_VG_COMPUTE_MATRIX(ctransform, ptransform, nd);
EFL_CANVAS_VG_COMPUTE_ALPHA(c_r, c_g, c_b, c_a, p_opacity, nd);
- //Container may have composite target.
- //FIXME : _prepare_comp() should only work in cases with matte or masking.
- // This condition is valid because the masking use same type as matte.
-
- //FIX_TVG: Missing tvg support composition????
-#ifndef HAVE_THORVG
- if (pd->comp_target &&
- (pd->comp.method == EFL_GFX_VG_COMPOSITE_METHOD_MATTE_ALPHA ||
- pd->comp.method == EFL_GFX_VG_COMPOSITE_METHOD_MATTE_ALPHA_INVERSE))
- {
- comp_method = pd->comp.method;
- comp = _prepare_comp(vg_pd, pd->comp_target,
- engine, output, context, surface,
- ptransform, ctransform, p_opacity, c_a, comp, comp_method);
- }
-#endif
-
//If the container has transparency, it internally alpha blends with ector buffer.
//So ector buffer must be created synchronously.
if (c_a < 255 && vg_pd && vg_pd->object)
efl_gfx_color_set(obj, 255, 255, 255, 255);
-#ifdef HAVE_THORVG
pd->scene = tvg_scene_new();
nd->render_pre_tvg = _efl_canvas_vg_container_render_pre_tvg;
-#endif
return obj;
}
{
efl_canvas_vg_container_blend_buffer_clear(obj, pd);
-#ifndef HAVE_THORVG
- //Destroy comp surface
- if (pd->comp.buffer)
- {
- if (pd->comp.pixels)
- ector_buffer_unmap(pd->comp.buffer, pd->comp.pixels, pd->comp.length);
- efl_unref(pd->comp.buffer);
- }
-#else
if (!pd->comp.src && pd->scene)
tvg_paint_del(pd->scene);
-#endif
efl_unref(pd->comp_target);
eina_list_free(pd->comp.src);
{
Efl_Canvas_Vg_Container_Data *pd2 = efl_data_scope_get(target, MY_CLASS);
pd2->comp.src = eina_list_append(pd2->comp.src, obj);
-#ifdef HAVE_THORVG
+
//FIX_TVG: currently only matte alpha is supported. Observed crash in thorvg when CLIP_PATH method is used.
if (method == EFL_GFX_VG_COMPOSITE_METHOD_MATTE_ALPHA)
tvg_paint_set_composite_method(pd->scene, pd2->scene, TVG_COMPOSITE_METHOD_ALPHA_MASK);
-#endif
}
pd->comp.method = method;
}
}
-void
-efl_canvas_vg_container_blend_buffer_clear(Efl_VG *obj EINA_UNUSED, Efl_Canvas_Vg_Container_Data *cd)
-{
-#ifndef HAVE_THORVG
- if (!cd->blend.buffer) return;
-
- if (cd->blend.pixels)
- {
- ector_buffer_unmap(cd->blend.buffer, cd->blend.pixels, cd->blend.length);
- cd->blend.pixels = NULL;
- }
- if (cd->blend.buffer) efl_unref(cd->blend.buffer);
- cd->blend.buffer = NULL;
-#endif
-}
-
EAPI Evas_Vg_Container *
evas_vg_container_add(Evas_Object *parent)
{