From 8a1c16ff38322f0210116fa7293eb8817c7e477e Mon Sep 17 00:00:00 2001 From: "reed@android.com" Date: Wed, 17 Dec 2008 15:59:43 +0000 Subject: grab from latest android git-svn-id: http://skia.googlecode.com/svn/trunk@27 2bbb7eff-a529-9590-31e7-b0007b416f81 --- src/animator/SkMatrixParts.cpp | 302 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 302 insertions(+) create mode 100644 src/animator/SkMatrixParts.cpp (limited to 'src/animator/SkMatrixParts.cpp') diff --git a/src/animator/SkMatrixParts.cpp b/src/animator/SkMatrixParts.cpp new file mode 100644 index 0000000000..56bb2d0b73 --- /dev/null +++ b/src/animator/SkMatrixParts.cpp @@ -0,0 +1,302 @@ +/* libs/graphics/animator/SkMatrixParts.cpp +** +** Copyright 2006, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + +#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\n", SkDisplayList::fIndent, ""); + SkDisplayList::fIndent += 4; + source->dump(maker); + SkDisplayList::fIndent -= 4; + SkDebugf("%*s\n", SkDisplayList::fIndent, ""); + } + if (destination) { + SkDebugf("%*s\n", SkDisplayList::fIndent, ""); + SkDisplayList::fIndent += 4; + destination->dump(maker); + SkDisplayList::fIndent -= 4; + SkDebugf("%*s\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\n", SkDisplayList::fIndent, ""); + SkDisplayList::fIndent += 4; + source->dump(maker); + SkDisplayList::fIndent -= 4; + SkDebugf("%*s\n", SkDisplayList::fIndent, ""); + } + if (destination) { + SkDebugf("%*s\n", SkDisplayList::fIndent, ""); + SkDisplayList::fIndent += 4; + destination->dump(maker); + SkDisplayList::fIndent -= 4; + SkDebugf("%*s\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"); + } +} + + -- cgit v1.2.3