hermet pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=39ccd92394616888c80b19abcd7a3fc3c355eb32

commit 39ccd92394616888c80b19abcd7a3fc3c355eb32
Author: JunsuChoi <jsuya.c...@samsung.com>
Date:   Fri Sep 4 11:14:58 2020 +0900

    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
---
 src/modules/evas/vg_loaders/svg/evas_vg_load_svg.c | 30 ++++++++++++++--------
 1 file changed, 20 insertions(+), 10 deletions(-)

diff --git a/src/modules/evas/vg_loaders/svg/evas_vg_load_svg.c 
b/src/modules/evas/vg_loaders/svg/evas_vg_load_svg.c
index cefdc3304f..6498f1ab10 100644
--- a/src/modules/evas/vg_loaders/svg/evas_vg_load_svg.c
+++ b/src/modules/evas/vg_loaders/svg/evas_vg_load_svg.c
@@ -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);

-- 


Reply via email to