GrDrawTarget.h revision 97c88c255cff3dbb8343c5d090526fdbedad6dd6
1ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com/*
2ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    Copyright 2010 Google Inc.
3ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
4ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    Licensed under the Apache License, Version 2.0 (the "License");
5ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    you may not use this file except in compliance with the License.
6ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    You may obtain a copy of the License at
7ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
8ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com         http://www.apache.org/licenses/LICENSE-2.0
9ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
10ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    Unless required by applicable law or agreed to in writing, software
11ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    distributed under the License is distributed on an "AS IS" BASIS,
12ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    See the License for the specific language governing permissions and
14ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    limitations under the License.
15ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */
16ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
17ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
18ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#ifndef GrDrawTarget_DEFINED
19ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#define GrDrawTarget_DEFINED
20ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
21ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrMatrix.h"
22ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrColor.h"
23ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrRefCnt.h"
24ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrSamplerState.h"
25ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrClip.h"
26d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com#include "GrTexture.h"
27d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com#include "GrStencil.h"
28ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
2997c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo#include "SkXfermode.h"
3097c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo
31ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comclass GrTexture;
32ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comclass GrClipIterator;
33ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comclass GrVertexBuffer;
34ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comclass GrIndexBuffer;
35f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comclass GrEffect;
36ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
37ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comclass GrDrawTarget : public GrRefCnt {
38ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.compublic:
39ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
405782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com     * Number of texture stages. Each stage takes as input a color and
415782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com     * 2D texture coordinates. The color input to the first enabled stage is the
425782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com     * per-vertex color or the constant color (setColor/setAlpha) if there are
435782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com     * no per-vertex colors. For subsequent stages the input color is the output
448531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * color from the previous enabled stage. The output color of each stage is
455782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com     * the input color modulated with the result of a texture lookup. Texture
46c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com     * lookups are specified by a texture a sampler (setSamplerState). Texture
47c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com     * coordinates for each stage come from the vertices based on a
48c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com     * GrVertexLayout bitfield. The output fragment color is the output color of
49c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com     * the last enabled stage. The presence or absence of texture coordinates
50c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com     * for each stage in the vertex layout indicates whether a stage is enabled
51c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com     * or not.
528531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     */
538531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    enum {
547d34d2eecc40d150d867e37d5160a1bc3cfccbdebsalomon@google.com        kNumStages = 2,
558531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com        kMaxTexCoords = kNumStages
568531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    };
575782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com
588531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    /**
59ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com     *  Bitfield used to indicate which stages are in use.
60ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
61ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com    typedef int StageBitfield;
62ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com    GR_STATIC_ASSERT(sizeof(StageBitfield)*8 >= kNumStages);
63ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
64ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
65ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *  Flags that affect rendering. Controlled using enable/disableState(). All
66ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *  default to disabled.
67ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
68ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    enum StateBits {
69ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        kDither_StateBit          = 0x1,//<! Perform color dithering
70ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        kAntialias_StateBit       = 0x2,//<! Perform anti-aliasing. The render-
71ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                        //   target must support some form of AA
72ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                        //   (msaa, coverage sampling, etc). For
73ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                        //   GrGpu-created rendertarget/textures
74ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                        //   this is controlled by parameters
75ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                        //   passed to createTexture.
76ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        kClip_StateBit            = 0x4,//<! Controls whether drawing is clipped
77ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                        //   against the region specified by
78ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                        //   setClip.
79d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        kNoColorWrites_StateBit   = 0x8,//<! If set it disables writing colors.
80d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com                                        //   Useful while performing stencil ops.
81d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com
82d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        // subclass may use additional bits internally
83d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        kDummyStateBit,
84d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        kLastPublicStateBit = kDummyStateBit-1
85ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    };
86ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
87d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com    enum DrawFace {
88d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        kBoth_DrawFace,
89d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        kCCW_DrawFace,
90d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        kCW_DrawFace,
91ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    };
92ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
93d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com    /**
94d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com     * The DrawTarget may reserve some of the high bits of the stencil. The draw
95d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com     * target will automatically trim reference and mask values so that the
96d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com     * client doesn't overwrite these bits.
97d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com     * The number of bits available is relative to the currently set render
98d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com      *target.
99d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com     * @return the number of bits usable by the draw target client.
100d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com     */
101d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com    int getUsableStencilBits() const {
102d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        int bits = fCurrDrawState.fRenderTarget->stencilBits();
103d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        if (bits) {
104d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com            return bits - 1;
105d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        } else {
106d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com            return 0;
107d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        }
108d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com    }
109d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com
110d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com    /**
111d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com     * Sets the stencil settings to use for the next draw.
1125aaa69e4339e229adfb05e96084a8ec0a590238bbsalomon@google.com     * Changing the clip has the side-effect of possibly zeroing
1135aaa69e4339e229adfb05e96084a8ec0a590238bbsalomon@google.com     * out the client settable stencil bits. So multipass algorithms
1145aaa69e4339e229adfb05e96084a8ec0a590238bbsalomon@google.com     * using stencil should not change the clip between passes.
115d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com     * @param settings  the stencil settings to use.
116d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com     */
117d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com    void setStencil(const GrStencilSettings& settings) {
118d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        fCurrDrawState.fStencilSettings = settings;
119d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com    }
120d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com
121d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com    /**
122d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com     * Shortcut to disable stencil testing and ops.
123d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com     */
124d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com    void disableStencil() {
125d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        fCurrDrawState.fStencilSettings.setDisabled();
126d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com    }
127d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com
128ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comprotected:
129ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
1308195f674278e8d785bf57489847b1d05d3c2f7d5reed@google.com    struct DrState {
131d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        DrState() {
132d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com            // make sure any pad is zero for memcmp
133d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com            // all DrState members should default to something
134d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com            // valid by the memset
135d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com            memset(this, 0, sizeof(DrState));
13697c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo            // This is an exception to our memset, since it will
13797c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo            // result in no change.
13897c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo            fColorFilterXfermode = SkXfermode::kDstIn_Mode;
139d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com            GrAssert((intptr_t)(void*)NULL == 0LL);
140d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com            GrAssert(fStencilSettings.isDisabled());
141d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        }
142ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        uint32_t                fFlagBits;
143ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com        GrBlendCoeff            fSrcBlend;
144ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com        GrBlendCoeff            fDstBlend;
145080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com        GrColor                 fBlendConstant;
146c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com        GrTexture*              fTextures[kNumStages];
147f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrEffect*               fEffects[kNumStages];
148c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com        GrSamplerState          fSamplerStates[kNumStages];
149c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com        GrRenderTarget*         fRenderTarget;
150c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com        GrColor                 fColor;
151d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        DrawFace                fDrawFace;
15297c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo        GrColor                 fColorFilterColor;
15397c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo        SkXfermode::Mode        fColorFilterXfermode;
154d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com
155d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        GrStencilSettings       fStencilSettings;
1568531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com        GrMatrix                fViewMatrix;
1578195f674278e8d785bf57489847b1d05d3c2f7d5reed@google.com        bool operator ==(const DrState& s) const {
1588195f674278e8d785bf57489847b1d05d3c2f7d5reed@google.com            return 0 == memcmp(this, &s, sizeof(DrState));
159ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        }
1608195f674278e8d785bf57489847b1d05d3c2f7d5reed@google.com        bool operator !=(const DrState& s) const { return !(*this == s); }
161ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    };
162ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
163ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.compublic:
164ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    ///////////////////////////////////////////////////////////////////////////
165ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
166ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    GrDrawTarget();
167ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
168ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
169ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Sets the current clip to the region specified by clip. All draws will be
170ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * clipped against this clip if kClip_StateBit is enabled.
171ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
1725aaa69e4339e229adfb05e96084a8ec0a590238bbsalomon@google.com     * Setting the clip may (or may not) zero out the client's stencil bits.
1735aaa69e4339e229adfb05e96084a8ec0a590238bbsalomon@google.com     *
174ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param description of the clipping region
175ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
176ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    void setClip(const GrClip& clip);
177ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
178ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
179ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Gets the current clip.
180ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
181ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @return the clip.
182ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
183ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    const GrClip& getClip() const;
184ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
185ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
186ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Sets the texture used at the next drawing call
187ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
1888531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * @param stage The texture stage for which the texture will be set
1898531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     *
190ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param texture The texture to set. Can be NULL though there is no advantage
191ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * to settings a NULL texture if doing non-textured drawing
192ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
1938531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    void setTexture(int stage, GrTexture* texture);
194ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
195ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
196ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Retrieves the currently set texture.
197ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
198ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @return    The currently set texture. The return value will be NULL if no
199ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *            texture has been set, NULL was most recently passed to
200ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *            setTexture, or the last setTexture was destroyed.
201ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
2025782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com    const GrTexture* getTexture(int stage) const;
2035782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com    GrTexture* getTexture(int stage);
204ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
205ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
206ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Sets the rendertarget used at the next drawing call
207ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
2085782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com     * @param target  The render target to set.
209ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
210ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    void setRenderTarget(GrRenderTarget* target);
211ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
212ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
213ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Retrieves the currently set rendertarget.
214ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
215ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @return    The currently set render target.
216ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
2175782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com    const GrRenderTarget* getRenderTarget() const;
2185782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com    GrRenderTarget* getRenderTarget();
219ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
220ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
221c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com     * Sets the sampler state for a stage used in subsequent draws.
222ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
223d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com     * The sampler state determines how texture coordinates are
224c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com     * intepretted and used to sample the texture.
225ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
226c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com     * @param stage           the stage of the sampler to set
227ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param samplerState    Specifies the sampler state.
228ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
2298531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    void setSamplerState(int stage, const GrSamplerState& samplerState);
230ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
231ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
232c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com     * Concats the matrix of a stage's sampler.
233ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
234c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com     * @param stage   the stage of the sampler to set
235c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com     * @param matrix  the matrix to concat
236ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
23727847dedd9b5c1f48998c40842f3494c0746257fbsalomon@google.com    void preConcatSamplerMatrix(int stage, const GrMatrix& matrix)  {
23827847dedd9b5c1f48998c40842f3494c0746257fbsalomon@google.com        GrAssert(stage >= 0 && stage < kNumStages);
23927847dedd9b5c1f48998c40842f3494c0746257fbsalomon@google.com        fCurrDrawState.fSamplerStates[stage].preConcatMatrix(matrix);
240c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com    }
241ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
242ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
243c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com     * Gets the matrix of a stage's sampler
2446f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com     *
245c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com     * @param stage     the stage to of sampler to get
246c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com     * @return the sampler state's matrix
2476f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com     */
248c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com    const GrMatrix& getSamplerMatrix(int stage) const {
249c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com        return fCurrDrawState.fSamplerStates[stage].getMatrix();
250c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com    }
2516f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com
2526f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com    /**
253c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com     * Sets the matrix of a stage's sampler
254c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com     *
255c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com     * @param stage     the stage of sampler set
256c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com     * @param matrix    the matrix to set
2576f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com     */
258cd9d69b9ce7eb301a9fd8d91b9f95fd99b07bae5djsollen@google.com    void setSamplerMatrix(int stage, const GrMatrix& matrix) {
259c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com        fCurrDrawState.fSamplerStates[stage].setMatrix(matrix);
260c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com    }
2616f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com
2626f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com    /**
263ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Sets the matrix applied to veretx positions.
264ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
265ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * In the post-view-matrix space the rectangle [0,w]x[0,h]
266ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * fully covers the render target. (w and h are the width and height of the
267ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * the rendertarget.)
268ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
269ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param m the matrix used to transform the vertex positions.
270ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
2718531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    void setViewMatrix(const GrMatrix& m);
272ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
273ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
274ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *  Multiplies the current view matrix by a matrix
275ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
276ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *  After this call V' = V*m where V is the old view matrix,
277ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *  m is the parameter to this function, and V' is the new view matrix.
278ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *  (We consider positions to be column vectors so position vector p is
279ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *  transformed by matrix X as p' = X*p.)
280ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
2816f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com     *  @param m the matrix used to modify the view matrix.
282ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
283c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com    void preConcatViewMatrix(const GrMatrix& m);
284ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
285ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
28606afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com     *  Multiplies the current view matrix by a matrix
28706afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com     *
28806afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com     *  After this call V' = m*V where V is the old view matrix,
28906afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com     *  m is the parameter to this function, and V' is the new view matrix.
29006afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com     *  (We consider positions to be column vectors so position vector p is
29106afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com     *  transformed by matrix X as p' = X*p.)
29206afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com     *
29306afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com     *  @param m the matrix used to modify the view matrix.
29406afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com     */
29506afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com    void postConcatViewMatrix(const GrMatrix& m);
29606afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com
29706afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com    /**
2986f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com     * Retrieves the current view matrix
2996f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com     * @return the current view matrix.
3006f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com     */
3016f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com    const GrMatrix& getViewMatrix() const;
3026f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com
3036f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com    /**
3046f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com     *  Retrieves the inverse of the current view matrix.
3056f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com     *
3066f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com     *  If the current view matrix is invertible, return true, and if matrix
3076f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com     *  is non-null, copy the inverse into it. If the current view matrix is
3086f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com     *  non-invertible, return false and ignore the matrix parameter.
3096f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com     *
3106f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com     * @param matrix if not null, will receive a copy of the current inverse.
3116f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com     */
3126f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com    bool getViewInverse(GrMatrix* matrix) const;
3136f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com
3146f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com    /**
315ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *  Sets color for next draw to a premultiplied-alpha color.
316ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
317ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *  @param the color to set.
318ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
319ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    void setColor(GrColor);
320ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
321ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
32297c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo     * Add a color filter that can be represented by a color and a mode.
32397c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo     */
32497c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo    void setColorFilter(GrColor, SkXfermode::Mode);
32597c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo
32697c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo    /**
327ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *  Sets the color to be used for the next draw to be
328ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *  (r,g,b,a) = (alpha, alpha, alpha, alpha).
329ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
330ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *  @param alpha The alpha value to set as the color.
331ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
332ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    void setAlpha(uint8_t alpha);
333ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
334ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
335d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com     * Controls whether clockwise, counterclockwise, or both faces are drawn.
336d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com     * @param face  the face(s) to draw.
337ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
338d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com    void setDrawFace(DrawFace face) { fCurrDrawState.fDrawFace = face; }
339ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
340ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
341d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com     * Gets whether the target is drawing clockwise, counterclockwise,
342d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com     * or both faces.
343d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com     * @return the current draw face(s).
344ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
345d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com    DrawFace getDrawFace() const { return fCurrDrawState.fDrawFace; }
346ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
347ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
348ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Enable render state settings.
349ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
350ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param flags   bitfield of StateBits specifing the states to enable
351ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
352ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    void enableState(uint32_t stateBits);
353ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
354ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
355ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Disable render state settings.
356ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
357ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param flags   bitfield of StateBits specifing the states to disable
358ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
359ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    void disableState(uint32_t stateBits);
360ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
361ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    bool isDitherState() const {
36286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        return 0 != (fCurrDrawState.fFlagBits & kDither_StateBit);
36386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    }
36486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
36586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    bool isClipState() const {
36686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        return 0 != (fCurrDrawState.fFlagBits & kClip_StateBit);
367ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    }
368ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
369d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com    bool isColorWriteDisabled() const {
370d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        return 0 != (fCurrDrawState.fFlagBits & kNoColorWrites_StateBit);
371d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com    }
372d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com
373ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
374ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Sets the blending function coeffecients.
375ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
376ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * The blend function will be:
377ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *    D' = sat(S*srcCoef + D*dstCoef)
378ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
379ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *   where D is the existing destination color, S is the incoming source
380ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *   color, and D' is the new destination color that will be written. sat()
381ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *   is the saturation function.
382ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
383ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param srcCoef coeffecient applied to the src color.
384ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param dstCoef coeffecient applied to the dst color.
385ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
386ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com    void setBlendFunc(GrBlendCoeff srcCoef, GrBlendCoeff dstCoef);
387ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
388ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
389080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com     * Sets the blending function constant referenced by the following blending
390080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com     * coeffecients:
391080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com     *      kConstC_BlendCoeff
392080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com     *      kIConstC_BlendCoeff
393080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com     *      kConstA_BlendCoeff
394080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com     *      kIConstA_BlendCoeff
395080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com     *
396080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com     * @param constant the constant to set
397080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com     */
398080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com    void setBlendConstant(GrColor constant) { fCurrDrawState.fBlendConstant = constant; }
399080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com
400080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com    /**
401080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com     * Retrieves the last value set by setBlendConstant()
402080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com     * @return the blending constant value
403080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com     */
404080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com    GrColor getBlendConstant() const { return fCurrDrawState.fBlendConstant; }
405080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com
406080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com    /**
407ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Used to save and restore the GrGpu's drawing state
408ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
409ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    struct SavedDrawState {
410ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    private:
4118195f674278e8d785bf57489847b1d05d3c2f7d5reed@google.com        DrState fState;
412ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        friend class GrDrawTarget;
413ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    };
414ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
415ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
416ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Saves the current draw state. The state can be restored at a later time
417ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * with restoreDrawState.
418ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
419ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * See also AutoStateRestore class.
420ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
421ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param   state will hold the state after the function returns.
422ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
423ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    void saveCurrentDrawState(SavedDrawState* state) const;
424ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
425ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
426ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Restores previously saved draw state. The client guarantees that state
427ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * was previously passed to saveCurrentDrawState and that the rendertarget
428ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * and texture set at save are still valid.
429ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
430ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * See also AutoStateRestore class.
431ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
432ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param   state the previously saved state to restore.
433ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
434ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    void restoreDrawState(const SavedDrawState& state);
435ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
436ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
437ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Copies the draw state from another target to this target.
438ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
439ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param srcTarget     draw target used as src of the draw state.
440ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
441ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    void copyDrawState(const GrDrawTarget& srcTarget);
442ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
443ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
4448531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * The format of vertices is represented as a bitfield of flags.
4458531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * Flags that indicate the layout of vertex data. Vertices always contain
4465782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com     * positions and may also contain up to kMaxTexCoords sets of 2D texture
4478531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * coordinates and per-vertex colors. Each stage can use any of the texture
4488531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * coordinates as its input texture coordinates or it may use the positions.
4498531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     *
4508531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * If no texture coordinates are specified for a stage then the stage is
4518531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * disabled.
452ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
4538531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * Only one type of texture coord can be specified per stage. For
4545782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com     * example StageTexCoordVertexLayoutBit(0, 2) and
4558531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * StagePosAsTexCoordVertexLayoutBit(0) cannot both be specified.
456ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
4575782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com     * The order in memory is always (position, texture coord 0, ..., color)
4588531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * with any unused fields omitted. Note that this means that if only texture
4595782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com     * coordinates 1 is referenced then there is no texture coordinates 0 and
4608531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * the order would be (position, texture coordinate 1[, color]).
4618531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     */
4625782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com
4638531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    /**
4648531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * Generates a bit indicating that a texture stage uses texture coordinates
4655782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com     *
4668531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * @param stage       the stage that will use texture coordinates.
4678531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * @param texCoordIdx the index of the texture coordinates to use
468ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
4698531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * @return the bit to add to a GrVertexLayout bitfield.
4708531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     */
4718531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    static int StageTexCoordVertexLayoutBit(int stage, int texCoordIdx) {
4728531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com        GrAssert(stage < kNumStages);
4738531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com        GrAssert(texCoordIdx < kMaxTexCoords);
4748531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com        return 1 << (stage + (texCoordIdx * kNumStages));
4758531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    }
47686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
47786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    /**
47886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * Determines if blend is effectively disabled.
47986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     *
48086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * @return true if blend can be disabled without changing the rendering
48186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     *  result given the current state including the vertex layout specified
48286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     *  with the vertex source.
48386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     */
48486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    bool canDisableBlend() const;
48586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
4868531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.comprivate:
4878531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    static const int TEX_COORD_BIT_CNT = kNumStages*kMaxTexCoords;
4888531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.compublic:
4898531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    /**
4908531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * Generates a bit indicating that a texture stage uses the position
4918531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * as its texture coordinate.
4928531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     *
4935782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com     * @param stage       the stage that will use position as texture
4948531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     *                    coordinates.
4958531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     *
4968531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * @return the bit to add to a GrVertexLayout bitfield.
4978531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     */
4988531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    static int StagePosAsTexCoordVertexLayoutBit(int stage) {
4998531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com        GrAssert(stage < kNumStages);
5005782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com        return (1 << (TEX_COORD_BIT_CNT + stage));
5018531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    }
5028531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.comprivate:
5038531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    static const int STAGE_BIT_CNT = TEX_COORD_BIT_CNT + kNumStages;
5045782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com
5058531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.compublic:
5065782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com
5078531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    /**
5088531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * Additional Bits that can be specified in GrVertexLayout.
509ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
510ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    enum VertexLayoutBits {
5115782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com
5128531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com        kColor_VertexLayoutBit              = 1 << (STAGE_BIT_CNT + 0),
5138531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com                                                //<! vertices have colors
5148531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com        kTextFormat_VertexLayoutBit         = 1 << (STAGE_BIT_CNT + 1),
5158531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com                                                //<! use text vertices. (Pos
5168531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com                                                //   and tex coords may be
5175782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com                                                //   a different type for
5188531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com                                                //   text [GrGpuTextVertex vs
5198531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com                                                //   GrPoint].)
520ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        // for below assert
521d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        kDummyVertexLayoutBit,
522d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        kHighVertexLayoutBit = kDummyVertexLayoutBit - 1
523ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    };
5248531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    // make sure we haven't exceeded the number of bits in GrVertexLayout.
5254be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com    GR_STATIC_ASSERT(kHighVertexLayoutBit < ((uint64_t)1 << 8*sizeof(GrVertexLayout)));
526ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
527ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
5281c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * There are three paths for specifying geometry (vertices and optionally
5291c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * indices) to the draw target. When indexed drawing the indices and vertices
5301c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * can be each use a different path.
5311c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     *
5321c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * 1. Provide a cpu array (set*SourceToArray). This is useful when the
5331c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     *    caller's client has already provided vertex data in a format
5341c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     *    the time compatible with a GrVertexLayout. The array must contain the
5351c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     *    data at set*SourceToArray is called. The source stays in effect for
5361c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     *    drawIndexed & drawNonIndexed calls until set*SourceToArray is called
5371c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     *    again or one of the other two paths is chosen.
5381c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     *
5391c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * 2. Reserve and Lock. This is most useful when the caller has data it must
5401c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     *    transform before drawing and will not likely render it again. The
5411c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     *    caller requests that the draw target make room for some amount of
5421c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     *    vertex and/or index data. The target provides ptrs to hold the data
5431c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     *    data. The caller can write the data into the pts up until the first
5441c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     *    drawIndexed or drawNonIndexed call. At this point the data is frozen
5451c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     *    and the ptrs are no longer guaranteed to be valid. All subsequent
5461c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     *    drawIndexed & drawNonIndexed calls will use this data until
5471c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     *    releaseReserved geometry is called. This must be called before another
5481c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     *    source is set.
5491c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     *
5501c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * 3. Vertex and Index Buffers. This is most useful for geometry that will
5511c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     *    be rendered multiple times. SetVertexSourceToBuffer &
5521c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     *    SetIndexSourceToBuffer are used to set the buffer and subsequent
5531c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     *    drawIndexed and drawNonIndexed calls use this source until another
5541c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     *    source is set.
5551c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     */
5561c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com
5571c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    /**
558ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Reserves space for vertices and/or indices. Draw target will use
559ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * reserved vertices / indices at next draw.
560ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
561ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * If succeeds:
562ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *          if vertexCount is nonzero, *vertices will be the array
563ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *          of vertices to be filled by caller. The next draw will read
564ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *          these vertices.
565ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
5668295dc1474db279df08d816b2115e807c681fad5bsalomon@google.com     *          if indexCount is nonzero, *indices will be the array of indices
567ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *          to be filled by caller. The next indexed draw will read from
568ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *          these indices.
569ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
5701c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * If a client does not already have a vertex buffer then this is the
5711c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * preferred way to allocate vertex/index array. It allows the subclass of
5721c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * GrDrawTarget to decide whether to put data in buffers, to group vertex
5731c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * data that uses the same state (e.g. for deferred rendering), etc.
574ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
5751c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * Following the first draw after reserveAndLockGeometry the ptrs returned
5761c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * by releaseReservedGeometry are no longer valid and the geometry data
5771c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * cannot be further modified. The contents that were put in the reserved
5781c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * space can be drawn by multiple draws, however.
5791c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     *
5801c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * reserveAndLockGeometry must be matched with a releaseReservedGeometry
5811c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * call after all draws that reference the reserved geometry data have
5821c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * been called.
583ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
584ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * AutoGeometryRelease can be used to automatically call the release.
585ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
586ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param vertexCount  the number of vertices to reserve space for. Can be 0.
587ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param indexCount   the number of indices to reserve space for. Can be 0.
588ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param vertexLayout the format of vertices (ignored if vertexCount == 0).
589ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param vertices     will point to reserved vertex space if vertexCount is
590ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *                     non-zero. Illegal to pass NULL if vertexCount > 0.
591ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param indices      will point to reserved index space if indexCount is
592ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *                     non-zero. Illegal to pass NULL if indexCount > 0.
593ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
594ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @return  true if succeeded in allocating space for the vertices and false
595ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *               if not.
596ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
597ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    bool reserveAndLockGeometry(GrVertexLayout    vertexLayout,
598ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                uint32_t          vertexCount,
599ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                uint32_t          indexCount,
600ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                void**            vertices,
601ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                void**            indices);
602ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
603ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Provides hints to caller about the number of vertices and indices
604ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * that can be allocated cheaply. This can be useful if caller is reserving
605ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * space but doesn't know exactly how much geometry is needed.
606ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
607ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Also may hint whether the draw target should be flushed first. This is
608ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * useful for deferred targets.
609ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
610ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param vertexLayout layout of vertices caller would like to reserve
611ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param vertexCount  in: hint about how many vertices the caller would
612ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *                     like to allocate.
613ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *                     out: a hint about the number of vertices that can be
614ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *                     allocated cheaply. Negative means no hint.
615ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *                     Ignored if NULL.
616ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param indexCount   in: hint about how many indices the caller would
617ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *                     like to allocate.
618ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *                     out: a hint about the number of indices that can be
619ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *                     allocated cheaply. Negative means no hint.
620ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *                     Ignored if NULL.
621ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
622ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @return  true if target should be flushed based on the input values.
623ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
624ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    virtual bool geometryHints(GrVertexLayout vertexLayout,
6251c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                               int* vertexCount,
6261c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                               int* indexCount) const;
627ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
628ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
629ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Releases reserved vertex/index data from reserveAndLockGeometry().
630ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
631ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    void releaseReservedGeometry();
632ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
633ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
6341c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * Sets source of vertex data for the next draw. Array must contain
6351c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * the vertex data when this is called.
636ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
637ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param array         cpu array containing vertex data.
6381c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * @param size          size of the vertex data.
6391c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * @param vertexCount   the number of vertices in the array.
640ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
6411c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    void setVertexSourceToArray(GrVertexLayout vertexLayout,
6421c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                                const void* vertexArray,
6431c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                                int vertexCount);
644ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
645ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
6461c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * Sets source of index data for the next indexed draw. Array must contain
6471c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * the indices when this is called.
648ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
6491c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * @param array         cpu array containing index data.
6501c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com     * @param indexCount    the number of indices in the array.
651ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
6521c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    void setIndexSourceToArray(const void* indexArray, int indexCount);
653ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
654ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
655ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Sets source of vertex data for the next draw. Data does not have to be
656ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * in the buffer until drawIndexed or drawNonIndexed.
657ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
658ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param buffer        vertex buffer containing vertex data. Must be
659ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *                      unlocked before draw call.
660ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param vertexLayout  layout of the vertex data in the buffer.
661ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
6621c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    void setVertexSourceToBuffer(GrVertexLayout vertexLayout,
6631c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                                 const GrVertexBuffer* buffer);
664ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
665ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
666ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Sets source of index data for the next indexed draw. Data does not have
667ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * to be in the buffer until drawIndexed or drawNonIndexed.
668ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
669ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param buffer index buffer containing indices. Must be unlocked
670ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *               before indexed draw call.
671ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
672ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    void setIndexSourceToBuffer(const GrIndexBuffer* buffer);
673ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
674ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
675ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Draws indexed geometry using the current state and current vertex / index
676ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * sources.
677ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
678ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param type         The type of primitives to draw.
679ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param startVertex  the vertex in the vertex array/buffer corresponding
680ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *                     to index 0
681ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param startIndex   first index to read from index src.
682ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param vertexCount  one greater than the max index.
683ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param indexCount   the number of index elements to read. The index count
684ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *                     is effectively trimmed to the last completely
685ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *                     specified primitive.
686ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
687ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com    virtual void drawIndexed(GrPrimitiveType type,
6881c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                             int startVertex,
6891c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                             int startIndex,
6901c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                             int vertexCount,
6911c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                             int indexCount) = 0;
692ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
693ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
694ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Draws non-indexed geometry using the current state and current vertex
695ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * sources.
696ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
697ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param type         The type of primitives to draw.
698ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param startVertex  the vertex in the vertex array/buffer corresponding
699ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *                     to index 0
700ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @param vertexCount  one greater than the max index.
701ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
702ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com    virtual void drawNonIndexed(GrPrimitiveType type,
7031c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                                int startVertex,
7041c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                                int vertexCount)  = 0;
705ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
70686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    /**
70786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * Helper function for drawing rects. This does not use the current index
70886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * and vertex sources. After returning, the vertex and index sources may
70986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * have changed. They should be reestablished before the next drawIndexed
71086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * or drawNonIndexed. This cannot be called between reserving and releasing
71186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * geometry. The GrDrawTarget subclass may be able to perform additional
712d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com     * optimizations if drawRect is used rather than drawIndexed or
71386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * drawNonIndexed.
71486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * @param rect      the rect to draw
71586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * @param matrix    optional matrix applied to rect (before viewMatrix)
716ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com     * @param stageEnableBitfield bitmask indicating which stages are enabled.
717ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com     *                            Bit i indicates whether stage i is enabled.
71886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * @param srcRects  specifies rects for stages enabled by stageEnableMask.
71986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     *                  if stageEnableMask bit i is 1, srcRects is not NULL,
72086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     *                  and srcRects[i] is not NULL, then srcRects[i] will be
72186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     *                  used as coordinates for stage i. Otherwise, if stage i
72286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     *                  is enabled then rect is used as the coordinates.
72386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * @param srcMatrices   optional matrices applied to srcRects. If
72486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     *                      srcRect[i] is non-NULL and srcMatrices[i] is
72586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     *                      non-NULL then srcRect[i] will be transformed by
72686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     *                      srcMatrix[i]. srcMatrices can be NULL when no
72786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     *                      srcMatrices are desired.
72886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     */
729d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com    virtual void drawRect(const GrRect& rect,
73086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                          const GrMatrix* matrix,
731ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com                          StageBitfield stageEnableBitfield,
73286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                          const GrRect* srcRects[],
73386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                          const GrMatrix* srcMatrices[]);
73486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
73586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    /**
736d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com     * Helper for drawRect when the caller doesn't need separate src rects or
73786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * matrices.
73886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     */
739d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com    void drawSimpleRect(const GrRect& rect,
740d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com                        const GrMatrix* matrix,
741ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com                        StageBitfield stageEnableBitfield) {
742ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com         drawRect(rect, matrix, stageEnableBitfield, NULL, NULL);
74386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    }
74486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
7450b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com    /**
7466aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com     * Clear the render target. Ignores the clip and all other draw state
7476aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com     * (blend mode, stages, etc). Clears the whole thing if rect is NULL,
7486aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com     * otherwise just the rect.
7490b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com     */
7506aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com    virtual void clear(const GrIRect* rect, GrColor color) = 0;
7510b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com
752ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    ///////////////////////////////////////////////////////////////////////////
753ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
754ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    class AutoStateRestore : ::GrNoncopyable {
755ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    public:
75606afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com        AutoStateRestore();
757ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        AutoStateRestore(GrDrawTarget* target);
758ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        ~AutoStateRestore();
759ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
76006afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com        /**
76106afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com         * if this object is already saving state for param target then
76206afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com         * this does nothing. Otherise, it restores previously saved state on
76306afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com         * previous target (if any) and saves current state on param target.
76406afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com         */
76506afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com        void set(GrDrawTarget* target);
76606afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com
767ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    private:
768ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        GrDrawTarget*       fDrawTarget;
769ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        SavedDrawState      fDrawState;
770ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    };
771ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
772ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    ///////////////////////////////////////////////////////////////////////////
7731c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com
7746f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com    class AutoViewMatrixRestore : ::GrNoncopyable {
7756f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com    public:
7766f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com        AutoViewMatrixRestore() {
7776f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com            fDrawTarget = NULL;
7786f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com        }
7796f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com
7801c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com        AutoViewMatrixRestore(GrDrawTarget* target)
7816f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com            : fDrawTarget(target), fMatrix(fDrawTarget->getViewMatrix()) {
7826f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com            GrAssert(NULL != target);
7836f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com        }
7846f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com
7856f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com        void set(GrDrawTarget* target) {
7866f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com            GrAssert(NULL != target);
7876f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com            if (NULL != fDrawTarget) {
7886f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com                fDrawTarget->setViewMatrix(fMatrix);
7896f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com            }
7906f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com            fDrawTarget = target;
7916f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com            fMatrix = target->getViewMatrix();
7926f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com        }
7936f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com
7946f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com        ~AutoViewMatrixRestore() {
7956f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com            if (NULL != fDrawTarget) {
7966f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com                fDrawTarget->setViewMatrix(fMatrix);
7976f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com            }
7986f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com        }
7996f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com
8006f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com    private:
8016f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com        GrDrawTarget*       fDrawTarget;
8026f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com        GrMatrix            fMatrix;
8036f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com    };
8046f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com
8056f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com    ///////////////////////////////////////////////////////////////////////////
806ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
807ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    class AutoReleaseGeometry : ::GrNoncopyable {
808ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    public:
809ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        AutoReleaseGeometry(GrDrawTarget*  target,
810ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                            GrVertexLayout vertexLayout,
811ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                            uint32_t       vertexCount,
812ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                            uint32_t       indexCount) {
813a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com            fTarget = NULL;
814a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com            this->set(target, vertexLayout, vertexCount, indexCount);
815ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        }
8165782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com
8175782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com        AutoReleaseGeometry() {
818a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com            fTarget = NULL;
8195782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com        }
8205782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com
821ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        ~AutoReleaseGeometry() {
822a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com            if (NULL != fTarget) {
823ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                fTarget->releaseReservedGeometry();
824ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com            }
825ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        }
826ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
8275782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com        bool set(GrDrawTarget*  target,
8285782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com                 GrVertexLayout vertexLayout,
8295782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com                 uint32_t       vertexCount,
8305782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com                 uint32_t       indexCount) {
831a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com            if (NULL != fTarget) {
8325782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com                fTarget->releaseReservedGeometry();
8335782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com            }
8345782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com            fTarget = target;
835a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com            if (NULL != fTarget) {
836a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com                if (!fTarget->reserveAndLockGeometry(vertexLayout,
837a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com                                                     vertexCount,
838a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com                                                     indexCount,
839a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com                                                     &fVertices,
840a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com                                                     &fIndices)) {
841a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com                    fTarget = NULL;
842a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com                }
843a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com            }
844a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com            return NULL != fTarget;
8455782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com        }
8465782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com
847a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com        bool succeeded() const { return NULL != fTarget; }
848ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        void* vertices() const { return fVertices; }
849ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        void* indices() const { return fIndices; }
850ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
851ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        GrPoint* positions() const {
852ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com            return static_cast<GrPoint*>(fVertices);
853ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        }
854ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
855ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    private:
856ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        GrDrawTarget* fTarget;
857ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        void*         fVertices;
858ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        void*         fIndices;
859ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    };
860ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
861ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    ///////////////////////////////////////////////////////////////////////////
862ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
863ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    class AutoClipRestore : ::GrNoncopyable {
864ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    public:
865ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        AutoClipRestore(GrDrawTarget* target) {
866ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com            fTarget = target;
867ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com            fClip = fTarget->getClip();
868ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        }
869ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
870ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        ~AutoClipRestore() {
871ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com            fTarget->setClip(fClip);
872ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        }
873ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    private:
874ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        GrDrawTarget* fTarget;
875ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        GrClip        fClip;
876ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    };
877ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
878ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    ////////////////////////////////////////////////////////////////////////////
8798531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    // Helpers for picking apart vertex layouts
8805782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com
881ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
882ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Helper function to compute the size of a vertex from a vertex layout
883ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @return size of a single vertex.
884ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
885ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    static size_t VertexSize(GrVertexLayout vertexLayout);
8865782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com
8878531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    /**
8888531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * Helper function for determining the index of texture coordinates that
8898531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * is input for a texture stage. Note that a stage may instead use positions
8908531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * as texture coordinates, in which case the result of the function is
8918531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * indistinguishable from the case when the stage is disabled.
8928531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     *
8938531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * @param stage         the stage to query
8948531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * @param vertexLayout  layout to query
8958531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     *
8968531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * @return the texture coordinate index or -1 if the stage doesn't use
8978531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     *         separate (non-position) texture coordinates.
8988531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     */
8998531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    static int VertexTexCoordsForStage(int stage, GrVertexLayout vertexLayout);
900ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
901ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
902ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Helper function to compute the offset of texture coordinates in a vertex
903ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @return offset of texture coordinates in vertex layout or -1 if the
9045782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com     *         layout has no texture coordinates. Will be 0 if positions are
9058531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     *         used as texture coordinates for the stage.
906ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
9078531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    static int VertexStageCoordOffset(int stage, GrVertexLayout vertexLayout);
908ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
909ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
910ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Helper function to compute the offset of the color in a vertex
911ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * @return offset of color in vertex layout or -1 if the
912ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *         layout has no color.
913ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
914ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    static int VertexColorOffset(GrVertexLayout vertexLayout);
915ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
916ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
9175782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com     * Helper function to determine if vertex layout contains explicit texture
9188531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * coordinates of some index.
9198531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     *
9208531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * @param coordIndex    the tex coord index to query
9218531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * @param vertexLayout  layout to query
9228531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     *
9235782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com     * @return true if vertex specifies texture coordinates for the index,
9248531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     *              false otherwise.
925ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
9265782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com    static bool VertexUsesTexCoordIdx(int coordIndex,
9278531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com                                      GrVertexLayout vertexLayout);
9285782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com
929ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
930ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     * Helper function to determine if vertex layout contains either explicit or
9318531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * implicit texture coordinates for a stage.
932ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     *
9338531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * @param stage         the stage to query
9348531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * @param vertexLayout  layout to query
9358531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     *
9365782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com     * @return true if vertex specifies texture coordinates for the stage,
9378531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     *              false otherwise.
938ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com     */
9398531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    static bool VertexUsesStage(int stage, GrVertexLayout vertexLayout);
940ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
9418531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    /**
9425782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com     * Helper function to compute the size of each vertex and the offsets of
9435782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com     * texture coordinates and color. Determines tex coord offsets by tex coord
9445782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com     * index rather than by stage. (Each stage can be mapped to any t.c. index
9458531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * by StageTexCoordVertexLayoutBit.)
9468531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     *
9478531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * @param vertexLayout          the layout to query
9488531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * @param texCoordOffsetsByIdx  after return it is the offset of each
9498531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     *                              tex coord index in the vertex or -1 if
9508531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     *                              index isn't used.
9518531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * @return size of a single vertex
9528531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     */
9538531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    static int VertexSizeAndOffsetsByIdx(GrVertexLayout vertexLayout,
9548531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com                                         int texCoordOffsetsByIdx[kMaxTexCoords],
9558531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com                                         int *colorOffset);
9565782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com
9578531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    /**
9585782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com     * Helper function to compute the size of each vertex and the offsets of
9595782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com     * texture coordinates and color. Determines tex coord offsets by stage
9605782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com     * rather than by index. (Each stage can be mapped to any t.c. index
9615782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com     * by StageTexCoordVertexLayoutBit.) If a stage uses positions for
9628531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * tex coords then that stage's offset will be 0 (positions are always at 0).
9638531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     *
9648531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * @param vertexLayout              the layout to query
9658531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * @param texCoordOffsetsByStage    after return it is the offset of each
9668531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     *                                  tex coord index in the vertex or -1 if
9678531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     *                                  index isn't used.
9688531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     * @return size of a single vertex
9698531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com     */
9708531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com    static int VertexSizeAndOffsetsByStage(GrVertexLayout vertexLayout,
9718531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com                                           int texCoordOffsetsByStage[kNumStages],
9728531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com                                           int *colorOffset);
97386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
97486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    /**
97586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * Accessing positions, texture coords, or colors, of a vertex within an
97686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * array is a hassle involving casts and simple math. These helpers exist
97786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * to keep GrDrawTarget clients' code a bit nicer looking.
97886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     */
97986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
98086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    /**
98186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * Gets a pointer to a GrPoint of a vertex's position or texture
98286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * coordinate.
98386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * @param vertices      the vetex array
98486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * @param vertexIndex   the index of the vertex in the array
98586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * @param vertexSize    the size of each vertex in the array
98686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * @param offset        the offset in bytes of the vertex component.
98786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     *                      Defaults to zero (corresponding to vertex position)
98886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * @return pointer to the vertex component as a GrPoint
98986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     */
990d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com    static GrPoint* GetVertexPoint(void* vertices,
99186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                                   int vertexIndex,
99286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                                   int vertexSize,
99386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                                   int offset = 0) {
99486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        intptr_t start = GrTCast<intptr_t>(vertices);
995d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        return GrTCast<GrPoint*>(start + offset +
99686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                                 vertexIndex * vertexSize);
99786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    }
99886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    static const GrPoint* GetVertexPoint(const void* vertices,
99986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                                         int vertexIndex,
1000d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com                                         int vertexSize,
100186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                                         int offset = 0) {
100286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        intptr_t start = GrTCast<intptr_t>(vertices);
1003d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        return GrTCast<const GrPoint*>(start + offset +
100486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                                       vertexIndex * vertexSize);
100586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    }
100686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
100786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    /**
100886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * Gets a pointer to a GrColor inside a vertex within a vertex array.
100986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * @param vertices      the vetex array
101086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * @param vertexIndex   the index of the vertex in the array
101186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * @param vertexSize    the size of each vertex in the array
101286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * @param offset        the offset in bytes of the vertex color
101386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     * @return pointer to the vertex component as a GrColor
101486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     */
1015d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com    static GrColor* GetVertexColor(void* vertices,
101686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                                   int vertexIndex,
101786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                                   int vertexSize,
101886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                                   int offset) {
101986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        intptr_t start = GrTCast<intptr_t>(vertices);
1020d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        return GrTCast<GrColor*>(start + offset +
102186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                                 vertexIndex * vertexSize);
102286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    }
102386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    static const GrColor* GetVertexColor(const void* vertices,
102486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                                         int vertexIndex,
1025d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com                                         int vertexSize,
102686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                                         int offset) {
102786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        const intptr_t start = GrTCast<intptr_t>(vertices);
1028d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        return GrTCast<const GrColor*>(start + offset +
102986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                                       vertexIndex * vertexSize);
103086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    }
103186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
10325aaa69e4339e229adfb05e96084a8ec0a590238bbsalomon@google.com    static void VertexLayoutUnitTest();
10335aaa69e4339e229adfb05e96084a8ec0a590238bbsalomon@google.com
1034ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comprotected:
1035a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com    // given a vertex layout and a draw state, will a stage be used?
1036a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com    static bool StageWillBeUsed(int stage, GrVertexLayout layout,
1037a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com                         const DrState& state) {
1038a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com        return NULL != state.fTextures[stage] && VertexUsesStage(stage, layout);
1039a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com    }
1040a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com
1041a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com    bool isStageEnabled(int stage) const {
1042a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com        return StageWillBeUsed(stage, fGeometrySrc.fVertexLayout, fCurrDrawState);
1043a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com    }
10445782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com
1045ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    // Helpers for GrDrawTarget subclasses that won't have private access to
1046ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    // SavedDrawState but need to peek at the state values.
10478195f674278e8d785bf57489847b1d05d3c2f7d5reed@google.com    static DrState& accessSavedDrawState(SavedDrawState& sds)
1048ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                                        { return sds.fState; }
10498195f674278e8d785bf57489847b1d05d3c2f7d5reed@google.com    static const DrState& accessSavedDrawState(const SavedDrawState& sds)
1050ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                                        { return sds.fState; }
1051ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
1052ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    // implemented by subclass
1053bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com    virtual bool onAcquireGeometry(GrVertexLayout vertexLayout,
1054bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com                                   void** vertices,
1055bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com                                   void** indices) = 0;
1056ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
1057bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com    virtual void onReleaseGeometry() = 0;
1058ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
105986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    // subclass overrides to be notified when clip is set.
106086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    virtual void clipWillBeSet(const GrClip& clip) = 0;
1061ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
1062bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com    virtual void onSetVertexSourceToArray(const void* vertexArray,
1063bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com                                          int vertexCount) = 0;
10641c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com
1065bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com    virtual void onSetIndexSourceToArray(const void* indexArray,
1066bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com                                         int indexCount) = 0;
10671c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com
106886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    // Helpers for drawRect, protected so subclasses that override drawRect
106986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    // can use them.
1070ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com    static GrVertexLayout GetRectVertexLayout(StageBitfield stageEnableBitfield,
107186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                                              const GrRect* srcRects[]);
107286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
107386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    static void SetRectVertices(const GrRect& rect,
1074d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com                                const GrMatrix* matrix,
1075d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com                                const GrRect* srcRects[],
107686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                                const GrMatrix* srcMatrices[],
1077d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com                                GrVertexLayout layout,
107886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                                void* vertices);
107986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
1080ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    enum GeometrySrcType {
10811c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com        kReserved_GeometrySrcType,  // src was set using reserveAndLockGeometry
10821c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com        kArray_GeometrySrcType,     // src was set using set*SourceToArray
10831c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com        kBuffer_GeometrySrcType     // src was set using set*SourceToBuffer
1084ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    };
1085ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
1086d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com    struct ReservedGeometry {
1087ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        bool            fLocked;
1088ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        uint32_t        fVertexCount;
1089ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        uint32_t        fIndexCount;
1090ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    } fReservedGeometry;
1091ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
1092ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    struct GeometrySrc {
10931c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com        GeometrySrcType         fVertexSrc;
10941c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com        const GrVertexBuffer*   fVertexBuffer; // valid if src type is buffer
10951c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com        GeometrySrcType         fIndexSrc;
10961c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com        const GrIndexBuffer*    fIndexBuffer; // valid if src type is buffer
10971c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com        GrVertexLayout          fVertexLayout;
1098ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    } fGeometrySrc;
1099ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
1100ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    GrClip fClip;
1101ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
11028195f674278e8d785bf57489847b1d05d3c2f7d5reed@google.com    DrState fCurrDrawState;
1103ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
11041c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    // Not meant for external use. Only setVertexSourceToBuffer and
11051c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    // setIndexSourceToBuffer will work since GrDrawTarget subclasses don't
11061c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    // support nested reserveAndLockGeometry (and cpu arrays internally use the
11071c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    // same path).
1108ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    class AutoGeometrySrcRestore {
1109ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    public:
1110ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        AutoGeometrySrcRestore(GrDrawTarget* target) {
1111ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com            fTarget = target;
1112ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com            fGeometrySrc = fTarget->fGeometrySrc;
1113ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        }
1114ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        ~AutoGeometrySrcRestore() {
1115ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com            fTarget->fGeometrySrc = fGeometrySrc;
1116ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        }
1117ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    private:
1118ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        GrDrawTarget *fTarget;
1119ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        GeometrySrc  fGeometrySrc;
1120ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
1121ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        AutoGeometrySrcRestore();
1122ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        AutoGeometrySrcRestore(const AutoGeometrySrcRestore&);
1123ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        AutoGeometrySrcRestore& operator =(AutoGeometrySrcRestore&);
1124ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    };
1125ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com};
1126ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
1127ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#endif
1128