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
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gNativeInstanceFieldID;
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void Camera_constructor(JNIEnv* env, jobject obj) {
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Sk3DView* view = new Sk3DView;
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->SetIntField(obj, gNativeInstanceFieldID, (int)view);
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void Camera_destructor(JNIEnv* env, jobject obj) {
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    delete (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void Camera_save(JNIEnv* env, jobject obj) {
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    v->save();
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void Camera_restore(JNIEnv* env, jobject obj) {
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    v->restore();
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void Camera_translate(JNIEnv* env, jobject obj,
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                             float dx, float dy, float dz) {
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    v->translate(SkFloatToScalar(dx), SkFloatToScalar(dy), SkFloatToScalar(dz));
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void Camera_rotateX(JNIEnv* env, jobject obj, float degrees) {
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    v->rotateX(SkFloatToScalar(degrees));
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void Camera_rotateY(JNIEnv* env, jobject obj, float degrees) {
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    v->rotateY(SkFloatToScalar(degrees));
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void Camera_rotateZ(JNIEnv* env, jobject obj, float degrees) {
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    v->rotateZ(SkFloatToScalar(degrees));
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4847b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guystatic void Camera_rotate(JNIEnv* env, jobject obj, jfloat x, jfloat y, jfloat z) {
4947b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy    Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
5047b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy    v->rotateX(SkFloatToScalar(x));
5147b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy    v->rotateY(SkFloatToScalar(y));
5247b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy    v->rotateZ(SkFloatToScalar(z));
5347b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy}
5447b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy
5547b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guystatic void Camera_setLocation(JNIEnv* env, jobject obj, jfloat x, jfloat y, jfloat z) {
5647b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy    Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
5747b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy    v->setCameraLocation(SkFloatToScalar(x), SkFloatToScalar(y), SkFloatToScalar(z));
5847b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy}
5947b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy
60a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasestatic jfloat Camera_getLocationX(JNIEnv* env, jobject obj) {
61a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
62a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    return SkScalarToFloat(v->getCameraLocationX());
63a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
64a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
65a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasestatic jfloat Camera_getLocationY(JNIEnv* env, jobject obj) {
66a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
67a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    return SkScalarToFloat(v->getCameraLocationY());
68a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
69a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
70a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasestatic jfloat Camera_getLocationZ(JNIEnv* env, jobject obj) {
71a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
72a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    return SkScalarToFloat(v->getCameraLocationZ());
73a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
74a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void Camera_getMatrix(JNIEnv* env, jobject obj, int native_matrix) {
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    v->getMatrix((SkMatrix*)native_matrix);
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void Camera_applyToCanvas(JNIEnv* env, jobject obj, int native_canvas) {
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    v->applyToCanvas((SkCanvas*)native_canvas);
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic float Camera_dotWithNormal(JNIEnv* env, jobject obj,
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  float x, float y, float z) {
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SkScalar dot = v->dotWithNormal(SkFloatToScalar(x), SkFloatToScalar(y),
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    SkFloatToScalar(z));
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return SkScalarToFloat(dot);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration.
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gCameraMethods[] = {
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* name, signature, funcPtr */
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "nativeConstructor",   "()V",    (void*)Camera_constructor   },
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "nativeDestructor",    "()V",    (void*)Camera_destructor    },
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "save",                "()V",    (void*)Camera_save          },
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "restore",             "()V",    (void*)Camera_restore       },
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "translate",           "(FFF)V", (void*)Camera_translate     },
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "rotateX",             "(F)V",   (void*)Camera_rotateX       },
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "rotateY",             "(F)V",   (void*)Camera_rotateY       },
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "rotateZ",             "(F)V",   (void*)Camera_rotateZ       },
10947b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy    { "rotate",              "(FFF)V", (void*)Camera_rotate        },
11047b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy    { "setLocation",         "(FFF)V", (void*)Camera_setLocation   },
111a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    { "getLocationX",        "()F",    (void*)Camera_getLocationX  },
112a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    { "getLocationY",        "()F",    (void*)Camera_getLocationY  },
113a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    { "getLocationZ",        "()F",    (void*)Camera_getLocationZ  },
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "nativeGetMatrix",     "(I)V",   (void*)Camera_getMatrix     },
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "nativeApplyToCanvas", "(I)V",   (void*)Camera_applyToCanvas },
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "dotWithNormal",       "(FFF)F", (void*)Camera_dotWithNormal }
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_graphics_Camera(JNIEnv* env) {
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jclass clazz = env->FindClass("android/graphics/Camera");
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (clazz == 0) {
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gNativeInstanceFieldID = env->GetFieldID(clazz, "native_instance", "I");
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (gNativeInstanceFieldID == 0) {
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return android::AndroidRuntime::registerNativeMethods(env,
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                               "android/graphics/Camera",
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                               gCameraMethods,
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                               SK_ARRAY_COUNT(gCameraMethods));
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
133