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