Home | History | Annotate | Download | only in graphics
      1 #include "GraphicsJNI.h"
      2 #include "SkMaskFilter.h"
      3 #include "SkBlurMaskFilter.h"
      4 #include "SkTableMaskFilter.h"
      5 
      6 #include <jni.h>
      7 
      8 static void ThrowIAE_IfNull(JNIEnv* env, void* ptr) {
      9     if (NULL == ptr) {
     10         doThrowIAE(env);
     11     }
     12 }
     13 
     14 class SkMaskFilterGlue {
     15 public:
     16     static void destructor(JNIEnv* env, jobject, SkMaskFilter* filter) {
     17         SkSafeUnref(filter);
     18     }
     19 
     20     static SkMaskFilter* createBlur(JNIEnv* env, jobject, float radius, int blurStyle) {
     21         SkMaskFilter* filter = SkBlurMaskFilter::Create(SkFloatToScalar(radius),
     22                                         (SkBlurMaskFilter::BlurStyle)blurStyle);
     23         ThrowIAE_IfNull(env, filter);
     24         return filter;
     25     }
     26 
     27     static SkMaskFilter* createEmboss(JNIEnv* env, jobject, jfloatArray dirArray, float ambient, float specular, float radius) {
     28         SkScalar direction[3];
     29 
     30         AutoJavaFloatArray autoDir(env, dirArray, 3);
     31         float* values = autoDir.ptr();
     32         for (int i = 0; i < 3; i++) {
     33             direction[i] = SkFloatToScalar(values[i]);
     34         }
     35 
     36         SkMaskFilter* filter =  SkBlurMaskFilter::CreateEmboss(direction,
     37                                                       SkFloatToScalar(ambient),
     38                                                       SkFloatToScalar(specular),
     39                                                       SkFloatToScalar(radius));
     40         ThrowIAE_IfNull(env, filter);
     41         return filter;
     42     }
     43 
     44     static SkMaskFilter* createTable(JNIEnv* env, jobject, jbyteArray jtable) {
     45         AutoJavaByteArray autoTable(env, jtable, 256);
     46         return new SkTableMaskFilter((const uint8_t*)autoTable.ptr());
     47     }
     48 
     49     static SkMaskFilter* createClipTable(JNIEnv* env, jobject, int min, int max) {
     50         return SkTableMaskFilter::CreateClip(min, max);
     51     }
     52 
     53     static SkMaskFilter* createGammaTable(JNIEnv* env, jobject, float gamma) {
     54         return SkTableMaskFilter::CreateGamma(gamma);
     55     }
     56 };
     57 
     58 static JNINativeMethod gMaskFilterMethods[] = {
     59     { "nativeDestructor",   "(I)V",     (void*)SkMaskFilterGlue::destructor      }
     60 };
     61 
     62 static JNINativeMethod gBlurMaskFilterMethods[] = {
     63     { "nativeConstructor",  "(FI)I",    (void*)SkMaskFilterGlue::createBlur      }
     64 };
     65 
     66 static JNINativeMethod gEmbossMaskFilterMethods[] = {
     67     { "nativeConstructor",  "([FFFF)I", (void*)SkMaskFilterGlue::createEmboss    }
     68 };
     69 
     70 static JNINativeMethod gTableMaskFilterMethods[] = {
     71     { "nativeNewTable", "([B)I", (void*)SkMaskFilterGlue::createTable    },
     72     { "nativeNewClip",  "(II)I", (void*)SkMaskFilterGlue::createClipTable    },
     73     { "nativeNewGamma", "(F)I", (void*)SkMaskFilterGlue::createGammaTable    }
     74 };
     75 
     76 #include <android_runtime/AndroidRuntime.h>
     77 
     78 #define REG(env, name, array)                                                                       \
     79     result = android::AndroidRuntime::registerNativeMethods(env, name, array, SK_ARRAY_COUNT(array));  \
     80     if (result < 0) return result
     81 
     82 int register_android_graphics_MaskFilter(JNIEnv* env)
     83 {
     84     int result;
     85 
     86     REG(env, "android/graphics/MaskFilter", gMaskFilterMethods);
     87     REG(env, "android/graphics/BlurMaskFilter", gBlurMaskFilterMethods);
     88     REG(env, "android/graphics/EmbossMaskFilter", gEmbossMaskFilterMethods);
     89     REG(env, "android/graphics/TableMaskFilter", gTableMaskFilterMethods);
     90 
     91     return 0;
     92 }
     93