11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDrawExtraPathEffect.h"
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDrawPath.h"
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "Sk1DPathEffect.h"
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "Sk2DPathEffect.h"
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkMemberInfo.h"
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPaintParts.h"
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPathEffect.h"
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkCornerPathEffect.h"
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDashPathEffect.h"
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkDrawShapePathEffect : public SkDrawPathEffect {
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    DECLARE_PRIVATE_MEMBER_INFO(DrawShapePathEffect);
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDrawShapePathEffect();
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual ~SkDrawShapePathEffect();
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool add(SkAnimateMaker& , SkDisplayable* );
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual SkPathEffect* getPathEffect();
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected:
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDrawable* addPath;
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDrawable* addMatrix;
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDrawPath* path;
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPathEffect* fPathEffect;
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    friend class SkShape1DPathEffect;
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    friend class SkShape2DPathEffect;
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkDrawShape1DPathEffect : public SkDrawShapePathEffect {
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    DECLARE_EXTRAS_MEMBER_INFO(SkDrawShape1DPathEffect);
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDrawShape1DPathEffect(SkDisplayTypes );
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual ~SkDrawShape1DPathEffect();
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void onEndElement(SkAnimateMaker& );
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkString phase;
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkString spacing;
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    friend class SkShape1DPathEffect;
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    typedef SkDrawShapePathEffect INHERITED;
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkDrawShape2DPathEffect : public SkDrawShapePathEffect {
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    DECLARE_EXTRAS_MEMBER_INFO(SkDrawShape2DPathEffect);
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDrawShape2DPathEffect(SkDisplayTypes );
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual ~SkDrawShape2DPathEffect();
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void onEndElement(SkAnimateMaker& );
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDrawMatrix* matrix;
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    friend class SkShape2DPathEffect;
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    typedef SkDrawShapePathEffect INHERITED;
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkDrawComposePathEffect : public SkDrawPathEffect {
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    DECLARE_EXTRAS_MEMBER_INFO(SkDrawComposePathEffect);
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDrawComposePathEffect(SkDisplayTypes );
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual ~SkDrawComposePathEffect();
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool add(SkAnimateMaker& , SkDisplayable* );
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual SkPathEffect* getPathEffect();
6540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    virtual bool isPaint() const;
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDrawPathEffect* effect1;
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDrawPathEffect* effect2;
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkDrawCornerPathEffect : public SkDrawPathEffect {
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    DECLARE_EXTRAS_MEMBER_INFO(SkDrawCornerPathEffect);
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDrawCornerPathEffect(SkDisplayTypes );
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual ~SkDrawCornerPathEffect();
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual SkPathEffect* getPathEffect();
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar radius;
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//////////// SkShape1DPathEffect
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkAnimateMaker.h"
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkAnimatorScript.h"
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDisplayApply.h"
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDrawMatrix.h"
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPaint.h"
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkShape1DPathEffect : public Sk1DPathEffect {
890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkShape1DPathEffect(SkDrawShape1DPathEffect* draw, SkAnimateMaker* maker) :
910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fDraw(draw), fMaker(maker) {
920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected:
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual SkScalar begin(SkScalar contourLength)
960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkScriptValue value;
980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkAnimatorScript engine(*fMaker, NULL, SkType_Float);
990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        engine.propertyCallBack(GetContourLength, &contourLength);
1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        value.fOperand.fScalar = 0;
1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        engine.evaluate(fDraw->phase.c_str(), &value, SkType_Float);
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return value.fOperand.fScalar;
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual SkScalar next(SkPath* dst, SkScalar distance, SkPathMeasure& )
1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fMaker->setExtraPropertyCallBack(fDraw->fType, GetDistance, &distance);
1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDrawPath* drawPath = NULL;
1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (fDraw->addPath->isPath()) {
1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            drawPath = (SkDrawPath*) fDraw->addPath;
1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        } else {
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkApply* apply = (SkApply*) fDraw->addPath;
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            apply->refresh(*fMaker);
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            apply->activate(*fMaker);
1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            apply->interpolate(*fMaker, SkScalarMulRound(distance, 1000));
1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            drawPath = (SkDrawPath*) apply->getScope();
1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkMatrix m;
1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        m.reset();
1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (fDraw->addMatrix) {
1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDrawMatrix* matrix;
12240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger            if (fDraw->addMatrix->getType() == SkType_Matrix)
1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                matrix = (SkDrawMatrix*) fDraw->addMatrix;
1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            else {
1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkApply* apply = (SkApply*) fDraw->addMatrix;
1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                apply->refresh(*fMaker);
1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                apply->activate(*fMaker);
1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                apply->interpolate(*fMaker, SkScalarMulRound(distance, 1000));
1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                matrix = (SkDrawMatrix*) apply->getScope();
1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            }
1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkScalar result = 0;
1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkAnimatorScript::EvaluateFloat(*fMaker, NULL, fDraw->spacing.c_str(), &result);
1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (drawPath)
1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            dst->addPath(drawPath->getPath(), m);
1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fMaker->clearExtraPropertyCallBack(fDraw->fType);
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return result;
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void flatten(SkFlattenableWriteBuffer& ) {}
1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual Factory getFactory() { return NULL; }
1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static bool GetContourLength(const char* token, size_t len, void* clen, SkScriptValue* value) {
1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (SK_LITERAL_STR_EQUAL("contourLength", token, len)) {
1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            value->fOperand.fScalar = *(SkScalar*) clen;
1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            value->fType = SkType_Float;
1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return true;
1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return false;
1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static bool GetDistance(const char* token, size_t len, void* dist, SkScriptValue* value) {
1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (SK_LITERAL_STR_EQUAL("distance", token, len)) {
1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            value->fOperand.fScalar = *(SkScalar*) dist;
1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            value->fType = SkType_Float;
1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return true;
1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return false;
1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDrawShape1DPathEffect* fDraw;
1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkAnimateMaker* fMaker;
1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//////////// SkDrawShapePathEffect
1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if SK_USE_CONDENSED_INFO == 0
1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkMemberInfo SkDrawShapePathEffect::fInfo[] = {
1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(addMatrix, Drawable), // either matrix or apply
1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(addPath, Drawable),   // either path or apply
1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(path, Path),
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectDEFINE_GET_MEMBER(SkDrawShapePathEffect);
1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
18040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek SollenbergerSkDrawShapePathEffect::SkDrawShapePathEffect() :
1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addPath(NULL), addMatrix(NULL), path(NULL), fPathEffect(NULL) {
1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDrawShapePathEffect::~SkDrawShapePathEffect() {
18540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkSafeUnref(fPathEffect);
1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDrawShapePathEffect::add(SkAnimateMaker& , SkDisplayable* child) {
1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    path = (SkDrawPath*) child;
1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return true;
1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkPathEffect* SkDrawShapePathEffect::getPathEffect() {
1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fPathEffect->ref();
1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return fPathEffect;
1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//////////// SkDrawShape1DPathEffect
1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if SK_USE_CONDENSED_INFO == 0
2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkMemberInfo SkDrawShape1DPathEffect::fInfo[] = {
2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_INHERITED,
2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(phase, String),
2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(spacing, String),
2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectDEFINE_GET_MEMBER(SkDrawShape1DPathEffect);
2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDrawShape1DPathEffect::SkDrawShape1DPathEffect(SkDisplayTypes type) : fType(type) {
2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDrawShape1DPathEffect::~SkDrawShape1DPathEffect() {
2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDrawShape1DPathEffect::onEndElement(SkAnimateMaker& maker) {
2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (addPath == NULL || (addPath->isPath() == false && addPath->isApply() == false))
2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        maker.setErrorCode(SkDisplayXMLParserError::kUnknownError); // !!! add error
2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    else
2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fPathEffect = new SkShape1DPathEffect(this, &maker);
2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project////////// SkShape2DPathEffect
2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkShape2DPathEffect : public Sk2DPathEffect {
2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
22940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkShape2DPathEffect(SkDrawShape2DPathEffect* draw, SkAnimateMaker* maker,
2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkMatrix& matrix) : Sk2DPathEffect(matrix), fDraw(draw), fMaker(maker) {
2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected:
2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void begin(const SkIRect& uvBounds, SkPath* )
2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fUVBounds.set(SkIntToScalar(uvBounds.fLeft), SkIntToScalar(uvBounds.fTop),
2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkIntToScalar(uvBounds.fRight), SkIntToScalar(uvBounds.fBottom));
2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void next(const SkPoint& loc, int u, int v, SkPath* dst)
2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fLoc = loc;
2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fU = u;
2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fV = v;
2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDrawPath* drawPath;
2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fMaker->setExtraPropertyCallBack(fDraw->fType, Get2D, this);
2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (fDraw->addPath->isPath()) {
2480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            drawPath = (SkDrawPath*) fDraw->addPath;
2490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        } else {
2500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkApply* apply = (SkApply*) fDraw->addPath;
2510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            apply->refresh(*fMaker);
2520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            apply->activate(*fMaker);
2530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            apply->interpolate(*fMaker, v);
2540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            drawPath = (SkDrawPath*) apply->getScope();
2550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
2560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (drawPath == NULL)
2570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            goto clearCallBack;
2580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (fDraw->matrix) {
2590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDrawMatrix* matrix;
26040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger            if (fDraw->matrix->getType() == SkType_Matrix)
2610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                matrix = (SkDrawMatrix*) fDraw->matrix;
2620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            else {
2630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkApply* apply = (SkApply*) fDraw->matrix;
2640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                apply->activate(*fMaker);
2650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                apply->interpolate(*fMaker, v);
2660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                matrix = (SkDrawMatrix*) apply->getScope();
2670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            }
2680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (matrix) {
2690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                dst->addPath(drawPath->getPath(), matrix->getMatrix());
2700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                goto clearCallBack;
2710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            }
2720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
2730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        dst->addPath(drawPath->getPath());
2740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectclearCallBack:
2750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fMaker->clearExtraPropertyCallBack(fDraw->fType);
2760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
2790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static bool Get2D(const char* token, size_t len, void* s2D, SkScriptValue* value) {
2810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        static const char match[] = "locX|locY|left|top|right|bottom|u|v" ;
2820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkShape2DPathEffect* shape2D = (SkShape2DPathEffect*) s2D;
2830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int index;
2840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (SkAnimatorScript::MapEnums(match, token, len, &index) == false)
2850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return false;
2860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT((sizeof(SkPoint) +     sizeof(SkRect)) / sizeof(SkScalar) == 6);
2870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (index < 6) {
2880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            value->fType = SkType_Float;
2890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            value->fOperand.fScalar = (&shape2D->fLoc.fX)[index];
2900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        } else {
2910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            value->fType = SkType_Int;
2920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            value->fOperand.fS32 = (&shape2D->fU)[index - 6];
2930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
2940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return true;
2950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
29640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
2970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPoint fLoc;
2980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkRect fUVBounds;
2990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int32_t fU;
3000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int32_t fV;
3010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDrawShape2DPathEffect* fDraw;
3020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkAnimateMaker* fMaker;
3030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // illegal
3050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkShape2DPathEffect(const SkShape2DPathEffect&);
3060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkShape2DPathEffect& operator=(const SkShape2DPathEffect&);
3070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
3080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project////////// SkDrawShape2DPathEffect
3100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if SK_USE_CONDENSED_INFO == 0
3120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkMemberInfo SkDrawShape2DPathEffect::fInfo[] = {
3140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_INHERITED,
3150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(matrix, Matrix)
3160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
3170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
3190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectDEFINE_GET_MEMBER(SkDrawShape2DPathEffect);
3210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDrawShape2DPathEffect::SkDrawShape2DPathEffect(SkDisplayTypes type) : fType(type) {
3230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
3240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDrawShape2DPathEffect::~SkDrawShape2DPathEffect() {
3260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
3270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDrawShape2DPathEffect::onEndElement(SkAnimateMaker& maker) {
3290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (addPath == NULL || (addPath->isPath() == false && addPath->isApply() == false) ||
3300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            matrix == NULL)
3310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        maker.setErrorCode(SkDisplayXMLParserError::kUnknownError); // !!! add error
3320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    else
3330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fPathEffect = new SkShape2DPathEffect(this, &maker, matrix->getMatrix());
3340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
3350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project////////// SkDrawComposePathEffect
3370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if SK_USE_CONDENSED_INFO == 0
3390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkMemberInfo SkDrawComposePathEffect::fInfo[] = {
3410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(effect1, PathEffect),
3420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(effect2, PathEffect)
3430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
3440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
3460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectDEFINE_GET_MEMBER(SkDrawComposePathEffect);
3480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDrawComposePathEffect::SkDrawComposePathEffect(SkDisplayTypes type) : fType(type),
3500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    effect1(NULL), effect2(NULL) {
3510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
3520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDrawComposePathEffect::~SkDrawComposePathEffect() {
3540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    delete effect1;
3550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    delete effect2;
3560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
3570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDrawComposePathEffect::add(SkAnimateMaker& , SkDisplayable* child) {
3590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (effect1 == NULL)
3600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        effect1 = (SkDrawPathEffect*) child;
3610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    else
3620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        effect2 = (SkDrawPathEffect*) child;
3630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return true;
3640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
3650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkPathEffect* SkDrawComposePathEffect::getPathEffect() {
3670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPathEffect* e1 = effect1->getPathEffect();
3680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPathEffect* e2 = effect2->getPathEffect();
3690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPathEffect* composite = new SkComposePathEffect(e1, e2);
3700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    e1->unref();
3710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    e2->unref();
3720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return composite;
3730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
3740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDrawComposePathEffect::isPaint() const {
3760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return true;
3770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
3780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//////////// SkDrawCornerPathEffect
3800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if SK_USE_CONDENSED_INFO == 0
3820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkMemberInfo SkDrawCornerPathEffect::fInfo[] = {
3840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(radius, Float)
3850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
3860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
3880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectDEFINE_GET_MEMBER(SkDrawCornerPathEffect);
3900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDrawCornerPathEffect::SkDrawCornerPathEffect(SkDisplayTypes type):
3920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fType(type), radius(0) {
3930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
3940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDrawCornerPathEffect::~SkDrawCornerPathEffect() {
3960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
3970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkPathEffect* SkDrawCornerPathEffect::getPathEffect() {
3990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return new SkCornerPathEffect(radius);
4000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/////////
4030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkExtras.h"
4050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst char kDrawShape1DPathEffectName[] = "pathEffect:shape1D";
4070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst char kDrawShape2DPathEffectName[] = "pathEffect:shape2D";
4080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst char kDrawComposePathEffectName[] = "pathEffect:compose";
4090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst char kDrawCornerPathEffectName[]  = "pathEffect:corner";
4100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkExtraPathEffects : public SkExtras {
4120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
41340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkExtraPathEffects(SkAnimator* animator) :
4140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            skDrawShape1DPathEffectType(SkType_Unknown),
4150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            skDrawShape2DPathEffectType(SkType_Unknown),
4160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            skDrawComposePathEffectType(SkType_Unknown),
4170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            skDrawCornerPathEffectType(SkType_Unknown) {
4180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
41940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
4200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual SkDisplayable* createInstance(SkDisplayTypes type) {
4210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDisplayable* result = NULL;
4220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (skDrawShape1DPathEffectType == type)
4230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            result = new SkDrawShape1DPathEffect(type);
4240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        else if (skDrawShape2DPathEffectType == type)
4250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            result = new SkDrawShape2DPathEffect(type);
4260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        else if (skDrawComposePathEffectType == type)
4270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            result = new SkDrawComposePathEffect(type);
4280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        else if (skDrawCornerPathEffectType == type)
4290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            result = new SkDrawCornerPathEffect(type);
4300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return result;
4310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool definesType(SkDisplayTypes type) {
43440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        return type == skDrawShape1DPathEffectType ||
43540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger            type == skDrawShape2DPathEffectType ||
4360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            type == skDrawComposePathEffectType ||
4370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            type == skDrawCornerPathEffectType;
4380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if SK_USE_CONDENSED_INFO == 0
4410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual const SkMemberInfo* getMembers(SkDisplayTypes type, int* infoCountPtr) {
4420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkMemberInfo* info = NULL;
4430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int infoCount = 0;
4440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (skDrawShape1DPathEffectType == type) {
4450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            info = SkDrawShape1DPathEffect::fInfo;
4460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            infoCount = SkDrawShape1DPathEffect::fInfoCount;
4470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        } else if (skDrawShape2DPathEffectType == type) {
4480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            info = SkDrawShape2DPathEffect::fInfo;
4490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            infoCount = SkDrawShape2DPathEffect::fInfoCount;
4500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        } else if (skDrawComposePathEffectType == type) {
4510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            info = SkDrawComposePathEffect::fInfo;
4520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            infoCount = SkDrawShape1DPathEffect::fInfoCount;
4530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        } else if (skDrawCornerPathEffectType == type) {
4540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            info = SkDrawCornerPathEffect::fInfo;
4550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            infoCount = SkDrawCornerPathEffect::fInfoCount;
4560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
4570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (infoCountPtr)
4580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            *infoCountPtr = infoCount;
4590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return info;
4600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
4620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG
4640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual const char* getName(SkDisplayTypes type) {
4650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (skDrawShape1DPathEffectType == type)
4660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return kDrawShape1DPathEffectName;
4670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        else if (skDrawShape2DPathEffectType == type)
4680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return kDrawShape2DPathEffectName;
4690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        else if (skDrawComposePathEffectType == type)
4700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return kDrawComposePathEffectName;
4710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        else if (skDrawCornerPathEffectType == type)
4720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return kDrawCornerPathEffectName;
4730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return NULL;
4740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
4760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual SkDisplayTypes getType(const char name[], size_t len ) {
4780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDisplayTypes* type = NULL;
4790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (SK_LITERAL_STR_EQUAL(kDrawShape1DPathEffectName, name, len))
4800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            type = &skDrawShape1DPathEffectType;
4810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        else if (SK_LITERAL_STR_EQUAL(kDrawShape2DPathEffectName, name, len))
4820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            type = &skDrawShape2DPathEffectType;
4830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        else if (SK_LITERAL_STR_EQUAL(kDrawComposePathEffectName, name, len))
4840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            type = &skDrawComposePathEffectType;
4850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        else if (SK_LITERAL_STR_EQUAL(kDrawCornerPathEffectName, name, len))
4860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            type = &skDrawCornerPathEffectType;
4870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (type) {
4880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (*type == SkType_Unknown)
4890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                *type = SkDisplayType::RegisterNewType();
4900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return *type;
4910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
4920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return SkType_Unknown;
4930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
4960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDisplayTypes skDrawShape1DPathEffectType;
4970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDisplayTypes skDrawShape2DPathEffectType;
4980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDisplayTypes skDrawComposePathEffectType;
4990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDisplayTypes skDrawCornerPathEffectType;
5000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
5010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid InitializeSkExtraPathEffects(SkAnimator* animator) {
5040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    animator->addExtras(new SkExtraPathEffects(animator));
5050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project////////////////
5080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkExtras::SkExtras() : fExtraCallBack(NULL), fExtraStorage(NULL) {
5110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
512