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