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