MaskFilter.cpp revision c9e22e9affec97a8c68f838de29dc7f685d9247b
1#include "GraphicsJNI.h"
2#include "SkMaskFilter.h"
3#include "SkBlurMaskFilter.h"
4#include "SkTableMaskFilter.h"
5
6#include <jni.h>
7
8static void ThrowIAE_IfNull(JNIEnv* env, void* ptr) {
9    if (NULL == ptr) {
10        doThrowIAE(env);
11    }
12}
13
14class SkMaskFilterGlue {
15public:
16    static void destructor(JNIEnv* env, jobject, SkMaskFilter* filter) {
17        SkSafeUnref(filter);
18    }
19
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
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
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
49    static SkMaskFilter* createClipTable(JNIEnv* env, jobject, int min, int max) {
50        return SkTableMaskFilter::CreateClip(min, max);
51    }
52
53    static SkMaskFilter* createGammaTable(JNIEnv* env, jobject, float gamma) {
54        return SkTableMaskFilter::CreateGamma(gamma);
55    }
56};
57
58static JNINativeMethod gMaskFilterMethods[] = {
59    { "nativeDestructor",   "(I)V",     (void*)SkMaskFilterGlue::destructor      }
60};
61
62static JNINativeMethod gBlurMaskFilterMethods[] = {
63    { "nativeConstructor",  "(FI)I",    (void*)SkMaskFilterGlue::createBlur      }
64};
65
66static JNINativeMethod gEmbossMaskFilterMethods[] = {
67    { "nativeConstructor",  "([FFFF)I", (void*)SkMaskFilterGlue::createEmboss    }
68};
69
70static 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
82int register_android_graphics_MaskFilter(JNIEnv* env);
83int 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