OLD | NEW |
| (Empty) |
1 /* libs/graphics/animator/SkDrawMatrix.cpp | |
2 ** | |
3 ** Copyright 2006, The Android Open Source Project | |
4 ** | |
5 ** Licensed under the Apache License, Version 2.0 (the "License"); | |
6 ** you may not use this file except in compliance with the License. | |
7 ** You may obtain a copy of the License at | |
8 ** | |
9 ** http://www.apache.org/licenses/LICENSE-2.0 | |
10 ** | |
11 ** Unless required by applicable law or agreed to in writing, software | |
12 ** distributed under the License is distributed on an "AS IS" BASIS, | |
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
14 ** See the License for the specific language governing permissions and | |
15 ** limitations under the License. | |
16 */ | |
17 | |
18 #include "SkDrawMatrix.h" | |
19 #include "SkAnimateMaker.h" | |
20 #include "SkCanvas.h" | |
21 #include "SkPaint.h" | |
22 #include "SkParse.h" | |
23 #include "SkMatrixParts.h" | |
24 #include "SkScript.h" | |
25 #include "SkTypedArray.h" | |
26 | |
27 enum SkDrawMatrix_Properties { | |
28 SK_PROPERTY(perspectX), | |
29 SK_PROPERTY(perspectY), | |
30 SK_PROPERTY(rotate), | |
31 SK_PROPERTY(scale), | |
32 SK_PROPERTY(scaleX), | |
33 SK_PROPERTY(scaleY), | |
34 SK_PROPERTY(skewX), | |
35 SK_PROPERTY(skewY), | |
36 SK_PROPERTY(translate), | |
37 SK_PROPERTY(translateX), | |
38 SK_PROPERTY(translateY) | |
39 }; | |
40 | |
41 #if SK_USE_CONDENSED_INFO == 0 | |
42 | |
43 const SkMemberInfo SkDrawMatrix::fInfo[] = { | |
44 SK_MEMBER_ARRAY(matrix, Float), | |
45 SK_MEMBER_PROPERTY(perspectX, Float), | |
46 SK_MEMBER_PROPERTY(perspectY, Float), | |
47 SK_MEMBER_PROPERTY(rotate, Float), | |
48 SK_MEMBER_PROPERTY(scale, Float), | |
49 SK_MEMBER_PROPERTY(scaleX, Float), | |
50 SK_MEMBER_PROPERTY(scaleY, Float), | |
51 SK_MEMBER_PROPERTY(skewX, Float), | |
52 SK_MEMBER_PROPERTY(skewY, Float), | |
53 SK_MEMBER_PROPERTY(translate, Point), | |
54 SK_MEMBER_PROPERTY(translateX, Float), | |
55 SK_MEMBER_PROPERTY(translateY, Float) | |
56 }; | |
57 | |
58 #endif | |
59 | |
60 DEFINE_GET_MEMBER(SkDrawMatrix); | |
61 | |
62 SkDrawMatrix::SkDrawMatrix() : fChildHasID(false), fDirty(false) { | |
63 fConcat.reset(); | |
64 fMatrix.reset(); | |
65 } | |
66 | |
67 SkDrawMatrix::~SkDrawMatrix() { | |
68 for (SkMatrixPart** part = fParts.begin(); part < fParts.end(); part++) | |
69 delete *part; | |
70 } | |
71 | |
72 bool SkDrawMatrix::add(SkAnimateMaker& maker, SkDisplayable* child) { | |
73 SkASSERT(child && child->isMatrixPart()); | |
74 SkMatrixPart* part = (SkMatrixPart*) child; | |
75 *fParts.append() = part; | |
76 if (part->add()) | |
77 maker.setErrorCode(SkDisplayXMLParserError::kErrorAddingToMatrix); | |
78 return true; | |
79 } | |
80 | |
81 bool SkDrawMatrix::childrenNeedDisposing() const { | |
82 return false; | |
83 } | |
84 | |
85 SkDisplayable* SkDrawMatrix::deepCopy(SkAnimateMaker* maker) { | |
86 SkDrawMatrix* copy = (SkDrawMatrix*) | |
87 SkDisplayType::CreateInstance(maker, SkType_Matrix); | |
88 SkASSERT(fParts.count() == 0); | |
89 copy->fMatrix = fMatrix; | |
90 copy->fConcat = fConcat; | |
91 return copy; | |
92 } | |
93 | |
94 void SkDrawMatrix::dirty() { | |
95 fDirty = true; | |
96 } | |
97 | |
98 bool SkDrawMatrix::draw(SkAnimateMaker& maker) { | |
99 SkMatrix& concat = getMatrix(); | |
100 maker.fCanvas->concat(concat); | |
101 return false; | |
102 } | |
103 | |
104 #ifdef SK_DUMP_ENABLED | |
105 void SkDrawMatrix::dump(SkAnimateMaker* maker) { | |
106 dumpBase(maker); | |
107 if (fMatrix.isIdentity()) { | |
108 SkDebugf("matrix=\"identity\"/>\n"); | |
109 return; | |
110 } | |
111 SkScalar result; | |
112 result = fMatrix[SkMatrix::kMScaleX]; | |
113 if (result != SK_Scalar1) | |
114 SkDebugf("sx=\"%g\" ", SkScalarToFloat(result)); | |
115 result = fMatrix.getScaleY(); | |
116 if (result != SK_Scalar1) | |
117 SkDebugf("sy=\"%g\" ", SkScalarToFloat(result)); | |
118 result = fMatrix.getSkewX(); | |
119 if (result) | |
120 SkDebugf("skew-x=\"%g\" ", SkScalarToFloat(result)); | |
121 result = fMatrix.getSkewY(); | |
122 if (result) | |
123 SkDebugf("skew-y=\"%g\" ", SkScalarToFloat(result)); | |
124 result = fMatrix.getTranslateX(); | |
125 if (result) | |
126 SkDebugf("tx=\"%g\" ", SkScalarToFloat(result)); | |
127 result = fMatrix.getTranslateY(); | |
128 if (result) | |
129 SkDebugf("ty=\"%g\" ", SkScalarToFloat(result)); | |
130 result = fMatrix.getPerspX(); | |
131 if (result) | |
132 SkDebugf("perspect-x=\"%g\" ", SkScalarToFloat(result)); | |
133 result = fMatrix.getPerspY(); | |
134 if (result) | |
135 SkDebugf("perspect-y=\"%g\" ", SkScalarToFloat(result)); | |
136 SkDebugf("/>\n"); | |
137 } | |
138 #endif | |
139 | |
140 SkMatrix& SkDrawMatrix::getMatrix() { | |
141 if (fDirty == false) | |
142 return fConcat; | |
143 fMatrix.reset(); | |
144 for (SkMatrixPart** part = fParts.begin(); part < fParts.end(); part++) { | |
145 (*part)->add(); | |
146 fConcat = fMatrix; | |
147 } | |
148 fDirty = false; | |
149 return fConcat; | |
150 } | |
151 | |
152 bool SkDrawMatrix::getProperty(int index, SkScriptValue* value) const { | |
153 value->fType = SkType_Float; | |
154 SkScalar result; | |
155 switch (index) { | |
156 case SK_PROPERTY(perspectX): | |
157 result = fMatrix.getPerspX(); | |
158 break; | |
159 case SK_PROPERTY(perspectY): | |
160 result = fMatrix.getPerspY(); | |
161 break; | |
162 case SK_PROPERTY(scaleX): | |
163 result = fMatrix.getScaleX(); | |
164 break; | |
165 case SK_PROPERTY(scaleY): | |
166 result = fMatrix.getScaleY(); | |
167 break; | |
168 case SK_PROPERTY(skewX): | |
169 result = fMatrix.getSkewX(); | |
170 break; | |
171 case SK_PROPERTY(skewY): | |
172 result = fMatrix.getSkewY(); | |
173 break; | |
174 case SK_PROPERTY(translateX): | |
175 result = fMatrix.getTranslateX(); | |
176 break; | |
177 case SK_PROPERTY(translateY): | |
178 result = fMatrix.getTranslateY(); | |
179 break; | |
180 default: | |
181 // SkASSERT(0); | |
182 return false; | |
183 } | |
184 value->fOperand.fScalar = result; | |
185 return true; | |
186 } | |
187 | |
188 void SkDrawMatrix::initialize() { | |
189 fConcat = fMatrix; | |
190 } | |
191 | |
192 void SkDrawMatrix::onEndElement(SkAnimateMaker& ) { | |
193 if (matrix.count() > 0) { | |
194 SkScalar* vals = matrix.begin(); | |
195 fMatrix.setScaleX(vals[0]); | |
196 fMatrix.setSkewX(vals[1]); | |
197 fMatrix.setTranslateX(vals[2]); | |
198 fMatrix.setSkewY(vals[3]); | |
199 fMatrix.setScaleY(vals[4]); | |
200 fMatrix.setTranslateY(vals[5]); | |
201 #ifdef SK_SCALAR_IS_FIXED | |
202 fMatrix.setPerspX(SkFixedToFract(vals[6])); | |
203 fMatrix.setPerspY(SkFixedToFract(vals[7])); | |
204 #else | |
205 fMatrix.setPerspX(vals[6]); | |
206 fMatrix.setPerspY(vals[7]); | |
207 #endif | |
208 // fMatrix.setPerspW(vals[8]); | |
209 goto setConcat; | |
210 } | |
211 if (fChildHasID == false) { | |
212 { | |
213 for (SkMatrixPart** part = fParts.begin(); part < fParts.end(); par
t++) | |
214 delete *part; | |
215 } | |
216 fParts.reset(); | |
217 setConcat: | |
218 fConcat = fMatrix; | |
219 fDirty = false; | |
220 } | |
221 } | |
222 | |
223 void SkDrawMatrix::setChildHasID() { | |
224 fChildHasID = true; | |
225 } | |
226 | |
227 bool SkDrawMatrix::setProperty(int index, SkScriptValue& scriptValue) { | |
228 SkScalar number = scriptValue.fOperand.fScalar; | |
229 switch (index) { | |
230 case SK_PROPERTY(translate): | |
231 // SkScalar xy[2]; | |
232 SkASSERT(scriptValue.fType == SkType_Array); | |
233 SkASSERT(scriptValue.fOperand.fArray->getType() == SkType_Float); | |
234 SkASSERT(scriptValue.fOperand.fArray->count() == 2); | |
235 // SkParse::FindScalars(scriptValue.fOperand.fString->c_str(), xy, 2); | |
236 fMatrix.setTranslateX((*scriptValue.fOperand.fArray)[0].fScalar); | |
237 fMatrix.setTranslateY((*scriptValue.fOperand.fArray)[1].fScalar); | |
238 return true; | |
239 case SK_PROPERTY(perspectX): | |
240 #ifdef SK_SCALAR_IS_FIXED | |
241 fMatrix.setPerspX(SkFixedToFract(number)); | |
242 #else | |
243 fMatrix.setPerspX(number); | |
244 #endif | |
245 break; | |
246 case SK_PROPERTY(perspectY): | |
247 #ifdef SK_SCALAR_IS_FIXED | |
248 fMatrix.setPerspY(SkFixedToFract(number)); | |
249 #else | |
250 fMatrix.setPerspY(number); | |
251 #endif | |
252 break; | |
253 case SK_PROPERTY(rotate): { | |
254 SkMatrix temp; | |
255 temp.setRotate(number, 0, 0); | |
256 fMatrix.setScaleX(temp.getScaleX()); | |
257 fMatrix.setScaleY(temp.getScaleY()); | |
258 fMatrix.setSkewX(temp.getSkewX()); | |
259 fMatrix.setSkewY(temp.getSkewY()); | |
260 } break; | |
261 case SK_PROPERTY(scale): | |
262 fMatrix.setScaleX(number); | |
263 fMatrix.setScaleY(number); | |
264 break; | |
265 case SK_PROPERTY(scaleX): | |
266 fMatrix.setScaleX(number); | |
267 break; | |
268 case SK_PROPERTY(scaleY): | |
269 fMatrix.setScaleY(number); | |
270 break; | |
271 case SK_PROPERTY(skewX): | |
272 fMatrix.setSkewX(number); | |
273 break; | |
274 case SK_PROPERTY(skewY): | |
275 fMatrix.setSkewY(number); | |
276 break; | |
277 case SK_PROPERTY(translateX): | |
278 fMatrix.setTranslateX(number); | |
279 break; | |
280 case SK_PROPERTY(translateY): | |
281 fMatrix.setTranslateY(number); | |
282 break; | |
283 default: | |
284 SkASSERT(0); | |
285 return false; | |
286 } | |
287 fConcat = fMatrix; | |
288 return true; | |
289 } | |
290 | |
OLD | NEW |