evas vg: prevent a corner-case crash.
tbh, current vg interfaces a little bit bad... here is one scenario to this stupid case. efl_parent_set() and evas_object_vg_root_node_set() both do re-parent job. They could be conflicted if user calls both apis in either way. efl_parent_set(root_node, NULL); but Vg Object still keeps the root node which is just a dangling pointer that occurs a crash while rendering.
This commit is contained in:
parent
bd5174b600
commit
c8c0dbb32b
|
@ -172,6 +172,8 @@ _efl_canvas_vg_object_root_node_set(Eo *obj, Efl_Canvas_Vg_Object_Data *pd, Efl_
|
|||
|
||||
// set the parent so that vg canvas can render it.
|
||||
efl_parent_set(pd->user_entry->root, pd->root);
|
||||
|
||||
efl_canvas_vg_node_root_set(root_node, obj);
|
||||
}
|
||||
else if (pd->user_entry)
|
||||
{
|
||||
|
|
|
@ -322,9 +322,24 @@ _efl_canvas_vg_node_efl_object_parent_set(Eo *obj,
|
|||
{
|
||||
Efl_Canvas_Vg_Container_Data *cd = NULL;
|
||||
Efl_Canvas_Vg_Container_Data *old_cd;
|
||||
Efl_Canvas_Vg_Node_Data *nd;
|
||||
Efl_VG *old_parent;
|
||||
Eina_Bool parent_container = EINA_TRUE;
|
||||
|
||||
nd = efl_data_scope_get(obj, MY_CLASS);
|
||||
|
||||
//No, prevent infinite calls parent_set() -> root_node_set() -> parent_set() -> ...
|
||||
if (nd->parenting) return;
|
||||
|
||||
//Cut off root node from vg object if it does....
|
||||
if (nd->vg_obj)
|
||||
{
|
||||
nd->parenting = EINA_TRUE;
|
||||
evas_object_vg_root_node_set(nd->vg_obj, NULL);
|
||||
nd->parenting = EINA_FALSE;
|
||||
nd->vg_obj = NULL;
|
||||
}
|
||||
|
||||
if (efl_isa(parent, EFL_CANVAS_VG_CONTAINER_CLASS))
|
||||
cd = efl_data_scope_get(parent, EFL_CANVAS_VG_CONTAINER_CLASS);
|
||||
else if (efl_isa(parent, EFL_CANVAS_VG_OBJECT_CLASS))
|
||||
|
@ -707,6 +722,14 @@ _efl_canvas_vg_node_efl_gfx_path_interpolate(Eo *obj, Efl_Canvas_Vg_Node_Data *p
|
|||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
efl_canvas_vg_node_root_set(Efl_VG *node, Efl_VG *vg_obj)
|
||||
{
|
||||
Efl_Canvas_Vg_Node_Data *nd = efl_data_scope_get(node, MY_CLASS);
|
||||
nd->vg_obj = vg_obj;
|
||||
}
|
||||
|
||||
|
||||
EOLIAN static Efl_VG *
|
||||
_efl_canvas_vg_node_efl_duplicate_duplicate(const Eo *obj, Efl_Canvas_Vg_Node_Data *pd)
|
||||
{
|
||||
|
|
|
@ -62,6 +62,8 @@ struct _Efl_Canvas_Vg_Node_Data
|
|||
Efl_Canvas_Vg_Node *mask;
|
||||
Ector_Renderer *renderer;
|
||||
|
||||
Efl_VG *vg_obj;
|
||||
|
||||
void (*render_pre)(Eo *obj, Eina_Matrix3 *parent, Ector_Surface *s, void *data, Efl_Canvas_Vg_Node_Data *nd);
|
||||
void *data;
|
||||
|
||||
|
@ -71,6 +73,7 @@ struct _Efl_Canvas_Vg_Node_Data
|
|||
|
||||
Eina_Bool visibility : 1;
|
||||
Eina_Bool changed : 1;
|
||||
Eina_Bool parenting : 1;
|
||||
};
|
||||
|
||||
struct _Efl_Canvas_Vg_Container_Data
|
||||
|
@ -108,6 +111,8 @@ Vg_File_Data * evas_cache_vg_file_info(const char *file, const char
|
|||
|
||||
Eina_Bool evas_vg_save_to_file(Vg_File_Data *evg_data, const char *file, const char *key, const char *flags);
|
||||
|
||||
void efl_canvas_vg_node_root_set(Efl_VG *node, Efl_VG *vg_obj);
|
||||
|
||||
static inline Efl_Canvas_Vg_Node_Data *
|
||||
_evas_vg_render_pre(Efl_VG *child, Ector_Surface *s, Eina_Matrix3 *m)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue