Index: src/gpu/batches/GrAAConvexTessellator.h |
diff --git a/src/gpu/batches/GrAAConvexTessellator.h b/src/gpu/batches/GrAAConvexTessellator.h |
index faa251e2a824eccef842a21782c3458fa7133f57..268314791256bcca24c9fbf3bc09cc3e1f4b637a 100644 |
--- a/src/gpu/batches/GrAAConvexTessellator.h |
+++ b/src/gpu/batches/GrAAConvexTessellator.h |
@@ -166,12 +166,24 @@ private: |
SkTDArray<PointData> fPts; |
}; |
+ // Represents whether a given point is within a curve. A point is inside a curve only if it is |
+ // an interior point within a quad, cubic, or conic, or if it is the endpoint of a quad, cubic, |
+ // or conic with another curve meeting it at (more or less) the same angle. |
+ enum CurveState { |
+ // point is a sharp vertex |
+ kSharp_CurveState, |
+ // endpoint of a curve with the other side's curvature not yet determined |
+ kIndeterminate_CurveState, |
+ // point is in the interior of a curve |
+ kCurve_CurveState |
+ }; |
+ |
bool movable(int index) const { return fMovable[index]; } |
// Movable points are those that can be slid along their bisector. |
// Basically, a point is immovable if it is part of the original |
// polygon or it results from the fusing of two bisectors. |
- int addPt(const SkPoint& pt, SkScalar depth, SkScalar coverage, bool movable, bool isCurve); |
+ int addPt(const SkPoint& pt, SkScalar depth, SkScalar coverage, bool movable, CurveState curve); |
void popLastPt(); |
void popFirstPtShuffle(); |
@@ -191,9 +203,9 @@ private: |
int edgeIdx, SkScalar desiredDepth, |
SkPoint* result) const; |
- void lineTo(SkPoint p, bool isCurve); |
+ void lineTo(SkPoint p, CurveState curve); |
- void lineTo(const SkMatrix& m, SkPoint p, bool isCurve); |
+ void lineTo(const SkMatrix& m, SkPoint p, CurveState curve); |
void quadTo(SkPoint pts[3]); |
@@ -226,43 +238,43 @@ private: |
void validate() const; |
// fPts, fCoverages & fMovable should always have the same # of elements |
- SkTDArray<SkPoint> fPts; |
- SkTDArray<SkScalar> fCoverages; |
+ SkTDArray<SkPoint> fPts; |
+ SkTDArray<SkScalar> fCoverages; |
// movable points are those that can be slid further along their bisector |
- SkTDArray<bool> fMovable; |
+ SkTDArray<bool> fMovable; |
// The outward facing normals for the original polygon |
- SkTDArray<SkVector> fNorms; |
+ SkTDArray<SkVector> fNorms; |
// The inward facing bisector at each point in the original polygon. Only |
// needed for exterior ring creation and then handed off to the initial ring. |
- SkTDArray<SkVector> fBisectors; |
+ SkTDArray<SkVector> fBisectors; |
// Tracks whether a given point is interior to a curve. Such points are |
// assumed to have shallow curvature. |
- SkTDArray<bool> fIsCurve; |
+ SkTDArray<CurveState> fCurveState; |
- SkPoint::Side fSide; // winding of the original polygon |
+ SkPoint::Side fSide; // winding of the original polygon |
// The triangulation of the points |
- SkTDArray<int> fIndices; |
+ SkTDArray<int> fIndices; |
- Ring fInitialRing; |
+ Ring fInitialRing; |
#if GR_AA_CONVEX_TESSELLATOR_VIZ |
// When visualizing save all the rings |
- SkTDArray<Ring*> fRings; |
+ SkTDArray<Ring*> fRings; |
#else |
- Ring fRings[2]; |
+ Ring fRings[2]; |
#endif |
- CandidateVerts fCandidateVerts; |
+ CandidateVerts fCandidateVerts; |
// < 0 means filling rather than stroking |
- SkScalar fStrokeWidth; |
+ SkScalar fStrokeWidth; |
- SkPaint::Join fJoin; |
+ SkPaint::Join fJoin; |
- SkScalar fMiterLimit; |
+ SkScalar fMiterLimit; |
- SkTDArray<SkPoint> fPointBuffer; |
+ SkTDArray<SkPoint> fPointBuffer; |
}; |