blob: 33d346f5d37991ea619d697ec00271a118304309 [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
Andreas Gampeed6b9df2014-11-20 22:02:20 -08007#include "core_jni_helpers.h"
8
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009#include <jni.h>
10
Mike Reeda04e5552009-07-30 11:05:57 -040011static void ThrowIAE_IfNull(JNIEnv* env, void* ptr) {
12 if (NULL == ptr) {
13 doThrowIAE(env);
14 }
15}
16
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080017class SkMaskFilterGlue {
18public:
Ashok Bhat36bef0b2014-01-20 20:08:01 +000019 static void destructor(JNIEnv* env, jobject, jlong filterHandle) {
20 SkMaskFilter* filter = reinterpret_cast<SkMaskFilter *>(filterHandle);
Derek Sollenberger6062c592011-02-22 13:55:04 -050021 SkSafeUnref(filter);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080022 }
23
Ashok Bhat36bef0b2014-01-20 20:08:01 +000024 static jlong createBlur(JNIEnv* env, jobject, jfloat radius, jint blurStyle) {
Leon Scroggins III2e0103e2014-04-04 17:05:24 -040025 SkScalar sigma = SkBlurMask::ConvertRadiusToSigma(radius);
Mike Reed1b9eeb12018-03-13 11:48:30 -040026 SkMaskFilter* filter = SkMaskFilter::MakeBlur((SkBlurStyle)blurStyle, sigma).release();
Mike Reeda04e5552009-07-30 11:05:57 -040027 ThrowIAE_IfNull(env, filter);
Ashok Bhat36bef0b2014-01-20 20:08:01 +000028 return reinterpret_cast<jlong>(filter);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080029 }
Elliott Hughes4cb17532011-04-12 16:10:26 -070030
Ashok Bhat36bef0b2014-01-20 20:08:01 +000031 static jlong createEmboss(JNIEnv* env, jobject, jfloatArray dirArray, jfloat ambient, jfloat specular, jfloat radius) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080032 SkScalar direction[3];
33
34 AutoJavaFloatArray autoDir(env, dirArray, 3);
35 float* values = autoDir.ptr();
36 for (int i = 0; i < 3; i++) {
Leon Scroggins III2e0103e2014-04-04 17:05:24 -040037 direction[i] = values[i];
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080038 }
39
Leon Scroggins III2e0103e2014-04-04 17:05:24 -040040 SkScalar sigma = SkBlurMask::ConvertRadiusToSigma(radius);
Mike Reed260ab722016-10-07 15:59:20 -040041 SkMaskFilter* filter = SkBlurMaskFilter::MakeEmboss(sigma,
42 direction, ambient, specular).release();
Mike Reeda04e5552009-07-30 11:05:57 -040043 ThrowIAE_IfNull(env, filter);
Ashok Bhat36bef0b2014-01-20 20:08:01 +000044 return reinterpret_cast<jlong>(filter);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080045 }
Mike Reed0e1e6232009-10-29 17:20:49 -040046
Ashok Bhat36bef0b2014-01-20 20:08:01 +000047 static jlong createTable(JNIEnv* env, jobject, jbyteArray jtable) {
Mike Reed0e1e6232009-10-29 17:20:49 -040048 AutoJavaByteArray autoTable(env, jtable, 256);
Leon Scrogginscc11f152014-03-31 16:52:13 -040049 SkMaskFilter* filter = SkTableMaskFilter::Create((const uint8_t*)autoTable.ptr());
Ashok Bhat36bef0b2014-01-20 20:08:01 +000050 return reinterpret_cast<jlong>(filter);
Mike Reed0e1e6232009-10-29 17:20:49 -040051 }
52
Ashok Bhat36bef0b2014-01-20 20:08:01 +000053 static jlong createClipTable(JNIEnv* env, jobject, jint min, jint max) {
54 SkMaskFilter* filter = SkTableMaskFilter::CreateClip(min, max);
55 return reinterpret_cast<jlong>(filter);
Mike Reed0e1e6232009-10-29 17:20:49 -040056 }
57
Ashok Bhat36bef0b2014-01-20 20:08:01 +000058 static jlong createGammaTable(JNIEnv* env, jobject, jfloat gamma) {
59 SkMaskFilter* filter = SkTableMaskFilter::CreateGamma(gamma);
60 return reinterpret_cast<jlong>(filter);
Mike Reed0e1e6232009-10-29 17:20:49 -040061 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080062};
63
Daniel Micay76f6a862015-09-19 17:31:01 -040064static const JNINativeMethod gMaskFilterMethods[] = {
Ashok Bhat36bef0b2014-01-20 20:08:01 +000065 { "nativeDestructor", "(J)V", (void*)SkMaskFilterGlue::destructor }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080066};
67
Daniel Micay76f6a862015-09-19 17:31:01 -040068static const JNINativeMethod gBlurMaskFilterMethods[] = {
Ashok Bhat36bef0b2014-01-20 20:08:01 +000069 { "nativeConstructor", "(FI)J", (void*)SkMaskFilterGlue::createBlur }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080070};
71
Daniel Micay76f6a862015-09-19 17:31:01 -040072static const JNINativeMethod gEmbossMaskFilterMethods[] = {
Ashok Bhat36bef0b2014-01-20 20:08:01 +000073 { "nativeConstructor", "([FFFF)J", (void*)SkMaskFilterGlue::createEmboss }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080074};
75
Daniel Micay76f6a862015-09-19 17:31:01 -040076static const JNINativeMethod gTableMaskFilterMethods[] = {
Ashok Bhat36bef0b2014-01-20 20:08:01 +000077 { "nativeNewTable", "([B)J", (void*)SkMaskFilterGlue::createTable },
78 { "nativeNewClip", "(II)J", (void*)SkMaskFilterGlue::createClipTable },
79 { "nativeNewGamma", "(F)J", (void*)SkMaskFilterGlue::createGammaTable }
Mike Reed0e1e6232009-10-29 17:20:49 -040080};
81
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080082int register_android_graphics_MaskFilter(JNIEnv* env)
83{
Andreas Gampeed6b9df2014-11-20 22:02:20 -080084 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));
Elliott Hughes4cb17532011-04-12 16:10:26 -070092
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080093 return 0;
94}