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;
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))
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;
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;
};
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