PathEffect.cpp revision 36bef0bf30d6bae48cf3837df351075ca4fce654
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <jni.h> 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "GraphicsJNI.h" 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkPathEffect.h" 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkCornerPathEffect.h" 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkDashPathEffect.h" 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkDiscretePathEffect.h" 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "Sk1DPathEffect.h" 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkTemplates.h" 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass SkPathEffectGlue { 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat static void destructor(JNIEnv* env, jobject, jlong effectHandle) { 1536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat SkPathEffect* effect = reinterpret_cast<SkPathEffect*>(effectHandle); 166062c5912dc79704b489fc8c289b78a400ed05eeDerek Sollenberger SkSafeUnref(effect); 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat static jlong Compose_constructor(JNIEnv* env, jobject, 2036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong outerHandle, jlong innerHandle) { 2136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat SkPathEffect* outer = reinterpret_cast<SkPathEffect*>(outerHandle); 2236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat SkPathEffect* inner = reinterpret_cast<SkPathEffect*>(innerHandle); 2336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat SkPathEffect* effect = new SkComposePathEffect(outer, inner); 2436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return reinterpret_cast<jlong>(effect); 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 264cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes 2736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat static jlong Sum_constructor(JNIEnv* env, jobject, 2836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong firstHandle, jlong secondHandle) { 2936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat SkPathEffect* first = reinterpret_cast<SkPathEffect*>(firstHandle); 3036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat SkPathEffect* second = reinterpret_cast<SkPathEffect*>(secondHandle); 3136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat SkPathEffect* effect = new SkSumPathEffect(first, second); 3236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return reinterpret_cast<jlong>(effect); 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 344cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes 3536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat static jlong Dash_constructor(JNIEnv* env, jobject, 3636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jfloatArray intervalArray, jfloat phase) { 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoJavaFloatArray autoInterval(env, intervalArray); 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = autoInterval.length() & ~1; // even number 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float* values = autoInterval.ptr(); 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkAutoSTMalloc<32, SkScalar> storage(count); 424cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes SkScalar* intervals = storage.get(); 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intervals[i] = SkFloatToScalar(values[i]); 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat SkPathEffect* effect = new SkDashPathEffect(intervals, count, SkFloatToScalar(phase)); 4736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return reinterpret_cast<jlong>(effect); 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 494cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes 5036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat static jlong OneD_constructor(JNIEnv* env, jobject, 5136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong shapeHandle, jfloat advance, jfloat phase, jint style) { 5236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat const SkPath* shape = reinterpret_cast<SkPath*>(shapeHandle); 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkASSERT(shape != NULL); 5436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat SkPathEffect* effect = new SkPath1DPathEffect(*shape, SkFloatToScalar(advance), 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkFloatToScalar(phase), (SkPath1DPathEffect::Style)style); 5636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return reinterpret_cast<jlong>(effect); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 584cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes 5936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat static jlong Corner_constructor(JNIEnv* env, jobject, jfloat radius){ 6036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat SkPathEffect* effect = new SkCornerPathEffect(SkFloatToScalar(radius)); 6136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return reinterpret_cast<jlong>(effect); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 634cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes 6436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat static jlong Discrete_constructor(JNIEnv* env, jobject, 6536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jfloat length, jfloat deviation) { 6636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat SkPathEffect* effect = new SkDiscretePathEffect(SkFloatToScalar(length), 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkFloatToScalar(deviation)); 6836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return reinterpret_cast<jlong>(effect); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 704cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////////////////////////////// 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gPathEffectMethods[] = { 7636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nativeDestructor", "(J)V", (void*)SkPathEffectGlue::destructor } 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gComposePathEffectMethods[] = { 8036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nativeCreate", "(JJ)J", (void*)SkPathEffectGlue::Compose_constructor } 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gSumPathEffectMethods[] = { 8436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nativeCreate", "(JJ)J", (void*)SkPathEffectGlue::Sum_constructor } 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gDashPathEffectMethods[] = { 8836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nativeCreate", "([FF)J", (void*)SkPathEffectGlue::Dash_constructor } 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gPathDashPathEffectMethods[] = { 9236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nativeCreate", "(JFFI)J", (void*)SkPathEffectGlue::OneD_constructor } 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gCornerPathEffectMethods[] = { 9636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nativeCreate", "(F)J", (void*)SkPathEffectGlue::Corner_constructor } 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gDiscretePathEffectMethods[] = { 10036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nativeCreate", "(FF)J", (void*)SkPathEffectGlue::Discrete_constructor } 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h> 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define REG(env, name, array) \ 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = android::AndroidRuntime::registerNativeMethods(env, name, array, \ 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SK_ARRAY_COUNT(array)); \ 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result < 0) return result 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_graphics_PathEffect(JNIEnv* env) 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 1134cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REG(env, "android/graphics/PathEffect", gPathEffectMethods); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REG(env, "android/graphics/ComposePathEffect", gComposePathEffectMethods); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REG(env, "android/graphics/SumPathEffect", gSumPathEffectMethods); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REG(env, "android/graphics/DashPathEffect", gDashPathEffectMethods); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REG(env, "android/graphics/PathDashPathEffect", gPathDashPathEffectMethods); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REG(env, "android/graphics/CornerPathEffect", gCornerPathEffectMethods); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REG(env, "android/graphics/DiscretePathEffect", gDiscretePathEffectMethods); 1214cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 124