summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Derek Sollenberger <djsollen@google.com> 2016-02-17 12:14:50 -0500
committer Derek Sollenberger <djsollen@google.com> 2016-02-17 12:22:20 -0500
commitfd00820ca3db46eafda00b66e73bbfc2d9e37eae (patch)
tree4901549331505eaa2978845d4075b27e9bbbf644
parentf58179a24b4de90d0d1a5601530f7c19a57405f6 (diff)
Update Region parcelling to use SkRegion::Iter
Bug: 26593930 Change-Id: Ie673c776ed7e1c327ca0f3196900fbb229c2a936
-rw-r--r--core/jni/android/graphics/Region.cpp34
1 files changed, 16 insertions, 18 deletions
diff --git a/core/jni/android/graphics/Region.cpp b/core/jni/android/graphics/Region.cpp
index bcd0b60308bb..0c30fdc63905 100644
--- a/core/jni/android/graphics/Region.cpp
+++ b/core/jni/android/graphics/Region.cpp
@@ -212,17 +212,16 @@ static jlong Region_createFromParcel(JNIEnv* env, jobject clazz, jobject parcel)
android::Parcel* p = android::parcelForJavaObject(env, parcel);
- const size_t size = p->readInt32();
- const void* regionData = p->readInplace(size);
- if (regionData == nullptr) {
+ std::vector<int32_t> rects;
+ p->readInt32Vector(&rects);
+
+ if ((rects.size() % 4) != 0) {
return 0;
}
SkRegion* region = new SkRegion;
- size_t actualSize = region->readFromMemory(regionData, size);
- if (size != actualSize) {
- delete region;
- return 0;
+ for (size_t x = 0; x + 4 <= rects.size(); x += 4) {
+ region->op(rects[x], rects[x+1], rects[x+2], rects[x+3], SkRegion::kUnion_Op);
}
return reinterpret_cast<jlong>(region);
@@ -237,19 +236,18 @@ static jboolean Region_writeToParcel(JNIEnv* env, jobject clazz, jlong regionHan
android::Parcel* p = android::parcelForJavaObject(env, parcel);
- const size_t size = region->writeToMemory(nullptr);
- p->writeInt32(size);
- void* dst = p->writeInplace(size);
- if (dst == nullptr) {
- ALOGE("Region.writeToParcel could not write %zi bytes", size);
- return JNI_FALSE;
- }
- const size_t sizeWritten = region->writeToMemory(dst);
- if (sizeWritten != size) {
- ALOGE("SkRegion::writeToMemory should have written %zi bytes but wrote %zi",
- size, sizeWritten);
+ std::vector<int32_t> rects;
+ SkRegion::Iterator it(*region);
+ while (!it.done()) {
+ const SkIRect& r = it.rect();
+ rects.push_back(r.fLeft);
+ rects.push_back(r.fTop);
+ rects.push_back(r.fRight);
+ rects.push_back(r.fBottom);
+ it.next();
}
+ p->writeInt32Vector(rects);
return JNI_TRUE;
}