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
ThrowIAE_IfNull(JNIEnv * env,void * ptr)9 static void ThrowIAE_IfNull(JNIEnv* env, void* ptr) {
10 if (NULL == ptr) {
11 doThrowIAE(env);
12 }
13 }
14
15 class SkMaskFilterGlue {
16 public:
destructor(JNIEnv * env,jobject,jlong filterHandle)17 static void destructor(JNIEnv* env, jobject, jlong filterHandle) {
18 SkMaskFilter* filter = reinterpret_cast<SkMaskFilter *>(filterHandle);
19 SkSafeUnref(filter);
20 }
21
createBlur(JNIEnv * env,jobject,jfloat radius,jint blurStyle)22 static jlong createBlur(JNIEnv* env, jobject, jfloat radius, jint blurStyle) {
23 SkScalar sigma = SkBlurMask::ConvertRadiusToSigma(radius);
24 SkMaskFilter* filter = SkBlurMaskFilter::Create((SkBlurStyle)blurStyle, sigma);
25 ThrowIAE_IfNull(env, filter);
26 return reinterpret_cast<jlong>(filter);
27 }
28
createEmboss(JNIEnv * env,jobject,jfloatArray dirArray,jfloat ambient,jfloat specular,jfloat radius)29 static jlong createEmboss(JNIEnv* env, jobject, jfloatArray dirArray, jfloat ambient, jfloat specular, jfloat radius) {
30 SkScalar direction[3];
31
32 AutoJavaFloatArray autoDir(env, dirArray, 3);
33 float* values = autoDir.ptr();
34 for (int i = 0; i < 3; i++) {
35 direction[i] = values[i];
36 }
37
38 SkScalar sigma = SkBlurMask::ConvertRadiusToSigma(radius);
39 SkMaskFilter* filter = SkBlurMaskFilter::CreateEmboss(sigma,
40 direction, ambient, specular);
41 ThrowIAE_IfNull(env, filter);
42 return reinterpret_cast<jlong>(filter);
43 }
44
createTable(JNIEnv * env,jobject,jbyteArray jtable)45 static jlong createTable(JNIEnv* env, jobject, jbyteArray jtable) {
46 AutoJavaByteArray autoTable(env, jtable, 256);
47 SkMaskFilter* filter = SkTableMaskFilter::Create((const uint8_t*)autoTable.ptr());
48 return reinterpret_cast<jlong>(filter);
49 }
50
createClipTable(JNIEnv * env,jobject,jint min,jint max)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
createGammaTable(JNIEnv * env,jobject,jfloat gamma)56 static jlong createGammaTable(JNIEnv* env, jobject, jfloat gamma) {
57 SkMaskFilter* filter = SkTableMaskFilter::CreateGamma(gamma);
58 return reinterpret_cast<jlong>(filter);
59 }
60 };
61
62 static JNINativeMethod gMaskFilterMethods[] = {
63 { "nativeDestructor", "(J)V", (void*)SkMaskFilterGlue::destructor }
64 };
65
66 static JNINativeMethod gBlurMaskFilterMethods[] = {
67 { "nativeConstructor", "(FI)J", (void*)SkMaskFilterGlue::createBlur }
68 };
69
70 static JNINativeMethod gEmbossMaskFilterMethods[] = {
71 { "nativeConstructor", "([FFFF)J", (void*)SkMaskFilterGlue::createEmboss }
72 };
73
74 static 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
register_android_graphics_MaskFilter(JNIEnv * env)86 int 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