19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "GraphicsJNI.h"
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkMaskFilter.h"
367862524056ee2e73a94395139bb8bd0ec1ef38aChris Craik#include "SkBlurMask.h"
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkBlurMaskFilter.h"
50e1e62301112a51d9b91ac4ac31c406d726f93abMike Reed#include "SkTableMaskFilter.h"
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <jni.h>
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9a04e555dc91b11ad833cb5db4a24e38082d1dc45Mike Reedstatic void ThrowIAE_IfNull(JNIEnv* env, void* ptr) {
10a04e555dc91b11ad833cb5db4a24e38082d1dc45Mike Reed    if (NULL == ptr) {
11a04e555dc91b11ad833cb5db4a24e38082d1dc45Mike Reed        doThrowIAE(env);
12a04e555dc91b11ad833cb5db4a24e38082d1dc45Mike Reed    }
13a04e555dc91b11ad833cb5db4a24e38082d1dc45Mike Reed}
14a04e555dc91b11ad833cb5db4a24e38082d1dc45Mike Reed
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass SkMaskFilterGlue {
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
1736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static void destructor(JNIEnv* env, jobject, jlong filterHandle) {
1836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMaskFilter* filter = reinterpret_cast<SkMaskFilter *>(filterHandle);
196062c5912dc79704b489fc8c289b78a400ed05eeDerek Sollenberger        SkSafeUnref(filter);
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong createBlur(JNIEnv* env, jobject, jfloat radius, jint blurStyle) {
232e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        SkScalar sigma = SkBlurMask::ConvertRadiusToSigma(radius);
24686534db8d84ce8d838ba90b4fafe3c48ce66e95Mike Reed        SkMaskFilter* filter = SkBlurMaskFilter::Create((SkBlurStyle)blurStyle, sigma);
25a04e555dc91b11ad833cb5db4a24e38082d1dc45Mike Reed        ThrowIAE_IfNull(env, filter);
2636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(filter);
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
284cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
2936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong createEmboss(JNIEnv* env, jobject, jfloatArray dirArray, jfloat ambient, jfloat specular, jfloat radius) {
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkScalar direction[3];
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AutoJavaFloatArray autoDir(env, dirArray, 3);
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float* values = autoDir.ptr();
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < 3; i++) {
352e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III            direction[i] = values[i];
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
382e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        SkScalar sigma = SkBlurMask::ConvertRadiusToSigma(radius);
3967862524056ee2e73a94395139bb8bd0ec1ef38aChris Craik        SkMaskFilter* filter =  SkBlurMaskFilter::CreateEmboss(sigma,
402e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III                direction, ambient, specular);
41a04e555dc91b11ad833cb5db4a24e38082d1dc45Mike Reed        ThrowIAE_IfNull(env, filter);
4236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(filter);
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
440e1e62301112a51d9b91ac4ac31c406d726f93abMike Reed
4536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong createTable(JNIEnv* env, jobject, jbyteArray jtable) {
460e1e62301112a51d9b91ac4ac31c406d726f93abMike Reed        AutoJavaByteArray autoTable(env, jtable, 256);
47cc11f15f76a62ded3e403cb2bc818c6aa5bf261cLeon Scroggins        SkMaskFilter* filter = SkTableMaskFilter::Create((const uint8_t*)autoTable.ptr());
4836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(filter);
490e1e62301112a51d9b91ac4ac31c406d726f93abMike Reed    }
500e1e62301112a51d9b91ac4ac31c406d726f93abMike Reed
5136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong createClipTable(JNIEnv* env, jobject, jint min, jint max) {
5236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMaskFilter* filter = SkTableMaskFilter::CreateClip(min, max);
5336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(filter);
540e1e62301112a51d9b91ac4ac31c406d726f93abMike Reed    }
550e1e62301112a51d9b91ac4ac31c406d726f93abMike Reed
5636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong createGammaTable(JNIEnv* env, jobject, jfloat gamma) {
5736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMaskFilter* filter = SkTableMaskFilter::CreateGamma(gamma);
5836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(filter);
590e1e62301112a51d9b91ac4ac31c406d726f93abMike Reed    }
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMaskFilterMethods[] = {
6336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeDestructor",   "(J)V",     (void*)SkMaskFilterGlue::destructor      }
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gBlurMaskFilterMethods[] = {
6736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeConstructor",  "(FI)J",    (void*)SkMaskFilterGlue::createBlur      }
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gEmbossMaskFilterMethods[] = {
7136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeConstructor",  "([FFFF)J", (void*)SkMaskFilterGlue::createEmboss    }
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
740e1e62301112a51d9b91ac4ac31c406d726f93abMike Reedstatic JNINativeMethod gTableMaskFilterMethods[] = {
7536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeNewTable", "([B)J", (void*)SkMaskFilterGlue::createTable    },
7636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeNewClip",  "(II)J", (void*)SkMaskFilterGlue::createClipTable    },
7736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeNewGamma", "(F)J", (void*)SkMaskFilterGlue::createGammaTable    }
780e1e62301112a51d9b91ac4ac31c406d726f93abMike Reed};
790e1e62301112a51d9b91ac4ac31c406d726f93abMike Reed
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h>
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define REG(env, name, array)                                                                       \
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = android::AndroidRuntime::registerNativeMethods(env, name, array, SK_ARRAY_COUNT(array));  \
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (result < 0) return result
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_graphics_MaskFilter(JNIEnv* env)
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result;
894cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    REG(env, "android/graphics/MaskFilter", gMaskFilterMethods);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    REG(env, "android/graphics/BlurMaskFilter", gBlurMaskFilterMethods);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    REG(env, "android/graphics/EmbossMaskFilter", gEmbossMaskFilterMethods);
930e1e62301112a51d9b91ac4ac31c406d726f93abMike Reed    REG(env, "android/graphics/TableMaskFilter", gTableMaskFilterMethods);
944cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
97