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