SkDrawExtraPathEffect.cpp revision 82065d667f64e232bcde2ad849756a6096fcbe6f
18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/* libs/graphics/animator/SkDrawExtraPathEffect.cpp 28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** 38a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** Copyright 2006, The Android Open Source Project 48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** 582065d667f64e232bcde2ad849756a6096fcbe6freed@google.com** Licensed under the Apache License, Version 2.0 (the "License"); 682065d667f64e232bcde2ad849756a6096fcbe6freed@google.com** you may not use this file except in compliance with the License. 782065d667f64e232bcde2ad849756a6096fcbe6freed@google.com** You may obtain a copy of the License at 88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** 982065d667f64e232bcde2ad849756a6096fcbe6freed@google.com** http://www.apache.org/licenses/LICENSE-2.0 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** 1182065d667f64e232bcde2ad849756a6096fcbe6freed@google.com** Unless required by applicable law or agreed to in writing, software 1282065d667f64e232bcde2ad849756a6096fcbe6freed@google.com** distributed under the License is distributed on an "AS IS" BASIS, 1382065d667f64e232bcde2ad849756a6096fcbe6freed@google.com** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1482065d667f64e232bcde2ad849756a6096fcbe6freed@google.com** See the License for the specific language governing permissions and 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** limitations under the License. 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawExtraPathEffect.h" 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawPath.h" 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "Sk1DPathEffect.h" 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "Sk2DPathEffect.h" 228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkMemberInfo.h" 238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPaintParts.h" 248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPathEffect.h" 258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCornerPathEffect.h" 268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDashPathEffect.h" 288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkDrawShapePathEffect : public SkDrawPathEffect { 308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com DECLARE_PRIVATE_MEMBER_INFO(DrawShapePathEffect); 318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawShapePathEffect(); 328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual ~SkDrawShapePathEffect(); 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual bool add(SkAnimateMaker& , SkDisplayable* ); 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual SkPathEffect* getPathEffect(); 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected: 368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawable* addPath; 378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawable* addMatrix; 388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawPath* path; 398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPathEffect* fPathEffect; 408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com friend class SkShape1DPathEffect; 418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com friend class SkShape2DPathEffect; 428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkDrawShape1DPathEffect : public SkDrawShapePathEffect { 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com DECLARE_EXTRAS_MEMBER_INFO(SkDrawShape1DPathEffect); 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawShape1DPathEffect(SkDisplayTypes ); 478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual ~SkDrawShape1DPathEffect(); 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void onEndElement(SkAnimateMaker& ); 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkString phase; 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkString spacing; 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com friend class SkShape1DPathEffect; 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typedef SkDrawShapePathEffect INHERITED; 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkDrawShape2DPathEffect : public SkDrawShapePathEffect { 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com DECLARE_EXTRAS_MEMBER_INFO(SkDrawShape2DPathEffect); 588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawShape2DPathEffect(SkDisplayTypes ); 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual ~SkDrawShape2DPathEffect(); 608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void onEndElement(SkAnimateMaker& ); 618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawMatrix* matrix; 638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com friend class SkShape2DPathEffect; 648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typedef SkDrawShapePathEffect INHERITED; 658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkDrawComposePathEffect : public SkDrawPathEffect { 688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com DECLARE_EXTRAS_MEMBER_INFO(SkDrawComposePathEffect); 698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawComposePathEffect(SkDisplayTypes ); 708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual ~SkDrawComposePathEffect(); 718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual bool add(SkAnimateMaker& , SkDisplayable* ); 728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual SkPathEffect* getPathEffect(); 7382065d667f64e232bcde2ad849756a6096fcbe6freed@google.com virtual bool isPaint() const; 748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawPathEffect* effect1; 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawPathEffect* effect2; 778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkDrawCornerPathEffect : public SkDrawPathEffect { 808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com DECLARE_EXTRAS_MEMBER_INFO(SkDrawCornerPathEffect); 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawCornerPathEffect(SkDisplayTypes ); 828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual ~SkDrawCornerPathEffect(); 838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual SkPathEffect* getPathEffect(); 848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkScalar radius; 868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////// SkShape1DPathEffect 898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkAnimateMaker.h" 918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkAnimatorScript.h" 928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayApply.h" 938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawMatrix.h" 948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPaint.h" 958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkShape1DPathEffect : public Sk1DPathEffect { 978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkShape1DPathEffect(SkDrawShape1DPathEffect* draw, SkAnimateMaker* maker) : 998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fDraw(draw), fMaker(maker) { 1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected: 1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual SkScalar begin(SkScalar contourLength) 1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkScriptValue value; 1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkAnimatorScript engine(*fMaker, NULL, SkType_Float); 1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com engine.propertyCallBack(GetContourLength, &contourLength); 1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com value.fOperand.fScalar = 0; 1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com engine.evaluate(fDraw->phase.c_str(), &value, SkType_Float); 1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return value.fOperand.fScalar; 1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual SkScalar next(SkPath* dst, SkScalar distance, SkPathMeasure& ) 1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fMaker->setExtraPropertyCallBack(fDraw->fType, GetDistance, &distance); 1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawPath* drawPath = NULL; 1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (fDraw->addPath->isPath()) { 1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com drawPath = (SkDrawPath*) fDraw->addPath; 1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else { 1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkApply* apply = (SkApply*) fDraw->addPath; 1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com apply->refresh(*fMaker); 1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com apply->activate(*fMaker); 1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com apply->interpolate(*fMaker, SkScalarMulRound(distance, 1000)); 1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com drawPath = (SkDrawPath*) apply->getScope(); 1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkMatrix m; 1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com m.reset(); 1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (fDraw->addMatrix) { 1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawMatrix* matrix; 13082065d667f64e232bcde2ad849756a6096fcbe6freed@google.com if (fDraw->addMatrix->getType() == SkType_Matrix) 1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com matrix = (SkDrawMatrix*) fDraw->addMatrix; 1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else { 1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkApply* apply = (SkApply*) fDraw->addMatrix; 1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com apply->refresh(*fMaker); 1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com apply->activate(*fMaker); 1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com apply->interpolate(*fMaker, SkScalarMulRound(distance, 1000)); 1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com matrix = (SkDrawMatrix*) apply->getScope(); 1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkScalar result = 0; 1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkAnimatorScript::EvaluateFloat(*fMaker, NULL, fDraw->spacing.c_str(), &result); 1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (drawPath) 1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com dst->addPath(drawPath->getPath(), m); 1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fMaker->clearExtraPropertyCallBack(fDraw->fType); 1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return result; 1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void flatten(SkFlattenableWriteBuffer& ) {} 1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual Factory getFactory() { return NULL; } 1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com static bool GetContourLength(const char* token, size_t len, void* clen, SkScriptValue* value) { 1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (SK_LITERAL_STR_EQUAL("contourLength", token, len)) { 1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com value->fOperand.fScalar = *(SkScalar*) clen; 1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com value->fType = SkType_Float; 1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return false; 1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com static bool GetDistance(const char* token, size_t len, void* dist, SkScriptValue* value) { 1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (SK_LITERAL_STR_EQUAL("distance", token, len)) { 1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com value->fOperand.fScalar = *(SkScalar*) dist; 1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com value->fType = SkType_Float; 1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return false; 1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawShape1DPathEffect* fDraw; 1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkAnimateMaker* fMaker; 1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////// SkDrawShapePathEffect 1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0 1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo SkDrawShapePathEffect::fInfo[] = { 1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(addMatrix, Drawable), // either matrix or apply 1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(addPath, Drawable), // either path or apply 1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(path, Path), 1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comDEFINE_GET_MEMBER(SkDrawShapePathEffect); 1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 18882065d667f64e232bcde2ad849756a6096fcbe6freed@google.comSkDrawShapePathEffect::SkDrawShapePathEffect() : 1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com addPath(NULL), addMatrix(NULL), path(NULL), fPathEffect(NULL) { 1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawShapePathEffect::~SkDrawShapePathEffect() { 19382065d667f64e232bcde2ad849756a6096fcbe6freed@google.com SkSafeUnref(fPathEffect); 1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkDrawShapePathEffect::add(SkAnimateMaker& , SkDisplayable* child) { 1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com path = (SkDrawPath*) child; 1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkPathEffect* SkDrawShapePathEffect::getPathEffect() { 2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPathEffect->ref(); 2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return fPathEffect; 2048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////// SkDrawShape1DPathEffect 2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0 2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo SkDrawShape1DPathEffect::fInfo[] = { 2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER_INHERITED, 2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(phase, String), 2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(spacing, String), 2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comDEFINE_GET_MEMBER(SkDrawShape1DPathEffect); 2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawShape1DPathEffect::SkDrawShape1DPathEffect(SkDisplayTypes type) : fType(type) { 2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawShape1DPathEffect::~SkDrawShape1DPathEffect() { 2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkDrawShape1DPathEffect::onEndElement(SkAnimateMaker& maker) { 2278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (addPath == NULL || (addPath->isPath() == false && addPath->isApply() == false)) 2288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com maker.setErrorCode(SkDisplayXMLParserError::kUnknownError); // !!! add error 2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else 2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPathEffect = new SkShape1DPathEffect(this, &maker); 2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////// SkShape2DPathEffect 2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkShape2DPathEffect : public Sk2DPathEffect { 2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 23782065d667f64e232bcde2ad849756a6096fcbe6freed@google.com SkShape2DPathEffect(SkDrawShape2DPathEffect* draw, SkAnimateMaker* maker, 2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkMatrix& matrix) : Sk2DPathEffect(matrix), fDraw(draw), fMaker(maker) { 2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected: 2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void begin(const SkIRect& uvBounds, SkPath* ) 2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 2448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fUVBounds.set(SkIntToScalar(uvBounds.fLeft), SkIntToScalar(uvBounds.fTop), 2458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkIntToScalar(uvBounds.fRight), SkIntToScalar(uvBounds.fBottom)); 2468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void next(const SkPoint& loc, int u, int v, SkPath* dst) 2498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fLoc = loc; 2518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fU = u; 2528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fV = v; 2538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawPath* drawPath; 2548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fMaker->setExtraPropertyCallBack(fDraw->fType, Get2D, this); 2558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (fDraw->addPath->isPath()) { 2568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com drawPath = (SkDrawPath*) fDraw->addPath; 2578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else { 2588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkApply* apply = (SkApply*) fDraw->addPath; 2598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com apply->refresh(*fMaker); 2608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com apply->activate(*fMaker); 2618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com apply->interpolate(*fMaker, v); 2628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com drawPath = (SkDrawPath*) apply->getScope(); 2638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (drawPath == NULL) 2658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com goto clearCallBack; 2668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (fDraw->matrix) { 2678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawMatrix* matrix; 26882065d667f64e232bcde2ad849756a6096fcbe6freed@google.com if (fDraw->matrix->getType() == SkType_Matrix) 2698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com matrix = (SkDrawMatrix*) fDraw->matrix; 2708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else { 2718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkApply* apply = (SkApply*) fDraw->matrix; 2728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com apply->activate(*fMaker); 2738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com apply->interpolate(*fMaker, v); 2748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com matrix = (SkDrawMatrix*) apply->getScope(); 2758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (matrix) { 2778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com dst->addPath(drawPath->getPath(), matrix->getMatrix()); 2788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com goto clearCallBack; 2798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com dst->addPath(drawPath->getPath()); 2828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclearCallBack: 2838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fMaker->clearExtraPropertyCallBack(fDraw->fType); 2848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 2878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com static bool Get2D(const char* token, size_t len, void* s2D, SkScriptValue* value) { 2898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com static const char match[] = "locX|locY|left|top|right|bottom|u|v" ; 2908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkShape2DPathEffect* shape2D = (SkShape2DPathEffect*) s2D; 2918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int index; 2928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (SkAnimatorScript::MapEnums(match, token, len, &index) == false) 2938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return false; 2948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT((sizeof(SkPoint) + sizeof(SkRect)) / sizeof(SkScalar) == 6); 2958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (index < 6) { 2968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com value->fType = SkType_Float; 2978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com value->fOperand.fScalar = (&shape2D->fLoc.fX)[index]; 2988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else { 2998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com value->fType = SkType_Int; 3008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com value->fOperand.fS32 = (&shape2D->fU)[index - 6]; 3018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 3028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 3038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 30482065d667f64e232bcde2ad849756a6096fcbe6freed@google.com 3058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPoint fLoc; 3068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkRect fUVBounds; 3078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int32_t fU; 3088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int32_t fV; 3098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawShape2DPathEffect* fDraw; 3108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkAnimateMaker* fMaker; 3118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // illegal 3138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkShape2DPathEffect(const SkShape2DPathEffect&); 3148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkShape2DPathEffect& operator=(const SkShape2DPathEffect&); 3158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 3168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////// SkDrawShape2DPathEffect 3188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0 3208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo SkDrawShape2DPathEffect::fInfo[] = { 3228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER_INHERITED, 3238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(matrix, Matrix) 3248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 3258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 3278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comDEFINE_GET_MEMBER(SkDrawShape2DPathEffect); 3298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawShape2DPathEffect::SkDrawShape2DPathEffect(SkDisplayTypes type) : fType(type) { 3318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawShape2DPathEffect::~SkDrawShape2DPathEffect() { 3348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkDrawShape2DPathEffect::onEndElement(SkAnimateMaker& maker) { 3378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (addPath == NULL || (addPath->isPath() == false && addPath->isApply() == false) || 3388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com matrix == NULL) 3398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com maker.setErrorCode(SkDisplayXMLParserError::kUnknownError); // !!! add error 3408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else 3418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPathEffect = new SkShape2DPathEffect(this, &maker, matrix->getMatrix()); 3428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////// SkDrawComposePathEffect 3458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0 3478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo SkDrawComposePathEffect::fInfo[] = { 3498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(effect1, PathEffect), 3508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(effect2, PathEffect) 3518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 3528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 3548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comDEFINE_GET_MEMBER(SkDrawComposePathEffect); 3568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawComposePathEffect::SkDrawComposePathEffect(SkDisplayTypes type) : fType(type), 3588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com effect1(NULL), effect2(NULL) { 3598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawComposePathEffect::~SkDrawComposePathEffect() { 3628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com delete effect1; 3638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com delete effect2; 3648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkDrawComposePathEffect::add(SkAnimateMaker& , SkDisplayable* child) { 3678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (effect1 == NULL) 3688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com effect1 = (SkDrawPathEffect*) child; 3698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else 3708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com effect2 = (SkDrawPathEffect*) child; 3718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 3728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkPathEffect* SkDrawComposePathEffect::getPathEffect() { 3758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPathEffect* e1 = effect1->getPathEffect(); 3768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPathEffect* e2 = effect2->getPathEffect(); 3778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPathEffect* composite = new SkComposePathEffect(e1, e2); 3788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com e1->unref(); 3798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com e2->unref(); 3808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return composite; 3818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkDrawComposePathEffect::isPaint() const { 3848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 3858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////// SkDrawCornerPathEffect 3888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0 3908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo SkDrawCornerPathEffect::fInfo[] = { 3928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(radius, Float) 3938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 3948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 3968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comDEFINE_GET_MEMBER(SkDrawCornerPathEffect); 3988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawCornerPathEffect::SkDrawCornerPathEffect(SkDisplayTypes type): 4008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fType(type), radius(0) { 4018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 4028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawCornerPathEffect::~SkDrawCornerPathEffect() { 4048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 4058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkPathEffect* SkDrawCornerPathEffect::getPathEffect() { 4078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return new SkCornerPathEffect(radius); 4088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 4098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////// 4118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkExtras.h" 4138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst char kDrawShape1DPathEffectName[] = "pathEffect:shape1D"; 4158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst char kDrawShape2DPathEffectName[] = "pathEffect:shape2D"; 4168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst char kDrawComposePathEffectName[] = "pathEffect:compose"; 4178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst char kDrawCornerPathEffectName[] = "pathEffect:corner"; 4188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkExtraPathEffects : public SkExtras { 4208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 42182065d667f64e232bcde2ad849756a6096fcbe6freed@google.com SkExtraPathEffects(SkAnimator* animator) : 4228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com skDrawShape1DPathEffectType(SkType_Unknown), 4238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com skDrawShape2DPathEffectType(SkType_Unknown), 4248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com skDrawComposePathEffectType(SkType_Unknown), 4258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com skDrawCornerPathEffectType(SkType_Unknown) { 4268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 42782065d667f64e232bcde2ad849756a6096fcbe6freed@google.com 4288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual SkDisplayable* createInstance(SkDisplayTypes type) { 4298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDisplayable* result = NULL; 4308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (skDrawShape1DPathEffectType == type) 4318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com result = new SkDrawShape1DPathEffect(type); 4328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else if (skDrawShape2DPathEffectType == type) 4338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com result = new SkDrawShape2DPathEffect(type); 4348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else if (skDrawComposePathEffectType == type) 4358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com result = new SkDrawComposePathEffect(type); 4368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else if (skDrawCornerPathEffectType == type) 4378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com result = new SkDrawCornerPathEffect(type); 4388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return result; 4398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 4408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual bool definesType(SkDisplayTypes type) { 44282065d667f64e232bcde2ad849756a6096fcbe6freed@google.com return type == skDrawShape1DPathEffectType || 44382065d667f64e232bcde2ad849756a6096fcbe6freed@google.com type == skDrawShape2DPathEffectType || 4448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com type == skDrawComposePathEffectType || 4458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com type == skDrawCornerPathEffectType; 4468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 4478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0 4498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual const SkMemberInfo* getMembers(SkDisplayTypes type, int* infoCountPtr) { 4508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkMemberInfo* info = NULL; 4518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int infoCount = 0; 4528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (skDrawShape1DPathEffectType == type) { 4538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com info = SkDrawShape1DPathEffect::fInfo; 4548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com infoCount = SkDrawShape1DPathEffect::fInfoCount; 4558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else if (skDrawShape2DPathEffectType == type) { 4568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com info = SkDrawShape2DPathEffect::fInfo; 4578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com infoCount = SkDrawShape2DPathEffect::fInfoCount; 4588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else if (skDrawComposePathEffectType == type) { 4598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com info = SkDrawComposePathEffect::fInfo; 4608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com infoCount = SkDrawShape1DPathEffect::fInfoCount; 4618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else if (skDrawCornerPathEffectType == type) { 4628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com info = SkDrawCornerPathEffect::fInfo; 4638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com infoCount = SkDrawCornerPathEffect::fInfoCount; 4648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 4658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (infoCountPtr) 4668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *infoCountPtr = infoCount; 4678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return info; 4688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 4698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 4708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG 4728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual const char* getName(SkDisplayTypes type) { 4738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (skDrawShape1DPathEffectType == type) 4748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return kDrawShape1DPathEffectName; 4758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else if (skDrawShape2DPathEffectType == type) 4768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return kDrawShape2DPathEffectName; 4778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else if (skDrawComposePathEffectType == type) 4788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return kDrawComposePathEffectName; 4798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else if (skDrawCornerPathEffectType == type) 4808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return kDrawCornerPathEffectName; 4818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return NULL; 4828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 4838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 4848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual SkDisplayTypes getType(const char name[], size_t len ) { 4868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDisplayTypes* type = NULL; 4878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (SK_LITERAL_STR_EQUAL(kDrawShape1DPathEffectName, name, len)) 4888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com type = &skDrawShape1DPathEffectType; 4898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else if (SK_LITERAL_STR_EQUAL(kDrawShape2DPathEffectName, name, len)) 4908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com type = &skDrawShape2DPathEffectType; 4918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else if (SK_LITERAL_STR_EQUAL(kDrawComposePathEffectName, name, len)) 4928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com type = &skDrawComposePathEffectType; 4938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else if (SK_LITERAL_STR_EQUAL(kDrawCornerPathEffectName, name, len)) 4948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com type = &skDrawCornerPathEffectType; 4958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (type) { 4968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (*type == SkType_Unknown) 4978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *type = SkDisplayType::RegisterNewType(); 4988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return *type; 4998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 5008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return SkType_Unknown; 5018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 5028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 5038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 5048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDisplayTypes skDrawShape1DPathEffectType; 5058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDisplayTypes skDrawShape2DPathEffectType; 5068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDisplayTypes skDrawComposePathEffectType; 5078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDisplayTypes skDrawCornerPathEffectType; 5088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 5098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 5108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 5118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid InitializeSkExtraPathEffects(SkAnimator* animator) { 5128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com animator->addExtras(new SkExtraPathEffects(animator)); 5138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 5148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 5158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////// 5168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 5178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 5188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkExtras::SkExtras() : fExtraCallBack(NULL), fExtraStorage(NULL) { 5198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 520