Sk2DPathEffect.cpp revision d252db03d9650013b545ef9781fe993c07f8f314
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* libs/graphics/effects/Sk2DPathEffect.cpp
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Copyright 2006, The Android Open Source Project
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Licensed under the Apache License, Version 2.0 (the "License");
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** you may not use this file except in compliance with the License.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** You may obtain a copy of the License at
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     http://www.apache.org/licenses/LICENSE-2.0
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)** Unless required by applicable law or agreed to in writing, software
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** distributed under the License is distributed on an "AS IS" BASIS,
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** See the License for the specific language governing permissions and
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** limitations under the License.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "Sk2DPathEffect.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "SkBlitter.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "SkPath.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkScan.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Sk2DPathEffectBlitter : public SkBlitter {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Sk2DPathEffectBlitter(Sk2DPathEffect* pe, SkPath* dst)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : fPE(pe), fDst(dst)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void blitH(int x, int y, int count)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fPE->nextSpan(x, y, count, fDst);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private:
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Sk2DPathEffect* fPE;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkPath*         fDst;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////////
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Sk2DPathEffect::Sk2DPathEffect(const SkMatrix& mat) : fMatrix(mat)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mat.invert(&fInverse);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Sk2DPathEffect::filterPath(SkPath* dst, const SkPath& src, SkScalar* width)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Sk2DPathEffectBlitter   blitter(this, dst);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkPath                  tmp;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkIRect                 ir;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    src.transform(fInverse, &tmp);
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tmp.getBounds().round(&ir);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!ir.isEmpty()) {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // need to pass a clip to fillpath, required for inverse filltypes,
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // even though those do not make sense for this patheffect
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkRegion clip(ir);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this->begin(ir, dst);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkScan::FillPath(tmp, clip, &blitter);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this->end(dst);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Sk2DPathEffect::nextSpan(int x, int y, int count, SkPath* path)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SkMatrix& mat = this->getMatrix();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkPoint src, dst;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    src.set(SkIntToScalar(x) + SK_ScalarHalf, SkIntToScalar(y) + SK_ScalarHalf);
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    do {
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        mat.mapPoints(&dst, &src, 1);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this->next(dst, x++, y, path);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        src.fX += SK_Scalar1;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } while (--count > 0);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Sk2DPathEffect::begin(const SkIRect& uvBounds, SkPath* dst) {}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Sk2DPathEffect::next(const SkPoint& loc, int u, int v, SkPath* dst) {}
79void Sk2DPathEffect::end(SkPath* dst) {}
80
81////////////////////////////////////////////////////////////////////////////////
82
83void Sk2DPathEffect::flatten(SkFlattenableWriteBuffer& buffer)
84{
85    buffer.writeMul4(&fMatrix, sizeof(fMatrix));
86}
87
88Sk2DPathEffect::Sk2DPathEffect(SkFlattenableReadBuffer& buffer)
89{
90    buffer.read(&fMatrix, sizeof(fMatrix));
91    fMatrix.invert(&fInverse);
92}
93
94SkFlattenable::Factory Sk2DPathEffect::getFactory()
95{
96    return CreateProc;
97}
98
99SkFlattenable* Sk2DPathEffect::CreateProc(SkFlattenableReadBuffer& buffer)
100{
101    return SkNEW_ARGS(Sk2DPathEffect, (buffer));
102}
103
104
105
106