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 16 SkMatrixPart::SkMatrixPart() : fMatrix(NULL) { 17 } 18 19 void SkMatrixPart::dirty() { 20 fMatrix->dirty(); 21 } 22 23 SkDisplayable* SkMatrixPart::getParent() const { 24 return fMatrix; 25 } 26 27 bool SkMatrixPart::setParent(SkDisplayable* parent) { 28 SkASSERT(parent != NULL); 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 47 SkRotate::SkRotate() : degrees(0) { 48 center.fX = center.fY = 0; 49 } 50 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 69 SkScale::SkScale() : x(SK_Scalar1), y(SK_Scalar1) { 70 center.fX = center.fY = 0; 71 } 72 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 91 SkSkew::SkSkew() : x(0), y(0) { 92 center.fX = center.fY = 0; 93 } 94 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 112 SkTranslate::SkTranslate() : x(0), y(0) { 113 } 114 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 133 SkFromPath::SkFromPath() : 134 mode(0), offset(0), path(NULL) { 135 } 136 137 SkFromPath::~SkFromPath() { 138 } 139 140 bool SkFromPath::add() { 141 if (path == NULL) 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 169 SkRectToRect::SkRectToRect() : 170 source(NULL), destination(NULL) { 171 } 172 173 SkRectToRect::~SkRectToRect() { 174 } 175 176 bool SkRectToRect::add() { 177 if (source == NULL || destination == NULL) 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 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 210 const SkMemberInfo* SkRectToRect::preferredChild(SkDisplayTypes ) { 211 if (source == NULL) 212 return getMember("source"); // !!! cwap! need to refer to member through enum like kScope instead 213 else { 214 SkASSERT(destination == NULL); 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 231 SkPolyToPoly::SkPolyToPoly() : source(NULL), destination(NULL) { 232 } 233 234 SkPolyToPoly::~SkPolyToPoly() { 235 } 236 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 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 278 void SkPolyToPoly::onEndElement(SkAnimateMaker& ) { 279 SkASSERT(source); 280 SkASSERT(destination); 281 if (source->childHasID() || destination->childHasID()) 282 fMatrix->setChildHasID(); 283 } 284 285 const SkMemberInfo* SkPolyToPoly::preferredChild(SkDisplayTypes ) { 286 if (source == NULL) 287 return getMember("source"); // !!! cwap! need to refer to member through enum like kScope instead 288 else { 289 SkASSERT(destination == NULL); 290 return getMember("destination"); 291 } 292 } 293