Interpolator.cpp revision 54b6cfa9a9e5b861a9930af873580d6dc20f773c
1#include "jni.h"
2#include <android_runtime/AndroidRuntime.h>
3
4#include "GraphicsJNI.h"
5#include "SkInterpolator.h"
6#include "SkTemplates.h"
7
8static SkInterpolator* Interpolator_constructor(JNIEnv* env, jobject clazz, int valueCount, int frameCount)
9{
10    return new SkInterpolator(valueCount, frameCount);
11}
12
13static void Interpolator_destructor(JNIEnv* env, jobject clazz, SkInterpolator* interp)
14{
15    delete interp;
16}
17
18static void Interpolator_reset(JNIEnv* env, jobject clazz, SkInterpolator* interp, int valueCount, int frameCount)
19{
20    interp->reset(valueCount, frameCount);
21}
22
23static void Interpolator_setKeyFrame(JNIEnv* env, jobject clazz, SkInterpolator* interp, int index, int msec, jfloatArray valueArray, jfloatArray blendArray)
24{
25    SkScalar    blendStorage[4];
26    SkScalar*   blend = NULL;
27
28    AutoJavaFloatArray  autoValues(env, valueArray);
29    float* values = autoValues.ptr();
30    int i, n = autoValues.length();
31
32    SkAutoSTMalloc<16, SkScalar>  storage(n);
33    SkScalar*                     scalars = storage.get();
34
35    for (i = 0; i < n; i++)
36        scalars[i] = SkFloatToScalar(values[i]);
37
38    if (blendArray != NULL) {
39        AutoJavaFloatArray autoBlend(env, blendArray, 4);
40        values = autoBlend.ptr();
41        for (i = 0; i < 4; i++)
42            blendStorage[i] = SkFloatToScalar(values[i]);
43        blend = blendStorage;
44    }
45
46    interp->setKeyFrame(index, msec, scalars, blend);
47}
48
49static void Interpolator_setRepeatMirror(JNIEnv* env, jobject clazz, SkInterpolator* interp, float repeatCount, jboolean mirror)
50{
51    if (repeatCount > 32000)
52        repeatCount = 32000;
53
54    interp->setRepeatCount(SkFloatToScalar(repeatCount));
55    interp->setMirror(mirror != 0);
56}
57
58static int Interpolator_timeToValues(JNIEnv* env, jobject clazz, SkInterpolator* interp, int msec, jfloatArray valueArray)
59{
60    SkInterpolatorBase::Result result;
61
62    float* values = valueArray ? env->GetFloatArrayElements(valueArray, NULL) : NULL;
63    result = interp->timeToValues(msec, (SkScalar*)values);
64
65    if (valueArray) {
66        int n = env->GetArrayLength(valueArray);
67        for (int i = 0; i < n; i++) {
68            values[i] = SkScalarToFloat(*(SkScalar*)&values[i]);
69        }
70        env->ReleaseFloatArrayElements(valueArray, values, 0);
71    }
72
73    return result;
74}
75
76// ----------------------------------------------------------------------------
77
78/*
79 * JNI registration.
80 */
81static JNINativeMethod gInterpolatorMethods[] = {
82    { "nativeConstructor",      "(II)I",        (void*)Interpolator_constructor     },
83    { "nativeDestructor",       "(I)V",         (void*)Interpolator_destructor      },
84    { "nativeReset",            "(III)V",       (void*)Interpolator_reset           },
85    { "nativeSetKeyFrame",      "(III[F[F)V",   (void*)Interpolator_setKeyFrame     },
86    { "nativeSetRepeatMirror",  "(IFZ)V",       (void*)Interpolator_setRepeatMirror },
87    { "nativeTimeToValues",     "(II[F)I",      (void*)Interpolator_timeToValues    }
88};
89
90int register_android_graphics_Interpolator(JNIEnv* env);
91int register_android_graphics_Interpolator(JNIEnv* env)
92{
93    return android::AndroidRuntime::registerNativeMethods(env,
94                                                       "android/graphics/Interpolator",
95                                                       gInterpolatorMethods,
96                                                       SK_ARRAY_COUNT(gInterpolatorMethods));
97}
98