/* * Copyright 2006 The Android Open Source Project * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkMatrixParts.h" #include "SkAnimateMaker.h" #include "SkDrawMatrix.h" #include "SkDrawRectangle.h" #include "SkDrawPath.h" SkMatrixPart::SkMatrixPart() : fMatrix(NULL) { } void SkMatrixPart::dirty() { fMatrix->dirty(); } SkDisplayable* SkMatrixPart::getParent() const { return fMatrix; } bool SkMatrixPart::setParent(SkDisplayable* parent) { SkASSERT(parent != NULL); if (parent->isMatrix() == false) return true; fMatrix = (SkDrawMatrix*) parent; return false; } #if SK_USE_CONDENSED_INFO == 0 const SkMemberInfo SkRotate::fInfo[] = { SK_MEMBER(center, Point), SK_MEMBER(degrees, Float) }; #endif DEFINE_GET_MEMBER(SkRotate); SkRotate::SkRotate() : degrees(0) { center.fX = center.fY = 0; } bool SkRotate::add() { fMatrix->rotate(degrees, center); return false; } #if SK_USE_CONDENSED_INFO == 0 const SkMemberInfo SkScale::fInfo[] = { SK_MEMBER(center, Point), SK_MEMBER(x, Float), SK_MEMBER(y, Float) }; #endif DEFINE_GET_MEMBER(SkScale); SkScale::SkScale() : x(SK_Scalar1), y(SK_Scalar1) { center.fX = center.fY = 0; } bool SkScale::add() { fMatrix->scale(x, y, center); return false; } #if SK_USE_CONDENSED_INFO == 0 const SkMemberInfo SkSkew::fInfo[] = { SK_MEMBER(center, Point), SK_MEMBER(x, Float), SK_MEMBER(y, Float) }; #endif DEFINE_GET_MEMBER(SkSkew); SkSkew::SkSkew() : x(0), y(0) { center.fX = center.fY = 0; } bool SkSkew::add() { fMatrix->skew(x, y, center); return false; } #if SK_USE_CONDENSED_INFO == 0 const SkMemberInfo SkTranslate::fInfo[] = { SK_MEMBER(x, Float), SK_MEMBER(y, Float) }; #endif DEFINE_GET_MEMBER(SkTranslate); SkTranslate::SkTranslate() : x(0), y(0) { } bool SkTranslate::add() { fMatrix->translate(x, y); return false; } #if SK_USE_CONDENSED_INFO == 0 const SkMemberInfo SkFromPath::fInfo[] = { SK_MEMBER(mode, FromPathMode), SK_MEMBER(offset, Float), SK_MEMBER(path, Path) }; #endif DEFINE_GET_MEMBER(SkFromPath); SkFromPath::SkFromPath() : mode(0), offset(0), path(NULL) { } SkFromPath::~SkFromPath() { } bool SkFromPath::add() { if (path == NULL) return true; static const uint8_t gFlags[] = { SkPathMeasure::kGetPosAndTan_MatrixFlag, // normal SkPathMeasure::kGetTangent_MatrixFlag, // angle SkPathMeasure::kGetPosition_MatrixFlag // position }; if ((unsigned)mode >= SK_ARRAY_COUNT(gFlags)) return true; SkMatrix result; fPathMeasure.setPath(&path->getPath(), false); if (fPathMeasure.getMatrix(offset, &result, (SkPathMeasure::MatrixFlags)gFlags[mode])) fMatrix->set(result); return false; } #if SK_USE_CONDENSED_INFO == 0 const SkMemberInfo SkRectToRect::fInfo[] = { SK_MEMBER(destination, Rect), SK_MEMBER(source, Rect) }; #endif DEFINE_GET_MEMBER(SkRectToRect); SkRectToRect::SkRectToRect() : source(NULL), destination(NULL) { } SkRectToRect::~SkRectToRect() { } bool SkRectToRect::add() { if (source == NULL || destination == NULL) return true; SkMatrix temp; temp.setRectToRect(source->fRect, destination->fRect, SkMatrix::kFill_ScaleToFit); fMatrix->set(temp); return false; } #ifdef SK_DUMP_ENABLED void SkRectToRect::dump(SkAnimateMaker* maker) { dumpBase(maker); SkDebugf("/>\n"); SkDisplayList::fIndent += 4; if (source) { SkDebugf("%*s<source>\n", SkDisplayList::fIndent, ""); SkDisplayList::fIndent += 4; source->dump(maker); SkDisplayList::fIndent -= 4; SkDebugf("%*s</source>\n", SkDisplayList::fIndent, ""); } if (destination) { SkDebugf("%*s<destination>\n", SkDisplayList::fIndent, ""); SkDisplayList::fIndent += 4; destination->dump(maker); SkDisplayList::fIndent -= 4; SkDebugf("%*s</destination>\n", SkDisplayList::fIndent, ""); } SkDisplayList::fIndent -= 4; dumpEnd(maker); } #endif const SkMemberInfo* SkRectToRect::preferredChild(SkDisplayTypes ) { if (source == NULL) return getMember("source"); // !!! cwap! need to refer to member through enum like kScope instead else { SkASSERT(destination == NULL); return getMember("destination"); } } #if SK_USE_CONDENSED_INFO == 0 const SkMemberInfo SkPolyToPoly::fInfo[] = { SK_MEMBER(destination, Polygon), SK_MEMBER(source, Polygon) }; #endif DEFINE_GET_MEMBER(SkPolyToPoly); SkPolyToPoly::SkPolyToPoly() : source(NULL), destination(NULL) { } SkPolyToPoly::~SkPolyToPoly() { } bool SkPolyToPoly::add() { SkASSERT(source); SkASSERT(destination); SkPoint src[4]; SkPoint dst[4]; SkPath& sourcePath = source->getPath(); int srcPts = sourcePath.getPoints(src, 4); SkPath& destPath = destination->getPath(); int dstPts = destPath.getPoints(dst, 4); if (srcPts != dstPts) return true; SkMatrix temp; temp.setPolyToPoly(src, dst, srcPts); fMatrix->set(temp); return false; } #ifdef SK_DUMP_ENABLED void SkPolyToPoly::dump(SkAnimateMaker* maker) { dumpBase(maker); SkDebugf("/>\n"); SkDisplayList::fIndent += 4; if (source) { SkDebugf("%*s<source>\n", SkDisplayList::fIndent, ""); SkDisplayList::fIndent += 4; source->dump(maker); SkDisplayList::fIndent -= 4; SkDebugf("%*s</source>\n", SkDisplayList::fIndent, ""); } if (destination) { SkDebugf("%*s<destination>\n", SkDisplayList::fIndent, ""); SkDisplayList::fIndent += 4; destination->dump(maker); SkDisplayList::fIndent -= 4; SkDebugf("%*s</destination>\n", SkDisplayList::fIndent, ""); } SkDisplayList::fIndent -= 4; dumpEnd(maker); } #endif void SkPolyToPoly::onEndElement(SkAnimateMaker& ) { SkASSERT(source); SkASSERT(destination); if (source->childHasID() || destination->childHasID()) fMatrix->setChildHasID(); } const SkMemberInfo* SkPolyToPoly::preferredChild(SkDisplayTypes ) { if (source == NULL) return getMember("source"); // !!! cwap! need to refer to member through enum like kScope instead else { SkASSERT(destination == NULL); return getMember("destination"); } }