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