OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (C) 1999 Antti Koivisto (koivisto@kde.org) | |
3 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. | |
4 * | |
5 * This library is free software; you can redistribute it and/or | |
6 * modify it under the terms of the GNU Library General Public | |
7 * License as published by the Free Software Foundation; either | |
8 * version 2 of the License, or (at your option) any later version. | |
9 * | |
10 * This library is distributed in the hope that it will be useful, | |
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 * Library General Public License for more details. | |
14 * | |
15 * You should have received a copy of the GNU Library General Public License | |
16 * along with this library; see the file COPYING.LIB. If not, write to | |
17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | |
18 * Boston, MA 02110-1301, USA. | |
19 * | |
20 */ | |
21 | |
22 #include "config.h" | |
23 #include "core/platform/graphics/transforms/TransformOperations.h" | |
24 | |
25 #include <algorithm> | |
26 #include "core/platform/graphics/transforms/IdentityTransformOperation.h" | |
27 #include "core/platform/graphics/transforms/InterpolatedTransformOperation.h" | |
28 | |
29 using namespace std; | |
30 | |
31 namespace WebCore { | |
32 | |
33 TransformOperations::TransformOperations(bool makeIdentity) | |
34 { | |
35 if (makeIdentity) | |
36 m_operations.append(IdentityTransformOperation::create()); | |
37 } | |
38 | |
39 bool TransformOperations::operator==(const TransformOperations& o) const | |
40 { | |
41 if (m_operations.size() != o.m_operations.size()) | |
42 return false; | |
43 | |
44 unsigned s = m_operations.size(); | |
45 for (unsigned i = 0; i < s; i++) { | |
46 if (*m_operations[i] != *o.m_operations[i]) | |
47 return false; | |
48 } | |
49 | |
50 return true; | |
51 } | |
52 | |
53 bool TransformOperations::operationsMatch(const TransformOperations& other) cons
t | |
54 { | |
55 size_t numOperations = operations().size(); | |
56 // If the sizes of the function lists don't match, the lists don't match | |
57 if (numOperations != other.operations().size()) | |
58 return false; | |
59 | |
60 // If the types of each function are not the same, the lists don't match | |
61 for (size_t i = 0; i < numOperations; ++i) { | |
62 if (!operations()[i]->isSameType(*other.operations()[i])) | |
63 return false; | |
64 } | |
65 return true; | |
66 } | |
67 | |
68 TransformOperations TransformOperations::blendByMatchingOperations(const Transfo
rmOperations& from, const double& progress) const | |
69 { | |
70 TransformOperations result; | |
71 | |
72 unsigned fromSize = from.operations().size(); | |
73 unsigned toSize = operations().size(); | |
74 unsigned size = max(fromSize, toSize); | |
75 for (unsigned i = 0; i < size; i++) { | |
76 RefPtr<TransformOperation> fromOperation = (i < fromSize) ? from.operati
ons()[i].get() : 0; | |
77 RefPtr<TransformOperation> toOperation = (i < toSize) ? operations()[i].
get() : 0; | |
78 RefPtr<TransformOperation> blendedOperation = toOperation ? toOperation-
>blend(fromOperation.get(), progress) : (fromOperation ? fromOperation->blend(0,
progress, true) : 0); | |
79 if (blendedOperation) | |
80 result.operations().append(blendedOperation); | |
81 else { | |
82 RefPtr<TransformOperation> identityOperation = IdentityTransformOper
ation::create(); | |
83 if (progress > 0.5) | |
84 result.operations().append(toOperation ? toOperation : identityO
peration); | |
85 else | |
86 result.operations().append(fromOperation ? fromOperation : ident
ityOperation); | |
87 } | |
88 } | |
89 | |
90 return result; | |
91 } | |
92 | |
93 TransformOperations TransformOperations::blendByUsingMatrixInterpolation(const T
ransformOperations& from, double progress) const | |
94 { | |
95 TransformOperations result; | |
96 result.operations().append(InterpolatedTransformOperation::create(from, *thi
s, progress)); | |
97 return result; | |
98 } | |
99 | |
100 TransformOperations TransformOperations::blend(const TransformOperations& from,
double progress) const | |
101 { | |
102 if (from == *this) | |
103 return *this; | |
104 | |
105 if (from.size() && from.operationsMatch(*this)) | |
106 return blendByMatchingOperations(from, progress); | |
107 | |
108 return blendByUsingMatrixInterpolation(from, progress); | |
109 } | |
110 | |
111 TransformOperations TransformOperations::add(const TransformOperations& addend)
const | |
112 { | |
113 TransformOperations result; | |
114 result.m_operations = operations(); | |
115 result.m_operations.append(addend.operations()); | |
116 return result; | |
117 } | |
118 | |
119 } // namespace WebCore | |
OLD | NEW |