Animator.cpp revision 766431aa57c16ece8842287a92b2e7208e3b8ac3
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#include "Animator.h"
18e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
1968bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck#include <inttypes.h>
20e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <set>
21e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
22119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck#include "AnimationContext.h"
232dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudson#include "Interpolator.h"
2452244fff29042926e21fa897ef5ab11148e35299John Reck#include "RenderNode.h"
25e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include "RenderProperties.h"
26e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
27e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Recknamespace android {
28e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Recknamespace uirenderer {
29e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
30e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck/************************************************************
31ff941dcd815021bb20d6504eb486acb1e50592c3John Reck *  BaseRenderNodeAnimator
32e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck ************************************************************/
33e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
34ff941dcd815021bb20d6504eb486acb1e50592c3John ReckBaseRenderNodeAnimator::BaseRenderNodeAnimator(float finalValue)
35d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik        : mTarget(nullptr)
368d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck        , mFinalValue(finalValue)
37ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        , mDeltaValue(0)
38ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        , mFromValue(0)
39b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik        , mStagingPlayState(PlayState::NotStarted)
40b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik        , mPlayState(PlayState::NotStarted)
4168bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck        , mHasStartValue(false)
42e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        , mStartTime(0)
43ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette        , mDuration(300)
44572d9acd598517c20c7bf2feb189357e925fa879Chris Craik        , mStartDelay(0)
45572d9acd598517c20c7bf2feb189357e925fa879Chris Craik        , mMayRunAsync(true) {
46e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
47e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
48ff941dcd815021bb20d6504eb486acb1e50592c3John ReckBaseRenderNodeAnimator::~BaseRenderNodeAnimator() {
4968bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck}
5068bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck
5168bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reckvoid BaseRenderNodeAnimator::checkMutable() {
5268bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    // Should be impossible to hit as the Java-side also has guards for this
53b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik    LOG_ALWAYS_FATAL_IF(mStagingPlayState != PlayState::NotStarted,
5468bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck            "Animator has already been started!");
55e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
56e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
57ff941dcd815021bb20d6504eb486acb1e50592c3John Reckvoid BaseRenderNodeAnimator::setInterpolator(Interpolator* interpolator) {
5868bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    checkMutable();
5951d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik    mInterpolator.reset(interpolator);
60e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
61e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
62ff941dcd815021bb20d6504eb486acb1e50592c3John Reckvoid BaseRenderNodeAnimator::setStartValue(float value) {
6368bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    checkMutable();
6468bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    doSetStartValue(value);
65ff941dcd815021bb20d6504eb486acb1e50592c3John Reck}
66ff941dcd815021bb20d6504eb486acb1e50592c3John Reck
6768bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reckvoid BaseRenderNodeAnimator::doSetStartValue(float value) {
6868bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    mFromValue = value;
6968bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    mDeltaValue = (mFinalValue - mFromValue);
7068bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    mHasStartValue = true;
71ff941dcd815021bb20d6504eb486acb1e50592c3John Reck}
72ff941dcd815021bb20d6504eb486acb1e50592c3John Reck
73ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverettevoid BaseRenderNodeAnimator::setDuration(nsecs_t duration) {
7468bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    checkMutable();
75ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    mDuration = duration;
76ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette}
77ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette
78ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverettevoid BaseRenderNodeAnimator::setStartDelay(nsecs_t startDelay) {
7968bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    checkMutable();
80ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    mStartDelay = startDelay;
81ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette}
82ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette
838d8af3c1b768d590754d657a7d1242dcb462454bJohn Reckvoid BaseRenderNodeAnimator::attach(RenderNode* target) {
848d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck    mTarget = target;
858d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck    onAttached();
868d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck}
878d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck
88119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckvoid BaseRenderNodeAnimator::pushStaging(AnimationContext& context) {
8968bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    if (!mHasStartValue) {
908d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck        doSetStartValue(getValue(mTarget));
91ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    }
9268bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    if (mStagingPlayState > mPlayState) {
93766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        if (mStagingPlayState == PlayState::Restarted) {
94766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            mStagingPlayState = PlayState::Running;
95766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        }
9668bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck        mPlayState = mStagingPlayState;
9768bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck        // Oh boy, we're starting! Man the battle stations!
98b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik        if (mPlayState == PlayState::Running) {
99119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck            transitionToRunning(context);
100b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik        } else if (mPlayState == PlayState::Finished) {
1014d2c47206a8e1706e5f89ef73c0e50e7321bf862John Reck            callOnFinishedListener(context);
10268bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck        }
10368bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    }
10468bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck}
105ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette
106119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckvoid BaseRenderNodeAnimator::transitionToRunning(AnimationContext& context) {
107119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    nsecs_t frameTimeMs = context.frameTimeMs();
108119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    LOG_ALWAYS_FATAL_IF(frameTimeMs <= 0, "%" PRId64 " isn't a real frame time!", frameTimeMs);
10968bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    if (mStartDelay < 0 || mStartDelay > 50000) {
11068bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck        ALOGW("Your start delay is strange and confusing: %" PRId64, mStartDelay);
11168bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    }
112119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    mStartTime = frameTimeMs + mStartDelay;
11368bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    if (mStartTime < 0) {
11468bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck        ALOGW("Ended up with a really weird start time of %" PRId64
11568bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck                " with frame time %" PRId64 " and start delay %" PRId64,
116119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck                mStartTime, frameTimeMs, mStartDelay);
11768bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck        // Set to 0 so that the animate() basically instantly finishes
11868bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck        mStartTime = 0;
11968bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    }
12068bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    // No interpolator was set, use the default
12168bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    if (!mInterpolator) {
12251d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik        mInterpolator.reset(Interpolator::createDefaultInterpolator());
12368bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    }
12468bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    if (mDuration < 0 || mDuration > 50000) {
12568bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck        ALOGW("Your duration is strange and confusing: %" PRId64, mDuration);
12668bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    }
12768bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck}
12868bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck
129119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckbool BaseRenderNodeAnimator::animate(AnimationContext& context) {
130b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik    if (mPlayState < PlayState::Running) {
131ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette        return false;
132ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    }
133b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik    if (mPlayState == PlayState::Finished) {
13432fb6307de7c3ee9399a39dc6734f1c82ffd1dcbJohn Reck        return true;
13532fb6307de7c3ee9399a39dc6734f1c82ffd1dcbJohn Reck    }
136ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette
137766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    // This should be set before setValue() so animators can query this time when setValue
138766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    // is called.
139766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    nsecs_t currentFrameTime = context.frameTimeMs();
140766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    onPlayTimeChanged(currentFrameTime - mStartTime);
141766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
1428d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck    // If BaseRenderNodeAnimator is handling the delay (not typical), then
1438d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck    // because the staging properties reflect the final value, we always need
1448d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck    // to call setValue even if the animation isn't yet running or is still
1458d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck    // being delayed as we need to override the staging value
146119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    if (mStartTime > context.frameTimeMs()) {
1478d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck        setValue(mTarget, mFromValue);
14868bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck        return false;
149e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
150e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
151e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    float fraction = 1.0f;
152766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
153b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik    if (mPlayState == PlayState::Running && mDuration > 0) {
154766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        fraction = (float)(currentFrameTime - mStartTime) / mDuration;
155e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
15668bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    if (fraction >= 1.0f) {
15768bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck        fraction = 1.0f;
158b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik        mPlayState = PlayState::Finished;
15968bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    }
16068bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck
161e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    fraction = mInterpolator->interpolate(fraction);
1628d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck    setValue(mTarget, mFromValue + (mDeltaValue * fraction));
163e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
164b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik    if (mPlayState == PlayState::Finished) {
165119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        callOnFinishedListener(context);
166e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        return true;
167e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
16868bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck
169e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    return false;
170e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
171e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
172e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reckvoid BaseRenderNodeAnimator::forceEndNow(AnimationContext& context) {
173b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik    if (mPlayState < PlayState::Finished) {
174b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik        mPlayState = PlayState::Finished;
175e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck        callOnFinishedListener(context);
176e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck    }
177e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck}
178e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck
179119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckvoid BaseRenderNodeAnimator::callOnFinishedListener(AnimationContext& context) {
18052244fff29042926e21fa897ef5ab11148e35299John Reck    if (mListener.get()) {
181119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        context.callOnFinished(this, mListener.get());
18252244fff29042926e21fa897ef5ab11148e35299John Reck    }
18352244fff29042926e21fa897ef5ab11148e35299John Reck}
18452244fff29042926e21fa897ef5ab11148e35299John Reck
185e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck/************************************************************
18652244fff29042926e21fa897ef5ab11148e35299John Reck *  RenderPropertyAnimator
18752244fff29042926e21fa897ef5ab11148e35299John Reck ************************************************************/
18852244fff29042926e21fa897ef5ab11148e35299John Reck
189ff941dcd815021bb20d6504eb486acb1e50592c3John Reckstruct RenderPropertyAnimator::PropertyAccessors {
190ff941dcd815021bb20d6504eb486acb1e50592c3John Reck   RenderNode::DirtyPropertyMask dirtyMask;
191ff941dcd815021bb20d6504eb486acb1e50592c3John Reck   GetFloatProperty getter;
192ff941dcd815021bb20d6504eb486acb1e50592c3John Reck   SetFloatProperty setter;
193ff941dcd815021bb20d6504eb486acb1e50592c3John Reck};
194ff941dcd815021bb20d6504eb486acb1e50592c3John Reck
19552244fff29042926e21fa897ef5ab11148e35299John Reck// Maps RenderProperty enum to accessors
19652244fff29042926e21fa897ef5ab11148e35299John Reckconst RenderPropertyAnimator::PropertyAccessors RenderPropertyAnimator::PROPERTY_ACCESSOR_LUT[] = {
197ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::TRANSLATION_X, &RenderProperties::getTranslationX, &RenderProperties::setTranslationX },
198ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::TRANSLATION_Y, &RenderProperties::getTranslationY, &RenderProperties::setTranslationY },
199ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::TRANSLATION_X, &RenderProperties::getTranslationZ, &RenderProperties::setTranslationZ },
200ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::SCALE_X, &RenderProperties::getScaleX, &RenderProperties::setScaleX },
201ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::SCALE_Y, &RenderProperties::getScaleY, &RenderProperties::setScaleY },
202ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::ROTATION, &RenderProperties::getRotation, &RenderProperties::setRotation },
203ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::ROTATION_X, &RenderProperties::getRotationX, &RenderProperties::setRotationX },
204ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::ROTATION_Y, &RenderProperties::getRotationY, &RenderProperties::setRotationY },
205ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::X, &RenderProperties::getX, &RenderProperties::setX },
206ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::Y, &RenderProperties::getY, &RenderProperties::setY },
207ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::Z, &RenderProperties::getZ, &RenderProperties::setZ },
208ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::ALPHA, &RenderProperties::getAlpha, &RenderProperties::setAlpha },
20952244fff29042926e21fa897ef5ab11148e35299John Reck};
21052244fff29042926e21fa897ef5ab11148e35299John Reck
211ff941dcd815021bb20d6504eb486acb1e50592c3John ReckRenderPropertyAnimator::RenderPropertyAnimator(RenderProperty property, float finalValue)
212ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        : BaseRenderNodeAnimator(finalValue)
213ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        , mPropertyAccess(&(PROPERTY_ACCESSOR_LUT[property])) {
214ff941dcd815021bb20d6504eb486acb1e50592c3John Reck}
215ff941dcd815021bb20d6504eb486acb1e50592c3John Reck
2168d8af3c1b768d590754d657a7d1242dcb462454bJohn Reckvoid RenderPropertyAnimator::onAttached() {
21768bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    if (!mHasStartValue
2188d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck            && mTarget->isPropertyFieldDirty(mPropertyAccess->dirtyMask)) {
2198d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck        setStartValue((mTarget->stagingProperties().*mPropertyAccess->getter)());
2208d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck    }
2218d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck}
2228d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck
2238d8af3c1b768d590754d657a7d1242dcb462454bJohn Reckvoid RenderPropertyAnimator::onStagingPlayStateChanged() {
224b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik    if (mStagingPlayState == PlayState::Running) {
2258d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck        (mTarget->mutateStagingProperties().*mPropertyAccess->setter)(finalValue());
226b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik    } else if (mStagingPlayState == PlayState::Finished) {
22732fb6307de7c3ee9399a39dc6734f1c82ffd1dcbJohn Reck        // We're being canceled, so make sure that whatever values the UI thread
22832fb6307de7c3ee9399a39dc6734f1c82ffd1dcbJohn Reck        // is observing for us is pushed over
22932fb6307de7c3ee9399a39dc6734f1c82ffd1dcbJohn Reck        mTarget->setPropertyFieldsDirty(dirtyMask());
230ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    }
23152244fff29042926e21fa897ef5ab11148e35299John Reck}
23252244fff29042926e21fa897ef5ab11148e35299John Reck
2332218472d23483f09341bf655d55db21dcbabc1b6John Reckuint32_t RenderPropertyAnimator::dirtyMask() {
2342218472d23483f09341bf655d55db21dcbabc1b6John Reck    return mPropertyAccess->dirtyMask;
2352218472d23483f09341bf655d55db21dcbabc1b6John Reck}
2362218472d23483f09341bf655d55db21dcbabc1b6John Reck
237ff941dcd815021bb20d6504eb486acb1e50592c3John Reckfloat RenderPropertyAnimator::getValue(RenderNode* target) const {
238ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    return (target->properties().*mPropertyAccess->getter)();
23952244fff29042926e21fa897ef5ab11148e35299John Reck}
24052244fff29042926e21fa897ef5ab11148e35299John Reck
241ff941dcd815021bb20d6504eb486acb1e50592c3John Reckvoid RenderPropertyAnimator::setValue(RenderNode* target, float value) {
242ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    (target->animatorProperties().*mPropertyAccess->setter)(value);
24352244fff29042926e21fa897ef5ab11148e35299John Reck}
24452244fff29042926e21fa897ef5ab11148e35299John Reck
24552244fff29042926e21fa897ef5ab11148e35299John Reck/************************************************************
24652244fff29042926e21fa897ef5ab11148e35299John Reck *  CanvasPropertyPrimitiveAnimator
24752244fff29042926e21fa897ef5ab11148e35299John Reck ************************************************************/
24852244fff29042926e21fa897ef5ab11148e35299John Reck
24952244fff29042926e21fa897ef5ab11148e35299John ReckCanvasPropertyPrimitiveAnimator::CanvasPropertyPrimitiveAnimator(
250ff941dcd815021bb20d6504eb486acb1e50592c3John Reck                CanvasPropertyPrimitive* property, float finalValue)
251ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        : BaseRenderNodeAnimator(finalValue)
25252244fff29042926e21fa897ef5ab11148e35299John Reck        , mProperty(property) {
25352244fff29042926e21fa897ef5ab11148e35299John Reck}
25452244fff29042926e21fa897ef5ab11148e35299John Reck
25564bb413a664001c95c8439cf097dc3033f4ed733Andreas Gampefloat CanvasPropertyPrimitiveAnimator::getValue(RenderNode* target) const {
25652244fff29042926e21fa897ef5ab11148e35299John Reck    return mProperty->value;
25752244fff29042926e21fa897ef5ab11148e35299John Reck}
25852244fff29042926e21fa897ef5ab11148e35299John Reck
25964bb413a664001c95c8439cf097dc3033f4ed733Andreas Gampevoid CanvasPropertyPrimitiveAnimator::setValue(RenderNode* target, float value) {
26052244fff29042926e21fa897ef5ab11148e35299John Reck    mProperty->value = value;
26152244fff29042926e21fa897ef5ab11148e35299John Reck}
26252244fff29042926e21fa897ef5ab11148e35299John Reck
263a7c2ea20c43ab797bef5801530687e22e83def8fJohn Reckuint32_t CanvasPropertyPrimitiveAnimator::dirtyMask() {
264a7c2ea20c43ab797bef5801530687e22e83def8fJohn Reck    return RenderNode::DISPLAY_LIST;
265a7c2ea20c43ab797bef5801530687e22e83def8fJohn Reck}
266a7c2ea20c43ab797bef5801530687e22e83def8fJohn Reck
26752244fff29042926e21fa897ef5ab11148e35299John Reck/************************************************************
26852244fff29042926e21fa897ef5ab11148e35299John Reck *  CanvasPropertySkPaintAnimator
26952244fff29042926e21fa897ef5ab11148e35299John Reck ************************************************************/
27052244fff29042926e21fa897ef5ab11148e35299John Reck
27152244fff29042926e21fa897ef5ab11148e35299John ReckCanvasPropertyPaintAnimator::CanvasPropertyPaintAnimator(
272ff941dcd815021bb20d6504eb486acb1e50592c3John Reck                CanvasPropertyPaint* property, PaintField field, float finalValue)
273ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        : BaseRenderNodeAnimator(finalValue)
27452244fff29042926e21fa897ef5ab11148e35299John Reck        , mProperty(property)
27552244fff29042926e21fa897ef5ab11148e35299John Reck        , mField(field) {
27652244fff29042926e21fa897ef5ab11148e35299John Reck}
27752244fff29042926e21fa897ef5ab11148e35299John Reck
27864bb413a664001c95c8439cf097dc3033f4ed733Andreas Gampefloat CanvasPropertyPaintAnimator::getValue(RenderNode* target) const {
27952244fff29042926e21fa897ef5ab11148e35299John Reck    switch (mField) {
28052244fff29042926e21fa897ef5ab11148e35299John Reck    case STROKE_WIDTH:
28152244fff29042926e21fa897ef5ab11148e35299John Reck        return mProperty->value.getStrokeWidth();
28252244fff29042926e21fa897ef5ab11148e35299John Reck    case ALPHA:
28352244fff29042926e21fa897ef5ab11148e35299John Reck        return mProperty->value.getAlpha();
28452244fff29042926e21fa897ef5ab11148e35299John Reck    }
28552244fff29042926e21fa897ef5ab11148e35299John Reck    LOG_ALWAYS_FATAL("Unknown field %d", (int) mField);
28652244fff29042926e21fa897ef5ab11148e35299John Reck    return -1;
28752244fff29042926e21fa897ef5ab11148e35299John Reck}
28852244fff29042926e21fa897ef5ab11148e35299John Reck
289531ee701ddca2d1604fcce8e5d6d8837a3f651acJohn Reckstatic uint8_t to_uint8(float value) {
290531ee701ddca2d1604fcce8e5d6d8837a3f651acJohn Reck    int c = (int) (value + .5f);
291531ee701ddca2d1604fcce8e5d6d8837a3f651acJohn Reck    return static_cast<uint8_t>( c < 0 ? 0 : c > 255 ? 255 : c );
292531ee701ddca2d1604fcce8e5d6d8837a3f651acJohn Reck}
293531ee701ddca2d1604fcce8e5d6d8837a3f651acJohn Reck
29464bb413a664001c95c8439cf097dc3033f4ed733Andreas Gampevoid CanvasPropertyPaintAnimator::setValue(RenderNode* target, float value) {
29552244fff29042926e21fa897ef5ab11148e35299John Reck    switch (mField) {
29652244fff29042926e21fa897ef5ab11148e35299John Reck    case STROKE_WIDTH:
29752244fff29042926e21fa897ef5ab11148e35299John Reck        mProperty->value.setStrokeWidth(value);
29852244fff29042926e21fa897ef5ab11148e35299John Reck        return;
29952244fff29042926e21fa897ef5ab11148e35299John Reck    case ALPHA:
300531ee701ddca2d1604fcce8e5d6d8837a3f651acJohn Reck        mProperty->value.setAlpha(to_uint8(value));
30152244fff29042926e21fa897ef5ab11148e35299John Reck        return;
30252244fff29042926e21fa897ef5ab11148e35299John Reck    }
30352244fff29042926e21fa897ef5ab11148e35299John Reck    LOG_ALWAYS_FATAL("Unknown field %d", (int) mField);
304e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
305e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
306a7c2ea20c43ab797bef5801530687e22e83def8fJohn Reckuint32_t CanvasPropertyPaintAnimator::dirtyMask() {
307a7c2ea20c43ab797bef5801530687e22e83def8fJohn Reck    return RenderNode::DISPLAY_LIST;
308a7c2ea20c43ab797bef5801530687e22e83def8fJohn Reck}
309a7c2ea20c43ab797bef5801530687e22e83def8fJohn Reck
310af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris CraikRevealAnimator::RevealAnimator(int centerX, int centerY,
311d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck        float startValue, float finalValue)
312d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck        : BaseRenderNodeAnimator(finalValue)
313d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck        , mCenterX(centerX)
314af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik        , mCenterY(centerY) {
315d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck    setStartValue(startValue);
316d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck}
317d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck
318d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reckfloat RevealAnimator::getValue(RenderNode* target) const {
319af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik    return target->properties().getRevealClip().getRadius();
320d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck}
321d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck
322d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reckvoid RevealAnimator::setValue(RenderNode* target, float value) {
323af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik    target->animatorProperties().mutableRevealClip().set(true,
324d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck            mCenterX, mCenterY, value);
325d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck}
326d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck
327a7c2ea20c43ab797bef5801530687e22e83def8fJohn Reckuint32_t RevealAnimator::dirtyMask() {
328a7c2ea20c43ab797bef5801530687e22e83def8fJohn Reck    return RenderNode::GENERIC;
329a7c2ea20c43ab797bef5801530687e22e83def8fJohn Reck}
330a7c2ea20c43ab797bef5801530687e22e83def8fJohn Reck
331e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} /* namespace uirenderer */
332e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} /* namespace android */
333