Interpolator.cpp revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
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); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 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 } 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 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 Projectint register_android_graphics_Interpolator(JNIEnv* env) 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return android::AndroidRuntime::registerNativeMethods(env, 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android/graphics/Interpolator", 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gInterpolatorMethods, 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SK_ARRAY_COUNT(gInterpolatorMethods)); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 98