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