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