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