svg_loader SvgLoader: Print inefficient elements
authorJunsuChoi <jsuya.choi@samsung.com>
Thu, 17 Dec 2020 04:03:52 +0000 (13:03 +0900)
committerJunsuChoi <jsuya.choi@samsung.com>
Thu, 17 Dec 2020 08:05:34 +0000 (17:05 +0900)
Opacity is 0
both Fill.Opacity and Stroke Opacity are 0
point is 0 in Path
declared display="none"
width or height of bounds becomes 0

Change-Id: I99f49551d7f70d9066493607e3eb5c98fd64c08f

src/loaders/svg/tvgSvgLoader.cpp
src/loaders/svg/tvgSvgLoaderCommon.h
src/loaders/svg/tvgXmlParser.cpp

index 9681181..4b56c44 100644 (file)
@@ -2225,9 +2225,49 @@ static void _styleInherit(SvgStyleProperty* child, SvgStyleProperty* parent)
 }
 
 
+#ifdef THORVG_LOG_ENABLED
+static void _inefficientNodeCheck(SvgNode* node){
+    if (!node->display) printf("SVG: Inefficient elements used [Display is none][Node Type : %s]\n", _nodeTypeToString(node->type).c_str());
+    if (node->style->opacity == 0) printf("SVG: Inefficient elements used [Opacity is zero][Node Type : %s]\n", _nodeTypeToString(node->type).c_str());
+    if (node->style->fill.opacity == 0 && node->style->stroke.opacity == 0) printf("SVG: Inefficient elements used [Fill opacity and stroke opacity are zero][Node Type : %s]\n", _nodeTypeToString(node->type).c_str());
+
+    switch (node->type) {
+        case SvgNodeType::Path: {
+            if (!node->node.path.path || node->node.path.path->empty()) printf("SVG: Inefficient elements used [Empty path][Node Type : %s]\n", _nodeTypeToString(node->type).c_str());
+            break;
+        }
+        case SvgNodeType::Ellipse: {
+            if (node->node.ellipse.rx == 0 && node->node.ellipse.ry == 0) printf("SVG: Inefficient elements used [Size is zero][Node Type : %s]\n", _nodeTypeToString(node->type).c_str());
+            break;
+        }
+        case SvgNodeType::Polygon:
+        case SvgNodeType::Polyline: {
+            if (node->node.polygon.pointsCount < 2) printf("SVG: Inefficient elements used [Invalid Polygon][Node Type : %s]\n", _nodeTypeToString(node->type).c_str());
+            break;
+        }
+        case SvgNodeType::Circle: {
+            if (node->node.circle.r == 0) printf("SVG: Inefficient elements used [Size is zero][Node Type : %s]\n", _nodeTypeToString(node->type).c_str());
+            break;
+        }
+        case SvgNodeType::Rect: {
+            if (node->node.rect.w == 0 && node->node.rect.h) printf("SVG: Inefficient elements used [Size is zero][Node Type : %s]\n", _nodeTypeToString(node->type).c_str());
+            break;
+        }
+        case SvgNodeType::Line: {
+            if (node->node.line.x1 == node->node.line.x2 && node->node.line.y1 == node->node.line.y2) printf("SVG: Inefficient elements used [Size is zero][Node Type : %s]\n", _nodeTypeToString(node->type).c_str());
+            break;
+        }
+        default: break;
+    }
+}
+#endif
+
 static void _updateStyle(SvgNode* node, SvgStyleProperty* parentStyle)
 {
     _styleInherit(node->style, parentStyle);
+#ifdef THORVG_LOG_ENABLED
+    _inefficientNodeCheck(node);
+#endif
 
     auto child = node->child.data;
     for (uint32_t i = 0; i < node->child.count; ++i, ++child) {
index 61d309c..1490fb3 100644 (file)
@@ -347,4 +347,8 @@ struct SvgLoaderData
     bool result = false;
 };
 
+#ifdef THORVG_LOG_ENABLED
+string _nodeTypeToString(SvgNodeType type);
+#endif
+
 #endif
index 4ae053a..b26cd2b 100644 (file)
@@ -35,7 +35,7 @@
 #include "tvgXmlParser.h"
 
 #ifdef THORVG_LOG_ENABLED
-static string nodeTypeToString(SvgNodeType type)
+string _nodeTypeToString(SvgNodeType type)
 {
     switch (type) {
         case SvgNodeType::Doc: return "Doc";
@@ -186,7 +186,7 @@ bool simpleXmlParseAttributes(const char* buf, unsigned bufLength, simpleXMLAttr
         tval[valueEnd - value] = '\0';
 
 #ifdef THORVG_LOG_ENABLED
-        if (!func((void*)data, tmpBuf, tval)) printf("SVG: Unsupported attributes used [Elements type: %s][Attribute: %s]\n", nodeTypeToString(((SvgLoaderData*)data)->svgParse->node->type).c_str(), tmpBuf);
+        if (!func((void*)data, tmpBuf, tval)) printf("SVG: Unsupported attributes used [Elements type: %s][Attribute: %s]\n", _nodeTypeToString(((SvgLoaderData*)data)->svgParse->node->type).c_str(), tmpBuf);
 #else
         func((void*)data, tmpBuf, tval);
 #endif