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