common: fix wrong viewport region.
authorHermet Park <chuneon.park@samsung.com>
Fri, 26 Mar 2021 08:24:43 +0000 (17:24 +0900)
committerHermet Park <chuneon.park@samsung.com>
Mon, 29 Mar 2021 02:25:36 +0000 (11:25 +0900)
in the clip rect, viewport must be accumulated to the smaller one.
this patch improves that corner-case.

src/lib/sw_engine/tvgSwShape.cpp
src/lib/tvgPaint.h
src/lib/tvgRender.h

index 4dcb91c..7756e7d 100644 (file)
@@ -401,7 +401,7 @@ bool shapeGenRle(SwShape* shape, TVG_UNUSED const Shape* sdata, bool antiAlias,
     //Case A: Fast Track Rectangle Drawing
     if (!hasComposite && (shape->rect = _fastTrack(shape->outline))) return true;
     //Case B: Normale Shape RLE Drawing
-    if ((shape->rle = rleRender(shape->rle, shape->outline, shape->bbox,antiAlias))) return true;
+    if ((shape->rle = rleRender(shape->rle, shape->outline, shape->bbox, antiAlias))) return true;
 
     return false;
 }
index 7ba2d16..adb7cfe 100644 (file)
@@ -214,6 +214,7 @@ namespace tvg
                     RenderRegion viewport2;
                     if ((cmpFastTrack = _clipPathFastTrack(cmpTarget, pTransform, viewport2))) {
                         viewport = renderer.viewport();
+                        viewport2.merge(viewport);
                         renderer.viewport(viewport2);
                     }
                 }
index 7b06fb7..510420e 100644 (file)
@@ -48,6 +48,19 @@ struct Compositor {
 
 struct RenderRegion {
     uint32_t x, y, w, h;
+
+    void merge(const RenderRegion& rhs)
+    {
+        auto x1 = x + w;
+        auto y1 = y + h;
+        auto x2 = rhs.x + rhs.w;
+        auto y2 = rhs.y + rhs.h;
+
+        x = max(x, rhs.x);
+        y = max(y, rhs.y);
+        w = min(x1, x2) - x;
+        h = min(y1, y2) - y;
+    }
 };
 
 struct RenderTransform