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);
23cc11f15f76a62ded3e403cb2bc818c6aa5bf261cLeon Scroggins        SkPathEffect* effect = SkComposePathEffect::Create(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);
31cc11f15f76a62ded3e403cb2bc818c6aa5bf261cLeon Scroggins        SkPathEffect* effect = SkSumPathEffect::Create(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);
382e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        int         count = autoInterval.length() & ~1;  // even number
392e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III#ifdef SK_SCALAR_IS_FLOAT
402e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        SkScalar*   intervals = autoInterval.ptr();
412e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III#else
422e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        #error Need to convert float array to SkScalar array before calling the following function.
432e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III#endif
442e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        SkPathEffect* effect = SkDashPathEffect::Create(intervals, count, phase);
4536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(effect);
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
474cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
4836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong OneD_constructor(JNIEnv* env, jobject,
4936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                  jlong shapeHandle, jfloat advance, jfloat phase, jint style) {
5036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        const SkPath* shape = reinterpret_cast<SkPath*>(shapeHandle);
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkASSERT(shape != NULL);
522e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        SkPathEffect* effect = SkPath1DPathEffect::Create(*shape, advance, phase,
532e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III                (SkPath1DPathEffect::Style)style);
5436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(effect);
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
564cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
5736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong Corner_constructor(JNIEnv* env, jobject, jfloat radius){
582e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        SkPathEffect* effect = SkCornerPathEffect::Create(radius);
5936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(effect);
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
614cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
6236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong Discrete_constructor(JNIEnv* env, jobject,
6336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                                      jfloat length, jfloat deviation) {
642e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        SkPathEffect* effect = SkDiscretePathEffect::Create(length, deviation);
6536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(effect);
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
674cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project////////////////////////////////////////////////////////////////////////////////////////////////////////
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gPathEffectMethods[] = {
7336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeDestructor", "(J)V", (void*)SkPathEffectGlue::destructor }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gComposePathEffectMethods[] = {
7736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeCreate", "(JJ)J", (void*)SkPathEffectGlue::Compose_constructor }
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gSumPathEffectMethods[] = {
8136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeCreate", "(JJ)J", (void*)SkPathEffectGlue::Sum_constructor }
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gDashPathEffectMethods[] = {
8536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeCreate", "([FF)J", (void*)SkPathEffectGlue::Dash_constructor }
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gPathDashPathEffectMethods[] = {
8936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeCreate", "(JFFI)J", (void*)SkPathEffectGlue::OneD_constructor }
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gCornerPathEffectMethods[] = {
9336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeCreate", "(F)J", (void*)SkPathEffectGlue::Corner_constructor }
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gDiscretePathEffectMethods[] = {
9736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeCreate", "(FF)J", (void*)SkPathEffectGlue::Discrete_constructor }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h>
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define REG(env, name, array)                                              \
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = android::AndroidRuntime::registerNativeMethods(env, name, array, \
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                  SK_ARRAY_COUNT(array));  \
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (result < 0) return result
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_graphics_PathEffect(JNIEnv* env)
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result;
1104cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    REG(env, "android/graphics/PathEffect", gPathEffectMethods);
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    REG(env, "android/graphics/ComposePathEffect", gComposePathEffectMethods);
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    REG(env, "android/graphics/SumPathEffect", gSumPathEffectMethods);
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    REG(env, "android/graphics/DashPathEffect", gDashPathEffectMethods);
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    REG(env, "android/graphics/PathDashPathEffect", gPathDashPathEffectMethods);
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    REG(env, "android/graphics/CornerPathEffect", gCornerPathEffectMethods);
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    REG(env, "android/graphics/DiscretePathEffect", gDiscretePathEffectMethods);
1184cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
121