103 lines
3.8 KiB
C++
103 lines
3.8 KiB
C++
#include "jni.h"
|
|
#include <android_runtime/AndroidRuntime.h>
|
|
|
|
#include "SkCamera.h"
|
|
|
|
static jfieldID gNativeInstanceFieldID;
|
|
|
|
static void Camera_constructor(JNIEnv* env, jobject obj) {
|
|
Sk3DView* view = new Sk3DView;
|
|
env->SetIntField(obj, gNativeInstanceFieldID, (int)view);
|
|
}
|
|
|
|
static void Camera_destructor(JNIEnv* env, jobject obj) {
|
|
delete (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
|
|
}
|
|
|
|
static void Camera_save(JNIEnv* env, jobject obj) {
|
|
Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
|
|
v->save();
|
|
}
|
|
|
|
static void Camera_restore(JNIEnv* env, jobject obj) {
|
|
Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
|
|
v->restore();
|
|
}
|
|
|
|
static void Camera_translate(JNIEnv* env, jobject obj,
|
|
float dx, float dy, float dz) {
|
|
Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
|
|
v->translate(SkFloatToScalar(dx), SkFloatToScalar(dy), SkFloatToScalar(dz));
|
|
}
|
|
|
|
static void Camera_rotateX(JNIEnv* env, jobject obj, float degrees) {
|
|
Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
|
|
v->rotateX(SkFloatToScalar(degrees));
|
|
}
|
|
|
|
static void Camera_rotateY(JNIEnv* env, jobject obj, float degrees) {
|
|
Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
|
|
v->rotateY(SkFloatToScalar(degrees));
|
|
}
|
|
|
|
static void Camera_rotateZ(JNIEnv* env, jobject obj, float degrees) {
|
|
Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
|
|
v->rotateZ(SkFloatToScalar(degrees));
|
|
}
|
|
|
|
static void Camera_getMatrix(JNIEnv* env, jobject obj, int native_matrix) {
|
|
Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
|
|
v->getMatrix((SkMatrix*)native_matrix);
|
|
}
|
|
|
|
static void Camera_applyToCanvas(JNIEnv* env, jobject obj, int native_canvas) {
|
|
Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
|
|
v->applyToCanvas((SkCanvas*)native_canvas);
|
|
}
|
|
|
|
static float Camera_dotWithNormal(JNIEnv* env, jobject obj,
|
|
float x, float y, float z) {
|
|
Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID);
|
|
SkScalar dot = v->dotWithNormal(SkFloatToScalar(x), SkFloatToScalar(y),
|
|
SkFloatToScalar(z));
|
|
return SkScalarToFloat(dot);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
/*
|
|
* JNI registration.
|
|
*/
|
|
static 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 },
|
|
{ "nativeGetMatrix", "(I)V", (void*)Camera_getMatrix },
|
|
{ "nativeApplyToCanvas", "(I)V", (void*)Camera_applyToCanvas },
|
|
{ "dotWithNormal", "(FFF)F", (void*)Camera_dotWithNormal }
|
|
};
|
|
|
|
int register_android_graphics_Camera(JNIEnv* env);
|
|
int register_android_graphics_Camera(JNIEnv* env) {
|
|
jclass clazz = env->FindClass("android/graphics/Camera");
|
|
if (clazz == 0) {
|
|
return -1;
|
|
}
|
|
gNativeInstanceFieldID = env->GetFieldID(clazz, "native_instance", "I");
|
|
if (gNativeInstanceFieldID == 0) {
|
|
return -1;
|
|
}
|
|
return android::AndroidRuntime::registerNativeMethods(env,
|
|
"android/graphics/Camera",
|
|
gCameraMethods,
|
|
SK_ARRAY_COUNT(gCameraMethods));
|
|
}
|
|
|