MaskFilter.cpp revision 36bef0bf30d6bae48cf3837df351075ca4fce654
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, jlong filterHandle) {
17        SkMaskFilter* filter = reinterpret_cast<SkMaskFilter *>(filterHandle);
18        SkSafeUnref(filter);
19    }
20
21    static jlong createBlur(JNIEnv* env, jobject, jfloat radius, jint blurStyle) {
22        SkMaskFilter* filter = SkBlurMaskFilter::Create(SkFloatToScalar(radius),
23                                        (SkBlurMaskFilter::BlurStyle)blurStyle);
24        ThrowIAE_IfNull(env, filter);
25        return reinterpret_cast<jlong>(filter);
26    }
27
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] = SkFloatToScalar(values[i]);
35        }
36
37        SkMaskFilter* filter =  SkBlurMaskFilter::CreateEmboss(direction,
38                                                      SkFloatToScalar(ambient),
39                                                      SkFloatToScalar(specular),
40                                                      SkFloatToScalar(radius));
41        ThrowIAE_IfNull(env, filter);
42        return reinterpret_cast<jlong>(filter);
43    }
44
45    static jlong createTable(JNIEnv* env, jobject, jbyteArray jtable) {
46        AutoJavaByteArray autoTable(env, jtable, 256);
47        SkMaskFilter* filter = new SkTableMaskFilter((const uint8_t*)autoTable.ptr());
48        return reinterpret_cast<jlong>(filter);
49    }
50
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
56    static jlong createGammaTable(JNIEnv* env, jobject, jfloat gamma) {
57        SkMaskFilter* filter = SkTableMaskFilter::CreateGamma(gamma);
58        return reinterpret_cast<jlong>(filter);
59    }
60};
61
62static JNINativeMethod gMaskFilterMethods[] = {
63    { "nativeDestructor",   "(J)V",     (void*)SkMaskFilterGlue::destructor      }
64};
65
66static JNINativeMethod gBlurMaskFilterMethods[] = {
67    { "nativeConstructor",  "(FI)J",    (void*)SkMaskFilterGlue::createBlur      }
68};
69
70static JNINativeMethod gEmbossMaskFilterMethods[] = {
71    { "nativeConstructor",  "([FFFF)J", (void*)SkMaskFilterGlue::createEmboss    }
72};
73
74static 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
86int 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