| Index: src/gpu/GrDefaultPathRenderer.cpp
|
| diff --git a/src/gpu/GrDefaultPathRenderer.cpp b/src/gpu/GrDefaultPathRenderer.cpp
|
| index 79e9f154ae8a826cc1c767913fb1a70cf5957f9b..af0404ae0efe97328530022e548de7f4d76592fa 100644
|
| --- a/src/gpu/GrDefaultPathRenderer.cpp
|
| +++ b/src/gpu/GrDefaultPathRenderer.cpp
|
| @@ -11,12 +11,12 @@
|
| #include "GrDefaultGeoProcFactory.h"
|
| #include "GrDrawState.h"
|
| #include "GrPathUtils.h"
|
| +#include "SkGeometry.h"
|
| #include "SkString.h"
|
| #include "SkStrokeRec.h"
|
| #include "SkTLazy.h"
|
| #include "SkTraceEvent.h"
|
|
|
| -
|
| GrDefaultPathRenderer::GrDefaultPathRenderer(bool separateStencilSupport,
|
| bool stencilWrapOpsSupport)
|
| : fSeparateStencil(separateStencilSupport)
|
| @@ -189,6 +189,24 @@ static inline void append_countour_edge_indices(bool hairLine,
|
| *((*indices)++) = edgeV0Idx + 1;
|
| }
|
|
|
| +static inline void add_quad(SkPoint** vert, const SkPoint* base, const SkPoint pts[],
|
| + SkScalar srcSpaceTolSqd, SkScalar srcSpaceTol, bool indexed,
|
| + bool isHairline, uint16_t subpathIdxStart, uint16_t** idx) {
|
| + // first pt of quad is the pt we ended on in previous step
|
| + uint16_t firstQPtIdx = (uint16_t)(*vert - base) - 1;
|
| + uint16_t numPts = (uint16_t)
|
| + GrPathUtils::generateQuadraticPoints(
|
| + pts[0], pts[1], pts[2],
|
| + srcSpaceTolSqd, vert,
|
| + GrPathUtils::quadraticPointCount(pts, srcSpaceTol));
|
| + if (indexed) {
|
| + for (uint16_t i = 0; i < numPts; ++i) {
|
| + append_countour_edge_indices(isHairline, subpathIdxStart,
|
| + firstQPtIdx + i, idx);
|
| + }
|
| + }
|
| +}
|
| +
|
| bool GrDefaultPathRenderer::createGeom(GrDrawTarget* target,
|
| GrDrawState* drawState,
|
| GrPrimitiveType* primType,
|
| @@ -256,9 +274,6 @@ bool GrDefaultPathRenderer::createGeom(GrDrawTarget* target,
|
| for (;;) {
|
| SkPath::Verb verb = iter.next(pts);
|
| switch (verb) {
|
| - case SkPath::kConic_Verb:
|
| - SkASSERT(0);
|
| - break;
|
| case SkPath::kMove_Verb:
|
| if (!first) {
|
| uint16_t currIdx = (uint16_t) (vert - base);
|
| @@ -276,22 +291,22 @@ bool GrDefaultPathRenderer::createGeom(GrDrawTarget* target,
|
| }
|
| *(vert++) = pts[1];
|
| break;
|
| - case SkPath::kQuad_Verb: {
|
| - // first pt of quad is the pt we ended on in previous step
|
| - uint16_t firstQPtIdx = (uint16_t)(vert - base) - 1;
|
| - uint16_t numPts = (uint16_t)
|
| - GrPathUtils::generateQuadraticPoints(
|
| - pts[0], pts[1], pts[2],
|
| - srcSpaceTolSqd, &vert,
|
| - GrPathUtils::quadraticPointCount(pts, srcSpaceTol));
|
| - if (indexed) {
|
| - for (uint16_t i = 0; i < numPts; ++i) {
|
| - append_countour_edge_indices(isHairline, subpathIdxStart,
|
| - firstQPtIdx + i, &idx);
|
| - }
|
| + case SkPath::kConic_Verb: {
|
| + SkScalar weight = iter.conicWeight();
|
| + SkAutoConicToQuads converter;
|
| + // Converting in src-space, hance the finer tolerance (0.25)
|
| + // TODO: find a way to do this in dev-space so the tolerance means something
|
| + const SkPoint* quadPts = converter.computeQuads(pts, weight, 0.25f);
|
| + for (int i = 0; i < converter.countQuads(); ++i) {
|
| + add_quad(&vert, base, quadPts + i*2, srcSpaceTolSqd, srcSpaceTol, indexed,
|
| + isHairline, subpathIdxStart, &idx);
|
| }
|
| break;
|
| }
|
| + case SkPath::kQuad_Verb:
|
| + add_quad(&vert, base, pts, srcSpaceTolSqd, srcSpaceTol, indexed,
|
| + isHairline, subpathIdxStart, &idx);
|
| + break;
|
| case SkPath::kCubic_Verb: {
|
| // first pt of cubic is the pt we ended on in previous step
|
| uint16_t firstCPtIdx = (uint16_t)(vert - base) - 1;
|
| @@ -530,9 +545,9 @@ bool GrDefaultPathRenderer::canDrawPath(const GrDrawTarget* target,
|
| const SkStrokeRec& stroke,
|
| bool antiAlias) const {
|
| // this class can draw any path with any fill but doesn't do any anti-aliasing.
|
| -
|
| - return !antiAlias && !(SkPath::kConic_SegmentMask & path.getSegmentMasks()) &&
|
| - (stroke.isFillStyle() || IsStrokeHairlineOrEquivalent(stroke, viewMatrix, NULL));
|
| + return !antiAlias && (stroke.isFillStyle() || IsStrokeHairlineOrEquivalent(stroke,
|
| + viewMatrix,
|
| + NULL));
|
| }
|
|
|
| bool GrDefaultPathRenderer::onDrawPath(GrDrawTarget* target,
|
|
|