MaskFilter.cpp revision a04e555dc91b11ad833cb5db4a24e38082d1dc45
1#include "GraphicsJNI.h"
2#include "SkMaskFilter.h"
3#include "SkBlurMaskFilter.h"
4
5#include <jni.h>
6
7static void ThrowIAE_IfNull(JNIEnv* env, void* ptr) {
8    if (NULL == ptr) {
9        doThrowIAE(env);
10    }
11}
12
13class SkMaskFilterGlue {
14public:
15    static void destructor(JNIEnv* env, jobject, SkMaskFilter* filter) {
16        SkSafeUnref(filter);
17    }
18
19    static SkMaskFilter* createBlur(JNIEnv* env, jobject, float radius, int blurStyle) {
20        SkMaskFilter* filter = SkBlurMaskFilter::Create(SkFloatToScalar(radius),
21                                        (SkBlurMaskFilter::BlurStyle)blurStyle);
22        ThrowIAE_IfNull(env, filter);
23        return filter;
24    }
25
26    static SkMaskFilter* createEmboss(JNIEnv* env, jobject, jfloatArray dirArray, float ambient, float specular, float radius) {
27        SkScalar direction[3];
28
29        AutoJavaFloatArray autoDir(env, dirArray, 3);
30        float* values = autoDir.ptr();
31        for (int i = 0; i < 3; i++) {
32            direction[i] = SkFloatToScalar(values[i]);
33        }
34
35        SkMaskFilter* filter =  SkBlurMaskFilter::CreateEmboss(direction,
36                                                      SkFloatToScalar(ambient),
37                                                      SkFloatToScalar(specular),
38                                                      SkFloatToScalar(radius));
39        ThrowIAE_IfNull(env, filter);
40        return filter;
41    }
42};
43
44static JNINativeMethod gMaskFilterMethods[] = {
45    { "nativeDestructor",   "(I)V",     (void*)SkMaskFilterGlue::destructor      }
46};
47
48static JNINativeMethod gBlurMaskFilterMethods[] = {
49    { "nativeConstructor",  "(FI)I",    (void*)SkMaskFilterGlue::createBlur      }
50};
51
52static JNINativeMethod gEmbossMaskFilterMethods[] = {
53    { "nativeConstructor",  "([FFFF)I", (void*)SkMaskFilterGlue::createEmboss    }
54};
55
56#include <android_runtime/AndroidRuntime.h>
57
58#define REG(env, name, array)                                                                       \
59    result = android::AndroidRuntime::registerNativeMethods(env, name, array, SK_ARRAY_COUNT(array));  \
60    if (result < 0) return result
61
62int register_android_graphics_MaskFilter(JNIEnv* env);
63int register_android_graphics_MaskFilter(JNIEnv* env)
64{
65    int result;
66
67    REG(env, "android/graphics/MaskFilter", gMaskFilterMethods);
68    REG(env, "android/graphics/BlurMaskFilter", gBlurMaskFilterMethods);
69    REG(env, "android/graphics/EmbossMaskFilter", gEmbossMaskFilterMethods);
70
71    return 0;
72}
73
74