svg_loader SceneBuilder: No propagate opacity to child accepted/tizen/unified/20201208.123147 submit/tizen/20201208.034059
authorJunsuChoi <jsuya.choi@samsung.com>
Mon, 7 Dec 2020 08:35:26 +0000 (17:35 +0900)
committerJunsuChoi <jsuya.choi@samsung.com>
Tue, 8 Dec 2020 03:36:26 +0000 (12:36 +0900)
Scene's opacity() propagates opacity value inside.
Therefore, unnecessary opacity calculation.

Change-Id: Ic7460c21b28aaa8bc1ed81272d63ef2931732b52

src/loaders/svg/tvgSvgSceneBuilder.cpp

index dc26c01..d32c648 100644 (file)
@@ -24,7 +24,7 @@
 #include "tvgSvgSceneBuilder.h"
 #include "tvgSvgPath.h"
 
-void _appendShape(SvgNode* node, Shape* shape, float vx, float vy, float vw, float vh);
+bool _appendShape(SvgNode* node, Shape* shape, float vx, float vy, float vw, float vh);
 
 bool _isGroupType(SvgNodeType type)
 {
@@ -277,11 +277,11 @@ void _applyProperty(SvgNode* node, Shape* vg, float vx, float vy, float vw, floa
 unique_ptr<Shape> _shapeBuildHelper(SvgNode* node, float vx, float vy, float vw, float vh)
 {
     auto shape = Shape::gen();
-    _appendShape(node, shape.get(), vx, vy, vw, vh);
-    return shape;
+    if (_appendShape(node, shape.get(), vx, vy, vw, vh)) return shape;
+    else return nullptr;
 }
 
-void _appendShape(SvgNode* node, Shape* shape, float vx, float vy, float vw, float vh)
+bool _appendShape(SvgNode* node, Shape* shape, float vx, float vy, float vw, float vh)
 {
     switch (node->type) {
         case SvgNodeType::Path: {
@@ -326,28 +326,28 @@ void _appendShape(SvgNode* node, Shape* shape, float vx, float vy, float vw, flo
             break;
         }
         default: {
-            break;
+            return false;
         }
     }
 
     _applyProperty(node, shape, vx, vy, vw, vh);
+    return true;
 }
 
-unique_ptr<Scene> _sceneBuildHelper(SvgNode* node, float vx, float vy, float vw, float vh, int parentOpacity)
+unique_ptr<Scene> _sceneBuildHelper(SvgNode* node, float vx, float vy, float vw, float vh)
 {
     if (_isGroupType(node->type)) {
         auto scene = Scene::gen();
         if (node->transform) scene->transform(*node->transform);
-        node->style->opacity = (node->style->opacity * parentOpacity) / 255.0f;
 
-        if (node->display) {
+        if (node->display && node->style->opacity != 0) {
             auto child = node->child.list;
             for (uint32_t i = 0; i < node->child.cnt; ++i, ++child) {
                 if (_isGroupType((*child)->type)) {
-                    scene->push(_sceneBuildHelper(*child, vx, vy, vw, vh, node->style->opacity));
+                    scene->push(_sceneBuildHelper(*child, vx, vy, vw, vh));
                 } else {
-                    (*child)->style->opacity = ((*child)->style->opacity * node->style->opacity) / 255.0f;
-                    scene->push(_shapeBuildHelper(*child, vx, vy, vw, vh));
+                    auto shape = _shapeBuildHelper(*child, vx, vy, vw, vh);
+                    if (shape) scene->push(move(shape));
                 }
             }
             //Apply composite node
@@ -363,6 +363,7 @@ unique_ptr<Scene> _sceneBuildHelper(SvgNode* node, float vx, float vy, float vw,
                     }
                 }
             }
+            scene->opacity(node->style->opacity);
         }
         return scene;
     }
@@ -384,5 +385,5 @@ unique_ptr<Scene> SvgSceneBuilder::build(SvgNode* node)
 {
     if (!node || (node->type != SvgNodeType::Doc)) return nullptr;
 
-    return _sceneBuildHelper(node, node->node.doc.vx, node->node.doc.vy, node->node.doc.vw, node->node.doc.vh, 255);
+    return _sceneBuildHelper(node, node->node.doc.vx, node->node.doc.vy, node->node.doc.vw, node->node.doc.vh);
 }