common engines: code refactoring
authorHermet Park <hermetpark@gmail.com>
Tue, 23 Mar 2021 05:18:17 +0000 (14:18 +0900)
committerJunsuChoi <jsuya.choi@samsung.com>
Wed, 24 Mar 2021 05:34:22 +0000 (14:34 +0900)
Introduce RenderRegion structure for region data
to simplify the methods paratemers.

also depends on the NRVO for the return data.

src/lib/gl_engine/tvgGlRenderer.cpp
src/lib/gl_engine/tvgGlRenderer.h
src/lib/sw_engine/tvgSwRenderer.cpp
src/lib/sw_engine/tvgSwRenderer.h
src/lib/tvgPaint.h
src/lib/tvgPictureImpl.h
src/lib/tvgRender.h
src/lib/tvgSceneImpl.h
src/lib/tvgShapeImpl.h

index 9434628468e03d8cb63b752ce1a697ece06644f6..5a0dcc338889ffd0518360724fa5a70abbbb09ee 100644 (file)
@@ -73,9 +73,9 @@ bool GlRenderer::sync()
 }
 
 
-bool GlRenderer::region(TVG_UNUSED RenderData data, TVG_UNUSED uint32_t* x, TVG_UNUSED uint32_t* y, TVG_UNUSED uint32_t* w, TVG_UNUSED uint32_t* h)
+RenderRegion GlRenderer::region(TVG_UNUSED RenderData data)
 {
-    return true;
+    return {0, 0, 0, 0};
 }
 
 
@@ -102,7 +102,7 @@ bool GlRenderer::postRender()
 }
 
 
-Compositor* GlRenderer::target(TVG_UNUSED uint32_t x, TVG_UNUSED uint32_t y, TVG_UNUSED uint32_t w, TVG_UNUSED uint32_t h)
+Compositor* GlRenderer::target(TVG_UNUSED const RenderRegion& region)
 {
     //TODO: Prepare frameBuffer & Setup render target for composition
     return nullptr;
index 7a9823536ba9d8bafe11b983679839928f9d83f8..4a748fe389747f0d7bd191b5c1d6a3a7b51d6e1d 100644 (file)
@@ -37,13 +37,13 @@ public:
     bool renderImage(RenderData data) override;
     bool postRender() override;
     bool dispose(RenderData data) override;;
-    bool region(RenderData data, uint32_t* x, uint32_t* y, uint32_t* w, uint32_t* h) override;
+    RenderRegion region(RenderData data) override;
 
     bool target(uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t h);
     bool sync() override;
     bool clear() override;
 
-    Compositor* target(uint32_t x, uint32_t y, uint32_t w, uint32_t h) override;
+    Compositor* target(const RenderRegion& region) override;
     bool beginComposite(Compositor* cmp, CompositeMethod method, uint32_t opacity) override;
     bool endComposite(Compositor* cmp) override;
 
index 1e0e28c5e3665b5f11be5775de43b4122e84a01a..1bfd8ac050965ba28b16cabf302c48d68ba6f3ba 100644 (file)
@@ -40,16 +40,18 @@ struct SwTask : Task
     uint32_t opacity;
     SwBBox bbox = {{0, 0}, {0, 0}};       //Whole Rendering Region
 
-    void bounds(uint32_t* x, uint32_t* y, uint32_t* w, uint32_t* h) const
+    RenderRegion bounds() const
     {
+        RenderRegion region;
+
         //Range over?
-        auto xx = bbox.min.x > 0 ? bbox.min.x : 0;
-        auto yy = bbox.min.y > 0 ? bbox.min.y : 0;
+        region.x = bbox.min.x > 0 ? bbox.min.x : 0;
+        region.y = bbox.min.y > 0 ? bbox.min.y : 0;
+
+        region.w = bbox.max.x - region.x;
+        region.h = bbox.max.y - region.y;
 
-        if (x) *x = xx;
-        if (y) *y = yy;
-        if (w) *w = bbox.max.x - xx;
-        if (h) *h = bbox.max.y - yy;
+        return region;
     }
 
     virtual bool dispose() = 0;
@@ -313,10 +315,8 @@ bool SwRenderer::renderShape(RenderData data)
 
     //Do Stroking Composition
     if (task->cmpStroking) {
-        uint32_t x, y, w, h;
-        task->bounds(&x, &y, &w, &h);
         opacity = 255;
-        cmp = target(x, y, w, h);
+        cmp = target(task->bounds());
         beginComposite(cmp, CompositeMethod::None, task->opacity);
     //No Stroking Composition
     } else {
@@ -348,11 +348,9 @@ bool SwRenderer::renderShape(RenderData data)
     return true;
 }
 
-bool SwRenderer::region(RenderData data, uint32_t* x, uint32_t* y, uint32_t* w, uint32_t* h)
+RenderRegion SwRenderer::region(RenderData data)
 {
-    static_cast<SwTask*>(data)->bounds(x, y, w, h);
-
-    return true;
+    return static_cast<SwTask*>(data)->bounds();
 }
 
 
@@ -374,8 +372,13 @@ bool SwRenderer::beginComposite(Compositor* cmp, CompositeMethod method, uint32_
 }
 
 
-Compositor* SwRenderer::target(uint32_t x, uint32_t y, uint32_t w, uint32_t h)
+Compositor* SwRenderer::target(const RenderRegion& region)
 {
+    auto x = region.x;
+    auto y = region.y;
+    auto w = region.w;
+    auto h = region.h;
+
     //Out of boundary
     if (x > surface->w || y > surface->h) return nullptr;
 
index 650a2de061268e25f4815ff20601c327d1b05cc0..0e425779f8be86121a54734b2b035c71b1d52168 100644 (file)
@@ -41,13 +41,13 @@ public:
     bool renderImage(RenderData data) override;
     bool postRender() override;
     bool dispose(RenderData data) override;
-    bool region(RenderData data, uint32_t* x, uint32_t* y, uint32_t* w, uint32_t* h) override;
+    RenderRegion region(RenderData data) override;
 
     bool clear() override;
     bool sync() override;
     bool target(uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t h, uint32_t cs);
 
-    Compositor* target(uint32_t x, uint32_t y, uint32_t w, uint32_t h) override;
+    Compositor* target(const RenderRegion& region) override;
     bool beginComposite(Compositor* cmp, CompositeMethod method, uint32_t opacity) override;
     bool endComposite(Compositor* cmp) override;
 
index 3cdbaccf0ed55f776e6b3cb1893cda1e72225ece..8ebe6f7f0fa4019d0c72f7df55c6fd8a542221f0 100644 (file)
@@ -38,7 +38,7 @@ namespace tvg
         virtual void* update(RenderMethod& renderer, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag pFlag) = 0;   //Return engine data if it has.
         virtual bool render(RenderMethod& renderer) = 0;
         virtual bool bounds(float* x, float* y, float* w, float* h) const = 0;
-        virtual bool bounds(RenderMethod& renderer, uint32_t* x, uint32_t* y, uint32_t* w, uint32_t* h) const = 0;
+        virtual RenderRegion bounds(RenderMethod& renderer) const = 0;
         virtual Paint* duplicate() = 0;
     };
 
@@ -129,9 +129,9 @@ namespace tvg
             return smethod->bounds(x, y, w, h);
         }
 
