1363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger/*
2363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Copyright 2011 Google Inc.
3363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger *
4363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be
5363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * found in the LICENSE file.
6363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */
7363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
8363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifndef GrPathRendererChain_DEFINED
9363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#define GrPathRendererChain_DEFINED
10363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
110a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "SkRefCnt.h"
12363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkTArray.h"
13363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
14363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass GrContext;
15363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass GrDrawTarget;
16363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass GrPathRenderer;
17363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass SkPath;
18363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass SkStrokeRec;
19363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
20363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger/**
21363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Keeps track of an ordered list of path renderers. When a path needs to be
22363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * drawn this list is scanned to find the most preferred renderer. To add your
23363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * path renderer to the list implement the GrPathRenderer::AddPathRenderers
24363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * function.
25363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */
26363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass GrPathRendererChain : public SkRefCnt {
27363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerpublic:
28363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    // See comments in GrPathRenderer.h
29363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    enum StencilSupport {
30363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        kNoSupport_StencilSupport,
31363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        kStencilOnly_StencilSupport,
32363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        kNoRestriction_StencilSupport,
33363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    };
34363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
35363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    SK_DECLARE_INST_COUNT(GrPathRendererChain)
36363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
37363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    GrPathRendererChain(GrContext* context);
38363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
39363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    ~GrPathRendererChain();
40363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
41363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    // takes a ref and unrefs in destructor
42363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    GrPathRenderer* addPathRenderer(GrPathRenderer* pr);
43363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
44363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    /** Documents how the caller plans to use a GrPathRenderer to draw a path. It affects the PR
45363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        returned by getPathRenderer */
46363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    enum DrawType {
47363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        kColor_DrawType,                    // draw to the color buffer, no AA
48363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        kColorAntiAlias_DrawType,           // draw to color buffer, with partial coverage AA
49363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        kStencilOnly_DrawType,              // draw just to the stencil buffer
50363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        kStencilAndColor_DrawType,          // draw the stencil and color buffer, no AA
51363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        kStencilAndColorAntiAlias_DrawType  // draw the stencil and color buffer, with partial
52363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                                            // coverage AA.
53363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    };
54363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    /** Returns a GrPathRenderer compatible with the request if one is available. If the caller
55363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        is drawing the path to the stencil buffer then stencilSupport can be used to determine
56363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        whether the path can be rendered with arbitrary stencil rules or not. See comments on
57363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        StencilSupport in GrPathRenderer.h. */
58363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    GrPathRenderer* getPathRenderer(const SkPath& path,
59363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                                    const SkStrokeRec& rec,
60363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                                    const GrDrawTarget* target,
61363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                                    DrawType drawType,
62363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                                    StencilSupport* stencilSupport);
63363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
64363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprivate:
65363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    GrPathRendererChain();
66363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
67363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    void init();
68363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
69363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    enum {
70363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        kPreAllocCount = 8,
71363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    };
72363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    bool fInit;
73363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    GrContext*                                          fOwner;
74363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    SkSTArray<kPreAllocCount, GrPathRenderer*, true>    fChain;
75363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
76363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    typedef SkRefCnt INHERITED;
77363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger};
78363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
79363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif
80