lottie/vector: Added a callback version of intersect() api. 76/195276/1
authorsubhransu mohanty <sub.mohanty@samsung.com>
Wed, 12 Dec 2018 05:59:35 +0000 (14:59 +0900)
committersubhransu mohanty <sub.mohanty@samsung.com>
Wed, 12 Dec 2018 06:12:59 +0000 (15:12 +0900)
Change-Id: I54aebc5d2ee5df1421054b5e5d98077e2a9a2299

src/vector/vrle.cpp
src/vector/vrle.h

index 76682180afaa4934de6d1ebfa5b48c4eb5dc1585..96370270230717269d4bc059ae671e7c1325afa1 100644 (file)
@@ -304,8 +304,15 @@ void VRle::VRleData::opGeneric(const VRle::VRleData &a, const VRle::VRleData &b,
     mBboxDirty = false;
 }
 
-void VRle::VRleData::opIntersect(const VRle::VRleData &obj1,
-                                 const VRle::VRleData &obj2)
+static void  rle_cb(int count, const VRle::Span *spans, void *userData)
+{
+    auto vector = static_cast<std::vector<VRle::Span> *>(userData);
+    copyArrayToVector(spans, count, *vector);
+}
+
+void opIntersectHelper(const VRle::VRleData &obj1,
+                       const VRle::VRleData &obj2,
+                       VRle::VRleSpanCb cb, void *userData)
 {
     VRleHelper                  result, source, clip;
     std::array<VRle::Span, 256> array;
@@ -327,13 +334,20 @@ void VRle::VRleData::opIntersect(const VRle::VRleData &obj1,
     while (source.size) {
         rleIntersectWithRle(&clip, 0, 0, &source, &result);
         if (result.size) {
-            copyArrayToVector(result.spans, result.size, mSpans);
+            cb(result.size, result.spans, userData);
         }
         result.size = 0;
     }
+}
+
+void VRle::VRleData::opIntersect(const VRle::VRleData &obj1,
+                                 const VRle::VRleData &obj2)
+{
+    opIntersectHelper(obj1, obj2, rle_cb, &mSpans);
     updateBbox();
 }
 
+
 #define VMIN(a, b) ((a) < (b) ? (a) : (b))
 #define VMAX(a, b) ((a) > (b) ? (a) : (b))
 
index a5f1d75130df75fba4ceac7d88c02ceca90be126..16cb23746cc5c68fa92ed6b14e2690e55664f896 100644 (file)
@@ -31,6 +31,7 @@ public:
     void operator*=(int alpha);
 
     void intersect(const VRect &r, VRleSpanCb cb, void *userData) const;
+    void intersect(const VRle &rle, VRleSpanCb cb, void *userData) const;
 
     VRle operator&(const VRle &o) const;
     VRle operator-(const VRle &o) const;
@@ -64,7 +65,9 @@ private:
         mutable VRect           mBbox;
         mutable bool            mBboxDirty = true;
     };
-
+    friend void opIntersectHelper(const VRle::VRleData &obj1,
+                                  const VRle::VRleData &obj2,
+                                  VRle::VRleSpanCb cb, void *userData);
     vcow_ptr<VRleData> d;
 };
 
@@ -156,6 +159,12 @@ inline void VRle::intersect(const VRect &r, VRleSpanCb cb, void *userData) const
     d->opIntersect(r, cb, userData);
 }
 
+inline void VRle::intersect(const VRle &r, VRleSpanCb cb, void *userData) const
+{
+    if (empty() || r.empty()) return;
+    opIntersectHelper(d.read(), r.d.read(), cb, userData);
+}
+
 V_END_NAMESPACE
 
 #endif  // VRLE_H