| #include "SkCamera.h" |
| |
| #include "GraphicsJNI.h" |
| #include <hwui/Canvas.h> |
| |
| static jfieldID gNativeInstanceFieldID; |
| |
| static void Camera_constructor(JNIEnv* env, jobject obj) { |
| Sk3DView* view = new Sk3DView; |
| env->SetLongField(obj, gNativeInstanceFieldID, reinterpret_cast<jlong>(view)); |
| } |
| |
| static void Camera_destructor(JNIEnv* env, jobject obj) { |
| jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID); |
| Sk3DView* view = reinterpret_cast<Sk3DView*>(viewHandle); |
| delete view; |
| } |
| |
| static void Camera_save(JNIEnv* env, jobject obj) { |
| jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID); |
| Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle); |
| v->save(); |
| } |
| |
| static void Camera_restore(JNIEnv* env, jobject obj) { |
| jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID); |
| Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle); |
| v->restore(); |
| } |
| |
| static void Camera_translate(JNIEnv* env, jobject obj, |
| jfloat dx, jfloat dy, jfloat dz) { |
| jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID); |
| Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle); |
| v->translate(dx, dy, dz); |
| } |
| |
| static void Camera_rotateX(JNIEnv* env, jobject obj, jfloat degrees) { |
| jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID); |
| Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle); |
| v->rotateX(degrees); |
| } |
| |
| static void Camera_rotateY(JNIEnv* env, jobject obj, jfloat degrees) { |
| jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID); |
| Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle); |
| v->rotateY(degrees); |
| } |
| |
| static void Camera_rotateZ(JNIEnv* env, jobject obj, jfloat degrees) { |
| jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID); |
| Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle); |
| v->rotateZ(degrees); |
| } |
| |
| static void Camera_rotate(JNIEnv* env, jobject obj, jfloat x, jfloat y, jfloat z) { |
| jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID); |
| Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle); |
| v->rotateX(x); |
| v->rotateY(y); |
| v->rotateZ(z); |
| } |
| |
| static void Camera_setLocation(JNIEnv* env, jobject obj, jfloat x, jfloat y, jfloat z) { |
| jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID); |
| Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle); |
| v->setCameraLocation(x, y, z); |
| } |
| |
| static jfloat Camera_getLocationX(JNIEnv* env, jobject obj) { |
| jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID); |
| Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle); |
| return SkScalarToFloat(v->getCameraLocationX()); |
| } |
| |
| static jfloat Camera_getLocationY(JNIEnv* env, jobject obj) { |
| jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID); |
| Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle); |
| return SkScalarToFloat(v->getCameraLocationY()); |
| } |
| |
| static jfloat Camera_getLocationZ(JNIEnv* env, jobject obj) { |
| jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID); |
| Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle); |
| return SkScalarToFloat(v->getCameraLocationZ()); |
| } |
| |
| static void Camera_getMatrix(JNIEnv* env, jobject obj, jlong matrixHandle) { |
| SkMatrix* native_matrix = reinterpret_cast<SkMatrix*>(matrixHandle); |
| jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID); |
| Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle); |
| v->getMatrix(native_matrix); |
| } |
| |
| static void Camera_applyToCanvas(JNIEnv* env, jobject obj, jlong canvasHandle) { |
| android::Canvas* canvas = reinterpret_cast<android::Canvas*>(canvasHandle); |
| jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID); |
| Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle); |
| SkMatrix matrix; |
| v->getMatrix(&matrix); |
| canvas->concat(matrix); |
| } |
| |
| static jfloat Camera_dotWithNormal(JNIEnv* env, jobject obj, |
| jfloat x, jfloat y, jfloat z) { |
| jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID); |
| Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle); |
| SkScalar dot = v->dotWithNormal(x, y, z); |
| return SkScalarToFloat(dot); |
| } |
| |
| // ---------------------------------------------------------------------------- |
| |
| /* |
| * JNI registration. |
| */ |
| static const JNINativeMethod gCameraMethods[] = { |
| /* name, signature, funcPtr */ |
| |
| { "nativeConstructor", "()V", (void*)Camera_constructor }, |
| { "nativeDestructor", "()V", (void*)Camera_destructor }, |
| { "save", "()V", (void*)Camera_save }, |
| { "restore", "()V", (void*)Camera_restore }, |
| { "translate", "(FFF)V", (void*)Camera_translate }, |
| { "rotateX", "(F)V", (void*)Camera_rotateX }, |
| { "rotateY", "(F)V", (void*)Camera_rotateY }, |
| { "rotateZ", "(F)V", (void*)Camera_rotateZ }, |
| { "rotate", "(FFF)V", (void*)Camera_rotate }, |
| { "setLocation", "(FFF)V", (void*)Camera_setLocation }, |
| { "getLocationX", "()F", (void*)Camera_getLocationX }, |
| { "getLocationY", "()F", (void*)Camera_getLocationY }, |
| { "getLocationZ", "()F", (void*)Camera_getLocationZ }, |
| { "nativeGetMatrix", "(J)V", (void*)Camera_getMatrix }, |
| { "nativeApplyToCanvas", "(J)V", (void*)Camera_applyToCanvas }, |
| { "dotWithNormal", "(FFF)F", (void*)Camera_dotWithNormal } |
| }; |
| |
| int register_android_graphics_Camera(JNIEnv* env) { |
| jclass clazz = android::FindClassOrDie(env, "android/graphics/Camera"); |
| gNativeInstanceFieldID = android::GetFieldIDOrDie(env, clazz, "native_instance", "J"); |
| return android::RegisterMethodsOrDie(env, "android/graphics/Camera", gCameraMethods, |
| NELEM(gCameraMethods)); |
| } |