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