11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrDefaultPathRenderer.h"
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrContext.h"
121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrDrawState.h"
131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrPathUtils.h"
141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkString.h"
151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkTrace.h"
161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
181cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrDefaultPathRenderer::GrDefaultPathRenderer(bool separateStencilSupport,
191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                             bool stencilWrapOpsSupport)
201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    : fSeparateStencil(separateStencilSupport)
214f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    , fStencilWrapOps(stencilWrapOpsSupport) {
221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger////////////////////////////////////////////////////////////////////////////////
261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// Stencil rules for paths
271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger////// Even/Odd
291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
301cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_CONST_SAME_STENCIL(gEOStencilPass,
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kInvert_StencilOp,
321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kKeep_StencilOp,
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kAlwaysIfInClip_StencilFunc,
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff,
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff,
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff);
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// ok not to check clip b/c stencil pass only wrote inside clip
391cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_CONST_SAME_STENCIL(gEOColorPass,
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kZero_StencilOp,
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kZero_StencilOp,
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kNotEqual_StencilFunc,
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff,
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x0000,
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff);
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// have to check clip b/c outside clip will always be zero.
481cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_CONST_SAME_STENCIL(gInvEOColorPass,
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kZero_StencilOp,
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kZero_StencilOp,
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kEqualIfInClip_StencilFunc,
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff,
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x0000,
541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff);
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger////// Winding
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// when we have separate stencil we increment front faces / decrement back faces
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// when we don't have wrap incr and decr we use the stencil test to simulate
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// them.
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
621cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_CONST_STENCIL(gWindStencilSeparateWithWrap,
631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kIncWrap_StencilOp,             kDecWrap_StencilOp,
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kKeep_StencilOp,                kKeep_StencilOp,
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kAlwaysIfInClip_StencilFunc,    kAlwaysIfInClip_StencilFunc,
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff,                         0xffff,
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff,                         0xffff,
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff,                         0xffff);
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// if inc'ing the max value, invert to make 0
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// if dec'ing zero invert to make all ones.
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// we can't avoid touching the stencil on both passing and
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// failing, so we can't resctrict ourselves to the clip.
741cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_CONST_STENCIL(gWindStencilSeparateNoWrap,
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kInvert_StencilOp,              kInvert_StencilOp,
761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kIncClamp_StencilOp,            kDecClamp_StencilOp,
771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kEqual_StencilFunc,             kEqual_StencilFunc,
781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff,                         0xffff,
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff,                         0x0000,
801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff,                         0xffff);
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// When there are no separate faces we do two passes to setup the winding rule
831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// stencil. First we draw the front faces and inc, then we draw the back faces
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// and dec. These are same as the above two split into the incrementing and
851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// decrementing passes.
861cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_CONST_SAME_STENCIL(gWindSingleStencilWithWrapInc,
871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kIncWrap_StencilOp,
881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kKeep_StencilOp,
891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kAlwaysIfInClip_StencilFunc,
901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff,
911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff,
921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff);
931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
941cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_CONST_SAME_STENCIL(gWindSingleStencilWithWrapDec,
951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kDecWrap_StencilOp,
961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kKeep_StencilOp,
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kAlwaysIfInClip_StencilFunc,
981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff,
991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff,
1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff);
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1021cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_CONST_SAME_STENCIL(gWindSingleStencilNoWrapInc,
1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kInvert_StencilOp,
1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kIncClamp_StencilOp,
1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kEqual_StencilFunc,
1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff,
1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff,
1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff);
1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1101cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_CONST_SAME_STENCIL(gWindSingleStencilNoWrapDec,
1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kInvert_StencilOp,
1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kDecClamp_StencilOp,
1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kEqual_StencilFunc,
1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff,
1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x0000,
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff);
1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// Color passes are the same whether we use the two-sided stencil or two passes
1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1201cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_CONST_SAME_STENCIL(gWindColorPass,
1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kZero_StencilOp,
1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kZero_StencilOp,
1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kNonZeroIfInClip_StencilFunc,
1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff,
1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x0000,
1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff);
1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1281cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_CONST_SAME_STENCIL(gInvWindColorPass,
1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kZero_StencilOp,
1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kZero_StencilOp,
1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kEqualIfInClip_StencilFunc,
1321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff,
1331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x0000,
1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff);
1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger////// Normal render to stencil
1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// Sometimes the default path renderer can draw a path directly to the stencil
1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// buffer without having to first resolve the interior / exterior.
1401cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_CONST_SAME_STENCIL(gDirectToStencil,
1411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kZero_StencilOp,
1421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kIncClamp_StencilOp,
1431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kAlwaysIfInClip_StencilFunc,
1441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff,
1451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x0000,
1461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xffff);
1471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger////////////////////////////////////////////////////////////////////////////////
1491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// Helpers for drawPath
1501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define STENCIL_OFF     0   // Always disable stencil (even when needed)
1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1534f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerstatic inline bool single_pass_path(const GrPath& path, GrPathFill fill) {
1541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#if STENCIL_OFF
1551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return true;
1561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#else
1574f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    if (kEvenOdd_PathFill == fill || kWinding_PathFill == fill) {
1584f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        return path.isConvex();
1591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return false;
1611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
1621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1644f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerbool GrDefaultPathRenderer::requiresStencilPass(const SkPath& path,
1654f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                                GrPathFill fill,
1664f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                                const GrDrawTarget* target) const {
1674f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    return !single_pass_path(path, fill);
1681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic inline void append_countour_edge_indices(GrPathFill fillType,
1711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                uint16_t fanCenterIdx,
1721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                uint16_t edgeV0Idx,
1731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                uint16_t** indices) {
1741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // when drawing lines we're appending line segments along
1751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // the contour. When applying the other fill rules we're
1761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // drawing triangle fans around fanCenterIdx.
1771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (kHairLine_PathFill != fillType) {
1781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        *((*indices)++) = fanCenterIdx;
1791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    *((*indices)++) = edgeV0Idx;
1811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    *((*indices)++) = edgeV0Idx + 1;
1821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1844f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerbool GrDefaultPathRenderer::createGeom(const SkPath& path,
1854f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                       GrPathFill fill,
1864f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                       const GrVec* translate,
1874f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                       GrScalar srcSpaceTol,
1884f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                       GrDrawTarget* target,
1894f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                       GrDrawState::StageMask stageMask,
1904f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                       GrPrimitiveType* primType,
1914f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                       int* vertexCnt,
1924f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                       int* indexCnt) {
1931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    {
1941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SK_TRACE_EVENT0("GrDefaultPathRenderer::createGeom");
1951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrScalar srcSpaceTolSqd = GrMul(srcSpaceTol, srcSpaceTol);
1974f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    int contourCnt;
1984f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    int maxPts = GrPathUtils::worstCasePointCount(path, &contourCnt,
1991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                  srcSpaceTol);
2001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (maxPts <= 0) {
2021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return false;
2031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
2041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (maxPts > ((int)SK_MaxU16 + 1)) {
2051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrPrintf("Path not rendered, too many verts (%d)\n", maxPts);
2061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return false;
2071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
2081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrVertexLayout layout = 0;
2101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (int s = 0; s < GrDrawState::kNumStages; ++s) {
2111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if ((1 << s) & stageMask) {
2121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            layout |= GrDrawTarget::StagePosAsTexCoordVertexLayoutBit(s);
2131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
2141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
2151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2164f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    bool indexed = contourCnt > 1;
2171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    int maxIdxs = 0;
2194f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    if (kHairLine_PathFill == fill) {
2204f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        if (indexed) {
2211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            maxIdxs = 2 * maxPts;
2224f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            *primType = kLines_PrimitiveType;
2231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else {
2244f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            *primType = kLineStrip_PrimitiveType;
2251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
2261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
2274f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        if (indexed) {
2281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            maxIdxs = 3 * maxPts;
2294f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            *primType = kTriangles_PrimitiveType;
2301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else {
2314f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            *primType = kTriangleFan_PrimitiveType;
2321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
2331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
2341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrPoint* base;
2364f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    if (!target->reserveVertexSpace(layout, maxPts, (void**)&base)) {
2371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return false;
2381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
2391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(NULL != base);
2401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrPoint* vert = base;
2411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    uint16_t* idxBase = NULL;
2431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    uint16_t* idx = NULL;
2441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    uint16_t subpathIdxStart = 0;
2454f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    if (indexed) {
2464f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        if (!target->reserveIndexSpace(maxIdxs, (void**)&idxBase)) {
2474f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            target->resetVertexSource();
2481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return false;
2491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
2501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrAssert(NULL != idxBase);
2511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        idx = idxBase;
2521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
2531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrPoint pts[4];
2551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool first = true;
2571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    int subpath = 0;
2581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2594f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    SkPath::Iter iter(path, false);
2601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (;;) {
2621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrPathCmd cmd = (GrPathCmd)iter.next(pts);
2631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        switch (cmd) {
2641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            case kMove_PathCmd:
2651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                if (!first) {
2661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    uint16_t currIdx = (uint16_t) (vert - base);
2671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    subpathIdxStart = currIdx;
2681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    ++subpath;
2691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                }
2701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                *vert = pts[0];
2711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                vert++;
2721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                break;
2731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            case kLine_PathCmd:
2744f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                if (indexed) {
2751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    uint16_t prevIdx = (uint16_t)(vert - base) - 1;
2764f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                    append_countour_edge_indices(fill, subpathIdxStart,
2771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                 prevIdx, &idx);
2781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                }
2791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                *(vert++) = pts[1];
2801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                break;
2811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            case kQuadratic_PathCmd: {
2821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                // first pt of quad is the pt we ended on in previous step
2831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                uint16_t firstQPtIdx = (uint16_t)(vert - base) - 1;
2841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                uint16_t numPts =  (uint16_t)
2851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    GrPathUtils::generateQuadraticPoints(
2861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            pts[0], pts[1], pts[2],
2871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            srcSpaceTolSqd, &vert,
2881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            GrPathUtils::quadraticPointCount(pts, srcSpaceTol));
2894f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                if (indexed) {
2901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    for (uint16_t i = 0; i < numPts; ++i) {
2914f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                        append_countour_edge_indices(fill, subpathIdxStart,
2921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                     firstQPtIdx + i, &idx);
2931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    }
2941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                }
2951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                break;
2961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
2971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            case kCubic_PathCmd: {
2981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                // first pt of cubic is the pt we ended on in previous step
2991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                uint16_t firstCPtIdx = (uint16_t)(vert - base) - 1;
3001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                uint16_t numPts = (uint16_t) GrPathUtils::generateCubicPoints(
3011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                pts[0], pts[1], pts[2], pts[3],
3021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                srcSpaceTolSqd, &vert,
3031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                GrPathUtils::cubicPointCount(pts, srcSpaceTol));
3044f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                if (indexed) {
3051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    for (uint16_t i = 0; i < numPts; ++i) {
3064f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                        append_countour_edge_indices(fill, subpathIdxStart,
3071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                     firstCPtIdx + i, &idx);
3081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    }
3091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                }
3101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                break;
3111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
3121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            case kClose_PathCmd:
3131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                break;
3141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            case kEnd_PathCmd:
3151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                uint16_t currIdx = (uint16_t) (vert - base);
3161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                goto FINISHED;
3171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
3181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        first = false;
3191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
3201cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerFINISHED:
3211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert((vert - base) <= maxPts);
3221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert((idx - idxBase) <= maxIdxs);
3231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3244f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    *vertexCnt = vert - base;
3254f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    *indexCnt = idx - idxBase;
3261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3274f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    if (NULL != translate &&
3284f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        (translate->fX || translate->fY)) {
3291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        int count = vert - base;
3301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        for (int i = 0; i < count; i++) {
3314f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            base[i].offset(translate->fX, translate->fY);
3321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
3331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
3341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
3351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return true;
3361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
3371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3384f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerbool GrDefaultPathRenderer::internalDrawPath(const SkPath& path,
3394f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                             GrPathFill fill,
3404f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                             const GrVec* translate,
3414f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                             GrDrawTarget* target,
3424f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                             GrDrawState::StageMask stageMask,
3434f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                             bool stencilOnly) {
3441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3454f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    GrMatrix viewM = target->getDrawState().getViewMatrix();
3461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrScalar tol = GR_Scalar1;
3474f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    tol = GrPathUtils::scaleToleranceToSrc(tol, viewM, path.getBounds());
3484f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    GrDrawState* drawState = target->drawState();
3494f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
3504f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    int vertexCnt;
3514f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    int indexCnt;
3524f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    GrPrimitiveType primType;
3534f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    if (!this->createGeom(path,
3544f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                          fill,
3554f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                          translate,
3564f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                          tol,
3574f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                          target,
3584f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                          stageMask,
3594f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                          &primType,
3604f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                          &vertexCnt,
3614f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                          &indexCnt)) {
3624f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        return false;
3631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
3641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3654f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    GrAssert(NULL != target);
3664f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    GrDrawTarget::AutoStateRestore asr(target);
3671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool colorWritesWereDisabled = drawState->isColorWriteDisabled();
3681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // face culling doesn't make sense here
3691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(GrDrawState::kBoth_DrawFace == drawState->getDrawFace());
3701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    int                         passCount = 0;
3721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const GrStencilSettings*    passes[3];
3731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrDrawState::DrawFace       drawFace[3];
3741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool                        reverse = false;
3751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool                        lastPassIsBounds;
3761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3774f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    if (kHairLine_PathFill == fill) {
3781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        passCount = 1;
3791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (stencilOnly) {
3801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            passes[0] = &gDirectToStencil;
3811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else {
3821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            passes[0] = NULL;
3831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
3841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        lastPassIsBounds = false;
3851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        drawFace[0] = GrDrawState::kBoth_DrawFace;
3861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
3874f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        if (single_pass_path(path, fill)) {
3881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            passCount = 1;
3891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (stencilOnly) {
3901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                passes[0] = &gDirectToStencil;
3911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            } else {
3921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                passes[0] = NULL;
3931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
3941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            drawFace[0] = GrDrawState::kBoth_DrawFace;
3951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            lastPassIsBounds = false;
3961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else {
3974f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            switch (fill) {
3981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                case kInverseEvenOdd_PathFill:
3991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    reverse = true;
4001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    // fallthrough
4011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                case kEvenOdd_PathFill:
4021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    passes[0] = &gEOStencilPass;
4031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    if (stencilOnly) {
4041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        passCount = 1;
4051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        lastPassIsBounds = false;
4061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    } else {
4071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        passCount = 2;
4081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        lastPassIsBounds = true;
4091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        if (reverse) {
4101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            passes[1] = &gInvEOColorPass;
4111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        } else {
4121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            passes[1] = &gEOColorPass;
4131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        }
4141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    }
4151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    drawFace[0] = drawFace[1] = GrDrawState::kBoth_DrawFace;
4161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    break;
4171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                case kInverseWinding_PathFill:
4191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    reverse = true;
4201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    // fallthrough
4211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                case kWinding_PathFill:
4221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    if (fSeparateStencil) {
4231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        if (fStencilWrapOps) {
4241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            passes[0] = &gWindStencilSeparateWithWrap;
4251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        } else {
4261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            passes[0] = &gWindStencilSeparateNoWrap;
4271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        }
4281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        passCount = 2;
4291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        drawFace[0] = GrDrawState::kBoth_DrawFace;
4301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    } else {
4311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        if (fStencilWrapOps) {
4321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            passes[0] = &gWindSingleStencilWithWrapInc;
4331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            passes[1] = &gWindSingleStencilWithWrapDec;
4341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        } else {
4351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            passes[0] = &gWindSingleStencilNoWrapInc;
4361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            passes[1] = &gWindSingleStencilNoWrapDec;
4371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        }
4381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        // which is cw and which is ccw is arbitrary.
4391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        drawFace[0] = GrDrawState::kCW_DrawFace;
4401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        drawFace[1] = GrDrawState::kCCW_DrawFace;
4411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        passCount = 3;
4421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    }
4431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    if (stencilOnly) {
4441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        lastPassIsBounds = false;
4451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        --passCount;
4461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    } else {
4471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        lastPassIsBounds = true;
4481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        drawFace[passCount-1] = GrDrawState::kBoth_DrawFace;
4491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        if (reverse) {
4501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            passes[passCount-1] = &gInvWindColorPass;
4511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        } else {
4521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            passes[passCount-1] = &gWindColorPass;
4531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        }
4541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    }
4551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    break;
4561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                default:
4571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    GrAssert(!"Unknown path fFill!");
4584f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                    return false;
4591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
4601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
4611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
4621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    {
4641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (int p = 0; p < passCount; ++p) {
4651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        drawState->setDrawFace(drawFace[p]);
4661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (NULL != passes[p]) {
4671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *drawState->stencil() = *passes[p];
4681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
4691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (lastPassIsBounds && (p == passCount-1)) {
4711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (!colorWritesWereDisabled) {
4721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                drawState->disableState(GrDrawState::kNoColorWrites_StateBit);
4731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
4741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrRect bounds;
4751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (reverse) {
4761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GrAssert(NULL != drawState->getRenderTarget());
4771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                // draw over the whole world.
4781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                bounds.setLTRB(0, 0,
4791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               GrIntToScalar(drawState->getRenderTarget()->width()),
4801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               GrIntToScalar(drawState->getRenderTarget()->height()));
4811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GrMatrix vmi;
4821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                // mapRect through persp matrix may not be correct
4831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                if (!drawState->getViewMatrix().hasPerspective() &&
4841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    drawState->getViewInverse(&vmi)) {
4851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    vmi.mapRect(&bounds);
4861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                } else {
4871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    if (stageMask) {
4881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        if (!drawState->getViewInverse(&vmi)) {
4891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            GrPrintf("Could not invert matrix.");
4904f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                            return false;
4911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        }
4921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        drawState->preConcatSamplerMatrices(stageMask, vmi);
4931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    }
4941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    drawState->setViewMatrix(GrMatrix::I());
4951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                }
4961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            } else {
4974f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                bounds = path.getBounds();
4984f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                if (NULL != translate) {
4994f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                    bounds.offset(*translate);
5004f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                }
5011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
5024f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            GrDrawTarget::AutoGeometryPush agp(target);
5034f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            target->drawSimpleRect(bounds, NULL, stageMask);
5041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else {
5051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (passCount > 1) {
5061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                drawState->enableState(GrDrawState::kNoColorWrites_StateBit);
5071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
5084f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            if (indexCnt) {
5094f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                target->drawIndexed(primType, 0, 0,
5104f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                    vertexCnt, indexCnt);
5111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            } else {
5124f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                target->drawNonIndexed(primType, 0, vertexCnt);
5131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
5141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
5151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
5161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
5174f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    return true;
5184f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger}
5194f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
5204f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerbool GrDefaultPathRenderer::canDrawPath(const SkPath& path,
5214f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                        GrPathFill fill,
5224f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                        const GrDrawTarget* target,
5234f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                        bool antiAlias) const {
5244f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    // this class can draw any path with any fill but doesn't do any
5254f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    // anti-aliasing.
5264f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    return !antiAlias;
5271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
5281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5294f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerbool GrDefaultPathRenderer::onDrawPath(const SkPath& path,
5304f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                       GrPathFill fill,
5314f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                       const GrVec* translate,
5324f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                       GrDrawTarget* target,
5334f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                       GrDrawState::StageMask stageMask,
5344f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                       bool antiAlias) {
5354f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    return this->internalDrawPath(path,
5364f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                  fill,
5374f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                  translate,
5384f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                  target,
5394f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                  stageMask,
5404f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                  false);
5411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
5421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5434f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergervoid GrDefaultPathRenderer::drawPathToStencil(const SkPath& path,
5444f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                              GrPathFill fill,
5454f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                              GrDrawTarget* target) {
5464f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    GrAssert(kInverseEvenOdd_PathFill != fill);
5474f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    GrAssert(kInverseWinding_PathFill != fill);
5484f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    this->internalDrawPath(path, fill, NULL, target, 0, true);
5491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
550