OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #ifndef InterpolableValue_h |
| 6 #define InterpolableValue_h |
| 7 |
| 8 #include "wtf/OwnPtr.h" |
| 9 #include "wtf/PassOwnPtr.h" |
| 10 |
| 11 namespace WebCore { |
| 12 |
| 13 class InterpolableValue { |
| 14 public: |
| 15 virtual bool isNumber() const { return false; } |
| 16 virtual bool isBool() const { return false; } |
| 17 virtual bool isList() const { return false; } |
| 18 |
| 19 virtual ~InterpolableValue() { } |
| 20 virtual PassOwnPtr<InterpolableValue> clone() const = 0; |
| 21 |
| 22 private: |
| 23 virtual PassOwnPtr<InterpolableValue> interpolate(const InterpolableValue &t
o, const double progress) const = 0; |
| 24 |
| 25 // TODO: Replace this with Interpolation when committing Interpolation |
| 26 // patch. Refactor InterpolableValueTest to test via Interpolation |
| 27 // interface. |
| 28 friend class AnimationInterpolableValueTest; |
| 29 |
| 30 // Keep interpolate private, but allow calls within the hierarchy without |
| 31 // knowledge of type. |
| 32 friend class InterpolableNumber; |
| 33 friend class InterpolableBool; |
| 34 friend class InterpolableList; |
| 35 }; |
| 36 |
| 37 class InterpolableNumber : public InterpolableValue { |
| 38 public: |
| 39 static PassOwnPtr<InterpolableNumber> create(double value) |
| 40 { |
| 41 return adoptPtr(new InterpolableNumber(value)); |
| 42 } |
| 43 |
| 44 virtual bool isNumber() const OVERRIDE FINAL { return true; } |
| 45 double value() const { return m_value; } |
| 46 virtual PassOwnPtr<InterpolableValue> clone() const OVERRIDE FINAL { return
create(m_value); } |
| 47 |
| 48 private: |
| 49 virtual PassOwnPtr<InterpolableValue> interpolate(const InterpolableValue &t
o, const double progress) const OVERRIDE FINAL; |
| 50 double m_value; |
| 51 |
| 52 InterpolableNumber(double value) |
| 53 : m_value(value) |
| 54 { } |
| 55 |
| 56 }; |
| 57 |
| 58 class InterpolableBool : public InterpolableValue { |
| 59 public: |
| 60 static PassOwnPtr<InterpolableBool> create(bool value) |
| 61 { |
| 62 return adoptPtr(new InterpolableBool(value)); |
| 63 } |
| 64 |
| 65 virtual bool isBool() const OVERRIDE FINAL { return true; } |
| 66 bool value() const { return m_value; } |
| 67 virtual PassOwnPtr<InterpolableValue> clone() const OVERRIDE FINAL { return
create(m_value); } |
| 68 |
| 69 private: |
| 70 virtual PassOwnPtr<InterpolableValue> interpolate(const InterpolableValue &t
o, const double progress) const OVERRIDE FINAL; |
| 71 bool m_value; |
| 72 |
| 73 InterpolableBool(bool value) |
| 74 : m_value(value) |
| 75 { } |
| 76 |
| 77 }; |
| 78 |
| 79 class InterpolableList : public InterpolableValue { |
| 80 public: |
| 81 static PassOwnPtr<InterpolableList> create(const InterpolableList &other) |
| 82 { |
| 83 return adoptPtr(new InterpolableList(other)); |
| 84 } |
| 85 |
| 86 static PassOwnPtr<InterpolableList> create(size_t size) |
| 87 { |
| 88 return adoptPtr(new InterpolableList(size)); |
| 89 } |
| 90 |
| 91 virtual bool isList() const OVERRIDE FINAL { return true; } |
| 92 void set(size_t position, PassOwnPtr<InterpolableValue> value) |
| 93 { |
| 94 ASSERT(position < m_size); |
| 95 m_values.get()[position] = value; |
| 96 } |
| 97 const InterpolableValue* get(size_t position) const |
| 98 { |
| 99 ASSERT(position < m_size); |
| 100 return m_values.get()[position].get(); |
| 101 } |
| 102 virtual PassOwnPtr<InterpolableValue> clone() const OVERRIDE FINAL { return
create(*this); } |
| 103 |
| 104 private: |
| 105 virtual PassOwnPtr<InterpolableValue> interpolate(const InterpolableValue &o
ther, const double progress) const OVERRIDE FINAL; |
| 106 InterpolableList(size_t size) |
| 107 : m_size(size) |
| 108 { |
| 109 m_values = adoptArrayPtr(new OwnPtr<InterpolableValue>[size]); |
| 110 } |
| 111 |
| 112 InterpolableList(const InterpolableList& other) |
| 113 : m_size(other.m_size) |
| 114 { |
| 115 m_values = adoptArrayPtr(new OwnPtr<InterpolableValue>[m_size]); |
| 116 for (size_t i = 0; i < m_size; i++) |
| 117 set(i, other.m_values.get()[i]->clone()); |
| 118 } |
| 119 |
| 120 size_t m_size; |
| 121 OwnPtr<OwnPtr<InterpolableValue>[]> m_values; |
| 122 }; |
| 123 |
| 124 DEFINE_TYPE_CASTS(InterpolableNumber, InterpolableValue, value, value->isNumber(
), value.isNumber()); |
| 125 DEFINE_TYPE_CASTS(InterpolableBool, InterpolableValue, value, value->isBool(), v
alue.isBool()); |
| 126 DEFINE_TYPE_CASTS(InterpolableList, InterpolableValue, value, value->isList(), v
alue.isList()); |
| 127 |
| 128 } |
| 129 |
| 130 #endif |
OLD | NEW |