blob: 2bffaf01fb741675d39e9b26018d98dbcc4d9269 [file] [log] [blame]
Jeff Brownfbf09772011-01-16 14:06:57 -08001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080017#include "SkRegion.h"
18#include "SkPath.h"
19#include "GraphicsJNI.h"
20
Jeff Brownfbf09772011-01-16 14:06:57 -080021#include <binder/Parcel.h>
Jeff Sharkeyd84e1ce2012-03-06 18:26:19 -080022#include "android_os_Parcel.h"
Jeff Brownfbf09772011-01-16 14:06:57 -080023#include "android_util_Binder.h"
24
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080025#include <jni.h>
Andreas Gampeed6b9df2014-11-20 22:02:20 -080026#include <core_jni_helpers.h>
Jeff Brownfbf09772011-01-16 14:06:57 -080027
28namespace android {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080029
30static jfieldID gRegion_nativeInstanceFieldID;
31
Ashok Bhata0398432014-01-20 20:08:01 +000032static inline jboolean boolTojboolean(bool value) {
33 return value ? JNI_TRUE : JNI_FALSE;
34}
35
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080036static inline SkRegion* GetSkRegion(JNIEnv* env, jobject regionObject) {
Ashok Bhata0398432014-01-20 20:08:01 +000037 jlong regionHandle = env->GetLongField(regionObject, gRegion_nativeInstanceFieldID);
38 SkRegion* region = reinterpret_cast<SkRegion*>(regionHandle);
39 SkASSERT(region != NULL);
40 return region;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080041}
42
Ashok Bhata0398432014-01-20 20:08:01 +000043static jlong Region_constructor(JNIEnv* env, jobject) {
44 return reinterpret_cast<jlong>(new SkRegion);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080045}
46
Ashok Bhata0398432014-01-20 20:08:01 +000047static void Region_destructor(JNIEnv* env, jobject, jlong regionHandle) {
48 SkRegion* region = reinterpret_cast<SkRegion*>(regionHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080049 SkASSERT(region);
50 delete region;
51}
52
Ashok Bhata0398432014-01-20 20:08:01 +000053static void Region_setRegion(JNIEnv* env, jobject, jlong dstHandle, jlong srcHandle) {
54 SkRegion* dst = reinterpret_cast<SkRegion*>(dstHandle);
55 const SkRegion* src = reinterpret_cast<SkRegion*>(srcHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080056 SkASSERT(dst && src);
57 *dst = *src;
58}
59
Ashok Bhata0398432014-01-20 20:08:01 +000060static jboolean Region_setRect(JNIEnv* env, jobject, jlong dstHandle, jint left, jint top, jint right, jint bottom) {
61 SkRegion* dst = reinterpret_cast<SkRegion*>(dstHandle);
62 bool result = dst->setRect(left, top, right, bottom);
63 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080064}
65
Ashok Bhata0398432014-01-20 20:08:01 +000066static jboolean Region_setPath(JNIEnv* env, jobject, jlong dstHandle,
67 jlong pathHandle, jlong clipHandle) {
68 SkRegion* dst = reinterpret_cast<SkRegion*>(dstHandle);
69 const SkPath* path = reinterpret_cast<SkPath*>(pathHandle);
70 const SkRegion* clip = reinterpret_cast<SkRegion*>(clipHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080071 SkASSERT(dst && path && clip);
Ashok Bhata0398432014-01-20 20:08:01 +000072 bool result = dst->setPath(*path, *clip);
73 return boolTojboolean(result);
74
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080075}
76
Ashok Bhata0398432014-01-20 20:08:01 +000077static jboolean Region_getBounds(JNIEnv* env, jobject, jlong regionHandle, jobject rectBounds) {
78 SkRegion* region = reinterpret_cast<SkRegion*>(regionHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080079 GraphicsJNI::irect_to_jrect(region->getBounds(), env, rectBounds);
Ashok Bhata0398432014-01-20 20:08:01 +000080 bool result = !region->isEmpty();
81 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080082}
83
Ashok Bhata0398432014-01-20 20:08:01 +000084static jboolean Region_getBoundaryPath(JNIEnv* env, jobject, jlong regionHandle, jlong pathHandle) {
85 const SkRegion* region = reinterpret_cast<SkRegion*>(regionHandle);
86 SkPath* path = reinterpret_cast<SkPath*>(pathHandle);
87 bool result = region->getBoundaryPath(path);
88 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080089}
90
Ashok Bhata0398432014-01-20 20:08:01 +000091static jboolean Region_op0(JNIEnv* env, jobject, jlong dstHandle, jint left, jint top, jint right, jint bottom, jint op) {
92 SkRegion* dst = reinterpret_cast<SkRegion*>(dstHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080093 SkIRect ir;
Elliott Hughes4cb17532011-04-12 16:10:26 -070094
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080095 ir.set(left, top, right, bottom);
Ashok Bhata0398432014-01-20 20:08:01 +000096 bool result = dst->op(ir, (SkRegion::Op)op);
97 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080098}
99
Ashok Bhata0398432014-01-20 20:08:01 +0000100static jboolean Region_op1(JNIEnv* env, jobject, jlong dstHandle, jobject rectObject, jlong regionHandle, jint op) {
101 SkRegion* dst = reinterpret_cast<SkRegion*>(dstHandle);
102 const SkRegion* region = reinterpret_cast<SkRegion*>(regionHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800103 SkIRect ir;
104 GraphicsJNI::jrect_to_irect(env, rectObject, &ir);
Ashok Bhata0398432014-01-20 20:08:01 +0000105 bool result = dst->op(ir, *region, (SkRegion::Op)op);
106 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800107}
108
Ashok Bhata0398432014-01-20 20:08:01 +0000109static jboolean Region_op2(JNIEnv* env, jobject, jlong dstHandle, jlong region1Handle, jlong region2Handle, jint op) {
110 SkRegion* dst = reinterpret_cast<SkRegion*>(dstHandle);
111 const SkRegion* region1 = reinterpret_cast<SkRegion*>(region1Handle);
112 const SkRegion* region2 = reinterpret_cast<SkRegion*>(region2Handle);
113 bool result = dst->op(*region1, *region2, (SkRegion::Op)op);
114 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800115}
116
Elliott Hughes4cb17532011-04-12 16:10:26 -0700117//////////////////////////////////// These are methods, not static
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800118
119static jboolean Region_isEmpty(JNIEnv* env, jobject region) {
Ashok Bhata0398432014-01-20 20:08:01 +0000120 bool result = GetSkRegion(env, region)->isEmpty();
121 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800122}
Elliott Hughes4cb17532011-04-12 16:10:26 -0700123
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800124static jboolean Region_isRect(JNIEnv* env, jobject region) {
Ashok Bhata0398432014-01-20 20:08:01 +0000125 bool result = GetSkRegion(env, region)->isRect();
126 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800127}
Elliott Hughes4cb17532011-04-12 16:10:26 -0700128
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800129static jboolean Region_isComplex(JNIEnv* env, jobject region) {
Ashok Bhata0398432014-01-20 20:08:01 +0000130 bool result = GetSkRegion(env, region)->isComplex();
131 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800132}
133
Ashok Bhata0398432014-01-20 20:08:01 +0000134static jboolean Region_contains(JNIEnv* env, jobject region, jint x, jint y) {
135 bool result = GetSkRegion(env, region)->contains(x, y);
136 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800137}
Elliott Hughes4cb17532011-04-12 16:10:26 -0700138
Ashok Bhata0398432014-01-20 20:08:01 +0000139static jboolean Region_quickContains(JNIEnv* env, jobject region, jint left, jint top, jint right, jint bottom) {
140 bool result = GetSkRegion(env, region)->quickContains(left, top, right, bottom);
141 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800142}
Elliott Hughes4cb17532011-04-12 16:10:26 -0700143
Ashok Bhata0398432014-01-20 20:08:01 +0000144static jboolean Region_quickRejectIIII(JNIEnv* env, jobject region, jint left, jint top, jint right, jint bottom) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800145 SkIRect ir;
146 ir.set(left, top, right, bottom);
Ashok Bhata0398432014-01-20 20:08:01 +0000147 bool result = GetSkRegion(env, region)->quickReject(ir);
148 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800149}
Elliott Hughes4cb17532011-04-12 16:10:26 -0700150
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800151static jboolean Region_quickRejectRgn(JNIEnv* env, jobject region, jobject other) {
Ashok Bhata0398432014-01-20 20:08:01 +0000152 bool result = GetSkRegion(env, region)->quickReject(*GetSkRegion(env, other));
153 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800154}
Elliott Hughes4cb17532011-04-12 16:10:26 -0700155
Ashok Bhata0398432014-01-20 20:08:01 +0000156static void Region_translate(JNIEnv* env, jobject region, jint x, jint y, jobject dst) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800157 SkRegion* rgn = GetSkRegion(env, region);
158 if (dst)
159 rgn->translate(x, y, GetSkRegion(env, dst));
160 else
161 rgn->translate(x, y);
162}
163
Mitsuru Oshimab10f1382009-05-11 17:11:37 -0700164// Scale the rectangle by given scale and set the reuslt to the dst.
165static void scale_rect(SkIRect* dst, const SkIRect& src, float scale) {
166 dst->fLeft = (int)::roundf(src.fLeft * scale);
167 dst->fTop = (int)::roundf(src.fTop * scale);
168 dst->fRight = (int)::roundf(src.fRight * scale);
169 dst->fBottom = (int)::roundf(src.fBottom * scale);
170}
171
172// Scale the region by given scale and set the reuslt to the dst.
173// dest and src can be the same region instance.
174static void scale_rgn(SkRegion* dst, const SkRegion& src, float scale) {
175 SkRegion tmp;
176 SkRegion::Iterator iter(src);
177
178 for (; !iter.done(); iter.next()) {
179 SkIRect r;
180 scale_rect(&r, iter.rect(), scale);
181 tmp.op(r, SkRegion::kUnion_Op);
182 }
183 dst->swap(tmp);
184}
185
186static void Region_scale(JNIEnv* env, jobject region, jfloat scale, jobject dst) {
187 SkRegion* rgn = GetSkRegion(env, region);
188 if (dst)
189 scale_rgn(GetSkRegion(env, dst), *rgn, scale);
190 else
191 scale_rgn(rgn, *rgn, scale);
192}
193
Ashok Bhata0398432014-01-20 20:08:01 +0000194static jstring Region_toString(JNIEnv* env, jobject clazz, jlong regionHandle) {
195 SkRegion* region = reinterpret_cast<SkRegion*>(regionHandle);
Joe Onorato120856c2011-01-19 14:52:08 -0800196 char* str = region->toString();
197 if (str == NULL) {
198 return NULL;
199 }
200 jstring result = env->NewStringUTF(str);
201 free(str);
202 return result;
203}
204
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800205////////////////////////////////////////////////////////////////////////////////////////////////////////////
206
Ashok Bhata0398432014-01-20 20:08:01 +0000207static jlong Region_createFromParcel(JNIEnv* env, jobject clazz, jobject parcel)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800208{
Derek Sollenberger3082fe42015-05-13 15:45:04 -0400209 if (parcel == nullptr) {
210 return 0;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800211 }
Elliott Hughes4cb17532011-04-12 16:10:26 -0700212
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800213 android::Parcel* p = android::parcelForJavaObject(env, parcel);
Elliott Hughes4cb17532011-04-12 16:10:26 -0700214
Derek Sollenbergerfd008202016-02-17 12:14:50 -0500215 std::vector<int32_t> rects;
216 p->readInt32Vector(&rects);
217
218 if ((rects.size() % 4) != 0) {
Derek Sollenbergercdadfc22015-05-18 14:29:02 -0400219 return 0;
220 }
Derek Sollenberger3082fe42015-05-13 15:45:04 -0400221
Derek Sollenbergercdadfc22015-05-18 14:29:02 -0400222 SkRegion* region = new SkRegion;
Derek Sollenbergerfd008202016-02-17 12:14:50 -0500223 for (size_t x = 0; x + 4 <= rects.size(); x += 4) {
224 region->op(rects[x], rects[x+1], rects[x+2], rects[x+3], SkRegion::kUnion_Op);
Derek Sollenberger3082fe42015-05-13 15:45:04 -0400225 }
Elliott Hughes4cb17532011-04-12 16:10:26 -0700226
Ashok Bhata0398432014-01-20 20:08:01 +0000227 return reinterpret_cast<jlong>(region);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800228}
229
Ashok Bhata0398432014-01-20 20:08:01 +0000230static jboolean Region_writeToParcel(JNIEnv* env, jobject clazz, jlong regionHandle, jobject parcel)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800231{
Ashok Bhata0398432014-01-20 20:08:01 +0000232 const SkRegion* region = reinterpret_cast<SkRegion*>(regionHandle);
Leon Scroggins III2a6d6e52015-06-17 11:56:43 -0400233 if (parcel == nullptr) {
Ashok Bhata0398432014-01-20 20:08:01 +0000234 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800235 }
Elliott Hughes4cb17532011-04-12 16:10:26 -0700236
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800237 android::Parcel* p = android::parcelForJavaObject(env, parcel);
238
Derek Sollenbergerfd008202016-02-17 12:14:50 -0500239 std::vector<int32_t> rects;
240 SkRegion::Iterator it(*region);
241 while (!it.done()) {
242 const SkIRect& r = it.rect();
243 rects.push_back(r.fLeft);
244 rects.push_back(r.fTop);
245 rects.push_back(r.fRight);
246 rects.push_back(r.fBottom);
247 it.next();
Leon Scroggins III2a6d6e52015-06-17 11:56:43 -0400248 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800249
Derek Sollenbergerfd008202016-02-17 12:14:50 -0500250 p->writeInt32Vector(rects);
Ashok Bhata0398432014-01-20 20:08:01 +0000251 return JNI_TRUE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800252}
253
254////////////////////////////////////////////////////////////////////////////////////////////////////////////
255
Ashok Bhata0398432014-01-20 20:08:01 +0000256static jboolean Region_equals(JNIEnv* env, jobject clazz, jlong r1Handle, jlong r2Handle)
Mitsuru Oshimab10f1382009-05-11 17:11:37 -0700257{
Ashok Bhata0398432014-01-20 20:08:01 +0000258 const SkRegion *r1 = reinterpret_cast<SkRegion*>(r1Handle);
259 const SkRegion *r2 = reinterpret_cast<SkRegion*>(r2Handle);
260 return boolTojboolean(*r1 == *r2);
Mitsuru Oshimab10f1382009-05-11 17:11:37 -0700261}
262
263////////////////////////////////////////////////////////////////////////////////////////////////////////////
264
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800265struct RgnIterPair {
266 SkRegion fRgn; // a copy of the caller's region
267 SkRegion::Iterator fIter; // an iterator acting upon the copy (fRgn)
Elliott Hughes4cb17532011-04-12 16:10:26 -0700268
Chih-Hung Hsiehc6baf562016-04-27 11:29:23 -0700269 explicit RgnIterPair(const SkRegion& rgn) : fRgn(rgn) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800270 // have our iterator reference our copy (fRgn), so we know it will be
271 // unchanged for the lifetime of the iterator
272 fIter.reset(fRgn);
273 }
274};
275
Ashok Bhata0398432014-01-20 20:08:01 +0000276static jlong RegionIter_constructor(JNIEnv* env, jobject, jlong regionHandle)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800277{
Ashok Bhata0398432014-01-20 20:08:01 +0000278 const SkRegion* region = reinterpret_cast<SkRegion*>(regionHandle);
Elliott Hughes4cb17532011-04-12 16:10:26 -0700279 SkASSERT(region);
Ashok Bhata0398432014-01-20 20:08:01 +0000280 return reinterpret_cast<jlong>(new RgnIterPair(*region));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800281}
282
Ashok Bhata0398432014-01-20 20:08:01 +0000283static void RegionIter_destructor(JNIEnv* env, jobject, jlong pairHandle)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800284{
Ashok Bhata0398432014-01-20 20:08:01 +0000285 RgnIterPair* pair = reinterpret_cast<RgnIterPair*>(pairHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800286 SkASSERT(pair);
287 delete pair;
288}
289
Ashok Bhata0398432014-01-20 20:08:01 +0000290static jboolean RegionIter_next(JNIEnv* env, jobject, jlong pairHandle, jobject rectObject)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800291{
Ashok Bhata0398432014-01-20 20:08:01 +0000292 RgnIterPair* pair = reinterpret_cast<RgnIterPair*>(pairHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800293 // the caller has checked that rectObject is not nul
294 SkASSERT(pair);
295 SkASSERT(rectObject);
296
297 if (!pair->fIter.done()) {
298 GraphicsJNI::irect_to_jrect(pair->fIter.rect(), env, rectObject);
299 pair->fIter.next();
Ashok Bhata0398432014-01-20 20:08:01 +0000300 return JNI_TRUE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800301 }
Ashok Bhata0398432014-01-20 20:08:01 +0000302 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800303}
304
305////////////////////////////////////////////////////////////////////////////////////////////////////////////
306
Daniel Micay76f6a862015-09-19 17:31:01 -0400307static const JNINativeMethod gRegionIterMethods[] = {
Ashok Bhata0398432014-01-20 20:08:01 +0000308 { "nativeConstructor", "(J)J", (void*)RegionIter_constructor },
309 { "nativeDestructor", "(J)V", (void*)RegionIter_destructor },
310 { "nativeNext", "(JLandroid/graphics/Rect;)Z", (void*)RegionIter_next }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800311};
312
Daniel Micay76f6a862015-09-19 17:31:01 -0400313static const JNINativeMethod gRegionMethods[] = {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800314 // these are static methods
Ashok Bhata0398432014-01-20 20:08:01 +0000315 { "nativeConstructor", "()J", (void*)Region_constructor },
316 { "nativeDestructor", "(J)V", (void*)Region_destructor },
317 { "nativeSetRegion", "(JJ)V", (void*)Region_setRegion },
318 { "nativeSetRect", "(JIIII)Z", (void*)Region_setRect },
319 { "nativeSetPath", "(JJJ)Z", (void*)Region_setPath },
320 { "nativeGetBounds", "(JLandroid/graphics/Rect;)Z", (void*)Region_getBounds },
321 { "nativeGetBoundaryPath", "(JJ)Z", (void*)Region_getBoundaryPath },
322 { "nativeOp", "(JIIIII)Z", (void*)Region_op0 },
323 { "nativeOp", "(JLandroid/graphics/Rect;JI)Z", (void*)Region_op1 },
324 { "nativeOp", "(JJJI)Z", (void*)Region_op2 },
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800325 // these are methods that take the java region object
326 { "isEmpty", "()Z", (void*)Region_isEmpty },
327 { "isRect", "()Z", (void*)Region_isRect },
328 { "isComplex", "()Z", (void*)Region_isComplex },
329 { "contains", "(II)Z", (void*)Region_contains },
330 { "quickContains", "(IIII)Z", (void*)Region_quickContains },
331 { "quickReject", "(IIII)Z", (void*)Region_quickRejectIIII },
332 { "quickReject", "(Landroid/graphics/Region;)Z", (void*)Region_quickRejectRgn },
Mitsuru Oshimab10f1382009-05-11 17:11:37 -0700333 { "scale", "(FLandroid/graphics/Region;)V", (void*)Region_scale },
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800334 { "translate", "(IILandroid/graphics/Region;)V", (void*)Region_translate },
Ashok Bhata0398432014-01-20 20:08:01 +0000335 { "nativeToString", "(J)Ljava/lang/String;", (void*)Region_toString },
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800336 // parceling methods
Ashok Bhata0398432014-01-20 20:08:01 +0000337 { "nativeCreateFromParcel", "(Landroid/os/Parcel;)J", (void*)Region_createFromParcel },
338 { "nativeWriteToParcel", "(JLandroid/os/Parcel;)Z", (void*)Region_writeToParcel },
339 { "nativeEquals", "(JJ)Z", (void*)Region_equals },
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800340};
341
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800342int register_android_graphics_Region(JNIEnv* env)
343{
Andreas Gampeed6b9df2014-11-20 22:02:20 -0800344 jclass clazz = FindClassOrDie(env, "android/graphics/Region");
Elliott Hughes4cb17532011-04-12 16:10:26 -0700345
Andreas Gampeed6b9df2014-11-20 22:02:20 -0800346 gRegion_nativeInstanceFieldID = GetFieldIDOrDie(env, clazz, "mNativeRegion", "J");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800347
Andreas Gampeed6b9df2014-11-20 22:02:20 -0800348 RegisterMethodsOrDie(env, "android/graphics/Region", gRegionMethods, NELEM(gRegionMethods));
349 return RegisterMethodsOrDie(env, "android/graphics/RegionIterator", gRegionIterMethods,
350 NELEM(gRegionIterMethods));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800351}
Jeff Brownfbf09772011-01-16 14:06:57 -0800352
353SkRegion* android_graphics_Region_getSkRegion(JNIEnv* env, jobject regionObj) {
354 return GetSkRegion(env, regionObj);
355}
356
357} // namespace android