1315c329544d7c593d1072b071cbb92d9afe74021John Reck/*
2315c329544d7c593d1072b071cbb92d9afe74021John Reck * Copyright (C) 2014 The Android Open Source Project
3315c329544d7c593d1072b071cbb92d9afe74021John Reck *
4315c329544d7c593d1072b071cbb92d9afe74021John Reck * Licensed under the Apache License, Version 2.0 (the "License");
5315c329544d7c593d1072b071cbb92d9afe74021John Reck * you may not use this file except in compliance with the License.
6315c329544d7c593d1072b071cbb92d9afe74021John Reck * You may obtain a copy of the License at
7315c329544d7c593d1072b071cbb92d9afe74021John Reck *
8315c329544d7c593d1072b071cbb92d9afe74021John Reck *      http://www.apache.org/licenses/LICENSE-2.0
9315c329544d7c593d1072b071cbb92d9afe74021John Reck *
10315c329544d7c593d1072b071cbb92d9afe74021John Reck * Unless required by applicable law or agreed to in writing, software
11315c329544d7c593d1072b071cbb92d9afe74021John Reck * distributed under the License is distributed on an "AS IS" BASIS,
12315c329544d7c593d1072b071cbb92d9afe74021John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13315c329544d7c593d1072b071cbb92d9afe74021John Reck * See the License for the specific language governing permissions and
14315c329544d7c593d1072b071cbb92d9afe74021John Reck * limitations under the License.
15315c329544d7c593d1072b071cbb92d9afe74021John Reck */
16315c329544d7c593d1072b071cbb92d9afe74021John Reck
17315c329544d7c593d1072b071cbb92d9afe74021John Reck#define LOG_TAG "OpenGLRenderer"
18315c329544d7c593d1072b071cbb92d9afe74021John Reck
19315c329544d7c593d1072b071cbb92d9afe74021John Reck#include "jni.h"
20315c329544d7c593d1072b071cbb92d9afe74021John Reck#include <nativehelper/JNIHelp.h>
219e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liu#include <cutils/log.h>
22ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe#include "core_jni_helpers.h"
23315c329544d7c593d1072b071cbb92d9afe74021John Reck
24315c329544d7c593d1072b071cbb92d9afe74021John Reck#include <Interpolator.h>
25315c329544d7c593d1072b071cbb92d9afe74021John Reck
26315c329544d7c593d1072b071cbb92d9afe74021John Recknamespace android {
27315c329544d7c593d1072b071cbb92d9afe74021John Reck
28315c329544d7c593d1072b071cbb92d9afe74021John Reckusing namespace uirenderer;
29315c329544d7c593d1072b071cbb92d9afe74021John Reck
30315c329544d7c593d1072b071cbb92d9afe74021John Reckstatic jlong createAccelerateDecelerateInterpolator(JNIEnv* env, jobject clazz) {
31315c329544d7c593d1072b071cbb92d9afe74021John Reck    return reinterpret_cast<jlong>(new AccelerateDecelerateInterpolator());
32315c329544d7c593d1072b071cbb92d9afe74021John Reck}
33315c329544d7c593d1072b071cbb92d9afe74021John Reck
34c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckstatic jlong createAccelerateInterpolator(JNIEnv* env, jobject clazz, jfloat factor) {
35c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    return reinterpret_cast<jlong>(new AccelerateInterpolator(factor));
36c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck}
37c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck
38c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckstatic jlong createAnticipateInterpolator(JNIEnv* env, jobject clazz, jfloat tension) {
39c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    return reinterpret_cast<jlong>(new AnticipateInterpolator(tension));
40c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck}
41c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck
42c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckstatic jlong createAnticipateOvershootInterpolator(JNIEnv* env, jobject clazz, jfloat tension) {
43c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    return reinterpret_cast<jlong>(new AnticipateOvershootInterpolator(tension));
44c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck}
45c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck
46c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckstatic jlong createBounceInterpolator(JNIEnv* env, jobject clazz) {
47c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    return reinterpret_cast<jlong>(new BounceInterpolator());
48c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck}
49c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck
50c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckstatic jlong createCycleInterpolator(JNIEnv* env, jobject clazz, jfloat cycles) {
51c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    return reinterpret_cast<jlong>(new CycleInterpolator(cycles));
52c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck}
53c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck
54c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckstatic jlong createDecelerateInterpolator(JNIEnv* env, jobject clazz, jfloat factor) {
55c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    return reinterpret_cast<jlong>(new DecelerateInterpolator(factor));
56c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck}
57c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck
58c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckstatic jlong createLinearInterpolator(JNIEnv* env, jobject clazz) {
59c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    return reinterpret_cast<jlong>(new LinearInterpolator());
60c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck}
61c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck
62c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckstatic jlong createOvershootInterpolator(JNIEnv* env, jobject clazz, jfloat tension) {
63c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    return reinterpret_cast<jlong>(new OvershootInterpolator(tension));
64c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck}
65c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck
669e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liustatic jlong createPathInterpolator(JNIEnv* env, jobject clazz, jfloatArray jX, jfloatArray jY) {
679e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liu    jsize lenX = env->GetArrayLength(jX);
689e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liu    jsize lenY = env->GetArrayLength(jY);
699e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liu    LOG_ALWAYS_FATAL_IF(lenX != lenY || lenX <= 0, "Invalid path interpolator, x size: %d,"
709e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liu            " y size: %d", lenX, lenY);
719e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liu    std::vector<float> x(lenX);
729e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liu    std::vector<float> y(lenY);
739e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liu    env->GetFloatArrayRegion(jX, 0, lenX, x.data());
749e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liu    env->GetFloatArrayRegion(jY, 0, lenX, y.data());
759e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liu
769e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liu    return reinterpret_cast<jlong>(new PathInterpolator(std::move(x), std::move(y)));
779e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liu}
789e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liu
79315c329544d7c593d1072b071cbb92d9afe74021John Reckstatic jlong createLutInterpolator(JNIEnv* env, jobject clazz, jfloatArray jlut) {
80315c329544d7c593d1072b071cbb92d9afe74021John Reck    jsize len = env->GetArrayLength(jlut);
81315c329544d7c593d1072b071cbb92d9afe74021John Reck    if (len <= 0) {
82315c329544d7c593d1072b071cbb92d9afe74021John Reck        return 0;
83315c329544d7c593d1072b071cbb92d9afe74021John Reck    }
84315c329544d7c593d1072b071cbb92d9afe74021John Reck    float* lut = new float[len];
85315c329544d7c593d1072b071cbb92d9afe74021John Reck    env->GetFloatArrayRegion(jlut, 0, len, lut);
86315c329544d7c593d1072b071cbb92d9afe74021John Reck    return reinterpret_cast<jlong>(new LUTInterpolator(lut, len));
87315c329544d7c593d1072b071cbb92d9afe74021John Reck}
88315c329544d7c593d1072b071cbb92d9afe74021John Reck
89315c329544d7c593d1072b071cbb92d9afe74021John Reck// ----------------------------------------------------------------------------
90315c329544d7c593d1072b071cbb92d9afe74021John Reck// JNI Glue
91315c329544d7c593d1072b071cbb92d9afe74021John Reck// ----------------------------------------------------------------------------
92315c329544d7c593d1072b071cbb92d9afe74021John Reck
93315c329544d7c593d1072b071cbb92d9afe74021John Reckconst char* const kClassPathName = "com/android/internal/view/animation/NativeInterpolatorFactoryHelper";
94315c329544d7c593d1072b071cbb92d9afe74021John Reck
9576f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = {
96315c329544d7c593d1072b071cbb92d9afe74021John Reck    { "createAccelerateDecelerateInterpolator", "()J", (void*) createAccelerateDecelerateInterpolator },
97c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    { "createAccelerateInterpolator", "(F)J", (void*) createAccelerateInterpolator },
98c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    { "createAnticipateInterpolator", "(F)J", (void*) createAnticipateInterpolator },
99c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    { "createAnticipateOvershootInterpolator", "(F)J", (void*) createAnticipateOvershootInterpolator },
100c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    { "createBounceInterpolator", "()J", (void*) createBounceInterpolator },
101c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    { "createCycleInterpolator", "(F)J", (void*) createCycleInterpolator },
102c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    { "createDecelerateInterpolator", "(F)J", (void*) createDecelerateInterpolator },
103c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    { "createLinearInterpolator", "()J", (void*) createLinearInterpolator },
104c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    { "createOvershootInterpolator", "(F)J", (void*) createOvershootInterpolator },
1059e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liu    { "createPathInterpolator", "([F[F)J", (void*) createPathInterpolator },
106315c329544d7c593d1072b071cbb92d9afe74021John Reck    { "createLutInterpolator", "([F)J", (void*) createLutInterpolator },
107315c329544d7c593d1072b071cbb92d9afe74021John Reck};
108315c329544d7c593d1072b071cbb92d9afe74021John Reck
109315c329544d7c593d1072b071cbb92d9afe74021John Reckint register_com_android_internal_view_animation_NativeInterpolatorFactoryHelper(JNIEnv* env) {
110ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
111315c329544d7c593d1072b071cbb92d9afe74021John Reck}
112315c329544d7c593d1072b071cbb92d9afe74021John Reck
113315c329544d7c593d1072b071cbb92d9afe74021John Reck
114315c329544d7c593d1072b071cbb92d9afe74021John Reck} // namespace android
115