-        bool bounds(RenderMethod& renderer, uint32_t* x, uint32_t* y, uint32_t* w, uint32_t* h) const
+        RenderRegion bounds(RenderMethod& renderer) const
         {
-            return smethod->bounds(renderer, x, y, w, h);
+            return smethod->bounds(renderer);
         }
 
         bool dispose(RenderMethod& renderer)
@@ -182,9 +182,9 @@ namespace tvg
             /* Note: only ClipPath is processed in update() step.
                Create a composition image. */
             if (cmpTarget && cmpMethod != CompositeMethod::ClipPath) {
-                uint32_t x, y, w, h;
-                if (!cmpTarget->pImpl->bounds(renderer, &x, &y, &w, &h)) return false;
-                cmp = renderer.target(x, y, w, h);
+                auto region = cmpTarget->pImpl->bounds(renderer);
+                if (region.w == 0 || region.h == 0) return false;
+                cmp = renderer.target(region);
                 renderer.beginComposite(cmp, CompositeMethod::None, 255);
                 cmpTarget->pImpl->render(renderer);
             }
@@ -244,9 +244,9 @@ namespace tvg
             return inst->bounds(x, y, w, h);
         }
 
-        bool bounds(RenderMethod& renderer, uint32_t* x, uint32_t* y, uint32_t* w, uint32_t* h) const override
+        RenderRegion bounds(RenderMethod& renderer) const override
         {
-            return inst->bounds(renderer, x, y, w, h);
+            return inst->bounds(renderer);
         }
 
         bool dispose(RenderMethod& renderer) override
index 2fc2267279b25cedbcc906ccb227cb27626a6232..b96230bbd6d9df343753809723a7de5d0f7aa192 100644 (file)
@@ -155,11 +155,11 @@ struct Picture::Impl
         return paint->pImpl->bounds(x, y, w, h);
     }
 
-    bool bounds(RenderMethod& renderer, uint32_t* x, uint32_t* y, uint32_t* w, uint32_t* h)
+    RenderRegion bounds(RenderMethod& renderer)
     {
-        if (rdata) return renderer.region(rdata, x, y, w, h);
-        if (paint) return paint->pImpl->bounds(renderer, x, y, w, h);
-        return false;
+        if (rdata) return renderer.region(rdata);
+        if (paint) return paint->pImpl->bounds(renderer);
+        return {0, 0, 0, 0};
     }
 
     Result load(const string& path)
