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