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