19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "GraphicsJNI.h"
260126efd7d905ca24822765c6dafac17fef278abBen Wagner#include "Sk1DPathEffect.h"
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkCornerPathEffect.h"
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkDashPathEffect.h"
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkDiscretePathEffect.h"
660126efd7d905ca24822765c6dafac17fef278abBen Wagner#include "SkPathEffect.h"
760126efd7d905ca24822765c6dafac17fef278abBen Wagner#include "core_jni_helpers.h"
860126efd7d905ca24822765c6dafac17fef278abBen Wagner
960126efd7d905ca24822765c6dafac17fef278abBen Wagner#include <jni.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
7276f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gPathEffectMethods[] = {
7336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeDestructor", "(J)V", (void*)SkPathEffectGlue::destructor }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7676f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gComposePathEffectMethods[] = {
7736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeCreate", "(JJ)J", (void*)SkPathEffectGlue::Compose_constructor }
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8076f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gSumPathEffectMethods[] = {
8136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeCreate", "(JJ)J", (void*)SkPathEffectGlue::Sum_constructor }
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8476f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gDashPathEffectMethods[] = {
8536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeCreate", "([FF)J", (void*)SkPathEffectGlue::Dash_constructor }
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8876f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gPathDashPathEffectMethods[] = {
8936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeCreate", "(JFFI)J", (void*)SkPathEffectGlue::OneD_constructor }
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9276f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gCornerPathEffectMethods[] = {
9336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nativeCreate", "(F)J", (void*)SkPathEffectGlue::Corner_constructor }
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9676f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const 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 Projectint register_android_graphics_PathEffect(JNIEnv* env)
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
102ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    android::RegisterMethodsOrDie(env, "android/graphics/PathEffect", gPathEffectMethods,
103ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe                         NELEM(gPathEffectMethods));
104ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    android::RegisterMethodsOrDie(env, "android/graphics/ComposePathEffect",
105ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe                                  gComposePathEffectMethods, NELEM(gComposePathEffectMethods));
106ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    android::RegisterMethodsOrDie(env, "android/graphics/SumPathEffect", gSumPathEffectMethods,
107ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe                                  NELEM(gSumPathEffectMethods));
108ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    android::RegisterMethodsOrDie(env, "android/graphics/DashPathEffect", gDashPathEffectMethods,
109ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe                                  NELEM(gDashPathEffectMethods));
110ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    android::RegisterMethodsOrDie(env, "android/graphics/PathDashPathEffect",
111ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe                                  gPathDashPathEffectMethods, NELEM(gPathDashPathEffectMethods));
112ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    android::RegisterMethodsOrDie(env, "android/graphics/CornerPathEffect",
113ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe                                  gCornerPathEffectMethods, NELEM(gCornerPathEffectMethods));
114ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    android::RegisterMethodsOrDie(env, "android/graphics/DiscretePathEffect",
115ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe                                  gDiscretePathEffectMethods, NELEM(gDiscretePathEffectMethods));
1164cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
119