vg_load_svg: Fix pointing to wrong parent

Summary:
If defs type is open empty style, it is not included in stack.
Because the current logic is weak to group tags in sibling relationships.
If defs of open-empty type is placed before the group tag,
the group tag refers to the wrong parent. This patch prevents it.

This change is the same concept as the D12127, which was reverted to 5065c9d0c2.

Test Plan: N/A

Reviewers: Hermet, smohanty

Reviewed By: Hermet

Subscribers: cedric, herb, kimcinoo, #committers, #reviewers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D12129
This commit is contained in:
junsu choi 2020-09-04 11:14:58 +09:00 committed by Hermet Park
parent add087837c
commit 39ccd92394
1 changed files with 20 additions and 10 deletions

View File

@ -2112,9 +2112,18 @@ _find_gradient_factory(const char *name)
return NULL;
}
static Svg_Node*
_get_parent_node_from_loader(Evas_SVG_Loader *loader)
{
if (eina_array_count(loader->stack) > 0)
return eina_array_data_get(loader->stack, eina_array_count(loader->stack) - 1);
else
return loader->doc;
}
static void
_evas_svg_loader_xml_open_parser(Evas_SVG_Loader *loader,
const char *content, unsigned int length)
const char *content, unsigned int length, Eina_Bool empty)
{
const char *attrs = NULL;
int attrs_length = 0;
@ -2157,20 +2166,21 @@ _evas_svg_loader_xml_open_parser(Evas_SVG_Loader *loader,
}
else
{
parent = eina_array_data_get(loader->stack, eina_array_count(loader->stack) - 1);
parent = _get_parent_node_from_loader(loader);
node = method(loader, parent, attrs, attrs_length);
}
eina_array_push(loader->stack, node);
if (node->type == SVG_NODE_DEFS)
{
loader->doc->node.doc.defs = node;
loader->def = node;
}
{
loader->doc->node.doc.defs = node;
loader->def = node;
if (!empty) eina_array_push(loader->stack, node);
}
else eina_array_push(loader->stack, node);
}
else if ((method = _find_graphics_factory(tag_name)))
{
parent = eina_array_data_get(loader->stack, eina_array_count(loader->stack) - 1);
parent = _get_parent_node_from_loader(loader);
node = method(loader, parent, attrs, attrs_length);
}
else if ((gradient_method = _find_gradient_factory(tag_name)))
@ -2250,10 +2260,10 @@ _evas_svg_loader_parser(void *data, Eina_Simple_XML_Type type,
switch (type)
{
case EINA_SIMPLE_XML_OPEN:
_evas_svg_loader_xml_open_parser(loader, content, length);
_evas_svg_loader_xml_open_parser(loader, content, length, EINA_FALSE);
break;
case EINA_SIMPLE_XML_OPEN_EMPTY:
_evas_svg_loader_xml_open_parser(loader, content, length);
_evas_svg_loader_xml_open_parser(loader, content, length, EINA_TRUE);
break;
case EINA_SIMPLE_XML_CLOSE:
_evas_svg_loader_xml_close_parser(loader, content, length);