Index: skia/animator/SkDrawExtraPathEffect.cpp |
=================================================================== |
--- skia/animator/SkDrawExtraPathEffect.cpp (revision 16859) |
+++ skia/animator/SkDrawExtraPathEffect.cpp (working copy) |
@@ -1,519 +0,0 @@ |
-/* libs/graphics/animator/SkDrawExtraPathEffect.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 "SkDrawExtraPathEffect.h" |
-#include "SkDrawPath.h" |
-#include "Sk1DPathEffect.h" |
-#include "Sk2DPathEffect.h" |
-#include "SkMemberInfo.h" |
-#include "SkPaintParts.h" |
-#include "SkPathEffect.h" |
-#include "SkCornerPathEffect.h" |
- |
-#include "SkDashPathEffect.h" |
- |
-class SkDrawShapePathEffect : public SkDrawPathEffect { |
- DECLARE_PRIVATE_MEMBER_INFO(DrawShapePathEffect); |
- SkDrawShapePathEffect(); |
- virtual ~SkDrawShapePathEffect(); |
- virtual bool add(SkAnimateMaker& , SkDisplayable* ); |
- virtual SkPathEffect* getPathEffect(); |
-protected: |
- SkDrawable* addPath; |
- SkDrawable* addMatrix; |
- SkDrawPath* path; |
- SkPathEffect* fPathEffect; |
- friend class SkShape1DPathEffect; |
- friend class SkShape2DPathEffect; |
-}; |
- |
-class SkDrawShape1DPathEffect : public SkDrawShapePathEffect { |
- DECLARE_EXTRAS_MEMBER_INFO(SkDrawShape1DPathEffect); |
- SkDrawShape1DPathEffect(SkDisplayTypes ); |
- virtual ~SkDrawShape1DPathEffect(); |
- virtual void onEndElement(SkAnimateMaker& ); |
-private: |
- SkString phase; |
- SkString spacing; |
- friend class SkShape1DPathEffect; |
- typedef SkDrawShapePathEffect INHERITED; |
-}; |
- |
-class SkDrawShape2DPathEffect : public SkDrawShapePathEffect { |
- DECLARE_EXTRAS_MEMBER_INFO(SkDrawShape2DPathEffect); |
- SkDrawShape2DPathEffect(SkDisplayTypes ); |
- virtual ~SkDrawShape2DPathEffect(); |
- virtual void onEndElement(SkAnimateMaker& ); |
-private: |
- SkDrawMatrix* matrix; |
- friend class SkShape2DPathEffect; |
- typedef SkDrawShapePathEffect INHERITED; |
-}; |
- |
-class SkDrawComposePathEffect : public SkDrawPathEffect { |
- DECLARE_EXTRAS_MEMBER_INFO(SkDrawComposePathEffect); |
- SkDrawComposePathEffect(SkDisplayTypes ); |
- virtual ~SkDrawComposePathEffect(); |
- virtual bool add(SkAnimateMaker& , SkDisplayable* ); |
- virtual SkPathEffect* getPathEffect(); |
- virtual bool isPaint() const; |
-private: |
- SkDrawPathEffect* effect1; |
- SkDrawPathEffect* effect2; |
-}; |
- |
-class SkDrawCornerPathEffect : public SkDrawPathEffect { |
- DECLARE_EXTRAS_MEMBER_INFO(SkDrawCornerPathEffect); |
- SkDrawCornerPathEffect(SkDisplayTypes ); |
- virtual ~SkDrawCornerPathEffect(); |
- virtual SkPathEffect* getPathEffect(); |
-private: |
- SkScalar radius; |
-}; |
- |
-//////////// SkShape1DPathEffect |
- |
-#include "SkAnimateMaker.h" |
-#include "SkAnimatorScript.h" |
-#include "SkDisplayApply.h" |
-#include "SkDrawMatrix.h" |
-#include "SkPaint.h" |
- |
-class SkShape1DPathEffect : public Sk1DPathEffect { |
-public: |
- SkShape1DPathEffect(SkDrawShape1DPathEffect* draw, SkAnimateMaker* maker) : |
- fDraw(draw), fMaker(maker) { |
- } |
- |
-protected: |
- virtual SkScalar begin(SkScalar contourLength) |
- { |
- SkScriptValue value; |
- SkAnimatorScript engine(*fMaker, NULL, SkType_Float); |
- engine.propertyCallBack(GetContourLength, &contourLength); |
- value.fOperand.fScalar = 0; |
- engine.evaluate(fDraw->phase.c_str(), &value, SkType_Float); |
- return value.fOperand.fScalar; |
- } |
- |
- virtual SkScalar next(SkPath* dst, SkScalar distance, SkPathMeasure& ) |
- { |
- fMaker->setExtraPropertyCallBack(fDraw->fType, GetDistance, &distance); |
- SkDrawPath* drawPath = NULL; |
- if (fDraw->addPath->isPath()) { |
- drawPath = (SkDrawPath*) fDraw->addPath; |
- } else { |
- SkApply* apply = (SkApply*) fDraw->addPath; |
- apply->refresh(*fMaker); |
- apply->activate(*fMaker); |
- apply->interpolate(*fMaker, SkScalarMulRound(distance, 1000)); |
- drawPath = (SkDrawPath*) apply->getScope(); |
- } |
- SkMatrix m; |
- m.reset(); |
- if (fDraw->addMatrix) { |
- SkDrawMatrix* matrix; |
- if (fDraw->addMatrix->getType() == SkType_Matrix) |
- matrix = (SkDrawMatrix*) fDraw->addMatrix; |
- else { |
- SkApply* apply = (SkApply*) fDraw->addMatrix; |
- apply->refresh(*fMaker); |
- apply->activate(*fMaker); |
- apply->interpolate(*fMaker, SkScalarMulRound(distance, 1000)); |
- matrix = (SkDrawMatrix*) apply->getScope(); |
- } |
- } |
- SkScalar result = 0; |
- SkAnimatorScript::EvaluateFloat(*fMaker, NULL, fDraw->spacing.c_str(), &result); |
- if (drawPath) |
- dst->addPath(drawPath->getPath(), m); |
- fMaker->clearExtraPropertyCallBack(fDraw->fType); |
- return result; |
- } |
- |
-private: |
- virtual void flatten(SkFlattenableWriteBuffer& ) {} |
- virtual Factory getFactory() { return NULL; } |
- |
- static bool GetContourLength(const char* token, size_t len, void* clen, SkScriptValue* value) { |
- if (SK_LITERAL_STR_EQUAL("contourLength", token, len)) { |
- value->fOperand.fScalar = *(SkScalar*) clen; |
- value->fType = SkType_Float; |
- return true; |
- } |
- return false; |
- } |
- |
- static bool GetDistance(const char* token, size_t len, void* dist, SkScriptValue* value) { |
- if (SK_LITERAL_STR_EQUAL("distance", token, len)) { |
- value->fOperand.fScalar = *(SkScalar*) dist; |
- value->fType = SkType_Float; |
- return true; |
- } |
- return false; |
- } |
- |
- SkDrawShape1DPathEffect* fDraw; |
- SkAnimateMaker* fMaker; |
-}; |
- |
-//////////// SkDrawShapePathEffect |
- |
-#if SK_USE_CONDENSED_INFO == 0 |
- |
-const SkMemberInfo SkDrawShapePathEffect::fInfo[] = { |
- SK_MEMBER(addMatrix, Drawable), // either matrix or apply |
- SK_MEMBER(addPath, Drawable), // either path or apply |
- SK_MEMBER(path, Path), |
-}; |
- |
-#endif |
- |
-DEFINE_GET_MEMBER(SkDrawShapePathEffect); |
- |
-SkDrawShapePathEffect::SkDrawShapePathEffect() : |
- addPath(NULL), addMatrix(NULL), path(NULL), fPathEffect(NULL) { |
-} |
- |
-SkDrawShapePathEffect::~SkDrawShapePathEffect() { |
- fPathEffect->safeUnref(); |
-} |
- |
-bool SkDrawShapePathEffect::add(SkAnimateMaker& , SkDisplayable* child) { |
- path = (SkDrawPath*) child; |
- return true; |
-} |
- |
-SkPathEffect* SkDrawShapePathEffect::getPathEffect() { |
- fPathEffect->ref(); |
- return fPathEffect; |
-} |
- |
-//////////// SkDrawShape1DPathEffect |
- |
-#if SK_USE_CONDENSED_INFO == 0 |
- |
-const SkMemberInfo SkDrawShape1DPathEffect::fInfo[] = { |
- SK_MEMBER_INHERITED, |
- SK_MEMBER(phase, String), |
- SK_MEMBER(spacing, String), |
-}; |
- |
-#endif |
- |
-DEFINE_GET_MEMBER(SkDrawShape1DPathEffect); |
- |
-SkDrawShape1DPathEffect::SkDrawShape1DPathEffect(SkDisplayTypes type) : fType(type) { |
-} |
- |
-SkDrawShape1DPathEffect::~SkDrawShape1DPathEffect() { |
-} |
- |
-void SkDrawShape1DPathEffect::onEndElement(SkAnimateMaker& maker) { |
- if (addPath == NULL || (addPath->isPath() == false && addPath->isApply() == false)) |
- maker.setErrorCode(SkDisplayXMLParserError::kUnknownError); // !!! add error |
- else |
- fPathEffect = new SkShape1DPathEffect(this, &maker); |
-} |
- |
-////////// SkShape2DPathEffect |
- |
-class SkShape2DPathEffect : public Sk2DPathEffect { |
-public: |
- SkShape2DPathEffect(SkDrawShape2DPathEffect* draw, SkAnimateMaker* maker, |
- const SkMatrix& matrix) : Sk2DPathEffect(matrix), fDraw(draw), fMaker(maker) { |
- } |
- |
-protected: |
- virtual void begin(const SkIRect& uvBounds, SkPath* ) |
- { |
- fUVBounds.set(SkIntToScalar(uvBounds.fLeft), SkIntToScalar(uvBounds.fTop), |
- SkIntToScalar(uvBounds.fRight), SkIntToScalar(uvBounds.fBottom)); |
- } |
- |
- virtual void next(const SkPoint& loc, int u, int v, SkPath* dst) |
- { |
- fLoc = loc; |
- fU = u; |
- fV = v; |
- SkDrawPath* drawPath; |
- fMaker->setExtraPropertyCallBack(fDraw->fType, Get2D, this); |
- if (fDraw->addPath->isPath()) { |
- drawPath = (SkDrawPath*) fDraw->addPath; |
- } else { |
- SkApply* apply = (SkApply*) fDraw->addPath; |
- apply->refresh(*fMaker); |
- apply->activate(*fMaker); |
- apply->interpolate(*fMaker, v); |
- drawPath = (SkDrawPath*) apply->getScope(); |
- } |
- if (drawPath == NULL) |
- goto clearCallBack; |
- if (fDraw->matrix) { |
- SkDrawMatrix* matrix; |
- if (fDraw->matrix->getType() == SkType_Matrix) |
- matrix = (SkDrawMatrix*) fDraw->matrix; |
- else { |
- SkApply* apply = (SkApply*) fDraw->matrix; |
- apply->activate(*fMaker); |
- apply->interpolate(*fMaker, v); |
- matrix = (SkDrawMatrix*) apply->getScope(); |
- } |
- if (matrix) { |
- dst->addPath(drawPath->getPath(), matrix->getMatrix()); |
- goto clearCallBack; |
- } |
- } |
- dst->addPath(drawPath->getPath()); |
-clearCallBack: |
- fMaker->clearExtraPropertyCallBack(fDraw->fType); |
- } |
- |
-private: |
- |
- static bool Get2D(const char* token, size_t len, void* s2D, SkScriptValue* value) { |
- static const char match[] = "locX|locY|left|top|right|bottom|u|v" ; |
- SkShape2DPathEffect* shape2D = (SkShape2DPathEffect*) s2D; |
- int index; |
- if (SkAnimatorScript::MapEnums(match, token, len, &index) == false) |
- return false; |
- SkASSERT((sizeof(SkPoint) + sizeof(SkRect)) / sizeof(SkScalar) == 6); |
- if (index < 6) { |
- value->fType = SkType_Float; |
- value->fOperand.fScalar = (&shape2D->fLoc.fX)[index]; |
- } else { |
- value->fType = SkType_Int; |
- value->fOperand.fS32 = (&shape2D->fU)[index - 6]; |
- } |
- return true; |
- } |
- |
- SkPoint fLoc; |
- SkRect fUVBounds; |
- int32_t fU; |
- int32_t fV; |
- SkDrawShape2DPathEffect* fDraw; |
- SkAnimateMaker* fMaker; |
- |
- // illegal |
- SkShape2DPathEffect(const SkShape2DPathEffect&); |
- SkShape2DPathEffect& operator=(const SkShape2DPathEffect&); |
-}; |
- |
-////////// SkDrawShape2DPathEffect |
- |
-#if SK_USE_CONDENSED_INFO == 0 |
- |
-const SkMemberInfo SkDrawShape2DPathEffect::fInfo[] = { |
- SK_MEMBER_INHERITED, |
- SK_MEMBER(matrix, Matrix) |
-}; |
- |
-#endif |
- |
-DEFINE_GET_MEMBER(SkDrawShape2DPathEffect); |
- |
-SkDrawShape2DPathEffect::SkDrawShape2DPathEffect(SkDisplayTypes type) : fType(type) { |
-} |
- |
-SkDrawShape2DPathEffect::~SkDrawShape2DPathEffect() { |
-} |
- |
-void SkDrawShape2DPathEffect::onEndElement(SkAnimateMaker& maker) { |
- if (addPath == NULL || (addPath->isPath() == false && addPath->isApply() == false) || |
- matrix == NULL) |
- maker.setErrorCode(SkDisplayXMLParserError::kUnknownError); // !!! add error |
- else |
- fPathEffect = new SkShape2DPathEffect(this, &maker, matrix->getMatrix()); |
-} |
- |
-////////// SkDrawComposePathEffect |
- |
-#if SK_USE_CONDENSED_INFO == 0 |
- |
-const SkMemberInfo SkDrawComposePathEffect::fInfo[] = { |
- SK_MEMBER(effect1, PathEffect), |
- SK_MEMBER(effect2, PathEffect) |
-}; |
- |
-#endif |
- |
-DEFINE_GET_MEMBER(SkDrawComposePathEffect); |
- |
-SkDrawComposePathEffect::SkDrawComposePathEffect(SkDisplayTypes type) : fType(type), |
- effect1(NULL), effect2(NULL) { |
-} |
- |
-SkDrawComposePathEffect::~SkDrawComposePathEffect() { |
- delete effect1; |
- delete effect2; |
-} |
- |
-bool SkDrawComposePathEffect::add(SkAnimateMaker& , SkDisplayable* child) { |
- if (effect1 == NULL) |
- effect1 = (SkDrawPathEffect*) child; |
- else |
- effect2 = (SkDrawPathEffect*) child; |
- return true; |
-} |
- |
-SkPathEffect* SkDrawComposePathEffect::getPathEffect() { |
- SkPathEffect* e1 = effect1->getPathEffect(); |
- SkPathEffect* e2 = effect2->getPathEffect(); |
- SkPathEffect* composite = new SkComposePathEffect(e1, e2); |
- e1->unref(); |
- e2->unref(); |
- return composite; |
-} |
- |
-bool SkDrawComposePathEffect::isPaint() const { |
- return true; |
-} |
- |
-//////////// SkDrawCornerPathEffect |
- |
-#if SK_USE_CONDENSED_INFO == 0 |
- |
-const SkMemberInfo SkDrawCornerPathEffect::fInfo[] = { |
- SK_MEMBER(radius, Float) |
-}; |
- |
-#endif |
- |
-DEFINE_GET_MEMBER(SkDrawCornerPathEffect); |
- |
-SkDrawCornerPathEffect::SkDrawCornerPathEffect(SkDisplayTypes type): |
- fType(type), radius(0) { |
-} |
- |
-SkDrawCornerPathEffect::~SkDrawCornerPathEffect() { |
-} |
- |
-SkPathEffect* SkDrawCornerPathEffect::getPathEffect() { |
- return new SkCornerPathEffect(radius); |
-} |
- |
-///////// |
- |
-#include "SkExtras.h" |
- |
-const char kDrawShape1DPathEffectName[] = "pathEffect:shape1D"; |
-const char kDrawShape2DPathEffectName[] = "pathEffect:shape2D"; |
-const char kDrawComposePathEffectName[] = "pathEffect:compose"; |
-const char kDrawCornerPathEffectName[] = "pathEffect:corner"; |
- |
-class SkExtraPathEffects : public SkExtras { |
-public: |
- SkExtraPathEffects(SkAnimator* animator) : |
- skDrawShape1DPathEffectType(SkType_Unknown), |
- skDrawShape2DPathEffectType(SkType_Unknown), |
- skDrawComposePathEffectType(SkType_Unknown), |
- skDrawCornerPathEffectType(SkType_Unknown) { |
- } |
- |
- virtual SkDisplayable* createInstance(SkDisplayTypes type) { |
- SkDisplayable* result = NULL; |
- if (skDrawShape1DPathEffectType == type) |
- result = new SkDrawShape1DPathEffect(type); |
- else if (skDrawShape2DPathEffectType == type) |
- result = new SkDrawShape2DPathEffect(type); |
- else if (skDrawComposePathEffectType == type) |
- result = new SkDrawComposePathEffect(type); |
- else if (skDrawCornerPathEffectType == type) |
- result = new SkDrawCornerPathEffect(type); |
- return result; |
- } |
- |
- virtual bool definesType(SkDisplayTypes type) { |
- return type == skDrawShape1DPathEffectType || |
- type == skDrawShape2DPathEffectType || |
- type == skDrawComposePathEffectType || |
- type == skDrawCornerPathEffectType; |
- } |
- |
-#if SK_USE_CONDENSED_INFO == 0 |
- virtual const SkMemberInfo* getMembers(SkDisplayTypes type, int* infoCountPtr) { |
- const SkMemberInfo* info = NULL; |
- int infoCount = 0; |
- if (skDrawShape1DPathEffectType == type) { |
- info = SkDrawShape1DPathEffect::fInfo; |
- infoCount = SkDrawShape1DPathEffect::fInfoCount; |
- } else if (skDrawShape2DPathEffectType == type) { |
- info = SkDrawShape2DPathEffect::fInfo; |
- infoCount = SkDrawShape2DPathEffect::fInfoCount; |
- } else if (skDrawComposePathEffectType == type) { |
- info = SkDrawComposePathEffect::fInfo; |
- infoCount = SkDrawShape1DPathEffect::fInfoCount; |
- } else if (skDrawCornerPathEffectType == type) { |
- info = SkDrawCornerPathEffect::fInfo; |
- infoCount = SkDrawCornerPathEffect::fInfoCount; |
- } |
- if (infoCountPtr) |
- *infoCountPtr = infoCount; |
- return info; |
- } |
-#endif |
- |
-#ifdef SK_DEBUG |
- virtual const char* getName(SkDisplayTypes type) { |
- if (skDrawShape1DPathEffectType == type) |
- return kDrawShape1DPathEffectName; |
- else if (skDrawShape2DPathEffectType == type) |
- return kDrawShape2DPathEffectName; |
- else if (skDrawComposePathEffectType == type) |
- return kDrawComposePathEffectName; |
- else if (skDrawCornerPathEffectType == type) |
- return kDrawCornerPathEffectName; |
- return NULL; |
- } |
-#endif |
- |
- virtual SkDisplayTypes getType(const char name[], size_t len ) { |
- SkDisplayTypes* type = NULL; |
- if (SK_LITERAL_STR_EQUAL(kDrawShape1DPathEffectName, name, len)) |
- type = &skDrawShape1DPathEffectType; |
- else if (SK_LITERAL_STR_EQUAL(kDrawShape2DPathEffectName, name, len)) |
- type = &skDrawShape2DPathEffectType; |
- else if (SK_LITERAL_STR_EQUAL(kDrawComposePathEffectName, name, len)) |
- type = &skDrawComposePathEffectType; |
- else if (SK_LITERAL_STR_EQUAL(kDrawCornerPathEffectName, name, len)) |
- type = &skDrawCornerPathEffectType; |
- if (type) { |
- if (*type == SkType_Unknown) |
- *type = SkDisplayType::RegisterNewType(); |
- return *type; |
- } |
- return SkType_Unknown; |
- } |
- |
-private: |
- SkDisplayTypes skDrawShape1DPathEffectType; |
- SkDisplayTypes skDrawShape2DPathEffectType; |
- SkDisplayTypes skDrawComposePathEffectType; |
- SkDisplayTypes skDrawCornerPathEffectType; |
-}; |
- |
- |
-void InitializeSkExtraPathEffects(SkAnimator* animator) { |
- animator->addExtras(new SkExtraPathEffects(animator)); |
-} |
- |
-//////////////// |
- |
- |
-SkExtras::SkExtras() : fExtraCallBack(NULL), fExtraStorage(NULL) { |
-} |