1#include <jni.h>
2#include "GraphicsJNI.h"
3
4#include "SkPathEffect.h"
5#include "SkCornerPathEffect.h"
6#include "SkDashPathEffect.h"
7#include "SkDiscretePathEffect.h"
8#include "Sk1DPathEffect.h"
9#include "SkTemplates.h"
10
11class SkPathEffectGlue {
12public:
13
14    static void destructor(JNIEnv* env, jobject, SkPathEffect* effect) {
15        SkSafeUnref(effect);
16    }
17
18    static SkPathEffect* Compose_constructor(JNIEnv* env, jobject,
19                                   SkPathEffect* outer, SkPathEffect* inner) {
20        return new SkComposePathEffect(outer, inner);
21    }
22
23    static SkPathEffect* Sum_constructor(JNIEnv* env, jobject,
24                                  SkPathEffect* first, SkPathEffect* second) {
25        return new SkSumPathEffect(first, second);
26    }
27
28    static SkPathEffect* Dash_constructor(JNIEnv* env, jobject,
29                                      jfloatArray intervalArray, float phase) {
30        AutoJavaFloatArray autoInterval(env, intervalArray);
31        int     count = autoInterval.length() & ~1;  // even number
32        float*  values = autoInterval.ptr();
33
34        SkAutoSTMalloc<32, SkScalar>    storage(count);
35        SkScalar*                       intervals = storage.get();
36        for (int i = 0; i < count; i++) {
37            intervals[i] = SkFloatToScalar(values[i]);
38        }
39        return new SkDashPathEffect(intervals, count, SkFloatToScalar(phase));
40    }
41
42    static SkPathEffect* OneD_constructor(JNIEnv* env, jobject,
43                  const SkPath* shape, float advance, float phase, int style) {
44        SkASSERT(shape != NULL);
45        return new SkPath1DPathEffect(*shape, SkFloatToScalar(advance),
46                     SkFloatToScalar(phase), (SkPath1DPathEffect::Style)style);
47    }
48
49    static SkPathEffect* Corner_constructor(JNIEnv* env, jobject, float radius){
50        return new SkCornerPathEffect(SkFloatToScalar(radius));
51    }
52
53    static SkPathEffect* Discrete_constructor(JNIEnv* env, jobject,
54                                              float length, float deviation) {
55        return new SkDiscretePathEffect(SkFloatToScalar(length),
56                                        SkFloatToScalar(deviation));
57    }
58
59};
60
61////////////////////////////////////////////////////////////////////////////////////////////////////////
62
63static JNINativeMethod gPathEffectMethods[] = {
64    { "nativeDestructor", "(I)V", (void*)SkPathEffectGlue::destructor }
65};
66
67static JNINativeMethod gComposePathEffectMethods[] = {
68    { "nativeCreate", "(II)I", (void*)SkPathEffectGlue::Compose_constructor }
69};
70
71static JNINativeMethod gSumPathEffectMethods[] = {
72    { "nativeCreate", "(II)I", (void*)SkPathEffectGlue::Sum_constructor }
73};
74
75static JNINativeMethod gDashPathEffectMethods[] = {
76    { "nativeCreate", "([FF)I", (void*)SkPathEffectGlue::Dash_constructor }
77};
78
79static JNINativeMethod gPathDashPathEffectMethods[] = {
80    { "nativeCreate", "(IFFI)I", (void*)SkPathEffectGlue::OneD_constructor }
81};
82
83static JNINativeMethod gCornerPathEffectMethods[] = {
84    { "nativeCreate", "(F)I", (void*)SkPathEffectGlue::Corner_constructor }
85};
86
87static JNINativeMethod gDiscretePathEffectMethods[] = {
88    { "nativeCreate", "(FF)I", (void*)SkPathEffectGlue::Discrete_constructor }
89};
90
91#include <android_runtime/AndroidRuntime.h>
92
93#define REG(env, name, array)                                              \
94    result = android::AndroidRuntime::registerNativeMethods(env, name, array, \
95                                                  SK_ARRAY_COUNT(array));  \
96    if (result < 0) return result
97
98int register_android_graphics_PathEffect(JNIEnv* env)
99{
100    int result;
101
102    REG(env, "android/graphics/PathEffect", gPathEffectMethods);
103    REG(env, "android/graphics/ComposePathEffect", gComposePathEffectMethods);
104    REG(env, "android/graphics/SumPathEffect", gSumPathEffectMethods);
105    REG(env, "android/graphics/DashPathEffect", gDashPathEffectMethods);
106    REG(env, "android/graphics/PathDashPathEffect", gPathDashPathEffectMethods);
107    REG(env, "android/graphics/CornerPathEffect", gCornerPathEffectMethods);
108    REG(env, "android/graphics/DiscretePathEffect", gDiscretePathEffectMethods);
109
110    return 0;
111}
112