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 24 SkMatrixPart::SkMatrixPart() : fMatrix(NULL) { 25 } 26 27 void SkMatrixPart::dirty() { 28 fMatrix->dirty(); 29 } 30 31 SkDisplayable* SkMatrixPart::getParent() const { 32 return fMatrix; 33 } 34 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 55 SkRotate::SkRotate() : degrees(0) { 56 center.fX = center.fY = 0; 57 } 58 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 77 SkScale::SkScale() : x(SK_Scalar1), y(SK_Scalar1) { 78 center.fX = center.fY = 0; 79 } 80 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 99 SkSkew::SkSkew() : x(0), y(0) { 100 center.fX = center.fY = 0; 101 } 102 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 120 SkTranslate::SkTranslate() : x(0), y(0) { 121 } 122 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 141 SkFromPath::SkFromPath() : 142 mode(0), offset(0), path(NULL) { 143 } 144 145 SkFromPath::~SkFromPath() { 146 } 147 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 177 SkRectToRect::SkRectToRect() : 178 source(NULL), destination(NULL) { 179 } 180 181 SkRectToRect::~SkRectToRect() { 182 } 183 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 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 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 239 SkPolyToPoly::SkPolyToPoly() : source(NULL), destination(NULL) { 240 } 241 242 SkPolyToPoly::~SkPolyToPoly() { 243 } 244 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 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 286 void SkPolyToPoly::onEndElement(SkAnimateMaker& ) { 287 SkASSERT(source); 288 SkASSERT(destination); 289 if (source->childHasID() || destination->childHasID()) 290 fMatrix->setChildHasID(); 291 } 292 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