19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "GraphicsJNI.h"
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkInterpolator.h"
360126efd7d905ca24822765c6dafac17fef278abBen Wagner#include "core_jni_helpers.h"
460126efd7d905ca24822765c6dafac17fef278abBen Wagner
560126efd7d905ca24822765c6dafac17fef278abBen Wagner#include <jni.h>
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhatstatic jlong Interpolator_constructor(JNIEnv* env, jobject clazz, jint valueCount, jint frameCount)
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
9a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    return reinterpret_cast<jlong>(new SkInterpolator(valueCount, frameCount));
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhatstatic void Interpolator_destructor(JNIEnv* env, jobject clazz, jlong interpHandle)
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle);
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    delete interp;
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhatstatic void Interpolator_reset(JNIEnv* env, jobject clazz, jlong interpHandle, jint valueCount, jint frameCount)
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
20a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle);
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    interp->reset(valueCount, frameCount);
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhatstatic void Interpolator_setKeyFrame(JNIEnv* env, jobject clazz, jlong interpHandle, jint index, jint msec, jfloatArray valueArray, jfloatArray blendArray)
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
26a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle);
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
282e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III    AutoJavaFloatArray autoValues(env, valueArray);
292e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III    AutoJavaFloatArray autoBlend(env, blendArray, 4);
302e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III#ifdef SK_SCALAR_IS_FLOAT
312e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III    SkScalar* scalars = autoValues.ptr();
322e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III    SkScalar* blend = autoBlend.ptr();
332e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III#else
342e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III    #error Need to convert float array to SkScalar array before calling the following function.
352e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III#endif
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    interp->setKeyFrame(index, msec, scalars, blend);
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhatstatic void Interpolator_setRepeatMirror(JNIEnv* env, jobject clazz, jlong interpHandle, jfloat repeatCount, jboolean mirror)
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
42a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle);
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (repeatCount > 32000)
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        repeatCount = 32000;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
462e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III    interp->setRepeatCount(repeatCount);
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    interp->setMirror(mirror != 0);
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhatstatic jint Interpolator_timeToValues(JNIEnv* env, jobject clazz, jlong interpHandle, jint msec, jfloatArray valueArray)
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
52a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle);
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SkInterpolatorBase::Result result;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float* values = valueArray ? env->GetFloatArrayElements(valueArray, NULL) : NULL;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = interp->timeToValues(msec, (SkScalar*)values);
574cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (valueArray) {
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int n = env->GetArrayLength(valueArray);
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < n; i++) {
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values[i] = SkScalarToFloat(*(SkScalar*)&values[i]);
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleaseFloatArrayElements(valueArray, values, 0);
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
654cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
66a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    return static_cast<jint>(result);
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration.
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
7476f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gInterpolatorMethods[] = {
75a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    { "nativeConstructor",      "(II)J",        (void*)Interpolator_constructor     },
76a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    { "nativeDestructor",       "(J)V",         (void*)Interpolator_destructor      },
77a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    { "nativeReset",            "(JII)V",       (void*)Interpolator_reset           },
78a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    { "nativeSetKeyFrame",      "(JII[F[F)V",   (void*)Interpolator_setKeyFrame     },
79a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    { "nativeSetRepeatMirror",  "(JFZ)V",       (void*)Interpolator_setRepeatMirror },
80a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    { "nativeTimeToValues",     "(JI[F)I",      (void*)Interpolator_timeToValues    }
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_graphics_Interpolator(JNIEnv* env)
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
85ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    return android::RegisterMethodsOrDie(env, "android/graphics/Interpolator",
86ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe                                         gInterpolatorMethods, NELEM(gInterpolatorMethods));
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
88