OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #ifndef GrAAConvexTessellator_DEFINED | 8 #ifndef GrAAConvexTessellator_DEFINED |
9 #define GrAAConvexTessellator_DEFINED | 9 #define GrAAConvexTessellator_DEFINED |
10 | 10 |
11 #include "SkColor.h" | 11 #include "SkColor.h" |
12 #include "SkPaint.h" | 12 #include "SkPaint.h" |
13 #include "SkPoint.h" | 13 #include "SkPoint.h" |
14 #include "SkScalar.h" | 14 #include "SkScalar.h" |
| 15 #include "SkStrokeRec.h" |
15 #include "SkTDArray.h" | 16 #include "SkTDArray.h" |
16 | 17 |
17 class SkCanvas; | 18 class SkCanvas; |
18 class SkMatrix; | 19 class SkMatrix; |
19 class SkPath; | 20 class SkPath; |
20 | 21 |
21 //#define GR_AA_CONVEX_TESSELLATOR_VIZ 1 | 22 //#define GR_AA_CONVEX_TESSELLATOR_VIZ 1 |
22 | 23 |
23 // device space distance which we inset / outset points in order to create the s
oft antialiased edge | 24 // device space distance which we inset / outset points in order to create the s
oft antialiased edge |
24 static const SkScalar kAntialiasingRadius = 0.5f; | 25 static const SkScalar kAntialiasingRadius = 0.5f; |
25 | 26 |
26 class GrAAConvexTessellator; | 27 class GrAAConvexTessellator; |
27 | 28 |
28 // The AAConvexTessellator holds the global pool of points and the triangulation | 29 // The AAConvexTessellator holds the global pool of points and the triangulation |
29 // that connects them. It also drives the tessellation process. | 30 // that connects them. It also drives the tessellation process. |
30 // The outward facing normals of the original polygon are stored (in 'fNorms') t
o service | 31 // The outward facing normals of the original polygon are stored (in 'fNorms') t
o service |
31 // computeDepthFromEdge requests. | 32 // computeDepthFromEdge requests. |
32 class GrAAConvexTessellator { | 33 class GrAAConvexTessellator { |
33 public: | 34 public: |
34 GrAAConvexTessellator(SkScalar strokeWidth = -1.0f, | 35 GrAAConvexTessellator(SkStrokeRec::Style style = SkStrokeRec::kFill_Style, |
| 36 SkScalar strokeWidth = -1.0f, |
35 SkPaint::Join join = SkPaint::Join::kBevel_Join, | 37 SkPaint::Join join = SkPaint::Join::kBevel_Join, |
36 SkScalar miterLimit = 0.0f) | 38 SkScalar miterLimit = 0.0f) |
37 : fSide(SkPoint::kOn_Side) | 39 : fSide(SkPoint::kOn_Side) |
38 , fStrokeWidth(strokeWidth) | 40 , fStrokeWidth(strokeWidth) |
| 41 , fStyle(style) |
39 , fJoin(join) | 42 , fJoin(join) |
40 , fMiterLimit(miterLimit) { | 43 , fMiterLimit(miterLimit) { |
41 } | 44 } |
42 | 45 |
43 SkPoint::Side side() const { return fSide; } | 46 SkPoint::Side side() const { return fSide; } |
44 | 47 |
45 bool tessellate(const SkMatrix& m, const SkPath& path); | 48 bool tessellate(const SkMatrix& m, const SkPath& path); |
46 | 49 |
47 // The next five should only be called after tessellate to extract the resul
t | 50 // The next five should only be called after tessellate to extract the resul
t |
48 int numPts() const { return fPts.count(); } | 51 int numPts() const { return fPts.count(); } |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 void rewind() { fPts.rewind(); } | 132 void rewind() { fPts.rewind(); } |
130 | 133 |
131 int numPts() const { return fPts.count(); } | 134 int numPts() const { return fPts.count(); } |
132 | 135 |
133 void addIdx(int index, int origEdgeId) { | 136 void addIdx(int index, int origEdgeId) { |
134 struct PointData* pt = fPts.push(); | 137 struct PointData* pt = fPts.push(); |
135 pt->fIndex = index; | 138 pt->fIndex = index; |
136 pt->fOrigEdgeId = origEdgeId; | 139 pt->fOrigEdgeId = origEdgeId; |
137 } | 140 } |
138 | 141 |
| 142 // Upgrade this ring so that it can behave like an originating ring |
| 143 void makeOriginalRing() { |
| 144 for (int i = 0; i < fPts.count(); ++i) { |
| 145 fPts[i].fOrigEdgeId = fPts[i].fIndex; |
| 146 } |
| 147 } |
| 148 |
139 // init should be called after all the indices have been added (via addI
dx) | 149 // init should be called after all the indices have been added (via addI
dx) |
140 void init(const GrAAConvexTessellator& tess); | 150 void init(const GrAAConvexTessellator& tess); |
141 void init(const SkTDArray<SkVector>& norms, const SkTDArray<SkVector>& b
isectors); | 151 void init(const SkTDArray<SkVector>& norms, const SkTDArray<SkVector>& b
isectors); |
142 | 152 |
143 const SkPoint& norm(int index) const { return fPts[index].fNorm; } | 153 const SkPoint& norm(int index) const { return fPts[index].fNorm; } |
144 const SkPoint& bisector(int index) const { return fPts[index].fBisector;
} | 154 const SkPoint& bisector(int index) const { return fPts[index].fBisector;
} |
145 int index(int index) const { return fPts[index].fIndex; } | 155 int index(int index) const { return fPts[index].fIndex; } |
146 int origEdgeID(int index) const { return fPts[index].fOrigEdgeId; } | 156 int origEdgeID(int index) const { return fPts[index].fOrigEdgeId; } |
147 void setOrigEdgeId(int index, int id) { fPts[index].fOrigEdgeId = id; } | 157 void setOrigEdgeId(int index, int id) { fPts[index].fOrigEdgeId = id; } |
148 | 158 |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 | 270 |
261 Ring fInitialRing; | 271 Ring fInitialRing; |
262 #if GR_AA_CONVEX_TESSELLATOR_VIZ | 272 #if GR_AA_CONVEX_TESSELLATOR_VIZ |
263 // When visualizing save all the rings | 273 // When visualizing save all the rings |
264 SkTDArray<Ring*> fRings; | 274 SkTDArray<Ring*> fRings; |
265 #else | 275 #else |
266 Ring fRings[2]; | 276 Ring fRings[2]; |
267 #endif | 277 #endif |
268 CandidateVerts fCandidateVerts; | 278 CandidateVerts fCandidateVerts; |
269 | 279 |
270 // < 0 means filling rather than stroking | 280 // the stroke width is only used for stroke or stroke-and-fill styles |
271 SkScalar fStrokeWidth; | 281 SkScalar fStrokeWidth; |
| 282 SkStrokeRec::Style fStyle; |
272 | 283 |
273 SkPaint::Join fJoin; | 284 SkPaint::Join fJoin; |
274 | 285 |
275 SkScalar fMiterLimit; | 286 SkScalar fMiterLimit; |
276 | 287 |
277 SkTDArray<SkPoint> fPointBuffer; | 288 SkTDArray<SkPoint> fPointBuffer; |
278 }; | 289 }; |
279 | 290 |
280 | 291 |
281 #endif | 292 #endif |
OLD | NEW |