index 25b5733ecfb800fc05d4361aafd09d0b33f19ca9..2d5d5843fa507463215d2b98b771afec8a9aebef 100644 (file)
@@ -28,6 +28,8 @@
 namespace tvg
 {
 
+enum RenderUpdateFlag {None = 0, Path = 1, Color = 2, Gradient = 4, Stroke = 8, Transform = 16, Image = 32, GradientStroke = 64, All = 127};
+
 struct Surface
 {
     //TODO: Union for multiple types
@@ -44,7 +46,9 @@ struct Compositor {
     uint32_t        opacity;
 };
 
-enum RenderUpdateFlag {None = 0, Path = 1, Color = 2, Gradient = 4, Stroke = 8, Transform = 16, Image = 32, GradientStroke = 64, All = 127};
+struct RenderRegion {
+    uint32_t x, y, w, h;
+};
 
 struct RenderTransform
 {
@@ -73,12 +77,12 @@ public:
     virtual bool renderImage(RenderData data) = 0;
     virtual bool postRender() = 0;
     virtual bool dispose(RenderData data) = 0;
-    virtual bool region(RenderData data, uint32_t* x, uint32_t* y, uint32_t* w, uint32_t* h) = 0;
+    virtual RenderRegion region(RenderData data) = 0;
 
     virtual bool clear() = 0;
     virtual bool sync() = 0;
 
-    virtual Compositor* target(uint32_t x, uint32_t y, uint32_t w, uint32_t h) = 0;
+    virtual Compositor* target(const RenderRegion& region) = 0;
     virtual bool beginComposite(Compositor* cmp, CompositeMethod method, uint32_t opacity) = 0;
     virtual bool endComposite(Compositor* cmp) = 0;
 };
index 26269cf13d6117099182477dbcee4ee11d995533..9d29ed2c8deb598e4eab9254ceeecb97d1e63e89 100644 (file)
@@ -76,9 +76,7 @@ struct Scene::Impl
         Compositor* cmp = nullptr;
 
         if (needComposition(opacity)) {
-            uint32_t x, y, w, h;
-            if (!bounds(renderer, &x, &y, &w, &h)) return false;
-            cmp = renderer.target(x, y, w, h);
+            cmp = renderer.target(bounds(renderer));
             renderer.beginComposite(cmp, CompositeMethod::None, opacity);
         }
 
@@ -91,9 +89,9 @@ struct Scene::Impl
         return true;
     }
 
-    bool bounds(RenderMethod& renderer, uint32_t* px, uint32_t* py, uint32_t* pw, uint32_t* ph) const
+    RenderRegion bounds(RenderMethod& renderer) const
     {
-        if (paints.count == 0) return false;
+        if (paints.count == 0) return {0, 0, 0, 0};
 
         uint32_t x1 = UINT32_MAX;
         uint32_t y1 = UINT32_MAX;
@@ -101,26 +99,17 @@ struct Scene::Impl
         uint32_t y2 = 0;
 
         for (auto paint = paints.data; paint < (paints.data + paints.count); ++paint) {
-            uint32_t x = UINT32_MAX;
-            uint32_t y = UINT32_MAX;
-            uint32_t w = 0;
-            uint32_t h = 0;
 
-            if (!(*paint)->pImpl->bounds(renderer, &x, &y, &w, &h)) continue;
+            auto region = (*paint)->pImpl->bounds(renderer);
 
             //Merge regions
-            if (x < x1) x1 = x;
-            if (x2 < x + w) x2 = (x + w);
-            if (y < y1) y1 = y;
-            if (y2 < y + h) y2 = (y + h);
+            if (region.x < x1) x1 = region.x;
+            if (x2 < region.x + region.w) x2 = (region.x + region.w);
+            if (region.y < y1) y1 = region.y;
+            if (y2 < region.y + region.h) y2 = (region.y + region.h);
         }
 
-        if (px) *px = x1;
-        if (py) *py = y1;
-        if (pw) *pw = (x2 - x1);
-        if (ph) *ph = (y2 - y1);
-
-        return true;
+        return {x1, y1, (x2 - x1), (y2 - y1)};
     }
 
     bool bounds(float* px, float* py, float* pw, float* ph) const
index 4bc5f618b2d2fe98d749442cc73d8b0e80a28e93..0aa39fa313b8ed2fe0ed8a5d1a67050b4ea6168e 100644 (file)
@@ -236,9 +236,9 @@ struct Shape::Impl
         return this->rdata;
     }
 
-    bool bounds(RenderMethod& renderer, uint32_t* x, uint32_t* y, uint32_t* w, uint32_t* h)
+    RenderRegion bounds(RenderMethod& renderer)
     {
-        return renderer.region(rdata, x, y, w, h);
+        return renderer.region(rdata);
     }
 
     bool bounds(float* x, float* y, float* w, float* h)