OLD | NEW |
| (Empty) |
1 /* libs/graphics/effects/Sk2DPathEffect.cpp | |
2 ** | |
3 ** Copyright 2006, The Android Open Source Project | |
4 ** | |
5 ** Licensed under the Apache License, Version 2.0 (the "License"); | |
6 ** you may not use this file except in compliance with the License. | |
7 ** You may obtain a copy of the License at | |
8 ** | |
9 ** http://www.apache.org/licenses/LICENSE-2.0 | |
10 ** | |
11 ** Unless required by applicable law or agreed to in writing, software | |
12 ** distributed under the License is distributed on an "AS IS" BASIS, | |
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
14 ** See the License for the specific language governing permissions and | |
15 ** limitations under the License. | |
16 */ | |
17 | |
18 #include "Sk2DPathEffect.h" | |
19 #include "SkBlitter.h" | |
20 #include "SkPath.h" | |
21 #include "SkScan.h" | |
22 | |
23 class Sk2DPathEffectBlitter : public SkBlitter { | |
24 public: | |
25 Sk2DPathEffectBlitter(Sk2DPathEffect* pe, SkPath* dst) | |
26 : fPE(pe), fDst(dst) | |
27 {} | |
28 virtual void blitH(int x, int y, int count) | |
29 { | |
30 fPE->nextSpan(x, y, count, fDst); | |
31 } | |
32 private: | |
33 Sk2DPathEffect* fPE; | |
34 SkPath* fDst; | |
35 }; | |
36 | |
37 ////////////////////////////////////////////////////////////////////////////////
//// | |
38 | |
39 Sk2DPathEffect::Sk2DPathEffect(const SkMatrix& mat) : fMatrix(mat) | |
40 { | |
41 mat.invert(&fInverse); | |
42 } | |
43 | |
44 bool Sk2DPathEffect::filterPath(SkPath* dst, const SkPath& src, SkScalar* width) | |
45 { | |
46 Sk2DPathEffectBlitter blitter(this, dst); | |
47 SkPath tmp; | |
48 SkRect bounds; | |
49 SkIRect ir; | |
50 | |
51 src.transform(fInverse, &tmp); | |
52 tmp.computeBounds(&bounds, SkPath::kExact_BoundsType); | |
53 bounds.round(&ir); | |
54 if (!ir.isEmpty()) { | |
55 // need to pass a clip to fillpath, required for inverse filltypes, | |
56 // even though those do not make sense for this patheffect | |
57 SkRegion clip(ir); | |
58 | |
59 this->begin(ir, dst); | |
60 SkScan::FillPath(tmp, clip, &blitter); | |
61 this->end(dst); | |
62 } | |
63 return true; | |
64 } | |
65 | |
66 void Sk2DPathEffect::nextSpan(int x, int y, int count, SkPath* path) | |
67 { | |
68 const SkMatrix& mat = this->getMatrix(); | |
69 SkPoint src, dst; | |
70 | |
71 src.set(SkIntToScalar(x) + SK_ScalarHalf, SkIntToScalar(y) + SK_ScalarHalf); | |
72 do { | |
73 mat.mapPoints(&dst, &src, 1); | |
74 this->next(dst, x++, y, path); | |
75 src.fX += SK_Scalar1; | |
76 } while (--count > 0); | |
77 } | |
78 | |
79 void Sk2DPathEffect::begin(const SkIRect& uvBounds, SkPath* dst) {} | |
80 void Sk2DPathEffect::next(const SkPoint& loc, int u, int v, SkPath* dst) {} | |
81 void Sk2DPathEffect::end(SkPath* dst) {} | |
82 | |
83 //////////////////////////////////////////////////////////////////////////////// | |
84 | |
85 void Sk2DPathEffect::flatten(SkFlattenableWriteBuffer& buffer) | |
86 { | |
87 buffer.writeMul4(&fMatrix, sizeof(fMatrix)); | |
88 } | |
89 | |
90 Sk2DPathEffect::Sk2DPathEffect(SkFlattenableReadBuffer& buffer) | |
91 { | |
92 buffer.read(&fMatrix, sizeof(fMatrix)); | |
93 fMatrix.invert(&fInverse); | |
94 } | |
95 | |
96 SkFlattenable::Factory Sk2DPathEffect::getFactory() | |
97 { | |
98 return CreateProc; | |
99 } | |
100 | |
101 SkFlattenable* Sk2DPathEffect::CreateProc(SkFlattenableReadBuffer& buffer) | |
102 { | |
103 return SkNEW_ARGS(Sk2DPathEffect, (buffer)); | |
104 } | |
105 | |
106 | |
107 | |
OLD | NEW |