sw_engine: Draw shapes even though there is no explict closed command. 54/237554/1
authorHermet Park <chuneon.park@samsung.com>
Wed, 1 Jul 2020 07:49:03 +0000 (16:49 +0900)
committerHermet Park <chuneon.park@samsung.com>
Wed, 1 Jul 2020 07:51:53 +0000 (16:51 +0900)
This behavior is not confiremd but it's beneficial for svg spec.

Change-Id: Ia711c057811ae51e472b4e164b36f3dd6af9893f

src/lib/sw_engine/tvgSwCommon.h
src/lib/sw_engine/tvgSwRenderer.cpp
src/lib/sw_engine/tvgSwShape.cpp

index 88686b5..5db4cd7 100644 (file)
@@ -264,7 +264,8 @@ SwFixed mathMean(SwFixed angle1, SwFixed angle2);
 
 void shapeReset(SwShape& shape);
 bool shapeGenOutline(SwShape& shape, const Shape* sdata);
-bool shapeGenRle(SwShape& shape, const Shape* sdata, const SwSize& clip, const Matrix* transform);
+bool shapePrepare(SwShape& shape, const Shape* sdata, const SwSize& clip, const Matrix* transform);
+bool shapeGenRle(SwShape& shape, const Shape* sdata, const SwSize& clip);
 void shapeDelOutline(SwShape& shape);
 void shapeResetStroke(SwShape& shape, const Shape* sdata);
 bool shapeGenStrokeRle(SwShape& shape, const Shape* sdata, const SwSize& clip);
index f6fc88b..b9ce7c0 100644 (file)
@@ -187,8 +187,12 @@ void* SwRenderer::prepare(const Shape& sdata, void* data, const RenderTransform*
             shapeReset(task->shape);
             uint8_t alpha = 0;
             task->sdata->fill(nullptr, nullptr, nullptr, &alpha);
-            if (alpha > 0 || task->sdata->fill() || strokeAlpha > 0) {
-                if (!shapeGenRle(task->shape, task->sdata, task->clip, task->transform)) return;
+            bool renderShape = (alpha > 0 || task->sdata->fill());
+            if (renderShape || strokeAlpha > 0) {
+                if (!shapePrepare(task->shape, task->sdata, task->clip, task->transform)) return;
+                if (renderShape) {
+                    if (!shapeGenRle(task->shape, task->sdata, task->clip)) return;
+                }
             }
         }
         //Fill
index 1c0a09e..dbdfb6a 100644 (file)
@@ -463,25 +463,31 @@ bool _fastTrack(const SwOutline* outline)
 /* External Class Implementation                                        */
 /************************************************************************/
 
-bool shapeGenRle(SwShape& shape, const Shape* sdata, const SwSize& clip, const Matrix* transform)
+bool shapePrepare(SwShape& shape, const Shape* sdata, const SwSize& clip, const Matrix* transform)
 {
     if (!shapeGenOutline(shape, sdata)) return false;
 
     _transformOutline(shape.outline, transform);
 
-    if (!_updateBBox(shape.outline, shape.bbox)) goto end;
+    if (!_updateBBox(shape.outline, shape.bbox)) return false;
 
-    if (!_checkValid(shape.outline, shape.bbox, clip)) goto end;
+    if (!_checkValid(shape.outline, shape.bbox, clip)) return false;
+
+    return true;
+}
 
-    //Case: Fast Track Rectangle Drawing
-    if ((shape.rect = _fastTrack(shape.outline))) return true;
 
+bool shapeGenRle(SwShape& shape, const Shape* sdata, const SwSize& clip)
+{
+    //FIXME: Should we draw it?
     //Case: Stroke Line
-    if (shape.outline->opened) return true;
+    //if (shape.outline->opened) return true;
+
+    //Case A: Fast Track Rectangle Drawing
+    if ((shape.rect = _fastTrack(shape.outline))) return true;
+    //Case B: Normale Shape RLE Drawing
+    if ((shape.rle = rleRender(shape.outline, shape.bbox, clip))) return true;
 
-    shape.rle = rleRender(shape.outline, shape.bbox, clip);
-end:
-    if (shape.rle) return true;
     return false;
 }