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