15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef InterpolableValue_h 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define InterpolableValue_h 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "core/animation/animatable/AnimatableValue.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "wtf/OwnPtr.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "wtf/PassOwnPtr.h" 119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "wtf/Vector.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace blink { 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InterpolableValue : public NoBaseWillBeGarbageCollected<InterpolableValue> { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DECLARE_EMPTY_VIRTUAL_DESTRUCTOR_WILL_BE_REMOVED(InterpolableValue); 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool isNumber() const { return false; } 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool isBool() const { return false; } 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool isList() const { return false; } 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool isAnimatableValue() const { return false; } 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual PassOwnPtrWillBeRawPtr<InterpolableValue> clone() const = 0; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void trace(Visitor*) { } 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual PassOwnPtrWillBeRawPtr<InterpolableValue> interpolate(const InterpolableValue &to, const double progress) const = 0; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class Interpolation; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep interpolate private, but allow calls within the hierarchy without 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // knowledge of type. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class DeferredLegacyStyleInterpolation; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class InterpolableNumber; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class InterpolableBool; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class InterpolableList; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InterpolableNumber : public InterpolableValue { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static PassOwnPtrWillBeRawPtr<InterpolableNumber> create(double value) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return adoptPtrWillBeNoop(new InterpolableNumber(value)); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool isNumber() const OVERRIDE FINAL { return true; } 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double value() const { return m_value; } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual PassOwnPtrWillBeRawPtr<InterpolableValue> clone() const OVERRIDE FINAL { return create(m_value); } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void trace(Visitor* visitor) OVERRIDE { InterpolableValue::trace(visitor); } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual PassOwnPtrWillBeRawPtr<InterpolableValue> interpolate(const InterpolableValue &to, const double progress) const OVERRIDE FINAL; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double m_value; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit InterpolableNumber(double value) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_value(value) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InterpolableBool : public InterpolableValue { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static PassOwnPtrWillBeRawPtr<InterpolableBool> create(bool value) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return adoptPtrWillBeNoop(new InterpolableBool(value)); 69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool isBool() const OVERRIDE FINAL { return true; } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool value() const { return m_value; } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual PassOwnPtrWillBeRawPtr<InterpolableValue> clone() const OVERRIDE FINAL { return create(m_value); } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void trace(Visitor* visitor) OVERRIDE { InterpolableValue::trace(visitor); } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private: 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual PassOwnPtrWillBeRawPtr<InterpolableValue> interpolate(const InterpolableValue &to, const double progress) const OVERRIDE FINAL; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool m_value; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit InterpolableBool(bool value) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : m_value(value) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InterpolableList : public InterpolableValue { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static PassOwnPtrWillBeRawPtr<InterpolableList> create(const InterpolableList &other) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return adoptPtrWillBeNoop(new InterpolableList(other)); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static PassOwnPtrWillBeRawPtr<InterpolableList> create(size_t size) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return adoptPtrWillBeNoop(new InterpolableList(size)); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool isList() const OVERRIDE FINAL { return true; } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set(size_t position, PassOwnPtrWillBeRawPtr<InterpolableValue> value) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT(position < m_size); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m_values[position] = value; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const InterpolableValue* get(size_t position) const 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT(position < m_size); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return m_values[position].get(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t length() const { return m_size; } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual PassOwnPtrWillBeRawPtr<InterpolableValue> clone() const OVERRIDE FINAL { return create(*this); } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void trace(Visitor*) OVERRIDE; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private: 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual PassOwnPtrWillBeRawPtr<InterpolableValue> interpolate(const InterpolableValue &other, const double progress) const OVERRIDE FINAL; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit InterpolableList(size_t size) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : m_size(size) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) , m_values(m_size) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InterpolableList(const InterpolableList& other) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : m_size(other.m_size) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_values(m_size) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < m_size; i++) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set(i, other.m_values[i]->clone()); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t m_size; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillBeHeapVector<OwnPtrWillBeMember<InterpolableValue> > m_values; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FIXME: Remove this when we can. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InterpolableAnimatableValue : public InterpolableValue { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static PassOwnPtrWillBeRawPtr<InterpolableAnimatableValue> create(PassRefPtrWillBeRawPtr<AnimatableValue> value) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return adoptPtrWillBeNoop(new InterpolableAnimatableValue(value)); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool isAnimatableValue() const OVERRIDE FINAL { return true; } 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimatableValue* value() const { return m_value.get(); } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual PassOwnPtrWillBeRawPtr<InterpolableValue> clone() const OVERRIDE FINAL { return create(m_value); } 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void trace(Visitor*) OVERRIDE; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private: 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual PassOwnPtrWillBeRawPtr<InterpolableValue> interpolate(const InterpolableValue &other, const double progress) const OVERRIDE FINAL; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RefPtrWillBeMember<AnimatableValue> m_value; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InterpolableAnimatableValue(PassRefPtrWillBeRawPtr<AnimatableValue> value) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : m_value(value) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DEFINE_TYPE_CASTS(InterpolableNumber, InterpolableValue, value, value->isNumber(), value.isNumber()); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DEFINE_TYPE_CASTS(InterpolableBool, InterpolableValue, value, value->isBool(), value.isBool()); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DEFINE_TYPE_CASTS(InterpolableList, InterpolableValue, value, value->isList(), value.isList()); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DEFINE_TYPE_CASTS(InterpolableAnimatableValue, InterpolableValue, value, value->isAnimatableValue(), value.isAnimatableValue()); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)