Camera.cpp revision 36bef0bf30d6bae48cf3837df351075ca4fce654
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