GrPathRendererChain.cpp revision f66018798099750e639a8fa131fece492a050997
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 16SK_DEFINE_INST_COUNT(GrPathRendererChain) 17 18GrPathRendererChain::GrPathRendererChain(GrContext* context, UsageFlags flags) 19 : fInit(false) 20 , fOwner(context) 21 , fFlags(flags) { 22} 23 24GrPathRendererChain::~GrPathRendererChain() { 25 for (int i = 0; i < fChain.count(); ++i) { 26 fChain[i]->unref(); 27 } 28} 29 30GrPathRenderer* GrPathRendererChain::addPathRenderer(GrPathRenderer* pr) { 31 fChain.push_back() = pr; 32 pr->ref(); 33 return pr; 34} 35 36GrPathRenderer* GrPathRendererChain::getPathRenderer(const SkPath& path, 37 GrPathFill fill, 38 const GrDrawTarget* target, 39 bool antiAlias) { 40 if (!fInit) { 41 this->init(); 42 } 43 for (int i = 0; i < fChain.count(); ++i) { 44 if (fChain[i]->canDrawPath(path, fill, target, antiAlias)) { 45 return fChain[i]; 46 } 47 } 48 return NULL; 49} 50 51void GrPathRendererChain::init() { 52 GrAssert(!fInit); 53 GrGpu* gpu = fOwner->getGpu(); 54 bool twoSided = gpu->getCaps().twoSidedStencilSupport(); 55 bool wrapOp = gpu->getCaps().stencilWrapOpsSupport(); 56 GrPathRenderer::AddPathRenderers(fOwner, fFlags, this); 57 this->addPathRenderer(SkNEW_ARGS(GrDefaultPathRenderer, 58 (twoSided, wrapOp)))->unref(); 59 fInit = true; 60} 61