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