blob: f331af70dac63e07f12646375a29cf27a00909a9 [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:
Ashok Bhat36bef0b2014-01-20 20:08:01 +000016 static void destructor(JNIEnv* env, jobject, jlong filterHandle) {
17 SkMaskFilter* filter = reinterpret_cast<SkMaskFilter *>(filterHandle);
Derek Sollenberger6062c592011-02-22 13:55:04 -050018 SkSafeUnref(filter);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080019 }
20
Ashok Bhat36bef0b2014-01-20 20:08:01 +000021 static jlong createBlur(JNIEnv* env, jobject, jfloat radius, jint blurStyle) {
Mike Reeda04e5552009-07-30 11:05:57 -040022 SkMaskFilter* filter = SkBlurMaskFilter::Create(SkFloatToScalar(radius),
23 (SkBlurMaskFilter::BlurStyle)blurStyle);
24 ThrowIAE_IfNull(env, filter);
Ashok Bhat36bef0b2014-01-20 20:08:01 +000025 return reinterpret_cast<jlong>(filter);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080026 }
Elliott Hughes4cb17532011-04-12 16:10:26 -070027
Ashok Bhat36bef0b2014-01-20 20:08:01 +000028 static jlong createEmboss(JNIEnv* env, jobject, jfloatArray dirArray, jfloat ambient, jfloat specular, jfloat radius) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080029 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
Mike Reeda04e5552009-07-30 11:05:57 -040037 SkMaskFilter* filter = SkBlurMaskFilter::CreateEmboss(direction,
38 SkFloatToScalar(ambient),
39 SkFloatToScalar(specular),
40 SkFloatToScalar(radius));
41 ThrowIAE_IfNull(env, filter);
Ashok Bhat36bef0b2014-01-20 20:08:01 +000042 return reinterpret_cast<jlong>(filter);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080043 }
Mike Reed0e1e6232009-10-29 17:20:49 -040044
Ashok Bhat36bef0b2014-01-20 20:08:01 +000045 static jlong createTable(JNIEnv* env, jobject, jbyteArray jtable) {
Mike Reed0e1e6232009-10-29 17:20:49 -040046 AutoJavaByteArray autoTable(env, jtable, 256);
Ashok Bhat36bef0b2014-01-20 20:08:01 +000047 SkMaskFilter* filter = new SkTableMaskFilter((const uint8_t*)autoTable.ptr());
48 return reinterpret_cast<jlong>(filter);
Mike Reed0e1e6232009-10-29 17:20:49 -040049 }
50
Ashok Bhat36bef0b2014-01-20 20:08:01 +000051 static jlong createClipTable(JNIEnv* env, jobject, jint min, jint max) {
52 SkMaskFilter* filter = SkTableMaskFilter::CreateClip(min, max);
53 return reinterpret_cast<jlong>(filter);
Mike Reed0e1e6232009-10-29 17:20:49 -040054 }
55
Ashok Bhat36bef0b2014-01-20 20:08:01 +000056 static jlong createGammaTable(JNIEnv* env, jobject, jfloat gamma) {
57 SkMaskFilter* filter = SkTableMaskFilter::CreateGamma(gamma);
58 return reinterpret_cast<jlong>(filter);
Mike Reed0e1e6232009-10-29 17:20:49 -040059 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080060};
61
62static JNINativeMethod gMaskFilterMethods[] = {
Ashok Bhat36bef0b2014-01-20 20:08:01 +000063 { "nativeDestructor", "(J)V", (void*)SkMaskFilterGlue::destructor }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080064};
65
66static JNINativeMethod gBlurMaskFilterMethods[] = {
Ashok Bhat36bef0b2014-01-20 20:08:01 +000067 { "nativeConstructor", "(FI)J", (void*)SkMaskFilterGlue::createBlur }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080068};
69
70static JNINativeMethod gEmbossMaskFilterMethods[] = {
Ashok Bhat36bef0b2014-01-20 20:08:01 +000071 { "nativeConstructor", "([FFFF)J", (void*)SkMaskFilterGlue::createEmboss }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080072};
73
Mike Reed0e1e6232009-10-29 17:20:49 -040074static JNINativeMethod gTableMaskFilterMethods[] = {
Ashok Bhat36bef0b2014-01-20 20:08:01 +000075 { "nativeNewTable", "([B)J", (void*)SkMaskFilterGlue::createTable },
76 { "nativeNewClip", "(II)J", (void*)SkMaskFilterGlue::createClipTable },
77 { "nativeNewGamma", "(F)J", (void*)SkMaskFilterGlue::createGammaTable }
Mike Reed0e1e6232009-10-29 17:20:49 -040078};
79
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080080#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
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080086int register_android_graphics_MaskFilter(JNIEnv* env)
87{
88 int result;
Elliott Hughes4cb17532011-04-12 16:10:26 -070089
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080090 REG(env, "android/graphics/MaskFilter", gMaskFilterMethods);
91 REG(env, "android/graphics/BlurMaskFilter", gBlurMaskFilterMethods);
92 REG(env, "android/graphics/EmbossMaskFilter", gEmbossMaskFilterMethods);
Mike Reed0e1e6232009-10-29 17:20:49 -040093 REG(env, "android/graphics/TableMaskFilter", gTableMaskFilterMethods);
Elliott Hughes4cb17532011-04-12 16:10:26 -070094
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080095 return 0;
96}