1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawExtraPathEffect.h" 98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawPath.h" 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "Sk1DPathEffect.h" 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "Sk2DPathEffect.h" 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkMemberInfo.h" 138d4dc714da9fc598d48ad3e360870aee622094c4reed@google.com#include "SkPaintPart.h" 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPathEffect.h" 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCornerPathEffect.h" 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDashPathEffect.h" 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkDrawShapePathEffect : public SkDrawPathEffect { 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com DECLARE_PRIVATE_MEMBER_INFO(DrawShapePathEffect); 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawShapePathEffect(); 228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual ~SkDrawShapePathEffect(); 231d3c411f5e4d2ad31bc92b3a85957004329ac00dtfarina@chromium.org virtual bool addChild(SkAnimateMaker& , SkDisplayable* ) SK_OVERRIDE; 248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual SkPathEffect* getPathEffect(); 258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected: 268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawable* addPath; 278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawable* addMatrix; 288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawPath* path; 298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPathEffect* fPathEffect; 308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com friend class SkShape1DPathEffect; 318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com friend class SkShape2DPathEffect; 328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkDrawShape1DPathEffect : public SkDrawShapePathEffect { 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com DECLARE_EXTRAS_MEMBER_INFO(SkDrawShape1DPathEffect); 368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawShape1DPathEffect(SkDisplayTypes ); 378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual ~SkDrawShape1DPathEffect(); 388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void onEndElement(SkAnimateMaker& ); 398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkString phase; 418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkString spacing; 428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com friend class SkShape1DPathEffect; 438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typedef SkDrawShapePathEffect INHERITED; 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkDrawShape2DPathEffect : public SkDrawShapePathEffect { 478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com DECLARE_EXTRAS_MEMBER_INFO(SkDrawShape2DPathEffect); 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawShape2DPathEffect(SkDisplayTypes ); 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual ~SkDrawShape2DPathEffect(); 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void onEndElement(SkAnimateMaker& ); 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawMatrix* matrix; 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com friend class SkShape2DPathEffect; 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typedef SkDrawShapePathEffect INHERITED; 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkDrawComposePathEffect : public SkDrawPathEffect { 588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com DECLARE_EXTRAS_MEMBER_INFO(SkDrawComposePathEffect); 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawComposePathEffect(SkDisplayTypes ); 608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual ~SkDrawComposePathEffect(); 611d3c411f5e4d2ad31bc92b3a85957004329ac00dtfarina@chromium.org virtual bool addChild(SkAnimateMaker& , SkDisplayable* ) SK_OVERRIDE; 628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual SkPathEffect* getPathEffect(); 6382065d667f64e232bcde2ad849756a6096fcbe6freed@google.com virtual bool isPaint() const; 648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawPathEffect* effect1; 668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawPathEffect* effect2; 678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkDrawCornerPathEffect : public SkDrawPathEffect { 708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com DECLARE_EXTRAS_MEMBER_INFO(SkDrawCornerPathEffect); 718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawCornerPathEffect(SkDisplayTypes ); 728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual ~SkDrawCornerPathEffect(); 738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual SkPathEffect* getPathEffect(); 748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkScalar radius; 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////// SkShape1DPathEffect 798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkAnimateMaker.h" 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkAnimatorScript.h" 828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayApply.h" 838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawMatrix.h" 848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPaint.h" 858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkShape1DPathEffect : public Sk1DPathEffect { 878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkShape1DPathEffect(SkDrawShape1DPathEffect* draw, SkAnimateMaker* maker) : 898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fDraw(draw), fMaker(maker) { 908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 92ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com SK_DECLARE_UNFLATTENABLE_OBJECT() 93ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com 948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected: 95548a1f321011292359ef163f78c8a1d4871b3b7freed@google.com virtual SkScalar begin(SkScalar contourLength) const { 968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkScriptValue value; 978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkAnimatorScript engine(*fMaker, NULL, SkType_Float); 988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com engine.propertyCallBack(GetContourLength, &contourLength); 998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com value.fOperand.fScalar = 0; 1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com engine.evaluate(fDraw->phase.c_str(), &value, SkType_Float); 1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return value.fOperand.fScalar; 1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 104548a1f321011292359ef163f78c8a1d4871b3b7freed@google.com virtual SkScalar next(SkPath* dst, SkScalar distance, SkPathMeasure&) const { 1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fMaker->setExtraPropertyCallBack(fDraw->fType, GetDistance, &distance); 1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawPath* drawPath = NULL; 1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (fDraw->addPath->isPath()) { 1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com drawPath = (SkDrawPath*) fDraw->addPath; 1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else { 1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkApply* apply = (SkApply*) fDraw->addPath; 1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com apply->refresh(*fMaker); 1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com apply->activate(*fMaker); 1138015cdd8fa5694e52b70e728bcdc6b35d739b819reed@google.com apply->interpolate(*fMaker, SkScalarRoundToInt(distance * 1000)); 1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com drawPath = (SkDrawPath*) apply->getScope(); 1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkMatrix m; 1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com m.reset(); 1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (fDraw->addMatrix) { 1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawMatrix* matrix; 12082065d667f64e232bcde2ad849756a6096fcbe6freed@google.com if (fDraw->addMatrix->getType() == SkType_Matrix) 1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com matrix = (SkDrawMatrix*) fDraw->addMatrix; 1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else { 1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkApply* apply = (SkApply*) fDraw->addMatrix; 1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com apply->refresh(*fMaker); 1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com apply->activate(*fMaker); 1268015cdd8fa5694e52b70e728bcdc6b35d739b819reed@google.com apply->interpolate(*fMaker, SkScalarRoundToInt(distance * 1000)); 1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com matrix = (SkDrawMatrix*) apply->getScope(); 1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 129dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com if (matrix) { 130dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com m = matrix->getMatrix(); 131dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com } 1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkScalar result = 0; 1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkAnimatorScript::EvaluateFloat(*fMaker, NULL, fDraw->spacing.c_str(), &result); 1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (drawPath) 1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com dst->addPath(drawPath->getPath(), m); 1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fMaker->clearExtraPropertyCallBack(fDraw->fType); 1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return result; 1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com static bool GetContourLength(const char* token, size_t len, void* clen, SkScriptValue* value) { 1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (SK_LITERAL_STR_EQUAL("contourLength", token, len)) { 1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com value->fOperand.fScalar = *(SkScalar*) clen; 1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com value->fType = SkType_Float; 1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return false; 1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com static bool GetDistance(const char* token, size_t len, void* dist, SkScriptValue* value) { 1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (SK_LITERAL_STR_EQUAL("distance", token, len)) { 1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com value->fOperand.fScalar = *(SkScalar*) dist; 1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com value->fType = SkType_Float; 1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return false; 1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawShape1DPathEffect* fDraw; 1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkAnimateMaker* fMaker; 1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////// SkDrawShapePathEffect 1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0 1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo SkDrawShapePathEffect::fInfo[] = { 1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(addMatrix, Drawable), // either matrix or apply 1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(addPath, Drawable), // either path or apply 1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(path, Path), 1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comDEFINE_GET_MEMBER(SkDrawShapePathEffect); 1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 17882065d667f64e232bcde2ad849756a6096fcbe6freed@google.comSkDrawShapePathEffect::SkDrawShapePathEffect() : 1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com addPath(NULL), addMatrix(NULL), path(NULL), fPathEffect(NULL) { 1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawShapePathEffect::~SkDrawShapePathEffect() { 18382065d667f64e232bcde2ad849756a6096fcbe6freed@google.com SkSafeUnref(fPathEffect); 1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1861d3c411f5e4d2ad31bc92b3a85957004329ac00dtfarina@chromium.orgbool SkDrawShapePathEffect::addChild(SkAnimateMaker& , SkDisplayable* child) { 1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com path = (SkDrawPath*) child; 1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkPathEffect* SkDrawShapePathEffect::getPathEffect() { 1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPathEffect->ref(); 1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return fPathEffect; 1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////// SkDrawShape1DPathEffect 1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0 1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo SkDrawShape1DPathEffect::fInfo[] = { 2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER_INHERITED, 2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(phase, String), 2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(spacing, String), 2048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comDEFINE_GET_MEMBER(SkDrawShape1DPathEffect); 2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawShape1DPathEffect::SkDrawShape1DPathEffect(SkDisplayTypes type) : fType(type) { 2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawShape1DPathEffect::~SkDrawShape1DPathEffect() { 2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkDrawShape1DPathEffect::onEndElement(SkAnimateMaker& maker) { 2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (addPath == NULL || (addPath->isPath() == false && addPath->isApply() == false)) 2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com maker.setErrorCode(SkDisplayXMLParserError::kUnknownError); // !!! add error 2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else 2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPathEffect = new SkShape1DPathEffect(this, &maker); 2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////// SkShape2DPathEffect 2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkShape2DPathEffect : public Sk2DPathEffect { 2268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 22782065d667f64e232bcde2ad849756a6096fcbe6freed@google.com SkShape2DPathEffect(SkDrawShape2DPathEffect* draw, SkAnimateMaker* maker, 2288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkMatrix& matrix) : Sk2DPathEffect(matrix), fDraw(draw), fMaker(maker) { 2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected: 232dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com virtual void begin(const SkIRect& uvBounds, SkPath*) const SK_OVERRIDE { 233dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com const_cast<SkShape2DPathEffect*>(this)->setUVBounds(uvBounds); 234dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com } 235dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com 236dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com virtual void next(const SkPoint& loc, int u, int v, SkPath* dst) const SK_OVERRIDE { 237dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com const_cast<SkShape2DPathEffect*>(this)->addPath(loc, u, v, dst); 238dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com } 239dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com 240dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.comprivate: 241dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com void setUVBounds(const SkIRect& uvBounds) { 2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fUVBounds.set(SkIntToScalar(uvBounds.fLeft), SkIntToScalar(uvBounds.fTop), 2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkIntToScalar(uvBounds.fRight), SkIntToScalar(uvBounds.fBottom)); 2448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 246dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com void addPath(const SkPoint& loc, int u, int v, SkPath* dst) { 2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fLoc = loc; 2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fU = u; 2498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fV = v; 2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawPath* drawPath; 2518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fMaker->setExtraPropertyCallBack(fDraw->fType, Get2D, this); 2528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (fDraw->addPath->isPath()) { 2538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com drawPath = (SkDrawPath*) fDraw->addPath; 2548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else { 2558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkApply* apply = (SkApply*) fDraw->addPath; 2568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com apply->refresh(*fMaker); 2578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com apply->activate(*fMaker); 2588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com apply->interpolate(*fMaker, v); 2598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com drawPath = (SkDrawPath*) apply->getScope(); 2608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (drawPath == NULL) 2628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com goto clearCallBack; 2638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (fDraw->matrix) { 2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawMatrix* matrix; 26582065d667f64e232bcde2ad849756a6096fcbe6freed@google.com if (fDraw->matrix->getType() == SkType_Matrix) 2668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com matrix = (SkDrawMatrix*) fDraw->matrix; 2678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else { 2688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkApply* apply = (SkApply*) fDraw->matrix; 2698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com apply->activate(*fMaker); 2708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com apply->interpolate(*fMaker, v); 2718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com matrix = (SkDrawMatrix*) apply->getScope(); 2728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (matrix) { 2748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com dst->addPath(drawPath->getPath(), matrix->getMatrix()); 2758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com goto clearCallBack; 2768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com dst->addPath(drawPath->getPath()); 2798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclearCallBack: 2808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fMaker->clearExtraPropertyCallBack(fDraw->fType); 2818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com static bool Get2D(const char* token, size_t len, void* s2D, SkScriptValue* value) { 2848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com static const char match[] = "locX|locY|left|top|right|bottom|u|v" ; 2858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkShape2DPathEffect* shape2D = (SkShape2DPathEffect*) s2D; 2868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int index; 2878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (SkAnimatorScript::MapEnums(match, token, len, &index) == false) 2888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return false; 2898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT((sizeof(SkPoint) + sizeof(SkRect)) / sizeof(SkScalar) == 6); 2908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (index < 6) { 2918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com value->fType = SkType_Float; 2928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com value->fOperand.fScalar = (&shape2D->fLoc.fX)[index]; 2938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else { 2948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com value->fType = SkType_Int; 2958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com value->fOperand.fS32 = (&shape2D->fU)[index - 6]; 2968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 2988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 29982065d667f64e232bcde2ad849756a6096fcbe6freed@google.com 3008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPoint fLoc; 3018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkRect fUVBounds; 3028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int32_t fU; 3038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int32_t fV; 3048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDrawShape2DPathEffect* fDraw; 3058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkAnimateMaker* fMaker; 3068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // illegal 3088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkShape2DPathEffect(const SkShape2DPathEffect&); 3098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkShape2DPathEffect& operator=(const SkShape2DPathEffect&); 3108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 3118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////// SkDrawShape2DPathEffect 3138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0 3158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo SkDrawShape2DPathEffect::fInfo[] = { 3178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER_INHERITED, 3188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(matrix, Matrix) 3198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 3208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 3228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comDEFINE_GET_MEMBER(SkDrawShape2DPathEffect); 3248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawShape2DPathEffect::SkDrawShape2DPathEffect(SkDisplayTypes type) : fType(type) { 3268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawShape2DPathEffect::~SkDrawShape2DPathEffect() { 3298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkDrawShape2DPathEffect::onEndElement(SkAnimateMaker& maker) { 3328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (addPath == NULL || (addPath->isPath() == false && addPath->isApply() == false) || 3338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com matrix == NULL) 3348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com maker.setErrorCode(SkDisplayXMLParserError::kUnknownError); // !!! add error 3358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else 3368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPathEffect = new SkShape2DPathEffect(this, &maker, matrix->getMatrix()); 3378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////// SkDrawComposePathEffect 3408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0 3428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo SkDrawComposePathEffect::fInfo[] = { 3448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(effect1, PathEffect), 3458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(effect2, PathEffect) 3468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 3478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 3498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comDEFINE_GET_MEMBER(SkDrawComposePathEffect); 3518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawComposePathEffect::SkDrawComposePathEffect(SkDisplayTypes type) : fType(type), 3538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com effect1(NULL), effect2(NULL) { 3548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawComposePathEffect::~SkDrawComposePathEffect() { 3578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com delete effect1; 3588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com delete effect2; 3598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3611d3c411f5e4d2ad31bc92b3a85957004329ac00dtfarina@chromium.orgbool SkDrawComposePathEffect::addChild(SkAnimateMaker& , SkDisplayable* child) { 3628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (effect1 == NULL) 3638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com effect1 = (SkDrawPathEffect*) child; 3648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else 3658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com effect2 = (SkDrawPathEffect*) child; 3668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 3678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkPathEffect* SkDrawComposePathEffect::getPathEffect() { 3708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPathEffect* e1 = effect1->getPathEffect(); 3718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPathEffect* e2 = effect2->getPathEffect(); 3720a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org SkPathEffect* composite = SkComposePathEffect::Create(e1, e2); 3738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com e1->unref(); 3748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com e2->unref(); 3758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return composite; 3768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkDrawComposePathEffect::isPaint() const { 3798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 3808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////// SkDrawCornerPathEffect 3838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0 3858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo SkDrawCornerPathEffect::fInfo[] = { 3878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(radius, Float) 3888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 3898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 3918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comDEFINE_GET_MEMBER(SkDrawCornerPathEffect); 3938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawCornerPathEffect::SkDrawCornerPathEffect(SkDisplayTypes type): 3958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fType(type), radius(0) { 3968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawCornerPathEffect::~SkDrawCornerPathEffect() { 3998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 4008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkPathEffect* SkDrawCornerPathEffect::getPathEffect() { 4020a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org return SkCornerPathEffect::Create(radius); 4038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 4048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////// 4068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkExtras.h" 4088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst char kDrawShape1DPathEffectName[] = "pathEffect:shape1D"; 4108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst char kDrawShape2DPathEffectName[] = "pathEffect:shape2D"; 4118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst char kDrawComposePathEffectName[] = "pathEffect:compose"; 4128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst char kDrawCornerPathEffectName[] = "pathEffect:corner"; 4138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkExtraPathEffects : public SkExtras { 4158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 41693c7ee34dc5c8f6bfad65809f4b39f8d00d7f0d4sugoi@google.com SkExtraPathEffects() : 4178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com skDrawShape1DPathEffectType(SkType_Unknown), 4188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com skDrawShape2DPathEffectType(SkType_Unknown), 4198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com skDrawComposePathEffectType(SkType_Unknown), 4208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com skDrawCornerPathEffectType(SkType_Unknown) { 4218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 42282065d667f64e232bcde2ad849756a6096fcbe6freed@google.com 4238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual SkDisplayable* createInstance(SkDisplayTypes type) { 4248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDisplayable* result = NULL; 4258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (skDrawShape1DPathEffectType == type) 4268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com result = new SkDrawShape1DPathEffect(type); 4278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else if (skDrawShape2DPathEffectType == type) 4288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com result = new SkDrawShape2DPathEffect(type); 4298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else if (skDrawComposePathEffectType == type) 4308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com result = new SkDrawComposePathEffect(type); 4318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else if (skDrawCornerPathEffectType == type) 4328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com result = new SkDrawCornerPathEffect(type); 4338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return result; 4348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 4358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual bool definesType(SkDisplayTypes type) { 43782065d667f64e232bcde2ad849756a6096fcbe6freed@google.com return type == skDrawShape1DPathEffectType || 43882065d667f64e232bcde2ad849756a6096fcbe6freed@google.com type == skDrawShape2DPathEffectType || 4398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com type == skDrawComposePathEffectType || 4408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com type == skDrawCornerPathEffectType; 4418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 4428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0 4448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual const SkMemberInfo* getMembers(SkDisplayTypes type, int* infoCountPtr) { 4458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkMemberInfo* info = NULL; 4468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int infoCount = 0; 4478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (skDrawShape1DPathEffectType == type) { 4488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com info = SkDrawShape1DPathEffect::fInfo; 4498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com infoCount = SkDrawShape1DPathEffect::fInfoCount; 4508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else if (skDrawShape2DPathEffectType == type) { 4518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com info = SkDrawShape2DPathEffect::fInfo; 4528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com infoCount = SkDrawShape2DPathEffect::fInfoCount; 4538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else if (skDrawComposePathEffectType == type) { 4548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com info = SkDrawComposePathEffect::fInfo; 4558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com infoCount = SkDrawShape1DPathEffect::fInfoCount; 4568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else if (skDrawCornerPathEffectType == type) { 4578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com info = SkDrawCornerPathEffect::fInfo; 4588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com infoCount = SkDrawCornerPathEffect::fInfoCount; 4598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 4608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (infoCountPtr) 4618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *infoCountPtr = infoCount; 4628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return info; 4638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 4648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 4658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG 4678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual const char* getName(SkDisplayTypes type) { 4688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (skDrawShape1DPathEffectType == type) 4698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return kDrawShape1DPathEffectName; 4708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else if (skDrawShape2DPathEffectType == type) 4718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return kDrawShape2DPathEffectName; 4728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else if (skDrawComposePathEffectType == type) 4738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return kDrawComposePathEffectName; 4748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else if (skDrawCornerPathEffectType == type) 4758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return kDrawCornerPathEffectName; 4768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return NULL; 4778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 4788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 4798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual SkDisplayTypes getType(const char name[], size_t len ) { 4818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDisplayTypes* type = NULL; 4828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (SK_LITERAL_STR_EQUAL(kDrawShape1DPathEffectName, name, len)) 4838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com type = &skDrawShape1DPathEffectType; 4848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else if (SK_LITERAL_STR_EQUAL(kDrawShape2DPathEffectName, name, len)) 4858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com type = &skDrawShape2DPathEffectType; 4868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else if (SK_LITERAL_STR_EQUAL(kDrawComposePathEffectName, name, len)) 4878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com type = &skDrawComposePathEffectType; 4888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else if (SK_LITERAL_STR_EQUAL(kDrawCornerPathEffectName, name, len)) 4898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com type = &skDrawCornerPathEffectType; 4908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (type) { 4918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (*type == SkType_Unknown) 4928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *type = SkDisplayType::RegisterNewType(); 4938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return *type; 4948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 4958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return SkType_Unknown; 4968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 4978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 4998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDisplayTypes skDrawShape1DPathEffectType; 5008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDisplayTypes skDrawShape2DPathEffectType; 5018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDisplayTypes skDrawComposePathEffectType; 5028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDisplayTypes skDrawCornerPathEffectType; 5038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 5048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 5058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid InitializeSkExtraPathEffects(SkAnimator* animator) { 50693c7ee34dc5c8f6bfad65809f4b39f8d00d7f0d4sugoi@google.com animator->addExtras(new SkExtraPathEffects()); 5078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 5088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 5098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////// 5108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 5118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 5128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkExtras::SkExtras() : fExtraCallBack(NULL), fExtraStorage(NULL) { 5138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 514