From 98b3a182657af1c5f71c00e66c6cc442cdbdd9fb Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 12 Dec 2018 14:59:35 +0900 Subject: [PATCH] lottie/vector: Added a callback version of intersect() api. Change-Id: I54aebc5d2ee5df1421054b5e5d98077e2a9a2299 --- src/vector/vrle.cpp | 20 +++++++++++++++++--- src/vector/vrle.h | 11 ++++++++++- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/vector/vrle.cpp b/src/vector/vrle.cpp index 7668218..9637027 100644 --- a/src/vector/vrle.cpp +++ b/src/vector/vrle.cpp @@ -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 *>(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 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)) diff --git a/src/vector/vrle.h b/src/vector/vrle.h index a5f1d75..16cb237 100644 --- a/src/vector/vrle.h +++ b/src/vector/vrle.h @@ -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 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 -- 2.34.1