AndroidAnimation.cpp revision fe41360961a5f02a9f54dbe4922d301ef4bc4a20
1797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard/* 2797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard * Copyright (C) 2009 The Android Open Source Project 3797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard * 4797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard * Licensed under the Apache License, Version 2.0 (the "License"); 5797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard * you may not use this file except in compliance with the License. 6797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard * You may obtain a copy of the License at 7797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard * 8797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard * http://www.apache.org/licenses/LICENSE-2.0 9797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard * 10797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard * Unless required by applicable law or agreed to in writing, software 11797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard * distributed under the License is distributed on an "AS IS" BASIS, 12797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard * See the License for the specific language governing permissions and 14797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard * limitations under the License. 15797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard */ 16797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 17797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#include "config.h" 18797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#include "AndroidAnimation.h" 19797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 20797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#if USE(ACCELERATED_COMPOSITING) 21797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 22797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#include "Animation.h" 23797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#include "GraphicsLayerAndroid.h" 24797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 25797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#include "Timer.h" 26797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#include "TimingFunction.h" 27797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#include "UnitBezier.h" 28797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 29797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#include <wtf/CurrentTime.h> 30797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 31797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roardnamespace WebCore { 32797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 33797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roardstatic long gDebugAndroidAnimationInstances; 34797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 35797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roardlong AndroidAnimation::instancesCount() 36797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{ 37797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard return gDebugAndroidAnimationInstances; 38797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 39797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 4030e39dd1918530408d55dbead3bf1567661b606eNicolas RoardAndroidAnimation::AndroidAnimation(const Animation* animation, 4130e39dd1918530408d55dbead3bf1567661b606eNicolas Roard double beginTime) : 42797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_beginTime(beginTime), 43797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_duration(animation->duration()), 44797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_iterationCount(animation->iterationCount()), 45797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_currentIteration(0), 46797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_direction(animation->direction()), 47797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_timingFunction(animation->timingFunction()) 48797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{ 49797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard if (!static_cast<int>(beginTime)) // time not set 50797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_beginTime = WTF::currentTime(); 51797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 52797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard gDebugAndroidAnimationInstances++; 53797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 54797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 55797e4f1087e408060f2812c79bddcd2b73a3830dNicolas RoardAndroidAnimation::AndroidAnimation(AndroidAnimation* anim) : 56797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_beginTime(anim->m_beginTime), 57797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_duration(anim->m_duration), 58797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_iterationCount(anim->m_iterationCount), 59797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_currentIteration(0), 60797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_direction(anim->m_direction), 61797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_timingFunction(anim->m_timingFunction) 62797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{ 63797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard gDebugAndroidAnimationInstances++; 64797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 65797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 66797e4f1087e408060f2812c79bddcd2b73a3830dNicolas RoardAndroidAnimation::~AndroidAnimation() 67797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{ 68797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard gDebugAndroidAnimationInstances--; 69797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 70797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 71797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roardfloat AndroidAnimation::currentProgress(double time) 72797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{ 73797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard if (m_beginTime <= 0.000001) // overflow or not correctly set 74797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_beginTime = time; 75797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 76797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_elapsedTime = time - m_beginTime; 77797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 78797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard if (m_duration <= 0) 79797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_duration = 0.000001; 80797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 81797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard if (m_elapsedTime < 0) // animation not yet started. 82797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard return 0; 83797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 84797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard return m_elapsedTime / m_duration; 85797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 86797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 87797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roardbool AndroidAnimation::checkIterationsAndProgress(double time, float* finalProgress) 88797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{ 89797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard float progress = currentProgress(time); 90797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 91797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard int currentIteration = static_cast<int>(progress); 92797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard if (currentIteration != m_currentIteration) 93797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard if (m_direction == Animation::AnimationDirectionAlternate) 94797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard swapDirection(); 95797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 96797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_currentIteration = currentIteration; 97797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard progress -= m_currentIteration; 98797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 99797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard if ((m_currentIteration >= m_iterationCount) 100797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard && (m_iterationCount != Animation::IterationCountInfinite)) 101797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard return false; 102797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 103797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard if (m_timingFunction.type() != LinearTimingFunction) { 104797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard UnitBezier bezier(m_timingFunction.x1(), 105797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_timingFunction.y1(), 106797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_timingFunction.x2(), 107797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_timingFunction.y2()); 108797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard if (m_duration > 0) 109797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard progress = bezier.solve(progress, 1.0f / (200.0f * m_duration)); 110797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard } 111797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 112797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard *finalProgress = progress; 113797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard return true; 114797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 115797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 11630e39dd1918530408d55dbead3bf1567661b606eNicolas RoardPassRefPtr<AndroidOpacityAnimation> AndroidOpacityAnimation::create( 11730e39dd1918530408d55dbead3bf1567661b606eNicolas Roard float fromValue, 11830e39dd1918530408d55dbead3bf1567661b606eNicolas Roard float toValue, 11930e39dd1918530408d55dbead3bf1567661b606eNicolas Roard const Animation* animation, 12030e39dd1918530408d55dbead3bf1567661b606eNicolas Roard double beginTime) 12130e39dd1918530408d55dbead3bf1567661b606eNicolas Roard{ 12230e39dd1918530408d55dbead3bf1567661b606eNicolas Roard return adoptRef(new AndroidOpacityAnimation(fromValue, toValue, 12330e39dd1918530408d55dbead3bf1567661b606eNicolas Roard animation, beginTime)); 124797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 125797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 12630e39dd1918530408d55dbead3bf1567661b606eNicolas RoardAndroidOpacityAnimation::AndroidOpacityAnimation(float fromValue, float toValue, 12730e39dd1918530408d55dbead3bf1567661b606eNicolas Roard const Animation* animation, 12830e39dd1918530408d55dbead3bf1567661b606eNicolas Roard double beginTime) 12930e39dd1918530408d55dbead3bf1567661b606eNicolas Roard : AndroidAnimation(animation, beginTime), 130797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_fromValue(fromValue), m_toValue(toValue) 131797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{ 132797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 133797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 134797e4f1087e408060f2812c79bddcd2b73a3830dNicolas RoardAndroidOpacityAnimation::AndroidOpacityAnimation(AndroidOpacityAnimation* anim) 135797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard : AndroidAnimation(anim), 136797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_fromValue(anim->m_fromValue), 137797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_toValue(anim->m_toValue) 138797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{ 139797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 140797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 14130e39dd1918530408d55dbead3bf1567661b606eNicolas RoardPassRefPtr<AndroidAnimation> AndroidOpacityAnimation::copy() 142797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{ 14330e39dd1918530408d55dbead3bf1567661b606eNicolas Roard return adoptRef(new AndroidOpacityAnimation(this)); 144797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 145797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 146797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roardvoid AndroidOpacityAnimation::swapDirection() 147797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{ 148797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard float v = m_toValue; 149797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_toValue = m_fromValue; 150797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_fromValue = m_toValue; 151797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 152797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 15330e39dd1918530408d55dbead3bf1567661b606eNicolas Roardbool AndroidOpacityAnimation::evaluate(LayerAndroid* layer, double time) 154797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{ 155797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard float progress; 156797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard if (!checkIterationsAndProgress(time, &progress)) 157797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard return false; 158797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 159797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard if (progress < 0) // we still want to be evaluated until we get progress > 0 160797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard return true; 161797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 162797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard float value = m_fromValue + ((m_toValue - m_fromValue) * progress); 163fe41360961a5f02a9f54dbe4922d301ef4bc4a20Nicolas Roard layer->setOpacity(value); 164797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard return true; 165797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 166797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 16730e39dd1918530408d55dbead3bf1567661b606eNicolas RoardPassRefPtr<AndroidTransformAnimation> AndroidTransformAnimation::create( 16830e39dd1918530408d55dbead3bf1567661b606eNicolas Roard const Animation* animation, 16930e39dd1918530408d55dbead3bf1567661b606eNicolas Roard double beginTime) 170797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{ 17130e39dd1918530408d55dbead3bf1567661b606eNicolas Roard return adoptRef(new AndroidTransformAnimation(animation, beginTime)); 172797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 173797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 17430e39dd1918530408d55dbead3bf1567661b606eNicolas RoardAndroidTransformAnimation::AndroidTransformAnimation(const Animation* animation, 17530e39dd1918530408d55dbead3bf1567661b606eNicolas Roard double beginTime) 17630e39dd1918530408d55dbead3bf1567661b606eNicolas Roard : AndroidAnimation(animation, beginTime), 177797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_doTranslation(false), 178797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_doScaling(false), 179797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_doRotation(false) 180797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{ 181797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 182797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 183797e4f1087e408060f2812c79bddcd2b73a3830dNicolas RoardAndroidTransformAnimation::AndroidTransformAnimation(AndroidTransformAnimation* anim) 184797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard : AndroidAnimation(anim), 185797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_doTranslation(anim->m_doTranslation), 186797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_doScaling(anim->m_doScaling), 187797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_doRotation(anim->m_doRotation), 188797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_position(anim->m_position), 189797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_fromX(anim->m_fromX), m_fromY(anim->m_fromY), m_fromZ(anim->m_fromZ), 190797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_toX(anim->m_toX), m_toY(anim->m_toY), m_toZ(anim->m_toZ), 191797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_fromAngle(anim->m_fromAngle), m_toAngle(anim->m_toAngle), 192797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_fromScaleX(anim->m_fromScaleX), m_fromScaleY(anim->m_fromScaleY), m_fromScaleZ(anim->m_fromScaleZ), 193797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_toScaleX(anim->m_toScaleX), m_toScaleY(anim->m_toScaleY), m_toScaleZ(anim->m_toScaleZ) 194797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{ 195797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 196797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 19730e39dd1918530408d55dbead3bf1567661b606eNicolas RoardPassRefPtr<AndroidAnimation> AndroidTransformAnimation::copy() 198797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{ 19930e39dd1918530408d55dbead3bf1567661b606eNicolas Roard return adoptRef(new AndroidTransformAnimation(this)); 200797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 201797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 202797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roardvoid AndroidTransformAnimation::setRotation(float fA, float tA) 203797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{ 204797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_fromAngle = fA; 205797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_toAngle = tA; 206797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_doRotation = true; 207797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 208797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 209797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roardvoid AndroidTransformAnimation::setTranslation(float fX, float fY, float fZ, 210797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard float tX, float tY, float tZ) 211797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{ 212797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_fromX = fX; 213797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_fromY = fY; 214797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_fromZ = fZ; 215797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_toX = tX; 216797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_toY = tY; 217797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_toZ = tZ; 218797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_doTranslation = true; 219797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 220797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 221797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roardvoid AndroidTransformAnimation::setScale(float fX, float fY, float fZ, 222797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard float tX, float tY, float tZ) 223797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{ 224797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_fromScaleX = fX; 225797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_fromScaleY = fY; 226797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_fromScaleZ = fZ; 227797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_toScaleX = tX; 228797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_toScaleY = tY; 229797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_toScaleZ = tZ; 230797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_doScaling = true; 231797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 232797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 233797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roardvoid AndroidTransformAnimation::swapDirection() 234797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{ 235797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard if (m_doTranslation) { 236797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard float tx = m_toX; 237797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_toX = m_fromX; 238797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_fromX = tx; 239797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard float ty = m_toY; 240797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_toY = m_fromY; 241797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_fromY = ty; 242797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard float tz = m_toZ; 243797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_toZ = m_fromZ; 244797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_fromZ = tz; 245797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard } 246797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard if (m_doScaling) { 247797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard float sx = m_toScaleX; 248797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_toScaleX = m_fromScaleX; 249797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_fromScaleX = sx; 250797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard float sy = m_toScaleY; 251797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_toScaleY = m_fromScaleY; 252797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_fromScaleY = sy; 253797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard } 254797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard if (m_doRotation) { 255797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard float a = m_toAngle; 256797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_toAngle = m_fromAngle; 257797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard m_fromAngle = a; 258797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard } 259797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 260797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 26130e39dd1918530408d55dbead3bf1567661b606eNicolas Roardbool AndroidTransformAnimation::evaluate(LayerAndroid* layer, double time) 262797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{ 263797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard float progress; 264797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard if (!checkIterationsAndProgress(time, &progress)) 265797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard return false; 266797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 267797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard if (progress < 0) // we still want to be evaluated until we get progress > 0 268797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard return true; 269797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 270797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard float x = m_fromX + (m_toX - m_fromX) * progress; 271797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard float y = m_fromY + (m_toY - m_fromY) * progress; 272797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard float z = m_fromZ + (m_toZ - m_fromZ) * progress; 273797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard float sx = m_fromScaleX + (m_toScaleX - m_fromScaleX) * progress; 274797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard float sy = m_fromScaleY + (m_toScaleY - m_fromScaleY) * progress; 275797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard float sz = m_fromScaleZ + (m_toScaleZ - m_fromScaleZ) * progress; 276797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard float a = m_fromAngle + (m_toAngle - m_fromAngle) * progress; 277797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 278fe41360961a5f02a9f54dbe4922d301ef4bc4a20Nicolas Roard if (m_doTranslation) 279fe41360961a5f02a9f54dbe4922d301ef4bc4a20Nicolas Roard layer->setTranslation(x, y); 280fe41360961a5f02a9f54dbe4922d301ef4bc4a20Nicolas Roard 281fe41360961a5f02a9f54dbe4922d301ef4bc4a20Nicolas Roard if (m_doScaling) 282fe41360961a5f02a9f54dbe4922d301ef4bc4a20Nicolas Roard layer->setScale(sx, sy); 283fe41360961a5f02a9f54dbe4922d301ef4bc4a20Nicolas Roard 284fe41360961a5f02a9f54dbe4922d301ef4bc4a20Nicolas Roard if (m_doRotation) 285fe41360961a5f02a9f54dbe4922d301ef4bc4a20Nicolas Roard layer->setRotation(a); 286fe41360961a5f02a9f54dbe4922d301ef4bc4a20Nicolas Roard 287797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard return true; 288797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 289797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 290797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} // namespace WebCore 291797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 292797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#endif // USE(ACCELERATED_COMPOSITING) 293