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