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