Home | History | Annotate | Download | only in gpu
      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