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
7ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe#include "core_jni_helpers.h"
8ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <jni.h>
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11a04e555dc91b11ad833cb5db4a24e38082d1dc45Mike Reedstatic void ThrowIAE_IfNull(JNIEnv* env, void* ptr) {
12a04e555dc91b11ad833cb5db4a24e38082d1dc45Mike Reed    if (NULL == ptr) {
13a04e555dc91b11ad833cb5db4a24e38082d1dc45Mike Reed        doThrowIAE(env);
14a04e555dc91b11ad833cb5db4a24e38082d1dc45Mike Reed    }
15a04e555dc91b11ad833cb5db4a24e38082d1dc45Mike Reed}
16a04e555dc91b11ad833cb5db4a24e38082d1dc45Mike Reed
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass SkMaskFilterGlue {
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
1936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static void destructor(JNIEnv* env, jobject, jlong filterHandle) {
2036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMaskFilter* filter = reinterpret_cast<SkMaskFilter *>(filterHandle);
216062c5912dc79704b489fc8c289b78a400ed05eeDerek Sollenberger        SkSafeUnref(filter);
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong createBlur(JNIEnv* env, jobject, jfloat radius, jint blurStyle) {
252e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        SkScalar sigma = SkBlurMask::ConvertRadiusToSigma(radius);
26686534db8d84ce8d838ba90b4fafe3c48ce66e95Mike Reed        SkMaskFilter* filter = SkBlurMaskFilter::Create((SkBlurStyle)blurStyle, sigma);
27a04e555dc91b11ad833cb5db4a24e38082d1dc45Mike Reed        ThrowIAE_IfNull(env, filter);
2836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(filter);
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
304cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
3136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong createEmboss(JNIEnv* env, jobject, jfloatArray dirArray, jfloat ambient, jfloat specular, jfloat radius) {
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkScalar direction[3];
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AutoJavaFloatArray autoDir(env, dirArray, 3);
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float* values = autoDir.ptr();
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < 3; i++) {
372e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III            direction[i] = values[i];
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
402e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        SkScalar sigma = SkBlurMask::ConvertRadiusToSigma(radius);
4167862524056ee2e73a94395139bb8bd0ec1ef38aChris Craik        SkMaskFilter* filter =  SkBlurMaskFilter::CreateEmboss(sigma,
422e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III                direction, ambient, specular);
43a04e555dc91b11ad833cb5db4a24e38082d1dc45Mike Reed        ThrowIAE_IfNull(env, filter);
4436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(filter);
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
460e1e62301112a51d9b91ac4ac31c406d726f93abMike Reed
4736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong createTable(JNIEnv* env, jobject, jbyteArray jtable) {
480e1e62301112a51d9b91ac4ac31c406d726f93abMike Reed        AutoJavaByteArray autoTable(env, jtable, 256);
49cc11f15f76a62ded3e403cb2bc818c6aa5bf261cLeon Scroggins        SkMaskFilter* filter = SkTableMaskFilter::Create((const uint8_t*)autoTable.ptr());
5036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(filter);
510e1e62301112a51d9b91ac4ac31c406d726f93abMike Reed    }
520e1e62301112a51d9b91ac4ac31c406d726f93abMike Reed
5336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong createClipTable(JNIEnv* env, jobject, jint min, jint max) {
5436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMaskFilter* filter = SkTableMaskFilter::CreateClip(min, max);
5536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(filter);
560e1e62301112a51d9b91ac4ac31c406d726f93abMike Reed    }
570e1e62301112a51d9b91ac4ac31c406d726f93abMike Reed
5836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong createGammaTable(JNIEnv* env, jobject, jfloat gamma) {
5936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMaskFilter* filter = SkTableMaskFilter::CreateGamma(gamma);
6036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(filter);
610e1e62301112a51d9b91ac4ac31c406d726f93abMike Reed    }
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6476f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMaskFilterMethods[] = {
6536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeDestructor",   "(J)V",     (void*)SkMaskFilterGlue::destructor      }
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6876f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gBlurMaskFilterMethods[] = {
6936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeConstructor",  "(FI)J",    (void*)SkMaskFilterGlue::createBlur      }
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7276f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gEmbossMaskFilterMethods[] = {
7336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeConstructor",  "([FFFF)J", (void*)SkMaskFilterGlue::createEmboss    }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7676f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gTableMaskFilterMethods[] = {
7736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeNewTable", "([B)J", (void*)SkMaskFilterGlue::createTable    },
7836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeNewClip",  "(II)J", (void*)SkMaskFilterGlue::createClipTable    },
7936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeNewGamma", "(F)J", (void*)SkMaskFilterGlue::createGammaTable    }
800e1e62301112a51d9b91ac4ac31c406d726f93abMike Reed};
810e1e62301112a51d9b91ac4ac31c406d726f93abMike Reed
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_graphics_MaskFilter(JNIEnv* env)
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
84ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    android::RegisterMethodsOrDie(env, "android/graphics/MaskFilter", gMaskFilterMethods,
85ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe                                  NELEM(gMaskFilterMethods));
86ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    android::RegisterMethodsOrDie(env, "android/graphics/BlurMaskFilter", gBlurMaskFilterMethods,
87ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe                                  NELEM(gBlurMaskFilterMethods));
88ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    android::RegisterMethodsOrDie(env, "android/graphics/EmbossMaskFilter",
89ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe                                  gEmbossMaskFilterMethods, NELEM(gEmbossMaskFilterMethods));
90ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    android::RegisterMethodsOrDie(env, "android/graphics/TableMaskFilter", gTableMaskFilterMethods,
91ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe                                  NELEM(gTableMaskFilterMethods));
924cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
95