180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc.
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrPathRendererChain.h"
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrContext.h"
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrDefaultPathRenderer.h"
147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "GrDrawTargetCaps.h"
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrGpu.h"
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
17363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerGrPathRendererChain::GrPathRendererChain(GrContext* context)
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    : fInit(false)
19363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    , fOwner(context) {
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrPathRendererChain::~GrPathRendererChain() {
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    for (int i = 0; i < fChain.count(); ++i) {
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fChain[i]->unref();
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrPathRenderer* GrPathRendererChain::addPathRenderer(GrPathRenderer* pr) {
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fChain.push_back() = pr;
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    pr->ref();
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return pr;
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrPathRenderer* GrPathRendererChain::getPathRenderer(const SkPath& path,
35363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                                                     const SkStrokeRec& stroke,
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                                     const GrDrawTarget* target,
37363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                                                     DrawType drawType,
38363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                                                     StencilSupport* stencilSupport) {
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (!fInit) {
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        this->init();
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
42363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    bool antiAlias = (kColorAntiAlias_DrawType == drawType ||
43363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                      kStencilAndColorAntiAlias_DrawType == drawType);
44363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
45363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    GR_STATIC_ASSERT(GrPathRenderer::kNoSupport_StencilSupport <
46363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                     GrPathRenderer::kStencilOnly_StencilSupport);
47363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    GR_STATIC_ASSERT(GrPathRenderer::kStencilOnly_StencilSupport <
48363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                     GrPathRenderer::kNoRestriction_StencilSupport);
49363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    GrPathRenderer::StencilSupport minStencilSupport;
50363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    if (kStencilOnly_DrawType == drawType) {
51363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        minStencilSupport = GrPathRenderer::kStencilOnly_StencilSupport;
52363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    } else if (kStencilAndColor_DrawType == drawType ||
53363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger               kStencilAndColorAntiAlias_DrawType == drawType) {
54363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        minStencilSupport = GrPathRenderer::kNoRestriction_StencilSupport;
55363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    } else {
56363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        minStencilSupport = GrPathRenderer::kNoSupport_StencilSupport;
57363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
58363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
59363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    for (int i = 0; i < fChain.count(); ++i) {
61363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        if (fChain[i]->canDrawPath(path, stroke, target, antiAlias)) {
62363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            if (GrPathRenderer::kNoSupport_StencilSupport != minStencilSupport) {
63363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                GrPathRenderer::StencilSupport support = fChain[i]->getStencilSupport(path,
64363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                                                                                      stroke,
65363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                                                                                      target);
66363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                if (support < minStencilSupport) {
67363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                    continue;
68363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                } else if (NULL != stencilSupport) {
69363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                    *stencilSupport = support;
70363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                }
71363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            }
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return fChain[i];
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return NULL;
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid GrPathRendererChain::init() {
790a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    SkASSERT(!fInit);
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GrGpu* gpu = fOwner->getGpu();
817839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    bool twoSided = gpu->caps()->twoSidedStencilSupport();
827839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    bool wrapOp = gpu->caps()->stencilWrapOpsSupport();
83363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    GrPathRenderer::AddPathRenderers(fOwner, this);
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->addPathRenderer(SkNEW_ARGS(GrDefaultPathRenderer,
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                     (twoSided, wrapOp)))->unref();
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fInit = true;
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
88