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