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