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