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