blob: 21133303910e10b742092bbb7e1ec08c55fe9503 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001#include "GraphicsJNI.h"
2#include "SkMaskFilter.h"
Chris Craik678625242014-02-28 12:26:34 -08003#include "SkBlurMask.h"
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004#include "SkBlurMaskFilter.h"
Mike Reed0e1e6232009-10-29 17:20:49 -04005#include "SkTableMaskFilter.h"
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006
7#include <jni.h>
8
Mike Reeda04e5552009-07-30 11:05:57 -04009static void ThrowIAE_IfNull(JNIEnv* env, void* ptr) {
10 if (NULL == ptr) {
11 doThrowIAE(env);
12 }
13}
14
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080015class SkMaskFilterGlue {
16public:
Ashok Bhat36bef0b2014-01-20 20:08:01 +000017 static void destructor(JNIEnv* env, jobject, jlong filterHandle) {
18 SkMaskFilter* filter = reinterpret_cast<SkMaskFilter *>(filterHandle);
Derek Sollenberger6062c592011-02-22 13:55:04 -050019 SkSafeUnref(filter);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080020 }
21
Ashok Bhat36bef0b2014-01-20 20:08:01 +000022 static jlong createBlur(JNIEnv* env, jobject, jfloat radius, jint blurStyle) {
Leon Scroggins III2e0103e2014-04-04 17:05:24 -040023 SkScalar sigma = SkBlurMask::ConvertRadiusToSigma(radius);
Chris Craikadbd2ba2014-02-28 12:46:41 -080024 SkMaskFilter* filter = SkBlurMaskFilter::Create(
25 (SkBlurMaskFilter::BlurStyle)blurStyle, sigma);
Mike Reeda04e5552009-07-30 11:05:57 -040026 ThrowIAE_IfNull(env, filter);
Ashok Bhat36bef0b2014-01-20 20:08:01 +000027 return reinterpret_cast<jlong>(filter);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080028 }
Elliott Hughes4cb17532011-04-12 16:10:26 -070029
Ashok Bhat36bef0b2014-01-20 20:08:01 +000030 static jlong createEmboss(JNIEnv* env, jobject, jfloatArray dirArray, jfloat ambient, jfloat specular, jfloat radius) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080031 SkScalar direction[3];
32
33 AutoJavaFloatArray autoDir(env, dirArray, 3);
34 float* values = autoDir.ptr();
35 for (int i = 0; i < 3; i++) {
Leon Scroggins III2e0103e2014-04-04 17:05:24 -040036 direction[i] = values[i];
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080037 }
38
Leon Scroggins III2e0103e2014-04-04 17:05:24 -040039 SkScalar sigma = SkBlurMask::ConvertRadiusToSigma(radius);
Chris Craik678625242014-02-28 12:26:34 -080040 SkMaskFilter* filter = SkBlurMaskFilter::CreateEmboss(sigma,
Leon Scroggins III2e0103e2014-04-04 17:05:24 -040041 direction, ambient, specular);
Mike Reeda04e5552009-07-30 11:05:57 -040042 ThrowIAE_IfNull(env, filter);
Ashok Bhat36bef0b2014-01-20 20:08:01 +000043 return reinterpret_cast<jlong>(filter);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080044 }
Mike Reed0e1e6232009-10-29 17:20:49 -040045
Ashok Bhat36bef0b2014-01-20 20:08:01 +000046 static jlong createTable(JNIEnv* env, jobject, jbyteArray jtable) {
Mike Reed0e1e6232009-10-29 17:20:49 -040047 AutoJavaByteArray autoTable(env, jtable, 256);
Leon Scrogginscc11f152014-03-31 16:52:13 -040048 SkMaskFilter* filter = SkTableMaskFilter::Create((const uint8_t*)autoTable.ptr());
Ashok Bhat36bef0b2014-01-20 20:08:01 +000049 return reinterpret_cast<jlong>(filter);
Mike Reed0e1e6232009-10-29 17:20:49 -040050 }
51
Ashok Bhat36bef0b2014-01-20 20:08:01 +000052 static jlong createClipTable(JNIEnv* env, jobject, jint min, jint max) {
53 SkMaskFilter* filter = SkTableMaskFilter::CreateClip(min, max);
54 return reinterpret_cast<jlong>(filter);
Mike Reed0e1e6232009-10-29 17:20:49 -040055 }
56
Ashok Bhat36bef0b2014-01-20 20:08:01 +000057 static jlong createGammaTable(JNIEnv* env, jobject, jfloat gamma) {
58 SkMaskFilter* filter = SkTableMaskFilter::CreateGamma(gamma);
59 return reinterpret_cast<jlong>(filter);
Mike Reed0e1e6232009-10-29 17:20:49 -040060 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080061};
62
63static JNINativeMethod gMaskFilterMethods[] = {
Ashok Bhat36bef0b2014-01-20 20:08:01 +000064 { "nativeDestructor", "(J)V", (void*)SkMaskFilterGlue::destructor }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080065};
66
67static JNINativeMethod gBlurMaskFilterMethods[] = {
Ashok Bhat36bef0b2014-01-20 20:08:01 +000068 { "nativeConstructor", "(FI)J", (void*)SkMaskFilterGlue::createBlur }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080069};
70
71static JNINativeMethod gEmbossMaskFilterMethods[] = {
Ashok Bhat36bef0b2014-01-20 20:08:01 +000072 { "nativeConstructor", "([FFFF)J", (void*)SkMaskFilterGlue::createEmboss }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080073};
74
Mike Reed0e1e6232009-10-29 17:20:49 -040075static JNINativeMethod gTableMaskFilterMethods[] = {
Ashok Bhat36bef0b2014-01-20 20:08:01 +000076 { "nativeNewTable", "([B)J", (void*)SkMaskFilterGlue::createTable },
77 { "nativeNewClip", "(II)J", (void*)SkMaskFilterGlue::createClipTable },
78 { "nativeNewGamma", "(F)J", (void*)SkMaskFilterGlue::createGammaTable }
Mike Reed0e1e6232009-10-29 17:20:49 -040079};
80
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080081#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
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080087int register_android_graphics_MaskFilter(JNIEnv* env)
88{
89 int result;
Elliott Hughes4cb17532011-04-12 16:10:26 -070090
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080091 REG(env, "android/graphics/MaskFilter", gMaskFilterMethods);
92 REG(env, "android/graphics/BlurMaskFilter", gBlurMaskFilterMethods);
93 REG(env, "android/graphics/EmbossMaskFilter", gEmbossMaskFilterMethods);
Mike Reed0e1e6232009-10-29 17:20:49 -040094 REG(env, "android/graphics/TableMaskFilter", gTableMaskFilterMethods);
Elliott Hughes4cb17532011-04-12 16:10:26 -070095
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080096 return 0;
97}