blob: 455449e5349d16a52c3690f2d1fa2f022c508d63 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001#include "GraphicsJNI.h"
2#include "SkMaskFilter.h"
3#include "SkBlurMaskFilter.h"
Mike Reed0e1e6232009-10-29 17:20:49 -04004#include "SkTableMaskFilter.h"
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005
6#include <jni.h>
7
Mike Reeda04e5552009-07-30 11:05:57 -04008static void ThrowIAE_IfNull(JNIEnv* env, void* ptr) {
9 if (NULL == ptr) {
10 doThrowIAE(env);
11 }
12}
13
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080014class SkMaskFilterGlue {
15public:
16 static void destructor(JNIEnv* env, jobject, SkMaskFilter* filter) {
Mike Reed6af25522009-07-30 11:46:47 -040017 filter->safeUnref();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080018 }
19
20 static SkMaskFilter* createBlur(JNIEnv* env, jobject, float radius, int blurStyle) {
Mike Reeda04e5552009-07-30 11:05:57 -040021 SkMaskFilter* filter = SkBlurMaskFilter::Create(SkFloatToScalar(radius),
22 (SkBlurMaskFilter::BlurStyle)blurStyle);
23 ThrowIAE_IfNull(env, filter);
24 return filter;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080025 }
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
Mike Reeda04e5552009-07-30 11:05:57 -040036 SkMaskFilter* filter = SkBlurMaskFilter::CreateEmboss(direction,
37 SkFloatToScalar(ambient),
38 SkFloatToScalar(specular),
39 SkFloatToScalar(radius));
40 ThrowIAE_IfNull(env, filter);
41 return filter;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080042 }
Mike Reed0e1e6232009-10-29 17:20:49 -040043
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 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080056};
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
Mike Reed0e1e6232009-10-29 17:20:49 -040070static 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
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080076#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);
Mike Reed0e1e6232009-10-29 17:20:49 -040090 REG(env, "android/graphics/TableMaskFilter", gTableMaskFilterMethods);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080091
92 return 0;
93}
94