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();
2336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool addChild(SkAnimateMaker& , SkDisplayable* ) override;
2436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkPathEffect* getPathEffect() override;
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
26986ca61cf7be3ec590f8820e9b7ba042ac2948fereed    SkADrawable* addPath;
27986ca61cf7be3ec590f8820e9b7ba042ac2948fereed    SkADrawable* 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();
3836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onEndElement(SkAnimateMaker& ) override;
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();
5036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onEndElement(SkAnimateMaker& ) override;
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();
6136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool addChild(SkAnimateMaker& , SkDisplayable* ) override;
6236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkPathEffect* getPathEffect() override;
6336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool isPaint() const override;
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();
7336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkPathEffect* getPathEffect() override;
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
927e44bb191633e225fd0455c267dbf67f9ee8633emtklein    // For serialization.  This will never be called.
9336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    Factory getFactory() const override { sk_throw(); return NULL; }
94ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
9636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkScalar begin(SkScalar contourLength) const override {
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkScriptValue value;
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkAnimatorScript engine(*fMaker, NULL, SkType_Float);
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        engine.propertyCallBack(GetContourLength, &contourLength);
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        value.fOperand.fScalar = 0;
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        engine.evaluate(fDraw->phase.c_str(), &value, SkType_Float);
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return value.fOperand.fScalar;
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
10536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkScalar next(SkPath* dst, SkScalar distance, SkPathMeasure&) const override {
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fMaker->setExtraPropertyCallBack(fDraw->fType, GetDistance, &distance);
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDrawPath* drawPath = NULL;
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (fDraw->addPath->isPath()) {
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            drawPath = (SkDrawPath*) fDraw->addPath;
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        } else {
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkApply* apply = (SkApply*) fDraw->addPath;
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            apply->refresh(*fMaker);
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            apply->activate(*fMaker);
1148015cdd8fa5694e52b70e728bcdc6b35d739b819reed@google.com            apply->interpolate(*fMaker, SkScalarRoundToInt(distance * 1000));
1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            drawPath = (SkDrawPath*) apply->getScope();
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkMatrix m;
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        m.reset();
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (fDraw->addMatrix) {
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkDrawMatrix* matrix;
12182065d667f64e232bcde2ad849756a6096fcbe6freed@google.com            if (fDraw->addMatrix->getType() == SkType_Matrix)
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                matrix = (SkDrawMatrix*) fDraw->addMatrix;
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            else {
1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkApply* apply = (SkApply*) fDraw->addMatrix;
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                apply->refresh(*fMaker);
1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                apply->activate(*fMaker);
1278015cdd8fa5694e52b70e728bcdc6b35d739b819reed@google.com                apply->interpolate(*fMaker, SkScalarRoundToInt(distance * 1000));
1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                matrix = (SkDrawMatrix*) apply->getScope();
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
130dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com            if (matrix) {
131dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com                m = matrix->getMatrix();
132dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com            }
1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkScalar result = 0;
1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkAnimatorScript::EvaluateFloat(*fMaker, NULL, fDraw->spacing.c_str(), &result);
1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (drawPath)
1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            dst->addPath(drawPath->getPath(), m);
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fMaker->clearExtraPropertyCallBack(fDraw->fType);
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return result;
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
14242dbfa8651861f2f686879c996aab9f9f82277ddrobertphillips#ifndef SK_IGNORE_TO_STRING
14336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void toString(SkString* str) const override {
14442dbfa8651861f2f686879c996aab9f9f82277ddrobertphillips        str->appendf("SkShape1DPathEffect: (");
14542dbfa8651861f2f686879c996aab9f9f82277ddrobertphillips        // TODO: fill in
14642dbfa8651861f2f686879c996aab9f9f82277ddrobertphillips        str->appendf(")");
14742dbfa8651861f2f686879c996aab9f9f82277ddrobertphillips    }
14842dbfa8651861f2f686879c996aab9f9f82277ddrobertphillips#endif
14942dbfa8651861f2f686879c996aab9f9f82277ddrobertphillips
1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static bool GetContourLength(const char* token, size_t len, void* clen, SkScriptValue* value) {
1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (SK_LITERAL_STR_EQUAL("contourLength", token, len)) {
1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            value->fOperand.fScalar = *(SkScalar*) clen;
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    static bool GetDistance(const char* token, size_t len, void* dist, SkScriptValue* value) {
1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (SK_LITERAL_STR_EQUAL("distance", token, len)) {
1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            value->fOperand.fScalar = *(SkScalar*) dist;
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            value->fType = SkType_Float;
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return true;
1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return false;
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDrawShape1DPathEffect* fDraw;
1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkAnimateMaker* fMaker;
1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////// SkDrawShapePathEffect
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0
1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo SkDrawShapePathEffect::fInfo[] = {
1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(addMatrix, Drawable), // either matrix or apply
1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(addPath, Drawable),   // either path or apply
1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(path, Path),
1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comDEFINE_GET_MEMBER(SkDrawShapePathEffect);
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
18782065d667f64e232bcde2ad849756a6096fcbe6freed@google.comSkDrawShapePathEffect::SkDrawShapePathEffect() :
1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    addPath(NULL), addMatrix(NULL), path(NULL), fPathEffect(NULL) {
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawShapePathEffect::~SkDrawShapePathEffect() {
19282065d667f64e232bcde2ad849756a6096fcbe6freed@google.com    SkSafeUnref(fPathEffect);
1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1951d3c411f5e4d2ad31bc92b3a85957004329ac00dtfarina@chromium.orgbool SkDrawShapePathEffect::addChild(SkAnimateMaker& , SkDisplayable* child) {
1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    path = (SkDrawPath*) child;
1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return true;
1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkPathEffect* SkDrawShapePathEffect::getPathEffect() {
2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fPathEffect->ref();
2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return fPathEffect;
2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////// SkDrawShape1DPathEffect
2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0
2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo SkDrawShape1DPathEffect::fInfo[] = {
2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER_INHERITED,
2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(phase, String),
2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(spacing, String),
2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comDEFINE_GET_MEMBER(SkDrawShape1DPathEffect);
2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawShape1DPathEffect::SkDrawShape1DPathEffect(SkDisplayTypes type) : fType(type) {
2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawShape1DPathEffect::~SkDrawShape1DPathEffect() {
2238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkDrawShape1DPathEffect::onEndElement(SkAnimateMaker& maker) {
2268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (addPath == NULL || (addPath->isPath() == false && addPath->isApply() == false))
2278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        maker.setErrorCode(SkDisplayXMLParserError::kUnknownError); // !!! add error
2288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    else
2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fPathEffect = new SkShape1DPathEffect(this, &maker);
2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////// SkShape2DPathEffect
2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkShape2DPathEffect : public Sk2DPathEffect {
2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
23682065d667f64e232bcde2ad849756a6096fcbe6freed@google.com    SkShape2DPathEffect(SkDrawShape2DPathEffect* draw, SkAnimateMaker* maker,
2378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const SkMatrix& matrix) : Sk2DPathEffect(matrix), fDraw(draw), fMaker(maker) {
2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2407e44bb191633e225fd0455c267dbf67f9ee8633emtklein    // For serialization.  This will never be called.
24136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    Factory getFactory() const override { sk_throw(); return NULL; }
2427e44bb191633e225fd0455c267dbf67f9ee8633emtklein
2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
24436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void begin(const SkIRect& uvBounds, SkPath*) const override {
245dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com        const_cast<SkShape2DPathEffect*>(this)->setUVBounds(uvBounds);
246dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com    }
247dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com
24836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void next(const SkPoint& loc, int u, int v, SkPath* dst) const override {
249dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com        const_cast<SkShape2DPathEffect*>(this)->addPath(loc, u, v, dst);
250dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com    }
251dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com
252dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.comprivate:
253dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com    void setUVBounds(const SkIRect& uvBounds) {
2548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fUVBounds.set(SkIntToScalar(uvBounds.fLeft), SkIntToScalar(uvBounds.fTop),
2558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkIntToScalar(uvBounds.fRight), SkIntToScalar(uvBounds.fBottom));
2568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
258dfc867bab24e184f5093d4eabbac7d9c58cc6320sugoi@google.com    void addPath(const SkPoint& loc, int u, int v, SkPath* dst) {
2598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fLoc = loc;
2608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fU = u;
2618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fV = v;
2628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDrawPath* drawPath;
2638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fMaker->setExtraPropertyCallBack(fDraw->fType, Get2D, this);
2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (fDraw->addPath->isPath()) {
2658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            drawPath = (SkDrawPath*) fDraw->addPath;
2668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        } else {
2678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkApply* apply = (SkApply*) fDraw->addPath;
2688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            apply->refresh(*fMaker);
2698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            apply->activate(*fMaker);
2708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            apply->interpolate(*fMaker, v);
2718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            drawPath = (SkDrawPath*) apply->getScope();
2728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
2738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (drawPath == NULL)
2748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            goto clearCallBack;
2758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (fDraw->matrix) {
2768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkDrawMatrix* matrix;
27782065d667f64e232bcde2ad849756a6096fcbe6freed@google.com            if (fDraw->matrix->getType() == SkType_Matrix)
2788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                matrix = (SkDrawMatrix*) fDraw->matrix;
2798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            else {
2808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkApply* apply = (SkApply*) fDraw->matrix;
2818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                apply->activate(*fMaker);
2828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                apply->interpolate(*fMaker, v);
2838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                matrix = (SkDrawMatrix*) apply->getScope();
2848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
2858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (matrix) {
2868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                dst->addPath(drawPath->getPath(), matrix->getMatrix());
2878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                goto clearCallBack;
2888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
2898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
2908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        dst->addPath(drawPath->getPath());
2918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclearCallBack:
2928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fMaker->clearExtraPropertyCallBack(fDraw->fType);
2938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static bool Get2D(const char* token, size_t len, void* s2D, SkScriptValue* value) {
2968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        static const char match[] = "locX|locY|left|top|right|bottom|u|v" ;
2978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkShape2DPathEffect* shape2D = (SkShape2DPathEffect*) s2D;
2988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int index;
2998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (SkAnimatorScript::MapEnums(match, token, len, &index) == false)
3008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return false;
3018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT((sizeof(SkPoint) +     sizeof(SkRect)) / sizeof(SkScalar) == 6);
3028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (index < 6) {
3038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            value->fType = SkType_Float;
3048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            value->fOperand.fScalar = (&shape2D->fLoc.fX)[index];
3058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        } else {
3068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            value->fType = SkType_Int;
3078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            value->fOperand.fS32 = (&shape2D->fU)[index - 6];
3088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
3098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return true;
3108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
31182065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
3128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPoint fLoc;
3138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkRect fUVBounds;
3148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int32_t fU;
3158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int32_t fV;
3168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDrawShape2DPathEffect* fDraw;
3178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkAnimateMaker* fMaker;
3188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // illegal
3208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkShape2DPathEffect(const SkShape2DPathEffect&);
3218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkShape2DPathEffect& operator=(const SkShape2DPathEffect&);
3228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
3238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////// SkDrawShape2DPathEffect
3258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0
3278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo SkDrawShape2DPathEffect::fInfo[] = {
3298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER_INHERITED,
3308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(matrix, Matrix)
3318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
3328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
3348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comDEFINE_GET_MEMBER(SkDrawShape2DPathEffect);
3368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawShape2DPathEffect::SkDrawShape2DPathEffect(SkDisplayTypes type) : fType(type) {
3388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
3398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawShape2DPathEffect::~SkDrawShape2DPathEffect() {
3418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
3428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkDrawShape2DPathEffect::onEndElement(SkAnimateMaker& maker) {
3448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (addPath == NULL || (addPath->isPath() == false && addPath->isApply() == false) ||
3458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            matrix == NULL)
3468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        maker.setErrorCode(SkDisplayXMLParserError::kUnknownError); // !!! add error
3478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    else
3488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fPathEffect = new SkShape2DPathEffect(this, &maker, matrix->getMatrix());
3498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
3508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////// SkDrawComposePathEffect
3528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0
3548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo SkDrawComposePathEffect::fInfo[] = {
3568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(effect1, PathEffect),
3578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(effect2, PathEffect)
3588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
3598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
3618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comDEFINE_GET_MEMBER(SkDrawComposePathEffect);
3638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawComposePathEffect::SkDrawComposePathEffect(SkDisplayTypes type) : fType(type),
3658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    effect1(NULL), effect2(NULL) {
3668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
3678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawComposePathEffect::~SkDrawComposePathEffect() {
3698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    delete effect1;
3708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    delete effect2;
3718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
3728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3731d3c411f5e4d2ad31bc92b3a85957004329ac00dtfarina@chromium.orgbool SkDrawComposePathEffect::addChild(SkAnimateMaker& , SkDisplayable* child) {
3748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (effect1 == NULL)
3758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        effect1 = (SkDrawPathEffect*) child;
3768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    else
3778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        effect2 = (SkDrawPathEffect*) child;
3788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return true;
3798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
3808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkPathEffect* SkDrawComposePathEffect::getPathEffect() {
3828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPathEffect* e1 = effect1->getPathEffect();
3838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPathEffect* e2 = effect2->getPathEffect();
3840a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org    SkPathEffect* composite = SkComposePathEffect::Create(e1, e2);
3858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    e1->unref();
3868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    e2->unref();
3878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return composite;
3888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
3898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkDrawComposePathEffect::isPaint() const {
3918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return true;
3928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
3938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////// SkDrawCornerPathEffect
3958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0
3978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo SkDrawCornerPathEffect::fInfo[] = {
3998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(radius, Float)
4008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
4018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
4038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comDEFINE_GET_MEMBER(SkDrawCornerPathEffect);
4058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawCornerPathEffect::SkDrawCornerPathEffect(SkDisplayTypes type):
4078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fType(type), radius(0) {
4088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
4098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawCornerPathEffect::~SkDrawCornerPathEffect() {
4118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
4128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkPathEffect* SkDrawCornerPathEffect::getPathEffect() {
4140a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org    return SkCornerPathEffect::Create(radius);
4158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
4168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////
4188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkExtras.h"
4208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst char kDrawShape1DPathEffectName[] = "pathEffect:shape1D";
4228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst char kDrawShape2DPathEffectName[] = "pathEffect:shape2D";
4238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst char kDrawComposePathEffectName[] = "pathEffect:compose";
4248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst char kDrawCornerPathEffectName[]  = "pathEffect:corner";
4258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkExtraPathEffects : public SkExtras {
4278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
42893c7ee34dc5c8f6bfad65809f4b39f8d00d7f0d4sugoi@google.com    SkExtraPathEffects() :
4298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            skDrawShape1DPathEffectType(SkType_Unknown),
4308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            skDrawShape2DPathEffectType(SkType_Unknown),
4318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            skDrawComposePathEffectType(SkType_Unknown),
4328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            skDrawCornerPathEffectType(SkType_Unknown) {
4338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
43482065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
4358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual SkDisplayable* createInstance(SkDisplayTypes type) {
4368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDisplayable* result = NULL;
4378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (skDrawShape1DPathEffectType == type)
4388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            result = new SkDrawShape1DPathEffect(type);
4398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else if (skDrawShape2DPathEffectType == type)
4408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            result = new SkDrawShape2DPathEffect(type);
4418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else if (skDrawComposePathEffectType == type)
4428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            result = new SkDrawComposePathEffect(type);
4438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else if (skDrawCornerPathEffectType == type)
4448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            result = new SkDrawCornerPathEffect(type);
4458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return result;
4468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
4478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual bool definesType(SkDisplayTypes type) {
44982065d667f64e232bcde2ad849756a6096fcbe6freed@google.com        return type == skDrawShape1DPathEffectType ||
45082065d667f64e232bcde2ad849756a6096fcbe6freed@google.com            type == skDrawShape2DPathEffectType ||
4518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            type == skDrawComposePathEffectType ||
4528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            type == skDrawCornerPathEffectType;
4538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
4548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0
4568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual const SkMemberInfo* getMembers(SkDisplayTypes type, int* infoCountPtr) {
4578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const SkMemberInfo* info = NULL;
4588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int infoCount = 0;
4598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (skDrawShape1DPathEffectType == type) {
4608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            info = SkDrawShape1DPathEffect::fInfo;
4618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            infoCount = SkDrawShape1DPathEffect::fInfoCount;
4628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        } else if (skDrawShape2DPathEffectType == type) {
4638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            info = SkDrawShape2DPathEffect::fInfo;
4648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            infoCount = SkDrawShape2DPathEffect::fInfoCount;
4658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        } else if (skDrawComposePathEffectType == type) {
4668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            info = SkDrawComposePathEffect::fInfo;
4678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            infoCount = SkDrawShape1DPathEffect::fInfoCount;
4688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        } else if (skDrawCornerPathEffectType == type) {
4698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            info = SkDrawCornerPathEffect::fInfo;
4708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            infoCount = SkDrawCornerPathEffect::fInfoCount;
4718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
4728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (infoCountPtr)
4738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            *infoCountPtr = infoCount;
4748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return info;
4758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
4768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
4778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG
4798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual const char* getName(SkDisplayTypes type) {
4808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (skDrawShape1DPathEffectType == type)
4818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return kDrawShape1DPathEffectName;
4828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else if (skDrawShape2DPathEffectType == type)
4838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return kDrawShape2DPathEffectName;
4848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else if (skDrawComposePathEffectType == type)
4858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return kDrawComposePathEffectName;
4868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else if (skDrawCornerPathEffectType == type)
4878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return kDrawCornerPathEffectName;
4888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return NULL;
4898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
4908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
4918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual SkDisplayTypes getType(const char name[], size_t len ) {
4938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDisplayTypes* type = NULL;
4948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (SK_LITERAL_STR_EQUAL(kDrawShape1DPathEffectName, name, len))
4958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            type = &skDrawShape1DPathEffectType;
4968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else if (SK_LITERAL_STR_EQUAL(kDrawShape2DPathEffectName, name, len))
4978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            type = &skDrawShape2DPathEffectType;
4988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else if (SK_LITERAL_STR_EQUAL(kDrawComposePathEffectName, name, len))
4998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            type = &skDrawComposePathEffectType;
5008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else if (SK_LITERAL_STR_EQUAL(kDrawCornerPathEffectName, name, len))
5018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            type = &skDrawCornerPathEffectType;
5028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (type) {
5038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (*type == SkType_Unknown)
5048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                *type = SkDisplayType::RegisterNewType();
5058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return *type;
5068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
5078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return SkType_Unknown;
5088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
5098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
5108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
5118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDisplayTypes skDrawShape1DPathEffectType;
5128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDisplayTypes skDrawShape2DPathEffectType;
5138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDisplayTypes skDrawComposePathEffectType;
5148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDisplayTypes skDrawCornerPathEffectType;
5158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
5168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
5178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid InitializeSkExtraPathEffects(SkAnimator* animator) {
51893c7ee34dc5c8f6bfad65809f4b39f8d00d7f0d4sugoi@google.com    animator->addExtras(new SkExtraPathEffects());
5198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
5208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
5218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////////////
5228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
5238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
5248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkExtras::SkExtras() : fExtraCallBack(NULL), fExtraStorage(NULL) {
5258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
526