[go: nahoru, domu]

android_view_RenderNodeAnimator.cpp revision e45b1fd03b524d2b57cc6c222d89076a31a08bea
1/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "OpenGLRenderer"
18
19#include "android_view_RenderNodeAnimator.h"
20
21#include "jni.h"
22#include "GraphicsJNI.h"
23#include <nativehelper/JNIHelp.h>
24#include <android_runtime/AndroidRuntime.h>
25
26#include <Animator.h>
27#include <Interpolator.h>
28#include <RenderProperties.h>
29
30namespace android {
31
32using namespace uirenderer;
33
34static struct {
35    jclass clazz;
36
37    jmethodID callOnFinished;
38} gRenderNodeAnimatorClassInfo;
39
40static JNIEnv* getEnv(JavaVM* vm) {
41    JNIEnv* env;
42    if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
43        return 0;
44    }
45    return env;
46}
47
48RenderNodeAnimator::RenderNodeAnimator(JNIEnv* env, jobject weakThis,
49                RenderProperty property, DeltaValueType deltaType, float delta)
50        : RenderPropertyAnimator(property, deltaType, delta) {
51    mWeakThis = env->NewGlobalRef(weakThis);
52    env->GetJavaVM(&mJvm);
53}
54
55RenderNodeAnimator::~RenderNodeAnimator() {
56    JNIEnv* env = getEnv(mJvm);
57    env->DeleteGlobalRef(mWeakThis);
58    mWeakThis = NULL;
59}
60
61void RenderNodeAnimator::callOnFinished() {
62    JNIEnv* env = getEnv(mJvm);
63    env->CallStaticVoidMethod(
64            gRenderNodeAnimatorClassInfo.clazz,
65            gRenderNodeAnimatorClassInfo.callOnFinished,
66            mWeakThis);
67}
68
69static jlong createAnimator(JNIEnv* env, jobject clazz, jobject weakThis,
70        jint property, jint deltaType, jfloat deltaValue) {
71    LOG_ALWAYS_FATAL_IF(property < 0 || property > RenderNodeAnimator::ALPHA,
72            "Invalid property %d", property);
73    LOG_ALWAYS_FATAL_IF(deltaType != RenderPropertyAnimator::DELTA
74            && deltaType != RenderPropertyAnimator::ABSOLUTE,
75            "Invalid delta type %d", deltaType);
76
77    RenderNodeAnimator* animator = new RenderNodeAnimator(env, weakThis,
78            static_cast<RenderPropertyAnimator::RenderProperty>(property),
79            static_cast<RenderPropertyAnimator::DeltaValueType>(deltaType),
80            deltaValue);
81    animator->incStrong(0);
82    return reinterpret_cast<jlong>( animator );
83}
84
85static void setDuration(JNIEnv* env, jobject clazz, jlong animatorPtr, jint duration) {
86    LOG_ALWAYS_FATAL_IF(duration < 0, "Duration cannot be negative");
87    RenderNodeAnimator* animator = reinterpret_cast<RenderNodeAnimator*>(animatorPtr);
88    animator->setDuration(duration);
89}
90
91static void unref(JNIEnv* env, jobject clazz, jlong objPtr) {
92    VirtualLightRefBase* obj = reinterpret_cast<VirtualLightRefBase*>(objPtr);
93    obj->decStrong(0);
94}
95
96// ----------------------------------------------------------------------------
97// JNI Glue
98// ----------------------------------------------------------------------------
99
100const char* const kClassPathName = "android/view/RenderNodeAnimator";
101
102static JNINativeMethod gMethods[] = {
103    { "nCreateAnimator", "(Ljava/lang/ref/WeakReference;IIF)J", (void*) createAnimator },
104    { "nSetDuration", "(JI)V", (void*) setDuration },
105    { "nUnref", "(J)V", (void*) unref },
106};
107
108#define FIND_CLASS(var, className) \
109        var = env->FindClass(className); \
110        LOG_FATAL_IF(! var, "Unable to find class " className);
111
112#define GET_STATIC_METHOD_ID(var, clazz, methodName, methodDescriptor) \
113        var = env->GetStaticMethodID(clazz, methodName, methodDescriptor); \
114        LOG_FATAL_IF(! var, "Unable to find method " methodName);
115
116int register_android_view_RenderNodeAnimator(JNIEnv* env) {
117    FIND_CLASS(gRenderNodeAnimatorClassInfo.clazz, kClassPathName);
118    gRenderNodeAnimatorClassInfo.clazz = jclass(env->NewGlobalRef(gRenderNodeAnimatorClassInfo.clazz));
119
120    GET_STATIC_METHOD_ID(gRenderNodeAnimatorClassInfo.callOnFinished, gRenderNodeAnimatorClassInfo.clazz,
121            "callOnFinished", "(Ljava/lang/ref/WeakReference;)V");
122
123    return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
124}
125
126
127} // namespace android
128