PathEffect.cpp revision c9e22e9affec97a8c68f838de29dc7f685d9247b
10b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#include <jni.h>
20b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#include "GraphicsJNI.h"
30b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
40b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#include "SkPathEffect.h"
50b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#include "SkCornerPathEffect.h"
60b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#include "SkDashPathEffect.h"
70b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#include "SkDiscretePathEffect.h"
80b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#include "Sk1DPathEffect.h"
90b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#include "SkTemplates.h"
100b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
110b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass SkPathEffectGlue {
120b167267bda99b68346045ccab14e810121d5de4Glenn Kastenpublic:
130b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
140b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    static void destructor(JNIEnv* env, jobject, SkPathEffect* effect) {
150b167267bda99b68346045ccab14e810121d5de4Glenn Kasten        SkSafeUnref(effect);
160b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    }
170b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    static SkPathEffect* Compose_constructor(JNIEnv* env, jobject,
19979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten                                   SkPathEffect* outer, SkPathEffect* inner) {
20979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten        return new SkComposePathEffect(outer, inner);
21ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
22daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten
23daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten    static SkPathEffect* Sum_constructor(JNIEnv* env, jobject,
240b167267bda99b68346045ccab14e810121d5de4Glenn Kasten                                  SkPathEffect* first, SkPathEffect* second) {
25ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        return new SkSumPathEffect(first, second);
26ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
277a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
28ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    static SkPathEffect* Dash_constructor(JNIEnv* env, jobject,
29ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                                      jfloatArray intervalArray, float phase) {
30ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        AutoJavaFloatArray autoInterval(env, intervalArray);
31ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        int     count = autoInterval.length() & ~1;  // even number
32ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        float*  values = autoInterval.ptr();
33ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
34ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SkAutoSTMalloc<32, SkScalar>    storage(count);
35ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SkScalar*                       intervals = storage.get();
36ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        for (int i = 0; i < count; i++) {
37ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            intervals[i] = SkFloatToScalar(values[i]);
38ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
39ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        return new SkDashPathEffect(intervals, count, SkFloatToScalar(phase));
40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
41ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
42ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    static SkPathEffect* OneD_constructor(JNIEnv* env, jobject,
43ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                  const SkPath* shape, float advance, float phase, int style) {
44ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SkASSERT(shape != NULL);
45ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        return new SkPath1DPathEffect(*shape, SkFloatToScalar(advance),
467a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten                     SkFloatToScalar(phase), (SkPath1DPathEffect::Style)style);
477a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    }
487a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
49ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    static SkPathEffect* Corner_constructor(JNIEnv* env, jobject, float radius){
50ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        return new SkCornerPathEffect(SkFloatToScalar(radius));
510b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    }
520b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
53ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    static SkPathEffect* Discrete_constructor(JNIEnv* env, jobject,
54daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten                                              float length, float deviation) {
55daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten        return new SkDiscretePathEffect(SkFloatToScalar(length),
560b167267bda99b68346045ccab14e810121d5de4Glenn Kasten                                        SkFloatToScalar(deviation));
57ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
58ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
597a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten};
60ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
61ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten////////////////////////////////////////////////////////////////////////////////////////////////////////
62ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
63ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenstatic JNINativeMethod gPathEffectMethods[] = {
64ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    { "nativeDestructor", "(I)V", (void*)SkPathEffectGlue::destructor }
65ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten};
66ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
67ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenstatic JNINativeMethod gComposePathEffectMethods[] = {
68ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    { "nativeCreate", "(II)I", (void*)SkPathEffectGlue::Compose_constructor }
69ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten};
70ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
71ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenstatic JNINativeMethod gSumPathEffectMethods[] = {
72ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    { "nativeCreate", "(II)I", (void*)SkPathEffectGlue::Sum_constructor }
73ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten};
74ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
75ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenstatic JNINativeMethod gDashPathEffectMethods[] = {
76ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    { "nativeCreate", "([FF)I", (void*)SkPathEffectGlue::Dash_constructor }
77ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten};
787a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
797a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kastenstatic JNINativeMethod gPathDashPathEffectMethods[] = {
807a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    { "nativeCreate", "(IFFI)I", (void*)SkPathEffectGlue::OneD_constructor }
81ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten};
82ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
830b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic JNINativeMethod gCornerPathEffectMethods[] = {
840b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    { "nativeCreate", "(F)I", (void*)SkPathEffectGlue::Corner_constructor }
85ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten};
860b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
870b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic JNINativeMethod gDiscretePathEffectMethods[] = {
880b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    { "nativeCreate", "(FF)I", (void*)SkPathEffectGlue::Discrete_constructor }
890b167267bda99b68346045ccab14e810121d5de4Glenn Kasten};
90ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
91ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#include <android_runtime/AndroidRuntime.h>
92ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
93ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#define REG(env, name, array)                                              \
94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    result = android::AndroidRuntime::registerNativeMethods(env, name, array, \
95ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                                                  SK_ARRAY_COUNT(array));  \
96ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (result < 0) return result
97ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
98ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenint register_android_graphics_PathEffect(JNIEnv* env);
99ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenint register_android_graphics_PathEffect(JNIEnv* env)
100ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten{
101ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    int result;
102ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
103ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    REG(env, "android/graphics/PathEffect", gPathEffectMethods);
104ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    REG(env, "android/graphics/ComposePathEffect", gComposePathEffectMethods);
105ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    REG(env, "android/graphics/SumPathEffect", gSumPathEffectMethods);
106ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    REG(env, "android/graphics/DashPathEffect", gDashPathEffectMethods);
107b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten    REG(env, "android/graphics/PathDashPathEffect", gPathDashPathEffectMethods);
108ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    REG(env, "android/graphics/CornerPathEffect", gCornerPathEffectMethods);
109daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten    REG(env, "android/graphics/DiscretePathEffect", gDiscretePathEffectMethods);
110ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
111ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    return 0;
112ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten}
113ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
114ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten