• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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