MaskFilter.cpp revision a0398430fcf365fba6e42ad0bdca2fbf45ed6fe0
1#include "GraphicsJNI.h" 2#include "SkMaskFilter.h" 3#include "SkBlurMaskFilter.h" 4#include "SkTableMaskFilter.h" 5 6#include <jni.h> 7 8static void ThrowIAE_IfNull(JNIEnv* env, void* ptr) { 9 if (NULL == ptr) { 10 doThrowIAE(env); 11 } 12} 13 14class SkMaskFilterGlue { 15public: 16 static void destructor(JNIEnv* env, jobject, jlong filterHandle) { 17 SkMaskFilter* filter = reinterpret_cast<SkMaskFilter *>(filterHandle); 18 SkSafeUnref(filter); 19 } 20 21 static jlong createBlur(JNIEnv* env, jobject, jfloat radius, jint blurStyle) { 22 SkMaskFilter* filter = SkBlurMaskFilter::Create(SkFloatToScalar(radius), 23 (SkBlurMaskFilter::BlurStyle)blurStyle); 24 ThrowIAE_IfNull(env, filter); 25 return reinterpret_cast<jlong>(filter); 26 } 27 28 static jlong createEmboss(JNIEnv* env, jobject, jfloatArray dirArray, jfloat ambient, jfloat specular, jfloat radius) { 29 SkScalar direction[3]; 30 31 AutoJavaFloatArray autoDir(env, dirArray, 3); 32 float* values = autoDir.ptr(); 33 for (int i = 0; i < 3; i++) { 34 direction[i] = SkFloatToScalar(values[i]); 35 } 36 37 SkMaskFilter* filter = SkBlurMaskFilter::CreateEmboss(direction, 38 SkFloatToScalar(ambient), 39 SkFloatToScalar(specular), 40 SkFloatToScalar(radius)); 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 = new SkTableMaskFilter((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