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)