Animator.cpp revision e45b1fd03b524d2b57cc6c222d89076a31a08bea
1e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck/*
2e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * Copyright (C) 2014 The Android Open Source Project
3e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck *
4e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * Licensed under the Apache License, Version 2.0 (the "License");
5e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * you may not use this file except in compliance with the License.
6e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * You may obtain a copy of the License at
7e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck *
8e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck *      http://www.apache.org/licenses/LICENSE-2.0
9e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck *
10e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * Unless required by applicable law or agreed to in writing, software
11e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * distributed under the License is distributed on an "AS IS" BASIS,
12e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * See the License for the specific language governing permissions and
14e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * limitations under the License.
15e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck */
16e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
17e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#define LOG_TAG "RT-Animator"
18e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
19e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include "Animator.h"
20e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
21e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <set>
22e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
23e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include "RenderProperties.h"
24e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
25e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Recknamespace android {
26e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Recknamespace uirenderer {
27e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
28e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck/************************************************************
29e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck *  Private header
30e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck ************************************************************/
31e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
32e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Recktypedef void (RenderProperties::*SetFloatProperty)(float value);
33e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Recktypedef float (RenderProperties::*GetFloatProperty)() const;
34e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
35e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckstruct PropertyAccessors {
36e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    GetFloatProperty getter;
37e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    SetFloatProperty setter;
38e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck};
39e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
40e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// Maps RenderProperty enum to accessors
41e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckstatic const PropertyAccessors PROPERTY_ACCESSOR_LUT[] = {
42e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    {&RenderProperties::getTranslationX, &RenderProperties::setTranslationX },
43e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    {&RenderProperties::getTranslationY, &RenderProperties::setTranslationY },
44e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    {&RenderProperties::getTranslationZ, &RenderProperties::setTranslationZ },
45e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    {&RenderProperties::getScaleX, &RenderProperties::setScaleX },
46e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    {&RenderProperties::getScaleY, &RenderProperties::setScaleY },
47e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    {&RenderProperties::getRotation, &RenderProperties::setRotation },
48e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    {&RenderProperties::getRotationX, &RenderProperties::setRotationX },
49e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    {&RenderProperties::getRotationY, &RenderProperties::setRotationY },
50e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    {&RenderProperties::getX, &RenderProperties::setX },
51e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    {&RenderProperties::getY, &RenderProperties::setY },
52e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    {&RenderProperties::getZ, &RenderProperties::setZ },
53e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    {&RenderProperties::getAlpha, &RenderProperties::setAlpha },
54e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck};
55e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
56e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// Helper class to contain generic animator helpers
57e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass BaseAnimator {
58e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic:
59e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    BaseAnimator();
60e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    virtual ~BaseAnimator();
61e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
62e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    void setInterpolator(Interpolator* interpolator);
63e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    void setDuration(nsecs_t durationInMs);
64e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
65e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    bool isFinished() { return mPlayState == FINISHED; }
66e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
67e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprotected:
68e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    // This is the main animation entrypoint that subclasses should call
69e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    // to generate the onAnimation* lifecycle events
70e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    // Returns true if the animation has finished, false otherwise
71e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    bool animateFrame(nsecs_t frameTime);
72e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
73e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    // Called when PlayState switches from PENDING to RUNNING
74e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    virtual void onAnimationStarted() {}
75e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    virtual void onAnimationUpdated(float fraction) = 0;
76e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    virtual void onAnimationFinished() {}
77e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
78e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprivate:
79e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    enum PlayState {
80e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        PENDING,
81e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        RUNNING,
82e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        FINISHED,
83e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    };
84e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
85e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    Interpolator* mInterpolator;
86e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    PlayState mPlayState;
87e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    long mStartTime;
88e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    long mDuration;
89e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck};
90e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
91e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// Hide the base classes & private bits from the exported RenderPropertyAnimator
92e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// in this Impl class so that subclasses of RenderPropertyAnimator don't require
93e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// knowledge of the inner guts but only the public virtual methods.
94e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// Animates a single property
95e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass RenderPropertyAnimatorImpl : public BaseAnimator {
96e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic:
97e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    RenderPropertyAnimatorImpl(GetFloatProperty getter, SetFloatProperty setter,
98e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck            RenderPropertyAnimator::DeltaValueType deltaType, float delta);
99e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    ~RenderPropertyAnimatorImpl();
100e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
101e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    bool animate(RenderProperties* target, TreeInfo& info);
102e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
103e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprotected:
104e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    virtual void onAnimationStarted();
105e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    virtual void onAnimationUpdated(float fraction);
106e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
107e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprivate:
108e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    // mTarget is only valid inside animate()
109e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    RenderProperties* mTarget;
110e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    GetFloatProperty mGetter;
111e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    SetFloatProperty mSetter;
112e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
113e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    RenderPropertyAnimator::DeltaValueType mDeltaValueType;
114e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    float mDeltaValue;
115e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    float mFromValue;
116e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck};
117e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
118e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn ReckRenderPropertyAnimator::RenderPropertyAnimator(RenderProperty property,
119e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        DeltaValueType deltaType, float deltaValue) {
120e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    PropertyAccessors pa = PROPERTY_ACCESSOR_LUT[property];
121e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    mImpl = new RenderPropertyAnimatorImpl(pa.getter, pa.setter, deltaType, deltaValue);
122e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
123e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
124e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn ReckRenderPropertyAnimator::~RenderPropertyAnimator() {
125e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    delete mImpl;
126e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    mImpl = NULL;
127e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
128e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
129e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckvoid RenderPropertyAnimator::setInterpolator(Interpolator* interpolator) {
130e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    mImpl->setInterpolator(interpolator);
131e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
132e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
133e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckvoid RenderPropertyAnimator::setDuration(nsecs_t durationInMs) {
134e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    mImpl->setDuration(durationInMs);
135e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
136e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
137e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckbool RenderPropertyAnimator::isFinished() {
138e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    return mImpl->isFinished();
139e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
140e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
141e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckbool RenderPropertyAnimator::animate(RenderProperties* target, TreeInfo& info) {
142e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    return mImpl->animate(target, info);
143e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
144e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
145e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
146e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck/************************************************************
147e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck *  Base animator
148e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck ************************************************************/
149e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
150e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn ReckBaseAnimator::BaseAnimator()
151e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        : mInterpolator(0)
152e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        , mPlayState(PENDING)
153e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        , mStartTime(0)
154e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        , mDuration(300) {
155e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
156e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
157e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
158e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn ReckBaseAnimator::~BaseAnimator() {
159e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    setInterpolator(NULL);
160e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
161e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
162e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckvoid BaseAnimator::setInterpolator(Interpolator* interpolator) {
163e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    delete mInterpolator;
164e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    mInterpolator = interpolator;
165e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
166e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
167e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckvoid BaseAnimator::setDuration(nsecs_t duration) {
168e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    mDuration = duration;
169e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
170e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
171e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckbool BaseAnimator::animateFrame(nsecs_t frameTime) {
172e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    if (mPlayState == PENDING) {
173e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        mPlayState = RUNNING;
174e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        mStartTime = frameTime;
175e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        // No interpolator was set, use the default
176e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        if (!mInterpolator) {
177e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck            setInterpolator(Interpolator::createDefaultInterpolator());
178e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        }
179e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        onAnimationStarted();
180e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
181e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
182e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    float fraction = 1.0f;
183e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    if (mPlayState == RUNNING) {
184e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        fraction = mDuration > 0 ? (float)(frameTime - mStartTime) / mDuration : 1.0f;
185e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        if (fraction >= 1.0f) {
186e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck            fraction = 1.0f;
187e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck            mPlayState = FINISHED;
188e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        }
189e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
190e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    fraction = mInterpolator->interpolate(fraction);
191e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    onAnimationUpdated(fraction);
192e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
193e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    if (mPlayState == FINISHED) {
194e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        onAnimationFinished();
195e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        return true;
196e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
197e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    return false;
198e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
199e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
200e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck/************************************************************
201e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck *  RenderPropertyAnimator
202e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck ************************************************************/
203e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
204e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn ReckRenderPropertyAnimatorImpl::RenderPropertyAnimatorImpl(
205e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck                GetFloatProperty getter, SetFloatProperty setter,
206e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck                RenderPropertyAnimator::DeltaValueType deltaType, float delta)
207e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        : mTarget(0)
208e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        , mGetter(getter)
209e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        , mSetter(setter)
210e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        , mDeltaValueType(deltaType)
211e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        , mDeltaValue(delta)
212e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        , mFromValue(-1) {
213e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
214e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
215e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn ReckRenderPropertyAnimatorImpl::~RenderPropertyAnimatorImpl() {
216e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
217e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
218e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckbool RenderPropertyAnimatorImpl::animate(RenderProperties* target, TreeInfo& info) {
219e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    mTarget = target;
220e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    bool finished = animateFrame(info.frameTimeMs);
221e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    mTarget = NULL;
222e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    return finished;
223e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
224e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
225e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckvoid RenderPropertyAnimatorImpl::onAnimationStarted() {
226e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    mFromValue = (mTarget->*mGetter)();
227e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
228e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    if (mDeltaValueType == RenderPropertyAnimator::ABSOLUTE) {
229e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        mDeltaValue = (mDeltaValue - mFromValue);
230e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        mDeltaValueType = RenderPropertyAnimator::DELTA;
231e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
232e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
233e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
234e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckvoid RenderPropertyAnimatorImpl::onAnimationUpdated(float fraction) {
235e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    float value = mFromValue + (mDeltaValue * fraction);
236e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    (mTarget->*mSetter)(value);
237e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
238e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
239e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} /* namespace uirenderer */
240e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} /* namespace android */
241