Camera.cpp revision 2e0103eb340822f9d580c1aa8492bae8394b8243
1#include "jni.h"
2#include <android_runtime/AndroidRuntime.h>
3
4#include "SkCamera.h"
5
6static jfieldID gNativeInstanceFieldID;
7
8static void Camera_constructor(JNIEnv* env, jobject obj) {
9    Sk3DView* view = new Sk3DView;
10    env->SetLongField(obj, gNativeInstanceFieldID, reinterpret_cast<jlong>(view));
11}
12
13static void Camera_destructor(JNIEnv* env, jobject obj) {
14    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
15    Sk3DView* view = reinterpret_cast<Sk3DView*>(viewHandle);
16    delete view;
17}
18
19static void Camera_save(JNIEnv* env, jobject obj) {
20    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
21    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
22    v->save();
23}
24
25static void Camera_restore(JNIEnv* env, jobject obj) {
26    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
27    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
28    v->restore();
29}
30
31static void Camera_translate(JNIEnv* env, jobject obj,
32                             jfloat dx, jfloat dy, jfloat dz) {
33    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
34    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
35    v->translate(dx, dy, dz);
36}
37
38static void Camera_rotateX(JNIEnv* env, jobject obj, jfloat degrees) {
39    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
40    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
41    v->rotateX(degrees);
42}
43
44static void Camera_rotateY(JNIEnv* env, jobject obj, jfloat degrees) {
45    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
46    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
47    v->rotateY(degrees);
48}
49
50static void Camera_rotateZ(JNIEnv* env, jobject obj, jfloat degrees) {
51    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
52    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
53    v->rotateZ(degrees);
54}
55
56static void Camera_rotate(JNIEnv* env, jobject obj, jfloat x, jfloat y, jfloat z) {
57    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
58    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
59    v->rotateX(x);
60    v->rotateY(y);
61    v->rotateZ(z);
62}
63
64static void Camera_setLocation(JNIEnv* env, jobject obj, jfloat x, jfloat y, jfloat z) {
65    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
66    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
67    v->setCameraLocation(x, y, z);
68}
69
70static jfloat Camera_getLocationX(JNIEnv* env, jobject obj) {
71    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
72    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
73    return SkScalarToFloat(v->getCameraLocationX());
74}
75
76static jfloat Camera_getLocationY(JNIEnv* env, jobject obj) {
77    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
78    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
79    return SkScalarToFloat(v->getCameraLocationY());
80}
81
82static jfloat Camera_getLocationZ(JNIEnv* env, jobject obj) {
83    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
84    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
85    return SkScalarToFloat(v->getCameraLocationZ());
86}
87
88static void Camera_getMatrix(JNIEnv* env, jobject obj, jlong matrixHandle) {
89    SkMatrix* native_matrix =  reinterpret_cast<SkMatrix*>(matrixHandle);
90    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
91    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
92    v->getMatrix(native_matrix);
93}
94
95static void Camera_applyToCanvas(JNIEnv* env, jobject obj, jlong canvasHandle) {
96    SkCanvas* native_canvas = reinterpret_cast<SkCanvas*>(canvasHandle);
97    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
98    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
99    v->applyToCanvas((SkCanvas*)native_canvas);
100}
101
102static jfloat Camera_dotWithNormal(JNIEnv* env, jobject obj,
103                                  jfloat x, jfloat y, jfloat z) {
104    jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
105    Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
106    SkScalar dot = v->dotWithNormal(x, y, z);
107    return SkScalarToFloat(dot);
108}
109
110// ----------------------------------------------------------------------------
111
112/*
113 * JNI registration.
114 */
115static JNINativeMethod gCameraMethods[] = {
116    /* name, signature, funcPtr */
117
118    { "nativeConstructor",   "()V",    (void*)Camera_constructor   },
119    { "nativeDestructor",    "()V",    (void*)Camera_destructor    },
120    { "save",                "()V",    (void*)Camera_save          },
121    { "restore",             "()V",    (void*)Camera_restore       },
122    { "translate",           "(FFF)V", (void*)Camera_translate     },
123    { "rotateX",             "(F)V",   (void*)Camera_rotateX       },
124    { "rotateY",             "(F)V",   (void*)Camera_rotateY       },
125    { "rotateZ",             "(F)V",   (void*)Camera_rotateZ       },
126    { "rotate",              "(FFF)V", (void*)Camera_rotate        },
127    { "setLocation",         "(FFF)V", (void*)Camera_setLocation   },
128    { "getLocationX",        "()F",    (void*)Camera_getLocationX  },
129    { "getLocationY",        "()F",    (void*)Camera_getLocationY  },
130    { "getLocationZ",        "()F",    (void*)Camera_getLocationZ  },
131    { "nativeGetMatrix",     "(J)V",   (void*)Camera_getMatrix     },
132    { "nativeApplyToCanvas", "(J)V",   (void*)Camera_applyToCanvas },
133    { "dotWithNormal",       "(FFF)F", (void*)Camera_dotWithNormal }
134};
135
136int register_android_graphics_Camera(JNIEnv* env) {
137    jclass clazz = env->FindClass("android/graphics/Camera");
138    if (clazz == 0) {
139        return -1;
140    }
141    gNativeInstanceFieldID = env->GetFieldID(clazz, "native_instance", "J");
142    if (gNativeInstanceFieldID == 0) {
143        return -1;
144    }
145    return android::AndroidRuntime::registerNativeMethods(env,
146                                               "android/graphics/Camera",
147                                               gCameraMethods,
148                                               SK_ARRAY_COUNT(gCameraMethods));
149}
150