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