Sk2DPathEffect.cpp revision d2700eec7eb2e26beb206b88a0f0b6f3c5f49118
1 2/* 3 * Copyright 2006 The Android Open Source Project 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10#include "Sk2DPathEffect.h" 11#include "SkBlitter.h" 12#include "SkPath.h" 13#include "SkScan.h" 14 15class Sk2DPathEffectBlitter : public SkBlitter { 16public: 17 Sk2DPathEffectBlitter(Sk2DPathEffect* pe, SkPath* dst) 18 : fPE(pe), fDst(dst) {} 19 20 virtual void blitH(int x, int y, int count) { 21 fPE->nextSpan(x, y, count, fDst); 22 } 23private: 24 Sk2DPathEffect* fPE; 25 SkPath* fDst; 26}; 27 28/////////////////////////////////////////////////////////////////////////////// 29 30Sk2DPathEffect::Sk2DPathEffect(const SkMatrix& mat) : fMatrix(mat) { 31 fMatrixIsInvertible = mat.invert(&fInverse); 32} 33 34bool Sk2DPathEffect::filterPath(SkPath* dst, const SkPath& src, SkStrokeRec*) { 35 if (!fMatrixIsInvertible) { 36 return false; 37 } 38 39 Sk2DPathEffectBlitter blitter(this, dst); 40 SkPath tmp; 41 SkIRect ir; 42 43 src.transform(fInverse, &tmp); 44 tmp.getBounds().round(&ir); 45 if (!ir.isEmpty()) { 46 this->begin(ir, dst); 47 SkScan::FillPath(tmp, ir, &blitter); 48 this->end(dst); 49 } 50 return true; 51} 52 53void Sk2DPathEffect::nextSpan(int x, int y, int count, SkPath* path) { 54 if (!fMatrixIsInvertible) { 55 return; 56 } 57 58 const SkMatrix& mat = this->getMatrix(); 59 SkPoint src, dst; 60 61 src.set(SkIntToScalar(x) + SK_ScalarHalf, SkIntToScalar(y) + SK_ScalarHalf); 62 do { 63 mat.mapPoints(&dst, &src, 1); 64 this->next(dst, x++, y, path); 65 src.fX += SK_Scalar1; 66 } while (--count > 0); 67} 68 69void Sk2DPathEffect::begin(const SkIRect& uvBounds, SkPath* dst) {} 70void Sk2DPathEffect::next(const SkPoint& loc, int u, int v, SkPath* dst) {} 71void Sk2DPathEffect::end(SkPath* dst) {} 72 73/////////////////////////////////////////////////////////////////////////////// 74 75void Sk2DPathEffect::flatten(SkFlattenableWriteBuffer& buffer) const { 76 this->INHERITED::flatten(buffer); 77 buffer.writeMatrix(fMatrix); 78} 79 80Sk2DPathEffect::Sk2DPathEffect(SkFlattenableReadBuffer& buffer) { 81 buffer.readMatrix(&fMatrix); 82 fMatrixIsInvertible = fMatrix.invert(&fInverse); 83} 84 85/////////////////////////////////////////////////////////////////////////////// 86/////////////////////////////////////////////////////////////////////////////// 87 88SkPath2DPathEffect::SkPath2DPathEffect(const SkMatrix& m, const SkPath& p) 89 : INHERITED(m), fPath(p) { 90} 91 92SkPath2DPathEffect::SkPath2DPathEffect(SkFlattenableReadBuffer& buffer) 93 : INHERITED(buffer) { 94 buffer.readPath(&fPath); 95} 96 97void SkPath2DPathEffect::flatten(SkFlattenableWriteBuffer& buffer) const { 98 this->INHERITED::flatten(buffer); 99 buffer.writePath(fPath); 100} 101 102void SkPath2DPathEffect::next(const SkPoint& loc, int u, int v, SkPath* dst) { 103 dst->addPath(fPath, loc.fX, loc.fY); 104} 105 106/////////////////////////////////////////////////////////////////////////////// 107 108SK_DEFINE_FLATTENABLE_REGISTRAR(SkPath2DPathEffect) 109