OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2011 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 21 matching lines...) Expand all Loading... |
32 TransformState& TransformState::operator=(const TransformState& other) | 32 TransformState& TransformState::operator=(const TransformState& other) |
33 { | 33 { |
34 m_accumulatedOffset = other.m_accumulatedOffset; | 34 m_accumulatedOffset = other.m_accumulatedOffset; |
35 m_mapPoint = other.m_mapPoint; | 35 m_mapPoint = other.m_mapPoint; |
36 m_mapQuad = other.m_mapQuad; | 36 m_mapQuad = other.m_mapQuad; |
37 if (m_mapPoint) | 37 if (m_mapPoint) |
38 m_lastPlanarPoint = other.m_lastPlanarPoint; | 38 m_lastPlanarPoint = other.m_lastPlanarPoint; |
39 if (m_mapQuad) | 39 if (m_mapQuad) |
40 m_lastPlanarQuad = other.m_lastPlanarQuad; | 40 m_lastPlanarQuad = other.m_lastPlanarQuad; |
41 m_accumulatingTransform = other.m_accumulatingTransform; | 41 m_accumulatingTransform = other.m_accumulatingTransform; |
| 42 m_forceAccumulatingTransform = other.m_forceAccumulatingTransform; |
42 m_direction = other.m_direction; | 43 m_direction = other.m_direction; |
43 | 44 |
44 m_accumulatedTransform.clear(); | 45 m_accumulatedTransform.clear(); |
45 | 46 |
46 if (other.m_accumulatedTransform) | 47 if (other.m_accumulatedTransform) |
47 m_accumulatedTransform = TransformationMatrix::create(*other.m_accumulat
edTransform); | 48 m_accumulatedTransform = TransformationMatrix::create(*other.m_accumulat
edTransform); |
48 | 49 |
49 return *this; | 50 return *this; |
50 } | 51 } |
51 | 52 |
52 void TransformState::translateTransform(const LayoutSize& offset) | 53 void TransformState::translateTransform(const LayoutSize& offset) |
53 { | 54 { |
54 if (m_direction == ApplyTransformDirection) | 55 if (m_direction == ApplyTransformDirection) |
55 m_accumulatedTransform->translateRight(offset.width().toDouble(), offset
.height().toDouble()); | 56 m_accumulatedTransform->translateRight(offset.width().toDouble(), offset
.height().toDouble()); |
56 else | 57 else |
57 m_accumulatedTransform->translate(offset.width().toDouble(), offset.heig
ht().toDouble()); | 58 m_accumulatedTransform->translate(offset.width().toDouble(), offset.heig
ht().toDouble()); |
58 } | 59 } |
59 | 60 |
60 void TransformState::translateMappedCoordinates(const LayoutSize& offset) | 61 void TransformState::translateMappedCoordinates(const LayoutSize& offset) |
61 { | 62 { |
62 FloatSize adjustedOffset((m_direction == ApplyTransformDirection) ? offset :
-offset); | 63 FloatSize adjustedOffset((m_direction == ApplyTransformDirection) ? offset :
-offset); |
63 if (m_mapPoint) | 64 if (m_mapPoint) |
64 m_lastPlanarPoint.move(adjustedOffset); | 65 m_lastPlanarPoint.move(adjustedOffset); |
65 if (m_mapQuad) | 66 if (m_mapQuad) |
66 m_lastPlanarQuad.move(adjustedOffset); | 67 m_lastPlanarQuad.move(adjustedOffset); |
67 } | 68 } |
68 | 69 |
69 void TransformState::move(const LayoutSize& offset, TransformAccumulation accumu
late) | 70 void TransformState::move(const LayoutSize& offset, TransformAccumulation accumu
late) |
70 { | 71 { |
| 72 if (m_forceAccumulatingTransform) |
| 73 accumulate = AccumulateTransform; |
| 74 |
71 if (accumulate == FlattenTransform || !m_accumulatedTransform) { | 75 if (accumulate == FlattenTransform || !m_accumulatedTransform) { |
72 m_accumulatedOffset += offset; | 76 m_accumulatedOffset += offset; |
73 } else { | 77 } else { |
74 applyAccumulatedOffset(); | 78 applyAccumulatedOffset(); |
75 if (m_accumulatingTransform && m_accumulatedTransform) { | 79 if (m_accumulatingTransform && m_accumulatedTransform) { |
76 // If we're accumulating into an existing transform, apply the trans
lation. | 80 // If we're accumulating into an existing transform, apply the trans
lation. |
77 translateTransform(offset); | 81 translateTransform(offset); |
78 } else { | 82 } else { |
79 // Just move the point and/or quad. | 83 // Just move the point and/or quad. |
80 translateMappedCoordinates(offset); | 84 translateMappedCoordinates(offset); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 if (m_direction == ApplyTransformDirection) | 124 if (m_direction == ApplyTransformDirection) |
121 m_accumulatedTransform = TransformationMatrix::create(transformFromC
ontainer * *m_accumulatedTransform); | 125 m_accumulatedTransform = TransformationMatrix::create(transformFromC
ontainer * *m_accumulatedTransform); |
122 else | 126 else |
123 m_accumulatedTransform->multiply(transformFromContainer); | 127 m_accumulatedTransform->multiply(transformFromContainer); |
124 } else if (accumulate == AccumulateTransform) { | 128 } else if (accumulate == AccumulateTransform) { |
125 // Make one if we started to accumulate | 129 // Make one if we started to accumulate |
126 m_accumulatedTransform = TransformationMatrix::create(transformFromConta
iner); | 130 m_accumulatedTransform = TransformationMatrix::create(transformFromConta
iner); |
127 } | 131 } |
128 | 132 |
129 if (accumulate == FlattenTransform) { | 133 if (accumulate == FlattenTransform) { |
130 const TransformationMatrix* finalTransform = m_accumulatedTransform ? m_
accumulatedTransform.get() : &transformFromContainer; | 134 if (m_forceAccumulatingTransform) { |
131 flattenWithTransform(*finalTransform, wasClamped); | 135 m_accumulatedTransform->flattenTo2d(); |
| 136 } else { |
| 137 const TransformationMatrix* finalTransform = m_accumulatedTransform
? m_accumulatedTransform.get() : &transformFromContainer; |
| 138 flattenWithTransform(*finalTransform, wasClamped); |
| 139 } |
132 } | 140 } |
133 m_accumulatingTransform = accumulate == AccumulateTransform; | 141 m_accumulatingTransform = accumulate == AccumulateTransform || m_forceAccumu
latingTransform; |
134 } | 142 } |
135 | 143 |
136 void TransformState::flatten(bool* wasClamped) | 144 void TransformState::flatten(bool* wasClamped) |
137 { | 145 { |
| 146 ASSERT(!m_forceAccumulatingTransform); |
138 if (wasClamped) | 147 if (wasClamped) |
139 *wasClamped = false; | 148 *wasClamped = false; |
140 | 149 |
141 applyAccumulatedOffset(); | 150 applyAccumulatedOffset(); |
142 | 151 |
143 if (!m_accumulatedTransform) { | 152 if (!m_accumulatedTransform) { |
144 m_accumulatingTransform = false; | 153 m_accumulatingTransform = false; |
145 return; | 154 return; |
146 } | 155 } |
147 | 156 |
(...skipping 25 matching lines...) Expand all Loading... |
173 quad.move(FloatSize((m_direction == ApplyTransformDirection) ? m_accumulated
Offset : -m_accumulatedOffset)); | 182 quad.move(FloatSize((m_direction == ApplyTransformDirection) ? m_accumulated
Offset : -m_accumulatedOffset)); |
174 if (!m_accumulatedTransform) | 183 if (!m_accumulatedTransform) |
175 return quad; | 184 return quad; |
176 | 185 |
177 if (m_direction == ApplyTransformDirection) | 186 if (m_direction == ApplyTransformDirection) |
178 return m_accumulatedTransform->mapQuad(quad); | 187 return m_accumulatedTransform->mapQuad(quad); |
179 | 188 |
180 return m_accumulatedTransform->inverse().projectQuad(quad, wasClamped); | 189 return m_accumulatedTransform->inverse().projectQuad(quad, wasClamped); |
181 } | 190 } |
182 | 191 |
| 192 const TransformationMatrix& TransformState::accumulatedTransform() const |
| 193 { |
| 194 ASSERT(m_forceAccumulatingTransform && m_accumulatingTransform); |
| 195 return *m_accumulatedTransform; |
| 196 } |
| 197 |
183 void TransformState::flattenWithTransform(const TransformationMatrix& t, bool* w
asClamped) | 198 void TransformState::flattenWithTransform(const TransformationMatrix& t, bool* w
asClamped) |
184 { | 199 { |
185 if (m_direction == ApplyTransformDirection) { | 200 if (m_direction == ApplyTransformDirection) { |
186 if (m_mapPoint) | 201 if (m_mapPoint) |
187 m_lastPlanarPoint = t.mapPoint(m_lastPlanarPoint); | 202 m_lastPlanarPoint = t.mapPoint(m_lastPlanarPoint); |
188 if (m_mapQuad) | 203 if (m_mapQuad) |
189 m_lastPlanarQuad = t.mapQuad(m_lastPlanarQuad); | 204 m_lastPlanarQuad = t.mapQuad(m_lastPlanarQuad); |
190 } else { | 205 } else { |
191 TransformationMatrix inverseTransform = t.inverse(); | 206 TransformationMatrix inverseTransform = t.inverse(); |
192 if (m_mapPoint) | 207 if (m_mapPoint) |
193 m_lastPlanarPoint = inverseTransform.projectPoint(m_lastPlanarPoint)
; | 208 m_lastPlanarPoint = inverseTransform.projectPoint(m_lastPlanarPoint)
; |
194 if (m_mapQuad) | 209 if (m_mapQuad) |
195 m_lastPlanarQuad = inverseTransform.projectQuad(m_lastPlanarQuad, wa
sClamped); | 210 m_lastPlanarQuad = inverseTransform.projectQuad(m_lastPlanarQuad, wa
sClamped); |
196 } | 211 } |
197 | 212 |
198 // We could throw away m_accumulatedTransform if we wanted to here, but that | 213 // We could throw away m_accumulatedTransform if we wanted to here, but that |
199 // would cause thrash when traversing hierarchies with alternating | 214 // would cause thrash when traversing hierarchies with alternating |
200 // preserve-3d and flat elements. | 215 // preserve-3d and flat elements. |
201 if (m_accumulatedTransform) | 216 if (m_accumulatedTransform) |
202 m_accumulatedTransform->makeIdentity(); | 217 m_accumulatedTransform->makeIdentity(); |
203 m_accumulatingTransform = false; | 218 m_accumulatingTransform = false; |
204 } | 219 } |
205 | 220 |
206 } // namespace blink | 221 } // namespace blink |
OLD | NEW |