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
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void destructor(JNIEnv* env, jobject, SkPathEffect* effect) {
156062c5912dc79704b489fc8c289b78a400ed05eeDerek Sollenberger        SkSafeUnref(effect);
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static SkPathEffect* Compose_constructor(JNIEnv* env, jobject,
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                   SkPathEffect* outer, SkPathEffect* inner) {
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new SkComposePathEffect(outer, inner);
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
224cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static SkPathEffect* Sum_constructor(JNIEnv* env, jobject,
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  SkPathEffect* first, SkPathEffect* second) {
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new SkSumPathEffect(first, second);
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
274cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static SkPathEffect* Dash_constructor(JNIEnv* env, jobject,
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                      jfloatArray intervalArray, float phase) {
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AutoJavaFloatArray autoInterval(env, intervalArray);
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int     count = autoInterval.length() & ~1;  // even number
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float*  values = autoInterval.ptr();
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkAutoSTMalloc<32, SkScalar>    storage(count);
354cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes        SkScalar*                       intervals = storage.get();
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < count; i++) {
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intervals[i] = SkFloatToScalar(values[i]);
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new SkDashPathEffect(intervals, count, SkFloatToScalar(phase));
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
414cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static SkPathEffect* OneD_constructor(JNIEnv* env, jobject,
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                  const SkPath* shape, float advance, float phase, int style) {
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkASSERT(shape != NULL);
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new SkPath1DPathEffect(*shape, SkFloatToScalar(advance),
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     SkFloatToScalar(phase), (SkPath1DPathEffect::Style)style);
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
484cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static SkPathEffect* Corner_constructor(JNIEnv* env, jobject, float radius){
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new SkCornerPathEffect(SkFloatToScalar(radius));
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
524cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static SkPathEffect* Discrete_constructor(JNIEnv* env, jobject,
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                              float length, float deviation) {
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new SkDiscretePathEffect(SkFloatToScalar(length),
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        SkFloatToScalar(deviation));
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
584cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project////////////////////////////////////////////////////////////////////////////////////////////////////////
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gPathEffectMethods[] = {
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "nativeDestructor", "(I)V", (void*)SkPathEffectGlue::destructor }
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gComposePathEffectMethods[] = {
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "nativeCreate", "(II)I", (void*)SkPathEffectGlue::Compose_constructor }
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gSumPathEffectMethods[] = {
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "nativeCreate", "(II)I", (void*)SkPathEffectGlue::Sum_constructor }
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gDashPathEffectMethods[] = {
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "nativeCreate", "([FF)I", (void*)SkPathEffectGlue::Dash_constructor }
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gPathDashPathEffectMethods[] = {
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "nativeCreate", "(IFFI)I", (void*)SkPathEffectGlue::OneD_constructor }
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gCornerPathEffectMethods[] = {
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "nativeCreate", "(F)I", (void*)SkPathEffectGlue::Corner_constructor }
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gDiscretePathEffectMethods[] = {
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "nativeCreate", "(FF)I", (void*)SkPathEffectGlue::Discrete_constructor }
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h>
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define REG(env, name, array)                                              \
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = android::AndroidRuntime::registerNativeMethods(env, name, array, \
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                  SK_ARRAY_COUNT(array));  \
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (result < 0) return result
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_graphics_PathEffect(JNIEnv* env)
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result;
1014cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    REG(env, "android/graphics/PathEffect", gPathEffectMethods);
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    REG(env, "android/graphics/ComposePathEffect", gComposePathEffectMethods);
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    REG(env, "android/graphics/SumPathEffect", gSumPathEffectMethods);
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    REG(env, "android/graphics/DashPathEffect", gDashPathEffectMethods);
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    REG(env, "android/graphics/PathDashPathEffect", gPathDashPathEffectMethods);
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    REG(env, "android/graphics/CornerPathEffect", gCornerPathEffectMethods);
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    REG(env, "android/graphics/DiscretePathEffect", gDiscretePathEffectMethods);
1094cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
112