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