Camera.cpp revision 5753b45516607988d5e84fee448d020911dde5d1
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(SkFloatToScalar(dx), SkFloatToScalar(dy), SkFloatToScalar(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(SkFloatToScalar(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(SkFloatToScalar(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(SkFloatToScalar(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(SkFloatToScalar(x));
60    v->rotateY(SkFloatToScalar(y));
61    v->rotateZ(SkFloatToScalar(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(SkFloatToScalar(x), SkFloatToScalar(y), SkFloatToScalar(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(SkFloatToScalar(x), SkFloatToScalar(y),
107                                    SkFloatToScalar(z));
108    return SkScalarToFloat(dot);
109}
110
111// ----------------------------------------------------------------------------
112
113/*
114 * JNI registration.
115 */
116static JNINativeMethod gCameraMethods[] = {
117    /* name, signature, funcPtr */
118
119    { "nativeConstructor",   "()V",    (void*)Camera_constructor   },
120    { "nativeDestructor",    "()V",    (void*)Camera_destructor    },
121    { "save",                "()V",    (void*)Camera_save          },
122    { "restore",             "()V",    (void*)Camera_restore       },
123    { "translate",           "(FFF)V", (void*)Camera_translate     },
124    { "rotateX",             "(F)V",   (void*)Camera_rotateX       },
125    { "rotateY",             "(F)V",   (void*)Camera_rotateY       },
126    { "rotateZ",             "(F)V",   (void*)Camera_rotateZ       },
127    { "rotate",              "(FFF)V", (void*)Camera_rotate        },
128    { "setLocation",         "(FFF)V", (void*)Camera_setLocation   },
129    { "getLocationX",        "()F",    (void*)Camera_getLocationX  },
130    { "getLocationY",        "()F",    (void*)Camera_getLocationY  },
131    { "getLocationZ",        "()F",    (void*)Camera_getLocationZ  },
132    { "nativeGetMatrix",     "(J)V",   (void*)Camera_getMatrix     },
133    { "nativeApplyToCanvas", "(J)V",   (void*)Camera_applyToCanvas },
134    { "dotWithNormal",       "(FFF)F", (void*)Camera_dotWithNormal }
135};
136
137int register_android_graphics_Camera(JNIEnv* env) {
138    jclass clazz = env->FindClass("android/graphics/Camera");
139    if (clazz == 0) {
140        return -1;
141    }
142    gNativeInstanceFieldID = env->GetFieldID(clazz, "native_instance", "J");
143    if (gNativeInstanceFieldID == 0) {
144        return -1;
145    }
146    return android::AndroidRuntime::registerNativeMethods(env,
147                                               "android/graphics/Camera",
148                                               gCameraMethods,
149                                               SK_ARRAY_COUNT(gCameraMethods));
150}
151