19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h"
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h>
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkCamera.h"
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger#include "Canvas.h"
75c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita#include "GraphicsJNI.h"
85c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gNativeInstanceFieldID;
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void Camera_constructor(JNIEnv* env, jobject obj) {
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Sk3DView* view = new Sk3DView;
1336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    env->SetLongField(obj, gNativeInstanceFieldID, reinterpret_cast<jlong>(view));
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void Camera_destructor(JNIEnv* env, jobject obj) {
1736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
1836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    Sk3DView* view = reinterpret_cast<Sk3DView*>(viewHandle);
1936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    delete view;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void Camera_save(JNIEnv* env, jobject obj) {
2336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
2436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    v->save();
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void Camera_restore(JNIEnv* env, jobject obj) {
2936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
3036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    v->restore();
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void Camera_translate(JNIEnv* env, jobject obj,
3536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                             jfloat dx, jfloat dy, jfloat dz) {
3636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
3736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
382e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III    v->translate(dx, dy, dz);
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic void Camera_rotateX(JNIEnv* env, jobject obj, jfloat degrees) {
4236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
4336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
442e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III    v->rotateX(degrees);
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic void Camera_rotateY(JNIEnv* env, jobject obj, jfloat degrees) {
4836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
4936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
502e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III    v->rotateY(degrees);
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic void Camera_rotateZ(JNIEnv* env, jobject obj, jfloat degrees) {
5436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
5536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
562e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III    v->rotateZ(degrees);
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5947b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guystatic void Camera_rotate(JNIEnv* env, jobject obj, jfloat x, jfloat y, jfloat z) {
6036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
6136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
622e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III    v->rotateX(x);
632e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III    v->rotateY(y);
642e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III    v->rotateZ(z);
6547b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy}
6647b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy
6747b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guystatic void Camera_setLocation(JNIEnv* env, jobject obj, jfloat x, jfloat y, jfloat z) {
6836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
6936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
702e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III    v->setCameraLocation(x, y, z);
7147b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy}
7247b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy
73a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasestatic jfloat Camera_getLocationX(JNIEnv* env, jobject obj) {
7436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
7536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
76a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    return SkScalarToFloat(v->getCameraLocationX());
77a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
78a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
79a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasestatic jfloat Camera_getLocationY(JNIEnv* env, jobject obj) {
8036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
8136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
82a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    return SkScalarToFloat(v->getCameraLocationY());
83a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
84a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
85a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasestatic jfloat Camera_getLocationZ(JNIEnv* env, jobject obj) {
8636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
8736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
88a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    return SkScalarToFloat(v->getCameraLocationZ());
89a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
90a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
9136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic void Camera_getMatrix(JNIEnv* env, jobject obj, jlong matrixHandle) {
9236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    SkMatrix* native_matrix =  reinterpret_cast<SkMatrix*>(matrixHandle);
9336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
9436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
9536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    v->getMatrix(native_matrix);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic void Camera_applyToCanvas(JNIEnv* env, jobject obj, jlong canvasHandle) {
998872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger    SkCanvas* canvas = reinterpret_cast<android::Canvas*>(canvasHandle)->getSkCanvas();
10036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
10136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
1028872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger    v->applyToCanvas(canvas);
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jfloat Camera_dotWithNormal(JNIEnv* env, jobject obj,
10636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                                  jfloat x, jfloat y, jfloat z) {
10736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
10836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
1092e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III    SkScalar dot = v->dotWithNormal(x, y, z);
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return SkScalarToFloat(dot);
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration.
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gCameraMethods[] = {
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* name, signature, funcPtr */
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "nativeConstructor",   "()V",    (void*)Camera_constructor   },
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "nativeDestructor",    "()V",    (void*)Camera_destructor    },
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "save",                "()V",    (void*)Camera_save          },
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "restore",             "()V",    (void*)Camera_restore       },
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "translate",           "(FFF)V", (void*)Camera_translate     },
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "rotateX",             "(F)V",   (void*)Camera_rotateX       },
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "rotateY",             "(F)V",   (void*)Camera_rotateY       },
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "rotateZ",             "(F)V",   (void*)Camera_rotateZ       },
12947b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy    { "rotate",              "(FFF)V", (void*)Camera_rotate        },
13047b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy    { "setLocation",         "(FFF)V", (void*)Camera_setLocation   },
131a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    { "getLocationX",        "()F",    (void*)Camera_getLocationX  },
132a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    { "getLocationY",        "()F",    (void*)Camera_getLocationY  },
133a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    { "getLocationZ",        "()F",    (void*)Camera_getLocationZ  },
13436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeGetMatrix",     "(J)V",   (void*)Camera_getMatrix     },
13536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeApplyToCanvas", "(J)V",   (void*)Camera_applyToCanvas },
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "dotWithNormal",       "(FFF)F", (void*)Camera_dotWithNormal }
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_graphics_Camera(JNIEnv* env) {
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jclass clazz = env->FindClass("android/graphics/Camera");
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (clazz == 0) {
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    gNativeInstanceFieldID = env->GetFieldID(clazz, "native_instance", "J");
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (gNativeInstanceFieldID == 0) {
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return android::AndroidRuntime::registerNativeMethods(env,
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                               "android/graphics/Camera",
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                               gCameraMethods,
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                               SK_ARRAY_COUNT(gCameraMethods));
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
153