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