1fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown/* 2fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown * Copyright (C) 2011 The Android Open Source Project 3fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown * 4fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 5fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown * you may not use this file except in compliance with the License. 6fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown * You may obtain a copy of the License at 7fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown * 8fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown * http://www.apache.org/licenses/LICENSE-2.0 9fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown * 10fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown * Unless required by applicable law or agreed to in writing, software 11fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 12fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown * See the License for the specific language governing permissions and 14fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown * limitations under the License. 15fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown */ 16fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkRegion.h" 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkPath.h" 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "GraphicsJNI.h" 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown#include <binder/Parcel.h> 22d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include "android_os_Parcel.h" 23fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown#include "android_util_Binder.h" 24fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <jni.h> 26fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown#include <android_runtime/AndroidRuntime.h> 27fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown 28fbf097732137a32930d151f7ba6816a5b870c32aJeff Brownnamespace android { 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gRegion_nativeInstanceFieldID; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic inline SkRegion* GetSkRegion(JNIEnv* env, jobject regionObject) { 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkRegion* rgn = (SkRegion*)env->GetIntField(regionObject, gRegion_nativeInstanceFieldID); 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkASSERT(rgn != NULL); 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rgn; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic SkRegion* Region_constructor(JNIEnv* env, jobject) { 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new SkRegion; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void Region_destructor(JNIEnv* env, jobject, SkRegion* region) { 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkASSERT(region); 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete region; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void Region_setRegion(JNIEnv* env, jobject, SkRegion* dst, const SkRegion* src) { 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkASSERT(dst && src); 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *dst = *src; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean Region_setRect(JNIEnv* env, jobject, SkRegion* dst, int left, int top, int right, int bottom) { 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return dst->setRect(left, top, right, bottom); 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean Region_setPath(JNIEnv* env, jobject, SkRegion* dst, 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const SkPath* path, const SkRegion* clip) { 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkASSERT(dst && path && clip); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return dst->setPath(*path, *clip); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean Region_getBounds(JNIEnv* env, jobject, SkRegion* region, jobject rectBounds) { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicsJNI::irect_to_jrect(region->getBounds(), env, rectBounds); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return !region->isEmpty(); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean Region_getBoundaryPath(JNIEnv* env, jobject, const SkRegion* region, SkPath* path) { 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return region->getBoundaryPath(path); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean Region_op0(JNIEnv* env, jobject, SkRegion* dst, int left, int top, int right, int bottom, int op) { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkIRect ir; 734cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ir.set(left, top, right, bottom); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return dst->op(ir, (SkRegion::Op)op); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean Region_op1(JNIEnv* env, jobject, SkRegion* dst, jobject rectObject, const SkRegion* region, int op) { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkIRect ir; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicsJNI::jrect_to_irect(env, rectObject, &ir); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return dst->op(ir, *region, (SkRegion::Op)op); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean Region_op2(JNIEnv* env, jobject, SkRegion* dst, const SkRegion* region1, const SkRegion* region2, int op) { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return dst->op(*region1, *region2, (SkRegion::Op)op); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 884cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes//////////////////////////////////// These are methods, not static 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean Region_isEmpty(JNIEnv* env, jobject region) { 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return GetSkRegion(env, region)->isEmpty(); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 934cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean Region_isRect(JNIEnv* env, jobject region) { 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return GetSkRegion(env, region)->isRect(); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 974cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean Region_isComplex(JNIEnv* env, jobject region) { 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return GetSkRegion(env, region)->isComplex(); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean Region_contains(JNIEnv* env, jobject region, int x, int y) { 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return GetSkRegion(env, region)->contains(x, y); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1054cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean Region_quickContains(JNIEnv* env, jobject region, int left, int top, int right, int bottom) { 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return GetSkRegion(env, region)->quickContains(left, top, right, bottom); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1094cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean Region_quickRejectIIII(JNIEnv* env, jobject region, int left, int top, int right, int bottom) { 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkIRect ir; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ir.set(left, top, right, bottom); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return GetSkRegion(env, region)->quickReject(ir); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1154cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean Region_quickRejectRgn(JNIEnv* env, jobject region, jobject other) { 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return GetSkRegion(env, region)->quickReject(*GetSkRegion(env, other)); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1194cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void Region_translate(JNIEnv* env, jobject region, int x, int y, jobject dst) { 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkRegion* rgn = GetSkRegion(env, region); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dst) 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rgn->translate(x, y, GetSkRegion(env, dst)); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rgn->translate(x, y); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 128b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima// Scale the rectangle by given scale and set the reuslt to the dst. 129b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshimastatic void scale_rect(SkIRect* dst, const SkIRect& src, float scale) { 130b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima dst->fLeft = (int)::roundf(src.fLeft * scale); 131b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima dst->fTop = (int)::roundf(src.fTop * scale); 132b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima dst->fRight = (int)::roundf(src.fRight * scale); 133b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima dst->fBottom = (int)::roundf(src.fBottom * scale); 134b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima} 135b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima 136b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima// Scale the region by given scale and set the reuslt to the dst. 137b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima// dest and src can be the same region instance. 138b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshimastatic void scale_rgn(SkRegion* dst, const SkRegion& src, float scale) { 139b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima SkRegion tmp; 140b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima SkRegion::Iterator iter(src); 141b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima 142b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima for (; !iter.done(); iter.next()) { 143b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima SkIRect r; 144b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima scale_rect(&r, iter.rect(), scale); 145b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima tmp.op(r, SkRegion::kUnion_Op); 146b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima } 147b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima dst->swap(tmp); 148b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima} 149b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima 150b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshimastatic void Region_scale(JNIEnv* env, jobject region, jfloat scale, jobject dst) { 151b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima SkRegion* rgn = GetSkRegion(env, region); 152b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima if (dst) 153b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima scale_rgn(GetSkRegion(env, dst), *rgn, scale); 154b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima else 155b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima scale_rgn(rgn, *rgn, scale); 156b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima} 157b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima 158120856c50a56595c0954ae1bf6f05888386937b9Joe Onoratostatic jstring Region_toString(JNIEnv* env, jobject clazz, SkRegion* region) { 159120856c50a56595c0954ae1bf6f05888386937b9Joe Onorato char* str = region->toString(); 160120856c50a56595c0954ae1bf6f05888386937b9Joe Onorato if (str == NULL) { 161120856c50a56595c0954ae1bf6f05888386937b9Joe Onorato return NULL; 162120856c50a56595c0954ae1bf6f05888386937b9Joe Onorato } 163120856c50a56595c0954ae1bf6f05888386937b9Joe Onorato jstring result = env->NewStringUTF(str); 164120856c50a56595c0954ae1bf6f05888386937b9Joe Onorato free(str); 165120856c50a56595c0954ae1bf6f05888386937b9Joe Onorato return result; 166120856c50a56595c0954ae1bf6f05888386937b9Joe Onorato} 167120856c50a56595c0954ae1bf6f05888386937b9Joe Onorato 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////////////////////////////////// 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic SkRegion* Region_createFromParcel(JNIEnv* env, jobject clazz, jobject parcel) 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel == NULL) { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1754cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android::Parcel* p = android::parcelForJavaObject(env, parcel); 1774cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkRegion* region = new SkRegion; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t size = p->readInt32(); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project region->unflatten(p->readInplace(size)); 1814cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return region; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean Region_writeToParcel(JNIEnv* env, jobject clazz, const SkRegion* region, jobject parcel) 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel == NULL) { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1904cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android::Parcel* p = android::parcelForJavaObject(env, parcel); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t size = region->flatten(NULL); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p->writeInt32(size); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project region->flatten(p->writeInplace(size)); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////////////////////////////////// 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 202b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshimastatic jboolean Region_equals(JNIEnv* env, jobject clazz, const SkRegion *r1, const SkRegion* r2) 203b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima{ 204b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima return (jboolean) (*r1 == *r2); 205b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima} 206b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima 207b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima//////////////////////////////////////////////////////////////////////////////////////////////////////////// 208b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct RgnIterPair { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkRegion fRgn; // a copy of the caller's region 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkRegion::Iterator fIter; // an iterator acting upon the copy (fRgn) 2124cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RgnIterPair(const SkRegion& rgn) : fRgn(rgn) { 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // have our iterator reference our copy (fRgn), so we know it will be 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // unchanged for the lifetime of the iterator 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fIter.reset(fRgn); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic RgnIterPair* RegionIter_constructor(JNIEnv* env, jobject, const SkRegion* region) 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2224cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes SkASSERT(region); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RgnIterPair(*region); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void RegionIter_destructor(JNIEnv* env, jobject, RgnIterPair* pair) 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkASSERT(pair); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete pair; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean RegionIter_next(JNIEnv* env, jobject, RgnIterPair* pair, jobject rectObject) 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the caller has checked that rectObject is not nul 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkASSERT(pair); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkASSERT(rectObject); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!pair->fIter.done()) { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicsJNI::irect_to_jrect(pair->fIter.rect(), env, rectObject); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pair->fIter.next(); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////////////////////////////////// 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gRegionIterMethods[] = { 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "nativeConstructor", "(I)I", (void*)RegionIter_constructor }, 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "nativeDestructor", "(I)V", (void*)RegionIter_destructor }, 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "nativeNext", "(ILandroid/graphics/Rect;)Z", (void*)RegionIter_next } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gRegionMethods[] = { 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // these are static methods 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "nativeConstructor", "()I", (void*)Region_constructor }, 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "nativeDestructor", "(I)V", (void*)Region_destructor }, 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "nativeSetRegion", "(II)Z", (void*)Region_setRegion }, 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "nativeSetRect", "(IIIII)Z", (void*)Region_setRect }, 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "nativeSetPath", "(III)Z", (void*)Region_setPath }, 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "nativeGetBounds", "(ILandroid/graphics/Rect;)Z", (void*)Region_getBounds }, 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "nativeGetBoundaryPath", "(II)Z", (void*)Region_getBoundaryPath }, 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "nativeOp", "(IIIIII)Z", (void*)Region_op0 }, 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "nativeOp", "(ILandroid/graphics/Rect;II)Z", (void*)Region_op1 }, 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "nativeOp", "(IIII)Z", (void*)Region_op2 }, 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // these are methods that take the java region object 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "isEmpty", "()Z", (void*)Region_isEmpty }, 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "isRect", "()Z", (void*)Region_isRect }, 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "isComplex", "()Z", (void*)Region_isComplex }, 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "contains", "(II)Z", (void*)Region_contains }, 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "quickContains", "(IIII)Z", (void*)Region_quickContains }, 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "quickReject", "(IIII)Z", (void*)Region_quickRejectIIII }, 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "quickReject", "(Landroid/graphics/Region;)Z", (void*)Region_quickRejectRgn }, 274b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima { "scale", "(FLandroid/graphics/Region;)V", (void*)Region_scale }, 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "translate", "(IILandroid/graphics/Region;)V", (void*)Region_translate }, 276120856c50a56595c0954ae1bf6f05888386937b9Joe Onorato { "nativeToString", "(I)Ljava/lang/String;", (void*)Region_toString }, 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // parceling methods 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "nativeCreateFromParcel", "(Landroid/os/Parcel;)I", (void*)Region_createFromParcel }, 279b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima { "nativeWriteToParcel", "(ILandroid/os/Parcel;)Z", (void*)Region_writeToParcel }, 280b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima { "nativeEquals", "(II)Z", (void*)Region_equals }, 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_graphics_Region(JNIEnv* env) 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz = env->FindClass("android/graphics/Region"); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkASSERT(clazz); 2874cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gRegion_nativeInstanceFieldID = env->GetFieldID(clazz, "mNativeRegion", "I"); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkASSERT(gRegion_nativeInstanceFieldID); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result = android::AndroidRuntime::registerNativeMethods(env, "android/graphics/Region", 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gRegionMethods, SK_ARRAY_COUNT(gRegionMethods)); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result < 0) 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return android::AndroidRuntime::registerNativeMethods(env, "android/graphics/RegionIterator", 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gRegionIterMethods, SK_ARRAY_COUNT(gRegionIterMethods)); 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 299fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown 300fbf097732137a32930d151f7ba6816a5b870c32aJeff BrownSkRegion* android_graphics_Region_getSkRegion(JNIEnv* env, jobject regionObj) { 301fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown return GetSkRegion(env, regionObj); 302fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown} 303fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown 304fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown} // namespace android 305