| Index: src/animator/SkDrawExtraPathEffect.cpp
|
| ===================================================================
|
| --- src/animator/SkDrawExtraPathEffect.cpp (revision 8005)
|
| +++ src/animator/SkDrawExtraPathEffect.cpp (working copy)
|
| @@ -118,15 +118,11 @@
|
| SkMatrix m;
|
| m.reset();
|
| if (fDraw->addMatrix) {
|
| - SkDrawMatrix* matrix;
|
| - if (fDraw->addMatrix->getType() == SkType_Matrix)
|
| - matrix = (SkDrawMatrix*) fDraw->addMatrix;
|
| - else {
|
| + if (fDraw->addMatrix->getType() != SkType_Matrix) {
|
| SkApply* apply = (SkApply*) fDraw->addMatrix;
|
| apply->refresh(*fMaker);
|
| apply->activate(*fMaker);
|
| apply->interpolate(*fMaker, SkScalarMulRound(distance, 1000));
|
| - matrix = (SkDrawMatrix*) apply->getScope();
|
| }
|
| }
|
| SkScalar result = 0;
|
| @@ -224,55 +220,76 @@
|
| class SkShape2DPathEffect : public Sk2DPathEffect {
|
| public:
|
| SkShape2DPathEffect(SkDrawShape2DPathEffect* draw, SkAnimateMaker* maker,
|
| - const SkMatrix& matrix) : Sk2DPathEffect(matrix), fDraw(draw), fMaker(maker) {
|
| + const SkMatrix& matrix) : Sk2DPathEffect(matrix) {
|
| + fData = new SkShape2DPathEffectData(draw, maker);
|
| }
|
| + ~SkShape2DPathEffect() {
|
| + delete fData;
|
| + }
|
|
|
| protected:
|
| - virtual void begin(const SkIRect& uvBounds, SkPath* )
|
| - {
|
| - fUVBounds.set(SkIntToScalar(uvBounds.fLeft), SkIntToScalar(uvBounds.fTop),
|
| - SkIntToScalar(uvBounds.fRight), SkIntToScalar(uvBounds.fBottom));
|
| + void begin(const SkIRect& uvBounds, SkPath*) const {
|
| + fData->begin(uvBounds);
|
| }
|
|
|
| - virtual void next(const SkPoint& loc, int u, int v, SkPath* dst)
|
| - {
|
| - fLoc = loc;
|
| - fU = u;
|
| - fV = v;
|
| - SkDrawPath* drawPath;
|
| - fMaker->setExtraPropertyCallBack(fDraw->fType, Get2D, this);
|
| - if (fDraw->addPath->isPath()) {
|
| - drawPath = (SkDrawPath*) fDraw->addPath;
|
| - } else {
|
| - SkApply* apply = (SkApply*) fDraw->addPath;
|
| - apply->refresh(*fMaker);
|
| - apply->activate(*fMaker);
|
| - apply->interpolate(*fMaker, v);
|
| - drawPath = (SkDrawPath*) apply->getScope();
|
| + void next(const SkPoint& loc, int u, int v, SkPath* dst) const {
|
| + fData->next(loc, u, v, dst);
|
| + }
|
| +
|
| +private:
|
| + struct SkShape2DPathEffectData {
|
| + SkShape2DPathEffectData(SkDrawShape2DPathEffect* draw, SkAnimateMaker* maker) :
|
| + fDraw(draw), fMaker(maker) {}
|
| +
|
| + void begin(const SkIRect& uvBounds) {
|
| + fUVBounds.set(SkIntToScalar(uvBounds.fLeft), SkIntToScalar(uvBounds.fTop),
|
| + SkIntToScalar(uvBounds.fRight), SkIntToScalar(uvBounds.fBottom));
|
| }
|
| - if (drawPath == NULL)
|
| - goto clearCallBack;
|
| - if (fDraw->matrix) {
|
| - SkDrawMatrix* matrix;
|
| - if (fDraw->matrix->getType() == SkType_Matrix)
|
| - matrix = (SkDrawMatrix*) fDraw->matrix;
|
| - else {
|
| - SkApply* apply = (SkApply*) fDraw->matrix;
|
| +
|
| + void next(const SkPoint& loc, int u, int v, SkPath* dst) {
|
| + fLoc = loc;
|
| + fU = u;
|
| + fV = v;
|
| + SkDrawPath* drawPath;
|
| + fMaker->setExtraPropertyCallBack(fDraw->fType, Get2D, this);
|
| + if (fDraw->addPath->isPath()) {
|
| + drawPath = (SkDrawPath*) fDraw->addPath;
|
| + } else {
|
| + SkApply* apply = (SkApply*) fDraw->addPath;
|
| + apply->refresh(*fMaker);
|
| apply->activate(*fMaker);
|
| apply->interpolate(*fMaker, v);
|
| - matrix = (SkDrawMatrix*) apply->getScope();
|
| + drawPath = (SkDrawPath*) apply->getScope();
|
| }
|
| - if (matrix) {
|
| - dst->addPath(drawPath->getPath(), matrix->getMatrix());
|
| + if (drawPath == NULL)
|
| goto clearCallBack;
|
| + if (fDraw->matrix) {
|
| + SkDrawMatrix* matrix;
|
| + if (fDraw->matrix->getType() == SkType_Matrix)
|
| + matrix = (SkDrawMatrix*) fDraw->matrix;
|
| + else {
|
| + SkApply* apply = (SkApply*) fDraw->matrix;
|
| + apply->activate(*fMaker);
|
| + apply->interpolate(*fMaker, v);
|
| + matrix = (SkDrawMatrix*) apply->getScope();
|
| + }
|
| + if (matrix) {
|
| + dst->addPath(drawPath->getPath(), matrix->getMatrix());
|
| + goto clearCallBack;
|
| + }
|
| }
|
| + dst->addPath(drawPath->getPath());
|
| +clearCallBack:
|
| + fMaker->clearExtraPropertyCallBack(fDraw->fType);
|
| }
|
| - dst->addPath(drawPath->getPath());
|
| -clearCallBack:
|
| - fMaker->clearExtraPropertyCallBack(fDraw->fType);
|
| - }
|
|
|
| -private:
|
| + SkPoint fLoc;
|
| + SkRect fUVBounds;
|
| + int32_t fU;
|
| + int32_t fV;
|
| + SkDrawShape2DPathEffect* fDraw;
|
| + SkAnimateMaker* fMaker;
|
| + };
|
|
|
| static bool Get2D(const char* token, size_t len, void* s2D, SkScriptValue* value) {
|
| static const char match[] = "locX|locY|left|top|right|bottom|u|v" ;
|
| @@ -283,20 +300,15 @@
|
| SkASSERT((sizeof(SkPoint) + sizeof(SkRect)) / sizeof(SkScalar) == 6);
|
| if (index < 6) {
|
| value->fType = SkType_Float;
|
| - value->fOperand.fScalar = (&shape2D->fLoc.fX)[index];
|
| + value->fOperand.fScalar = (&shape2D->fData->fLoc.fX)[index];
|
| } else {
|
| value->fType = SkType_Int;
|
| - value->fOperand.fS32 = (&shape2D->fU)[index - 6];
|
| + value->fOperand.fS32 = (&shape2D->fData->fU)[index - 6];
|
| }
|
| return true;
|
| }
|
|
|
| - SkPoint fLoc;
|
| - SkRect fUVBounds;
|
| - int32_t fU;
|
| - int32_t fV;
|
| - SkDrawShape2DPathEffect* fDraw;
|
| - SkAnimateMaker* fMaker;
|
| + SkShape2DPathEffectData* fData;
|
|
|
| // illegal
|
| SkShape2DPathEffect(const SkShape2DPathEffect&);
|
|
|