• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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