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