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