1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 #include "GrPathRendererChain.h" 11 12 #include "GrContext.h" 13 #include "GrDefaultPathRenderer.h" 14 #include "GrGpu.h" 15 16 SK_DEFINE_INST_COUNT(GrPathRendererChain) 17 18 GrPathRendererChain::GrPathRendererChain(GrContext* context) 19 : fInit(false) 20 , fOwner(context) { 21 } 22 23 GrPathRendererChain::~GrPathRendererChain() { 24 for (int i = 0; i < fChain.count(); ++i) { 25 fChain[i]->unref(); 26 } 27 } 28 29 GrPathRenderer* GrPathRendererChain::addPathRenderer(GrPathRenderer* pr) { 30 fChain.push_back() = pr; 31 pr->ref(); 32 return pr; 33 } 34 35 GrPathRenderer* GrPathRendererChain::getPathRenderer(const SkPath& path, 36 const SkStrokeRec& stroke, 37 const GrDrawTarget* target, 38 DrawType drawType, 39 StencilSupport* stencilSupport) { 40 if (!fInit) { 41 this->init(); 42 } 43 bool antiAlias = (kColorAntiAlias_DrawType == drawType || 44 kStencilAndColorAntiAlias_DrawType == drawType); 45 46 GR_STATIC_ASSERT(GrPathRenderer::kNoSupport_StencilSupport < 47 GrPathRenderer::kStencilOnly_StencilSupport); 48 GR_STATIC_ASSERT(GrPathRenderer::kStencilOnly_StencilSupport < 49 GrPathRenderer::kNoRestriction_StencilSupport); 50 GrPathRenderer::StencilSupport minStencilSupport; 51 if (kStencilOnly_DrawType == drawType) { 52 minStencilSupport = GrPathRenderer::kStencilOnly_StencilSupport; 53 } else if (kStencilAndColor_DrawType == drawType || 54 kStencilAndColorAntiAlias_DrawType == drawType) { 55 minStencilSupport = GrPathRenderer::kNoRestriction_StencilSupport; 56 } else { 57 minStencilSupport = GrPathRenderer::kNoSupport_StencilSupport; 58 } 59 60 61 for (int i = 0; i < fChain.count(); ++i) { 62 if (fChain[i]->canDrawPath(path, stroke, target, antiAlias)) { 63 if (GrPathRenderer::kNoSupport_StencilSupport != minStencilSupport) { 64 GrPathRenderer::StencilSupport support = fChain[i]->getStencilSupport(path, 65 stroke, 66 target); 67 if (support < minStencilSupport) { 68 continue; 69 } else if (NULL != stencilSupport) { 70 *stencilSupport = support; 71 } 72 } 73 return fChain[i]; 74 } 75 } 76 return NULL; 77 } 78 79 void GrPathRendererChain::init() { 80 GrAssert(!fInit); 81 GrGpu* gpu = fOwner->getGpu(); 82 bool twoSided = gpu->getCaps().twoSidedStencilSupport(); 83 bool wrapOp = gpu->getCaps().stencilWrapOpsSupport(); 84 GrPathRenderer::AddPathRenderers(fOwner, this); 85 this->addPathRenderer(SkNEW_ARGS(GrDefaultPathRenderer, 86 (twoSided, wrapOp)))->unref(); 87 fInit = true; 88 } 89