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