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