aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/ccpr/GrCCGeometry.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpu/ccpr/GrCCGeometry.h')
-rw-r--r--src/gpu/ccpr/GrCCGeometry.h19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/gpu/ccpr/GrCCGeometry.h b/src/gpu/ccpr/GrCCGeometry.h
index 01cf16c68d..7f098f958b 100644
--- a/src/gpu/ccpr/GrCCGeometry.h
+++ b/src/gpu/ccpr/GrCCGeometry.h
@@ -31,6 +31,7 @@ public:
kLineTo,
kMonotonicQuadraticTo, // Monotonic relative to the vector between its endpoints [P2 - P0].
kMonotonicCubicTo,
+ kMonotonicConicTo,
kEndClosedContour, // endPt == startPt.
kEndOpenContour // endPt != startPt.
};
@@ -41,6 +42,7 @@ public:
int fWeightedTriangles; // Triangles (from the tessellator) whose winding magnitude > 1.
int fQuadratics;
int fCubics;
+ int fConics;
void operator+=(const PrimitiveTallies&);
PrimitiveTallies operator-(const PrimitiveTallies&) const;
@@ -53,6 +55,7 @@ public:
const SkTArray<SkPoint, true>& points() const { SkASSERT(!fBuildingContour); return fPoints; }
const SkTArray<Verb, true>& verbs() const { SkASSERT(!fBuildingContour); return fVerbs; }
+ float getConicWeight(int idx) const { SkASSERT(!fBuildingContour); return fConicWeights[idx]; }
void reset() {
SkASSERT(!fBuildingContour);
@@ -89,6 +92,8 @@ public:
// intersection vs. 1.489 on the tiger).
void cubicTo(const SkPoint[4], float inflectPad = 0.55f, float loopIntersectPad = 2);
+ void conicTo(const SkPoint[3], float w);
+
PrimitiveTallies endContour(); // Returns the numbers of primitives needed to draw the contour.
private:
@@ -116,15 +121,17 @@ private:
void appendCubicApproximation(const Sk2f& p0, const Sk2f& p1, const Sk2f& p2, const Sk2f& p3,
int maxSubdivisions = kMaxSubdivionsPerCubicSection);
+ void appendMonotonicConic(const Sk2f& p0, const Sk2f& p1, const Sk2f& p2, float w);
+
// Transient state used while building a contour.
SkPoint fCurrAnchorPoint;
PrimitiveTallies fCurrContourTallies;
SkCubicType fCurrCubicType;
SkDEBUGCODE(bool fBuildingContour = false);
- // TODO: These points could eventually be written directly to block-allocated GPU buffers.
- SkSTArray<128, SkPoint, true> fPoints;
- SkSTArray<128, Verb, true> fVerbs;
+ SkSTArray<128, SkPoint, true> fPoints;
+ SkSTArray<32, float, true> fConicWeights;
+ SkSTArray<128, Verb, true> fVerbs;
};
inline void GrCCGeometry::PrimitiveTallies::operator+=(const PrimitiveTallies& b) {
@@ -132,6 +139,7 @@ inline void GrCCGeometry::PrimitiveTallies::operator+=(const PrimitiveTallies& b
fWeightedTriangles += b.fWeightedTriangles;
fQuadratics += b.fQuadratics;
fCubics += b.fCubics;
+ fConics += b.fConics;
}
GrCCGeometry::PrimitiveTallies
@@ -139,12 +147,13 @@ inline GrCCGeometry::PrimitiveTallies::operator-(const PrimitiveTallies& b) cons
return {fTriangles - b.fTriangles,
fWeightedTriangles - b.fWeightedTriangles,
fQuadratics - b.fQuadratics,
- fCubics - b.fCubics};
+ fCubics - b.fCubics,
+ fConics - b.fConics};
}
inline bool GrCCGeometry::PrimitiveTallies::operator==(const PrimitiveTallies& b) {
return fTriangles == b.fTriangles && fWeightedTriangles == b.fWeightedTriangles &&
- fQuadratics == b.fQuadratics && fCubics == b.fCubics;
+ fQuadratics == b.fQuadratics && fCubics == b.fCubics && fConics == b.fConics;
}
#endif