19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h"
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h>
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "GraphicsJNI.h"
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkInterpolator.h"
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkTemplates.h"
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic SkInterpolator* Interpolator_constructor(JNIEnv* env, jobject clazz, int valueCount, int frameCount)
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return new SkInterpolator(valueCount, frameCount);
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void Interpolator_destructor(JNIEnv* env, jobject clazz, SkInterpolator* interp)
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    delete interp;
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void Interpolator_reset(JNIEnv* env, jobject clazz, SkInterpolator* interp, int valueCount, int frameCount)
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    interp->reset(valueCount, frameCount);
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void Interpolator_setKeyFrame(JNIEnv* env, jobject clazz, SkInterpolator* interp, int index, int msec, jfloatArray valueArray, jfloatArray blendArray)
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SkScalar    blendStorage[4];
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SkScalar*   blend = NULL;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AutoJavaFloatArray  autoValues(env, valueArray);
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float* values = autoValues.ptr();
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int i, n = autoValues.length();
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SkAutoSTMalloc<16, SkScalar>  storage(n);
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SkScalar*                     scalars = storage.get();
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (i = 0; i < n; i++)
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scalars[i] = SkFloatToScalar(values[i]);
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (blendArray != NULL) {
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AutoJavaFloatArray autoBlend(env, blendArray, 4);
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        values = autoBlend.ptr();
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i = 0; i < 4; i++)
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            blendStorage[i] = SkFloatToScalar(values[i]);
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        blend = blendStorage;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    interp->setKeyFrame(index, msec, scalars, blend);
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void Interpolator_setRepeatMirror(JNIEnv* env, jobject clazz, SkInterpolator* interp, float repeatCount, jboolean mirror)
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (repeatCount > 32000)
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        repeatCount = 32000;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    interp->setRepeatCount(SkFloatToScalar(repeatCount));
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    interp->setMirror(mirror != 0);
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int Interpolator_timeToValues(JNIEnv* env, jobject clazz, SkInterpolator* interp, int msec, jfloatArray valueArray)
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SkInterpolatorBase::Result result;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float* values = valueArray ? env->GetFloatArrayElements(valueArray, NULL) : NULL;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = interp->timeToValues(msec, (SkScalar*)values);
644cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (valueArray) {
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int n = env->GetArrayLength(valueArray);
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < n; i++) {
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values[i] = SkScalarToFloat(*(SkScalar*)&values[i]);
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleaseFloatArrayElements(valueArray, values, 0);
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
724cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return result;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration.
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gInterpolatorMethods[] = {
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "nativeConstructor",      "(II)I",        (void*)Interpolator_constructor     },
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "nativeDestructor",       "(I)V",         (void*)Interpolator_destructor      },
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "nativeReset",            "(III)V",       (void*)Interpolator_reset           },
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "nativeSetKeyFrame",      "(III[F[F)V",   (void*)Interpolator_setKeyFrame     },
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "nativeSetRepeatMirror",  "(IFZ)V",       (void*)Interpolator_setRepeatMirror },
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "nativeTimeToValues",     "(II[F)I",      (void*)Interpolator_timeToValues    }
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_graphics_Interpolator(JNIEnv* env)
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return android::AndroidRuntime::registerNativeMethods(env,
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                       "android/graphics/Interpolator",
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                       gInterpolatorMethods,
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                       SK_ARRAY_COUNT(gInterpolatorMethods));
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
97