blob: 1e064b8205916c2d58726969354a82d04fe2e388 [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
Jerome Gaillard21e7e2d2019-05-14 14:34:46 +010021#ifdef __ANDROID__ // Layoutlib does not support parcel
Derek Sollenberger15da7e22020-02-14 14:16:34 -050022#include <android/binder_parcel.h>
23#include <android/binder_parcel_jni.h>
24#include <android/binder_parcel_utils.h>
Jerome Gaillard21e7e2d2019-05-14 14:34:46 +010025#endif
Jeff Brownfbf09772011-01-16 14:06:57 -080026
Jeff Brownfbf09772011-01-16 14:06:57 -080027namespace android {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080028
29static jfieldID gRegion_nativeInstanceFieldID;
30
Ashok Bhata0398432014-01-20 20:08:01 +000031static inline jboolean boolTojboolean(bool value) {
32 return value ? JNI_TRUE : JNI_FALSE;
33}
34
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080035static inline SkRegion* GetSkRegion(JNIEnv* env, jobject regionObject) {
Ashok Bhata0398432014-01-20 20:08:01 +000036 jlong regionHandle = env->GetLongField(regionObject, gRegion_nativeInstanceFieldID);
37 SkRegion* region = reinterpret_cast<SkRegion*>(regionHandle);
38 SkASSERT(region != NULL);
39 return region;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080040}
41
Ashok Bhata0398432014-01-20 20:08:01 +000042static jlong Region_constructor(JNIEnv* env, jobject) {
43 return reinterpret_cast<jlong>(new SkRegion);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080044}
45
Ashok Bhata0398432014-01-20 20:08:01 +000046static void Region_destructor(JNIEnv* env, jobject, jlong regionHandle) {
47 SkRegion* region = reinterpret_cast<SkRegion*>(regionHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080048 SkASSERT(region);
49 delete region;
50}
51
Ashok Bhata0398432014-01-20 20:08:01 +000052static void Region_setRegion(JNIEnv* env, jobject, jlong dstHandle, jlong srcHandle) {
53 SkRegion* dst = reinterpret_cast<SkRegion*>(dstHandle);
54 const SkRegion* src = reinterpret_cast<SkRegion*>(srcHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080055 SkASSERT(dst && src);
56 *dst = *src;
57}
58
Ashok Bhata0398432014-01-20 20:08:01 +000059static jboolean Region_setRect(JNIEnv* env, jobject, jlong dstHandle, jint left, jint top, jint right, jint bottom) {
60 SkRegion* dst = reinterpret_cast<SkRegion*>(dstHandle);
Mike Reed39adc882019-08-22 11:53:05 -040061 bool result = dst->setRect({left, top, right, bottom});
Ashok Bhata0398432014-01-20 20:08:01 +000062 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080063}
64
Ashok Bhata0398432014-01-20 20:08:01 +000065static jboolean Region_setPath(JNIEnv* env, jobject, jlong dstHandle,
66 jlong pathHandle, jlong clipHandle) {
67 SkRegion* dst = reinterpret_cast<SkRegion*>(dstHandle);
68 const SkPath* path = reinterpret_cast<SkPath*>(pathHandle);
69 const SkRegion* clip = reinterpret_cast<SkRegion*>(clipHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080070 SkASSERT(dst && path && clip);
Ashok Bhata0398432014-01-20 20:08:01 +000071 bool result = dst->setPath(*path, *clip);
72 return boolTojboolean(result);
73
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080074}
75
Ashok Bhata0398432014-01-20 20:08:01 +000076static jboolean Region_getBounds(JNIEnv* env, jobject, jlong regionHandle, jobject rectBounds) {
77 SkRegion* region = reinterpret_cast<SkRegion*>(regionHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080078 GraphicsJNI::irect_to_jrect(region->getBounds(), env, rectBounds);
Ashok Bhata0398432014-01-20 20:08:01 +000079 bool result = !region->isEmpty();
80 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080081}
82
Ashok Bhata0398432014-01-20 20:08:01 +000083static jboolean Region_getBoundaryPath(JNIEnv* env, jobject, jlong regionHandle, jlong pathHandle) {
84 const SkRegion* region = reinterpret_cast<SkRegion*>(regionHandle);
85 SkPath* path = reinterpret_cast<SkPath*>(pathHandle);
86 bool result = region->getBoundaryPath(path);
87 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080088}
89
Ashok Bhata0398432014-01-20 20:08:01 +000090static jboolean Region_op0(JNIEnv* env, jobject, jlong dstHandle, jint left, jint top, jint right, jint bottom, jint op) {
91 SkRegion* dst = reinterpret_cast<SkRegion*>(dstHandle);
Mike Reed39adc882019-08-22 11:53:05 -040092 bool result = dst->op({left, top, right, bottom}, (SkRegion::Op)op);
Ashok Bhata0398432014-01-20 20:08:01 +000093 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080094}
95
Ashok Bhata0398432014-01-20 20:08:01 +000096static jboolean Region_op1(JNIEnv* env, jobject, jlong dstHandle, jobject rectObject, jlong regionHandle, jint op) {
97 SkRegion* dst = reinterpret_cast<SkRegion*>(dstHandle);
98 const SkRegion* region = reinterpret_cast<SkRegion*>(regionHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080099 SkIRect ir;
100 GraphicsJNI::jrect_to_irect(env, rectObject, &ir);
Ashok Bhata0398432014-01-20 20:08:01 +0000101 bool result = dst->op(ir, *region, (SkRegion::Op)op);
102 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800103}
104
Ashok Bhata0398432014-01-20 20:08:01 +0000105static jboolean Region_op2(JNIEnv* env, jobject, jlong dstHandle, jlong region1Handle, jlong region2Handle, jint op) {
106 SkRegion* dst = reinterpret_cast<SkRegion*>(dstHandle);
107 const SkRegion* region1 = reinterpret_cast<SkRegion*>(region1Handle);
108 const SkRegion* region2 = reinterpret_cast<SkRegion*>(region2Handle);
109 bool result = dst->op(*region1, *region2, (SkRegion::Op)op);
110 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800111}
112
Elliott Hughes4cb17532011-04-12 16:10:26 -0700113//////////////////////////////////// These are methods, not static
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800114
115static jboolean Region_isEmpty(JNIEnv* env, jobject region) {
Ashok Bhata0398432014-01-20 20:08:01 +0000116 bool result = GetSkRegion(env, region)->isEmpty();
117 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800118}
Elliott Hughes4cb17532011-04-12 16:10:26 -0700119
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800120static jboolean Region_isRect(JNIEnv* env, jobject region) {
Ashok Bhata0398432014-01-20 20:08:01 +0000121 bool result = GetSkRegion(env, region)->isRect();
122 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800123}
Elliott Hughes4cb17532011-04-12 16:10:26 -0700124
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800125static jboolean Region_isComplex(JNIEnv* env, jobject region) {
Ashok Bhata0398432014-01-20 20:08:01 +0000126 bool result = GetSkRegion(env, region)->isComplex();
127 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800128}
129
Ashok Bhata0398432014-01-20 20:08:01 +0000130static jboolean Region_contains(JNIEnv* env, jobject region, jint x, jint y) {
131 bool result = GetSkRegion(env, region)->contains(x, y);
132 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800133}
Elliott Hughes4cb17532011-04-12 16:10:26 -0700134
Ashok Bhata0398432014-01-20 20:08:01 +0000135static jboolean Region_quickContains(JNIEnv* env, jobject region, jint left, jint top, jint right, jint bottom) {
Mike Reed39adc882019-08-22 11:53:05 -0400136 bool result = GetSkRegion(env, region)->quickContains({left, top, right, bottom});
Ashok Bhata0398432014-01-20 20:08:01 +0000137 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800138}
Elliott Hughes4cb17532011-04-12 16:10:26 -0700139
Ashok Bhata0398432014-01-20 20:08:01 +0000140static 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 -0800141 SkIRect ir;
Mike Reed39adc882019-08-22 11:53:05 -0400142 ir.setLTRB(left, top, right, bottom);
Ashok Bhata0398432014-01-20 20:08:01 +0000143 bool result = GetSkRegion(env, region)->quickReject(ir);
144 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800145}
Elliott Hughes4cb17532011-04-12 16:10:26 -0700146
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800147static jboolean Region_quickRejectRgn(JNIEnv* env, jobject region, jobject other) {
Ashok Bhata0398432014-01-20 20:08:01 +0000148 bool result = GetSkRegion(env, region)->quickReject(*GetSkRegion(env, other));
149 return boolTojboolean(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800150}
Elliott Hughes4cb17532011-04-12 16:10:26 -0700151
Ashok Bhata0398432014-01-20 20:08:01 +0000152static void Region_translate(JNIEnv* env, jobject region, jint x, jint y, jobject dst) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800153 SkRegion* rgn = GetSkRegion(env, region);
154 if (dst)
155 rgn->translate(x, y, GetSkRegion(env, dst));
156 else
157 rgn->translate(x, y);
158}
159
Mitsuru Oshimab10f1382009-05-11 17:11:37 -0700160// Scale the rectangle by given scale and set the reuslt to the dst.
161static void scale_rect(SkIRect* dst, const SkIRect& src, float scale) {
162 dst->fLeft = (int)::roundf(src.fLeft * scale);
163 dst->fTop = (int)::roundf(src.fTop * scale);
164 dst->fRight = (int)::roundf(src.fRight * scale);
165 dst->fBottom = (int)::roundf(src.fBottom * scale);
166}
167
168// Scale the region by given scale and set the reuslt to the dst.
169// dest and src can be the same region instance.
170static void scale_rgn(SkRegion* dst, const SkRegion& src, float scale) {
171 SkRegion tmp;
172 SkRegion::Iterator iter(src);
173
174 for (; !iter.done(); iter.next()) {
175 SkIRect r;
176 scale_rect(&r, iter.rect(), scale);
177 tmp.op(r, SkRegion::kUnion_Op);
178 }
179 dst->swap(tmp);
180}
181
182static void Region_scale(JNIEnv* env, jobject region, jfloat scale, jobject dst) {
183 SkRegion* rgn = GetSkRegion(env, region);
184 if (dst)
185 scale_rgn(GetSkRegion(env, dst), *rgn, scale);
186 else
187 scale_rgn(rgn, *rgn, scale);
188}
189
Ashok Bhata0398432014-01-20 20:08:01 +0000190static jstring Region_toString(JNIEnv* env, jobject clazz, jlong regionHandle) {
191 SkRegion* region = reinterpret_cast<SkRegion*>(regionHandle);
Joe Onorato120856c2011-01-19 14:52:08 -0800192 char* str = region->toString();
193 if (str == NULL) {
194 return NULL;
195 }
196 jstring result = env->NewStringUTF(str);
197 free(str);
198 return result;
199}
200
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800201////////////////////////////////////////////////////////////////////////////////////////////////////////////
202
Ashok Bhata0398432014-01-20 20:08:01 +0000203static jlong Region_createFromParcel(JNIEnv* env, jobject clazz, jobject parcel)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800204{
Jerome Gaillard21e7e2d2019-05-14 14:34:46 +0100205#ifdef __ANDROID__ // Layoutlib does not support parcel
Derek Sollenberger3082fe42015-05-13 15:45:04 -0400206 if (parcel == nullptr) {
207 return 0;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800208 }
Elliott Hughes4cb17532011-04-12 16:10:26 -0700209
Derek Sollenbergerfd008202016-02-17 12:14:50 -0500210 std::vector<int32_t> rects;
Derek Sollenberger15da7e22020-02-14 14:16:34 -0500211
212 AParcel* p = AParcel_fromJavaParcel(env, parcel);
213 ndk::AParcel_readVector(p, &rects);
214 AParcel_delete(p);
Derek Sollenbergerfd008202016-02-17 12:14:50 -0500215
216 if ((rects.size() % 4) != 0) {
Derek Sollenbergercdadfc22015-05-18 14:29:02 -0400217 return 0;
218 }
Derek Sollenberger3082fe42015-05-13 15:45:04 -0400219
Derek Sollenbergercdadfc22015-05-18 14:29:02 -0400220 SkRegion* region = new SkRegion;
Derek Sollenbergerfd008202016-02-17 12:14:50 -0500221 for (size_t x = 0; x + 4 <= rects.size(); x += 4) {
Mike Reed39adc882019-08-22 11:53:05 -0400222 region->op({rects[x], rects[x+1], rects[x+2], rects[x+3]}, SkRegion::kUnion_Op);
Derek Sollenberger3082fe42015-05-13 15:45:04 -0400223 }
Elliott Hughes4cb17532011-04-12 16:10:26 -0700224
Ashok Bhata0398432014-01-20 20:08:01 +0000225 return reinterpret_cast<jlong>(region);
Jerome Gaillard21e7e2d2019-05-14 14:34:46 +0100226#else
227 return 0;
228#endif
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800229}
230
Ashok Bhata0398432014-01-20 20:08:01 +0000231static jboolean Region_writeToParcel(JNIEnv* env, jobject clazz, jlong regionHandle, jobject parcel)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800232{
Jerome Gaillard21e7e2d2019-05-14 14:34:46 +0100233#ifdef __ANDROID__ // Layoutlib does not support parcel
Ashok Bhata0398432014-01-20 20:08:01 +0000234 const SkRegion* region = reinterpret_cast<SkRegion*>(regionHandle);
Leon Scroggins III2a6d6e52015-06-17 11:56:43 -0400235 if (parcel == nullptr) {
Ashok Bhata0398432014-01-20 20:08:01 +0000236 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800237 }
Elliott Hughes4cb17532011-04-12 16:10:26 -0700238
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 Sollenberger15da7e22020-02-14 14:16:34 -0500250 AParcel* p = AParcel_fromJavaParcel(env, parcel);
251 ndk::AParcel_writeVector(p, rects);
252 AParcel_delete(p);
253
Ashok Bhata0398432014-01-20 20:08:01 +0000254 return JNI_TRUE;
Jerome Gaillard21e7e2d2019-05-14 14:34:46 +0100255#else
256 return JNI_FALSE;
257#endif
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800258}
259
260////////////////////////////////////////////////////////////////////////////////////////////////////////////
261
Ashok Bhata0398432014-01-20 20:08:01 +0000262static jboolean Region_equals(JNIEnv* env, jobject clazz, jlong r1Handle, jlong r2Handle)
Mitsuru Oshimab10f1382009-05-11 17:11:37 -0700263{
Ashok Bhata0398432014-01-20 20:08:01 +0000264 const SkRegion *r1 = reinterpret_cast<SkRegion*>(r1Handle);
265 const SkRegion *r2 = reinterpret_cast<SkRegion*>(r2Handle);
266 return boolTojboolean(*r1 == *r2);
Mitsuru Oshimab10f1382009-05-11 17:11:37 -0700267}
268
269////////////////////////////////////////////////////////////////////////////////////////////////////////////
270
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800271struct RgnIterPair {
272 SkRegion fRgn; // a copy of the caller's region
273 SkRegion::Iterator fIter; // an iterator acting upon the copy (fRgn)
Elliott Hughes4cb17532011-04-12 16:10:26 -0700274
Chih-Hung Hsiehc6baf562016-04-27 11:29:23 -0700275 explicit RgnIterPair(const SkRegion& rgn) : fRgn(rgn) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800276 // have our iterator reference our copy (fRgn), so we know it will be
277 // unchanged for the lifetime of the iterator
278 fIter.reset(fRgn);
279 }
280};
281
Ashok Bhata0398432014-01-20 20:08:01 +0000282static jlong RegionIter_constructor(JNIEnv* env, jobject, jlong regionHandle)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800283{
Ashok Bhata0398432014-01-20 20:08:01 +0000284 const SkRegion* region = reinterpret_cast<SkRegion*>(regionHandle);
Elliott Hughes4cb17532011-04-12 16:10:26 -0700285 SkASSERT(region);
Ashok Bhata0398432014-01-20 20:08:01 +0000286 return reinterpret_cast<jlong>(new RgnIterPair(*region));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800287}
288
Ashok Bhata0398432014-01-20 20:08:01 +0000289static void RegionIter_destructor(JNIEnv* env, jobject, jlong pairHandle)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800290{
Ashok Bhata0398432014-01-20 20:08:01 +0000291 RgnIterPair* pair = reinterpret_cast<RgnIterPair*>(pairHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800292 SkASSERT(pair);
293 delete pair;
294}
295
Ashok Bhata0398432014-01-20 20:08:01 +0000296static jboolean RegionIter_next(JNIEnv* env, jobject, jlong pairHandle, jobject rectObject)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800297{
Ashok Bhata0398432014-01-20 20:08:01 +0000298 RgnIterPair* pair = reinterpret_cast<RgnIterPair*>(pairHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800299 // the caller has checked that rectObject is not nul
300 SkASSERT(pair);
301 SkASSERT(rectObject);
302
303 if (!pair->fIter.done()) {
304 GraphicsJNI::irect_to_jrect(pair->fIter.rect(), env, rectObject);
305 pair->fIter.next();
Ashok Bhata0398432014-01-20 20:08:01 +0000306 return JNI_TRUE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800307 }
Ashok Bhata0398432014-01-20 20:08:01 +0000308 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800309}
310
311////////////////////////////////////////////////////////////////////////////////////////////////////////////
312
Daniel Micay76f6a862015-09-19 17:31:01 -0400313static const JNINativeMethod gRegionIterMethods[] = {
Ashok Bhata0398432014-01-20 20:08:01 +0000314 { "nativeConstructor", "(J)J", (void*)RegionIter_constructor },
315 { "nativeDestructor", "(J)V", (void*)RegionIter_destructor },
316 { "nativeNext", "(JLandroid/graphics/Rect;)Z", (void*)RegionIter_next }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800317};
318
Daniel Micay76f6a862015-09-19 17:31:01 -0400319static const JNINativeMethod gRegionMethods[] = {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800320 // these are static methods
Ashok Bhata0398432014-01-20 20:08:01 +0000321 { "nativeConstructor", "()J", (void*)Region_constructor },
322 { "nativeDestructor", "(J)V", (void*)Region_destructor },
323 { "nativeSetRegion", "(JJ)V", (void*)Region_setRegion },
324 { "nativeSetRect", "(JIIII)Z", (void*)Region_setRect },
325 { "nativeSetPath", "(JJJ)Z", (void*)Region_setPath },
326 { "nativeGetBounds", "(JLandroid/graphics/Rect;)Z", (void*)Region_getBounds },
327 { "nativeGetBoundaryPath", "(JJ)Z", (void*)Region_getBoundaryPath },
328 { "nativeOp", "(JIIIII)Z", (void*)Region_op0 },
329 { "nativeOp", "(JLandroid/graphics/Rect;JI)Z", (void*)Region_op1 },
330 { "nativeOp", "(JJJI)Z", (void*)Region_op2 },
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800331 // these are methods that take the java region object
332 { "isEmpty", "()Z", (void*)Region_isEmpty },
333 { "isRect", "()Z", (void*)Region_isRect },
334 { "isComplex", "()Z", (void*)Region_isComplex },
335 { "contains", "(II)Z", (void*)Region_contains },
336 { "quickContains", "(IIII)Z", (void*)Region_quickContains },
337 { "quickReject", "(IIII)Z", (void*)Region_quickRejectIIII },
338 { "quickReject", "(Landroid/graphics/Region;)Z", (void*)Region_quickRejectRgn },
Mitsuru Oshimab10f1382009-05-11 17:11:37 -0700339 { "scale", "(FLandroid/graphics/Region;)V", (void*)Region_scale },
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800340 { "translate", "(IILandroid/graphics/Region;)V", (void*)Region_translate },
Ashok Bhata0398432014-01-20 20:08:01 +0000341 { "nativeToString", "(J)Ljava/lang/String;", (void*)Region_toString },
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800342 // parceling methods
Ashok Bhata0398432014-01-20 20:08:01 +0000343 { "nativeCreateFromParcel", "(Landroid/os/Parcel;)J", (void*)Region_createFromParcel },
344 { "nativeWriteToParcel", "(JLandroid/os/Parcel;)Z", (void*)Region_writeToParcel },
345 { "nativeEquals", "(JJ)Z", (void*)Region_equals },
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800346};
347
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800348int register_android_graphics_Region(JNIEnv* env)
349{
Andreas Gampeed6b9df2014-11-20 22:02:20 -0800350 jclass clazz = FindClassOrDie(env, "android/graphics/Region");
Elliott Hughes4cb17532011-04-12 16:10:26 -0700351
Andreas Gampeed6b9df2014-11-20 22:02:20 -0800352 gRegion_nativeInstanceFieldID = GetFieldIDOrDie(env, clazz, "mNativeRegion", "J");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800353
Andreas Gampeed6b9df2014-11-20 22:02:20 -0800354 RegisterMethodsOrDie(env, "android/graphics/Region", gRegionMethods, NELEM(gRegionMethods));
355 return RegisterMethodsOrDie(env, "android/graphics/RegionIterator", gRegionIterMethods,
356 NELEM(gRegionIterMethods));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800357}
Jeff Brownfbf09772011-01-16 14:06:57 -0800358
Jeff Brownfbf09772011-01-16 14:06:57 -0800359} // namespace android