19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h"
2ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe#include "core_jni_helpers.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
8a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhatstatic jlong Interpolator_constructor(JNIEnv* env, jobject clazz, jint valueCount, jint frameCount)
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
10a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    return reinterpret_cast<jlong>(new SkInterpolator(valueCount, frameCount));
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhatstatic void Interpolator_destructor(JNIEnv* env, jobject clazz, jlong interpHandle)
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle);
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    delete interp;
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhatstatic void Interpolator_reset(JNIEnv* env, jobject clazz, jlong interpHandle, jint valueCount, jint frameCount)
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
21a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle);
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    interp->reset(valueCount, frameCount);
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhatstatic void Interpolator_setKeyFrame(JNIEnv* env, jobject clazz, jlong interpHandle, jint index, jint msec, jfloatArray valueArray, jfloatArray blendArray)
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
27a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle);
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
292e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III    AutoJavaFloatArray autoValues(env, valueArray);
302e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III    AutoJavaFloatArray autoBlend(env, blendArray, 4);
312e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III#ifdef SK_SCALAR_IS_FLOAT
322e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III    SkScalar* scalars = autoValues.ptr();
332e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III    SkScalar* blend = autoBlend.ptr();
342e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III#else
352e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III    #error Need to convert float array to SkScalar array before calling the following function.
362e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III#endif
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    interp->setKeyFrame(index, msec, scalars, blend);
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhatstatic void Interpolator_setRepeatMirror(JNIEnv* env, jobject clazz, jlong interpHandle, jfloat repeatCount, jboolean mirror)
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
43a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle);
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (repeatCount > 32000)
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        repeatCount = 32000;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
472e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III    interp->setRepeatCount(repeatCount);
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    interp->setMirror(mirror != 0);
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhatstatic jint Interpolator_timeToValues(JNIEnv* env, jobject clazz, jlong interpHandle, jint msec, jfloatArray valueArray)
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
53a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle);
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SkInterpolatorBase::Result result;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float* values = valueArray ? env->GetFloatArrayElements(valueArray, NULL) : NULL;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = interp->timeToValues(msec, (SkScalar*)values);
584cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (valueArray) {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int n = env->GetArrayLength(valueArray);
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < n; i++) {
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values[i] = SkScalarToFloat(*(SkScalar*)&values[i]);
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleaseFloatArrayElements(valueArray, values, 0);
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
664cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes
67a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    return static_cast<jint>(result);
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/*
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration.
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gInterpolatorMethods[] = {
76a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    { "nativeConstructor",      "(II)J",        (void*)Interpolator_constructor     },
77a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    { "nativeDestructor",       "(J)V",         (void*)Interpolator_destructor      },
78a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    { "nativeReset",            "(JII)V",       (void*)Interpolator_reset           },
79a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    { "nativeSetKeyFrame",      "(JII[F[F)V",   (void*)Interpolator_setKeyFrame     },
80a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    { "nativeSetRepeatMirror",  "(JFZ)V",       (void*)Interpolator_setRepeatMirror },
81a2f9042f4eec167bad04ba8923723cd9458699b5Ashok Bhat    { "nativeTimeToValues",     "(JI[F)I",      (void*)Interpolator_timeToValues    }
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_graphics_Interpolator(JNIEnv* env)
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
86ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    return android::RegisterMethodsOrDie(env, "android/graphics/Interpolator",
87ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe                                         gInterpolatorMethods, NELEM(gInterpolatorMethods));
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
89