1 /* libs/graphics/animator/SkMatrixParts.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 "SkMatrixParts.h"
19 #include "SkAnimateMaker.h"
20 #include "SkDrawMatrix.h"
21 #include "SkDrawRectangle.h"
22 #include "SkDrawPath.h"
23
SkMatrixPart()24 SkMatrixPart::SkMatrixPart() : fMatrix(NULL) {
25 }
26
dirty()27 void SkMatrixPart::dirty() {
28 fMatrix->dirty();
29 }
30
getParent() const31 SkDisplayable* SkMatrixPart::getParent() const {
32 return fMatrix;
33 }
34
setParent(SkDisplayable * parent)35 bool SkMatrixPart::setParent(SkDisplayable* parent) {
36 SkASSERT(parent != NULL);
37 if (parent->isMatrix() == false)
38 return true;
39 fMatrix = (SkDrawMatrix*) parent;
40 return false;
41 }
42
43
44 #if SK_USE_CONDENSED_INFO == 0
45
46 const SkMemberInfo SkRotate::fInfo[] = {
47 SK_MEMBER(center, Point),
48 SK_MEMBER(degrees, Float)
49 };
50
51 #endif
52
53 DEFINE_GET_MEMBER(SkRotate);
54
SkRotate()55 SkRotate::SkRotate() : degrees(0) {
56 center.fX = center.fY = 0;
57 }
58
add()59 bool SkRotate::add() {
60 fMatrix->rotate(degrees, center);
61 return false;
62 }
63
64
65 #if SK_USE_CONDENSED_INFO == 0
66
67 const SkMemberInfo SkScale::fInfo[] = {
68 SK_MEMBER(center, Point),
69 SK_MEMBER(x, Float),
70 SK_MEMBER(y, Float)
71 };
72
73 #endif
74
75 DEFINE_GET_MEMBER(SkScale);
76
SkScale()77 SkScale::SkScale() : x(SK_Scalar1), y(SK_Scalar1) {
78 center.fX = center.fY = 0;
79 }
80
add()81 bool SkScale::add() {
82 fMatrix->scale(x, y, center);
83 return false;
84 }
85
86
87 #if SK_USE_CONDENSED_INFO == 0
88
89 const SkMemberInfo SkSkew::fInfo[] = {
90 SK_MEMBER(center, Point),
91 SK_MEMBER(x, Float),
92 SK_MEMBER(y, Float)
93 };
94
95 #endif
96
97 DEFINE_GET_MEMBER(SkSkew);
98
SkSkew()99 SkSkew::SkSkew() : x(0), y(0) {
100 center.fX = center.fY = 0;
101 }
102
add()103 bool SkSkew::add() {
104 fMatrix->skew(x, y, center);
105 return false;
106 }
107
108
109 #if SK_USE_CONDENSED_INFO == 0
110
111 const SkMemberInfo SkTranslate::fInfo[] = {
112 SK_MEMBER(x, Float),
113 SK_MEMBER(y, Float)
114 };
115
116 #endif
117
118 DEFINE_GET_MEMBER(SkTranslate);
119
SkTranslate()120 SkTranslate::SkTranslate() : x(0), y(0) {
121 }
122
add()123 bool SkTranslate::add() {
124 fMatrix->translate(x, y);
125 return false;
126 }
127
128
129 #if SK_USE_CONDENSED_INFO == 0
130
131 const SkMemberInfo SkFromPath::fInfo[] = {
132 SK_MEMBER(mode, FromPathMode),
133 SK_MEMBER(offset, Float),
134 SK_MEMBER(path, Path)
135 };
136
137 #endif
138
139 DEFINE_GET_MEMBER(SkFromPath);
140
SkFromPath()141 SkFromPath::SkFromPath() :
142 mode(0), offset(0), path(NULL) {
143 }
144
~SkFromPath()145 SkFromPath::~SkFromPath() {
146 }
147
add()148 bool SkFromPath::add() {
149 if (path == NULL)
150 return true;
151 static const uint8_t gFlags[] = {
152 SkPathMeasure::kGetPosAndTan_MatrixFlag, // normal
153 SkPathMeasure::kGetTangent_MatrixFlag, // angle
154 SkPathMeasure::kGetPosition_MatrixFlag // position
155 };
156 if ((unsigned)mode >= SK_ARRAY_COUNT(gFlags))
157 return true;
158 SkMatrix result;
159 fPathMeasure.setPath(&path->getPath(), false);
160 if (fPathMeasure.getMatrix(offset, &result, (SkPathMeasure::MatrixFlags)gFlags[mode]))
161 fMatrix->set(result);
162 return false;
163 }
164
165
166 #if SK_USE_CONDENSED_INFO == 0
167
168 const SkMemberInfo SkRectToRect::fInfo[] = {
169 SK_MEMBER(destination, Rect),
170 SK_MEMBER(source, Rect)
171 };
172
173 #endif
174
175 DEFINE_GET_MEMBER(SkRectToRect);
176
SkRectToRect()177 SkRectToRect::SkRectToRect() :
178 source(NULL), destination(NULL) {
179 }
180
~SkRectToRect()181 SkRectToRect::~SkRectToRect() {
182 }
183
add()184 bool SkRectToRect::add() {
185 if (source == NULL || destination == NULL)
186 return true;
187 SkMatrix temp;
188 temp.setRectToRect(source->fRect, destination->fRect,
189 SkMatrix::kFill_ScaleToFit);
190 fMatrix->set(temp);
191 return false;
192 }
193
194 #ifdef SK_DUMP_ENABLED
dump(SkAnimateMaker * maker)195 void SkRectToRect::dump(SkAnimateMaker* maker) {
196 dumpBase(maker);
197 SkDebugf("/>\n");
198 SkDisplayList::fIndent += 4;
199 if (source) {
200 SkDebugf("%*s<source>\n", SkDisplayList::fIndent, "");
201 SkDisplayList::fIndent += 4;
202 source->dump(maker);
203 SkDisplayList::fIndent -= 4;
204 SkDebugf("%*s</source>\n", SkDisplayList::fIndent, "");
205 }
206 if (destination) {
207 SkDebugf("%*s<destination>\n", SkDisplayList::fIndent, "");
208 SkDisplayList::fIndent += 4;
209 destination->dump(maker);
210 SkDisplayList::fIndent -= 4;
211 SkDebugf("%*s</destination>\n", SkDisplayList::fIndent, "");
212 }
213 SkDisplayList::fIndent -= 4;
214 dumpEnd(maker);
215 }
216 #endif
217
preferredChild(SkDisplayTypes)218 const SkMemberInfo* SkRectToRect::preferredChild(SkDisplayTypes ) {
219 if (source == NULL)
220 return getMember("source"); // !!! cwap! need to refer to member through enum like kScope instead
221 else {
222 SkASSERT(destination == NULL);
223 return getMember("destination");
224 }
225 }
226
227
228 #if SK_USE_CONDENSED_INFO == 0
229
230 const SkMemberInfo SkPolyToPoly::fInfo[] = {
231 SK_MEMBER(destination, Polygon),
232 SK_MEMBER(source, Polygon)
233 };
234
235 #endif
236
237 DEFINE_GET_MEMBER(SkPolyToPoly);
238
SkPolyToPoly()239 SkPolyToPoly::SkPolyToPoly() : source(NULL), destination(NULL) {
240 }
241
~SkPolyToPoly()242 SkPolyToPoly::~SkPolyToPoly() {
243 }
244
add()245 bool SkPolyToPoly::add() {
246 SkASSERT(source);
247 SkASSERT(destination);
248 SkPoint src[4];
249 SkPoint dst[4];
250 SkPath& sourcePath = source->getPath();
251 int srcPts = sourcePath.getPoints(src, 4);
252 SkPath& destPath = destination->getPath();
253 int dstPts = destPath.getPoints(dst, 4);
254 if (srcPts != dstPts)
255 return true;
256 SkMatrix temp;
257 temp.setPolyToPoly(src, dst, srcPts);
258 fMatrix->set(temp);
259 return false;
260 }
261
262 #ifdef SK_DUMP_ENABLED
dump(SkAnimateMaker * maker)263 void SkPolyToPoly::dump(SkAnimateMaker* maker) {
264 dumpBase(maker);
265 SkDebugf("/>\n");
266 SkDisplayList::fIndent += 4;
267 if (source) {
268 SkDebugf("%*s<source>\n", SkDisplayList::fIndent, "");
269 SkDisplayList::fIndent += 4;
270 source->dump(maker);
271 SkDisplayList::fIndent -= 4;
272 SkDebugf("%*s</source>\n", SkDisplayList::fIndent, "");
273 }
274 if (destination) {
275 SkDebugf("%*s<destination>\n", SkDisplayList::fIndent, "");
276 SkDisplayList::fIndent += 4;
277 destination->dump(maker);
278 SkDisplayList::fIndent -= 4;
279 SkDebugf("%*s</destination>\n", SkDisplayList::fIndent, "");
280 }
281 SkDisplayList::fIndent -= 4;
282 dumpEnd(maker);
283 }
284 #endif
285
onEndElement(SkAnimateMaker &)286 void SkPolyToPoly::onEndElement(SkAnimateMaker& ) {
287 SkASSERT(source);
288 SkASSERT(destination);
289 if (source->childHasID() || destination->childHasID())
290 fMatrix->setChildHasID();
291 }
292
preferredChild(SkDisplayTypes)293 const SkMemberInfo* SkPolyToPoly::preferredChild(SkDisplayTypes ) {
294 if (source == NULL)
295 return getMember("source"); // !!! cwap! need to refer to member through enum like kScope instead
296 else {
297 SkASSERT(destination == NULL);
298 return getMember("destination");
299 }
300 }
301
302
303