105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/*
205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    Copyright 2010 Google Inc.
305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    Licensed under the Apache License, Version 2.0 (the "License");
505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    you may not use this file except in compliance with the License.
605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    You may obtain a copy of the License at
705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger         http://www.apache.org/licenses/LICENSE-2.0
905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    Unless required by applicable law or agreed to in writing, software
1105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    distributed under the License is distributed on an "AS IS" BASIS,
1205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    See the License for the specific language governing permissions and
1405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    limitations under the License.
1505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
1605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#ifndef GrTypes_DEFINED
1905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define GrTypes_DEFINED
2005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkTypes.h"
2205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrConfig.h"
2305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
2435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger////////////////////////////////////////////////////////////////////////////////
2535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
2635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger/**
2735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger * Defines overloaded bitwise operators to make it easier to use an enum as a
2835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger * bitfield.
2935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger */
3035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#define GR_MAKE_BITFIELD_OPS(X) \
3135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    static inline X operator | (X a, X b) { \
3235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        return (X) (+a | +b); \
3335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    } \
3435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    \
3535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    static inline X operator & (X a, X b) { \
3635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        return (X) (+a & +b); \
3735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    } \
3835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    template <typename T> \
3935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    static inline X operator & (T a, X b) { \
4035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        return (X) (+a & +b); \
4135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    } \
4235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    template <typename T> \
4335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    static inline X operator & (X a, T b) { \
4435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        return (X) (+a & +b); \
4535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    } \
4635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
4735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger////////////////////////////////////////////////////////////////////////////////
4835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
4935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
5005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
5105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger *  Macro to round n up to the next multiple of 4, or return it unchanged if
5205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger *  n is already a multiple of 4
5305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#define GrALIGN4(n)     SkAlign4(n)
5505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define GrIsALIGN4(n)   (((n) & 3) == 0)
5605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
5705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergertemplate <typename T> const T& GrMin(const T& a, const T& b) {
5805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger	return (a < b) ? a : b;
5905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
6005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
6105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergertemplate <typename T> const T& GrMax(const T& a, const T& b) {
6205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger	return (b < a) ? a : b;
6305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
6405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
6505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger// compile time versions of min/max
6605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define GR_CT_MAX(a, b) (((b) < (a)) ? (a) : (b))
6705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define GR_CT_MIN(a, b) (((b) < (a)) ? (b) : (a))
6805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
6905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
7005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger *  divide, rounding up
7105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
7205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline uint32_t GrUIDivRoundUp(uint32_t x, uint32_t y) {
7305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return (x + (y-1)) / y;
7405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
7505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline size_t GrSizeDivRoundUp(size_t x, uint32_t y) {
7605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return (x + (y-1)) / y;
7705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
7805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
7905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
8005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger *  align up
8105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
8205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline uint32_t GrUIAlignUp(uint32_t x, uint32_t alignment) {
8305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return GrUIDivRoundUp(x, alignment) * alignment;
8405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
8505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline uint32_t GrSizeAlignUp(size_t x, uint32_t alignment) {
8605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return GrSizeDivRoundUp(x, alignment) * alignment;
8705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
8805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
8905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
9005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * amount of pad needed to align up
9105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
9205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline uint32_t GrUIAlignUpPad(uint32_t x, uint32_t alignment) {
9305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return (alignment - x % alignment) % alignment;
9405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
9505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline size_t GrSizeAlignUpPad(size_t x, uint32_t alignment) {
9605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return (alignment - x % alignment) % alignment;
9705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
9805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
9905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
10005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger *  align down
10105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
10205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline uint32_t GrUIAlignDown(uint32_t x, uint32_t alignment) {
10305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return (x / alignment) * alignment;
10405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
10505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline uint32_t GrSizeAlignDown(size_t x, uint32_t alignment) {
10605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return (x / alignment) * alignment;
10705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
10805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
10905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
11005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger *  Count elements in an array
11105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
1120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#define GR_ARRAY_COUNT(array)  SK_ARRAY_COUNT(array)
11305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
11405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger//!< allocate a block of memory, will never return NULL
11505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerextern void* GrMalloc(size_t bytes);
11605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
11705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger//!< free block allocated by GrMalloc. ptr may be NULL
11805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerextern void GrFree(void* ptr);
11905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
12005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline void Gr_bzero(void* dst, size_t size) {
12105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    memset(dst, 0, size);
12205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
12305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
12405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
12505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
12605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
12705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger *  Return the number of leading zeros in n
12805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
12905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerextern int Gr_clz(uint32_t n);
13005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
13105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
13205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger *  Return true if n is a power of 2
13305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
13405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline bool GrIsPow2(unsigned n) {
13505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return n && 0 == (n & (n - 1));
13605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
13705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
13805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
13905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger *  Return the next power of 2 >= n.
14005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
14105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline uint32_t GrNextPow2(uint32_t n) {
14205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return n ? (1 << (32 - Gr_clz(n - 1))) : 1;
14305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
14405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
14505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
14605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
14705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
14805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger *  16.16 fixed point type
14905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
15005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergertypedef int32_t GrFixed;
15105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
15205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#if GR_DEBUG
15305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
15405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline int16_t GrToS16(intptr_t x) {
15505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GrAssert((int16_t)x == x);
15605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return (int16_t)x;
15705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
15805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
15905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#else
16005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
16105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define GrToS16(x)  x
16205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
16305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif
16405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
16535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
16605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
16705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
16805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
16935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger * Possible 3D APIs that may be used by Ganesh.
17005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
17135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergerenum GrEngine {
17235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    kOpenGL_Shaders_GrEngine,
17335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    kOpenGL_Fixed_GrEngine,
17435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    kDirect3D9_GrEngine
17587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger};
17687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
17735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger/**
17835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger * Engine-specific 3D context handle
17935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger *      Unused for GL.
18035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger *      IDirect3DDevice9* for D3D9
18135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger */
18235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergertypedef intptr_t GrPlatform3DContext;
18335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
18487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger///////////////////////////////////////////////////////////////////////////////
18587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
18605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
18705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Type used to describe format of vertices in arrays
18805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Values are defined in GrDrawTarget
18905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
19035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergertypedef int GrVertexLayout;
19105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
19205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
19305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger* Geometric primitives used for drawing.
19405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger*/
19505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerenum GrPrimitiveType {
19605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kTriangles_PrimitiveType,
19705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kTriangleStrip_PrimitiveType,
19805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kTriangleFan_PrimitiveType,
19905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kPoints_PrimitiveType,
20005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kLines_PrimitiveType,
20105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kLineStrip_PrimitiveType
20205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
20305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
20487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic inline bool GrIsPrimTypeLines(GrPrimitiveType type) {
20587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    return kLines_PrimitiveType == type || kLineStrip_PrimitiveType == type;
20687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
20787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
20887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic inline bool GrIsPrimTypeTris(GrPrimitiveType type) {
20987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    return kTriangles_PrimitiveType == type     ||
21087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger           kTriangleStrip_PrimitiveType == type ||
21187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger           kTriangleFan_PrimitiveType == type;
21287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
21387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
21405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
21505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Coeffecients for alpha-blending.
21605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
21705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerenum GrBlendCoeff {
21805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kZero_BlendCoeff,    //<! 0
21905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kOne_BlendCoeff,     //<! 1
22005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kSC_BlendCoeff,      //<! src color
22105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kISC_BlendCoeff,     //<! one minus src color
22205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kDC_BlendCoeff,      //<! dst color
22305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kIDC_BlendCoeff,     //<! one minus dst color
22405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kSA_BlendCoeff,      //<! src alpha
22505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kISA_BlendCoeff,     //<! one minus src alpha
22605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kDA_BlendCoeff,      //<! dst alpha
22705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kIDA_BlendCoeff,     //<! one minus dst alpha
228137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger    kConstC_BlendCoeff,  //<! constant color
229137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger    kIConstC_BlendCoeff, //<! one minus constant color
230137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger    kConstA_BlendCoeff,  //<! constant color alpha
231137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger    kIConstA_BlendCoeff, //<! one minus constant color alpha
232137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger
2330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    kPublicBlendCoeffCount
234137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger};
235137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger
236137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger/**
237137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger *  Formats for masks, used by the font cache.
238137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger *  Important that these are 0-based.
239137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger */
240137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenbergerenum GrMaskFormat {
241137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger    kA8_GrMaskFormat,   //!< 1-byte per pixel
242137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger    kA565_GrMaskFormat  //!< 2-bytes per pixel
24305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
244137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger#define kCount_GrMaskFormats    2
245137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger
246137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger/**
247137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger *  Return the number of bytes-per-pixel for the specified mask format.
248137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger */
249137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenbergerstatic inline int GrMaskFormatBytesPerPixel(GrMaskFormat format) {
250137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger    GrAssert((unsigned)format <= 1);
251137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger    return (int)format + 1;
252137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger}
25305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
25405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
25587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Pixel configurations.
25687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */
25787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerenum GrPixelConfig {
25887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    kUnknown_GrPixelConfig,
25987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    kAlpha_8_GrPixelConfig,
26087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    kIndex_8_GrPixelConfig,
26187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    kRGB_565_GrPixelConfig,
26287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    kRGBA_4444_GrPixelConfig, //!< premultiplied
26387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    kRGBA_8888_GrPixelConfig, //!< premultiplied
26487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    kRGBX_8888_GrPixelConfig, //!< treat the alpha channel as opaque
26587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger};
26687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
26787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic inline size_t GrBytesPerPixel(GrPixelConfig config) {
26887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    switch (config) {
26987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        case kAlpha_8_GrPixelConfig:
27087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        case kIndex_8_GrPixelConfig:
27187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return 1;
27287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        case kRGB_565_GrPixelConfig:
27387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        case kRGBA_4444_GrPixelConfig:
27487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return 2;
27587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        case kRGBA_8888_GrPixelConfig:
27687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        case kRGBX_8888_GrPixelConfig:
27787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return 4;
27887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        default:
27987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return 0;
28087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
28187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
28287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
28387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic inline bool GrPixelConfigIsOpaque(GrPixelConfig config) {
28487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    switch (config) {
28587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        case kRGB_565_GrPixelConfig:
28687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        case kRGBX_8888_GrPixelConfig:
28787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return true;
28887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        default:
28987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return false;
29087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
29187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
29287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
29387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic inline bool GrPixelConfigIsAlphaOnly(GrPixelConfig config) {
29487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    switch (config) {
29587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        case kAlpha_8_GrPixelConfig:
29687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return true;
29787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        default:
29887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return false;
29987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
30087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
30187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
30287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger/**
30335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    * Used to control the level of antialiasing available for a rendertarget.
30435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    * Anti-alias quality levels depend on the underlying API/GPU capabilities.
30535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    */
30635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergerenum GrAALevels {
30735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    kNone_GrAALevel, //<! No antialiasing available.
30835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    kLow_GrAALevel,  //<! Low quality antialiased rendering. Actual
30935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger                     //   interpretation is platform-dependent.
31035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    kMed_GrAALevel,  //<! Medium quality antialiased rendering. Actual
31135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger                     //   interpretation is platform-dependent.
31235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    kHigh_GrAALevel, //<! High quality antialiased rendering. Actual
31335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger                     //   interpretation is platform-dependent.
31435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger};
31535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
31635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger/**
31735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger * Optional bitfield flags that can be passed to createTexture.
31835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger */
31935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergerenum GrTextureFlags {
32035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    kNone_GrTextureFlags            = 0x0,
32135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    /**
32235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     * Creates a texture that can be rendered to as a GrRenderTarget. Use
32335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     * GrTexture::asRenderTarget() to access.
32435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
32535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    kRenderTarget_GrTextureFlagBit  = 0x1,
32635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    /**
32735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     * By default all render targets have an associated stencil buffer that
32835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     * may be required for path filling. This flag overrides stencil buffer
32935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     * creation.
33035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     * MAKE THIS PRIVATE?
33135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
33235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    kNoStencil_GrTextureFlagBit     = 0x2,
33335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    /**
33435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     * Hint that the CPU may modify this texture after creation.
33535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
33635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    kDynamicUpdate_GrTextureFlagBit = 0x4,
33735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger};
33835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
33935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek SollenbergerGR_MAKE_BITFIELD_OPS(GrTextureFlags)
34035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
34135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergerenum {
34235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger   /**
34335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    *  For Index8 pixel config, the colortable must be 256 entries
34435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    */
34535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    kGrColorTableSize = 256 * 4 //sizeof(GrColor)
34635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger};
34735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
34835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger/**
34935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger * Describes a texture to be created.
35035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger */
35135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergerstruct GrTextureDesc {
35235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    GrTextureFlags         fFlags;  //!< bitfield of TextureFlags
35335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    /**
35435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     * The level of antialiasing available for a rendertarget texture. Only used
35535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     * fFlags contains kRenderTarget_GrTextureFlag.
35635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
35735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    GrAALevels             fAALevel;
35835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    uint32_t               fWidth;  //!< Width of the texture
35935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    uint32_t               fHeight; //!< Height of the texture
36035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    /**
36135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     * Format of source data of the texture. Not guaraunteed to be the same as
36235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     * internal format used by 3D API.
36335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
36435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    GrPixelConfig          fFormat;
36535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger};
36635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
36735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger/**
36805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Set Operations used to construct clips.
36905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
37005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerenum GrSetOp {
37105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kReplace_SetOp,
37205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kIntersect_SetOp,
37305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kUnion_SetOp,
37405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kXor_SetOp,
37505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kDifference_SetOp,
37605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kReverseDifference_SetOp,
37705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
37805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
37905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
38005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Clips are composed from these objects.
38105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
38205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerenum GrClipType {
38305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kRect_ClipType,
38405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kPath_ClipType
38505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
38605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
38705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
38805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Commands used to describe a path. Each command
38905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * is accompanied by some number of points.
39005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
39105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerenum GrPathCmd {
39205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kMove_PathCmd,      //!< Starts a new subpath at
39305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                        //   at the returned point
39405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                        // 1 point
39505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kLine_PathCmd,      //!< Adds a line segment
39605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                        // 2 points
39705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kQuadratic_PathCmd, //!< Adds a quadratic segment
39805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                        // 3 points
39905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kCubic_PathCmd,     //!< Adds a cubic segment
40005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                        // 4 points
40105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kClose_PathCmd,     //!< Closes the current subpath
40205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                        //   by connecting a line to the
40305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                        //   starting point.
40405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                        // 0 points
40505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kEnd_PathCmd        //!< Indicates the end of the last subpath
40605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                        //   when iterating
40705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                        // 0 points.
40805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
40905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
41005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
41105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Gets the number of points associated with a path command.
41205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
41305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic int inline NumPathCmdPoints(GrPathCmd cmd) {
41405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    static const int gNumPoints[] = {
41505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        1, 2, 3, 4, 0, 0
41605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    };
41705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return gNumPoints[cmd];
41805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
41905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
42005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
42105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Path filling rules
42205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
42305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerenum GrPathFill {
42405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kWinding_PathFill,
42505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kEvenOdd_PathFill,
42605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kInverseWinding_PathFill,
42705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kInverseEvenOdd_PathFill,
42805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kHairLine_PathFill,
42905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
43005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kPathFillCount
43105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
43205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
43305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline GrPathFill NonInvertedFill(GrPathFill fill) {
43405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    static const GrPathFill gNonInvertedFills[] = {
43505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kWinding_PathFill, // kWinding_PathFill
43605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kEvenOdd_PathFill, // kEvenOdd_PathFill
43705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kWinding_PathFill, // kInverseWinding_PathFill
43805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kEvenOdd_PathFill, // kInverseEvenOdd_PathFill
43905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kHairLine_PathFill,// kHairLine_PathFill
44005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    };
44105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(0 == kWinding_PathFill);
44205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(1 == kEvenOdd_PathFill);
44305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(2 == kInverseWinding_PathFill);
44405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(3 == kInverseEvenOdd_PathFill);
44505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(4 == kHairLine_PathFill);
44605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(5 == kPathFillCount);
44705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return gNonInvertedFills[fill];
44805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
44905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
45005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline bool IsFillInverted(GrPathFill fill) {
45105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    static const bool gIsFillInverted[] = {
45205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        false, // kWinding_PathFill
45305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        false, // kEvenOdd_PathFill
45405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        true,  // kInverseWinding_PathFill
45505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        true,  // kInverseEvenOdd_PathFill
45605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        false, // kHairLine_PathFill
45705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    };
45805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(0 == kWinding_PathFill);
45905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(1 == kEvenOdd_PathFill);
46005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(2 == kInverseWinding_PathFill);
46105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(3 == kInverseEvenOdd_PathFill);
46205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(4 == kHairLine_PathFill);
46305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(5 == kPathFillCount);
46405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return gIsFillInverted[fill];
46505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
46605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
46705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
46805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Hints provided about a path's convexity (or lack thereof).
46905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
47005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerenum GrConvexHint {
47105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kNone_ConvexHint,                         //<! No hint about convexity
47205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                                              //   of the path
47305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kConvex_ConvexHint,                       //<! Path is one convex piece
47405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kNonOverlappingConvexPieces_ConvexHint,   //<! Multiple convex pieces,
47505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                                              //   pieces are known to be
47605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                                              //   disjoint
47705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kSameWindingConvexPieces_ConvexHint,      //<! Multiple convex pieces,
47805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                                              //   may or may not intersect,
47905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                                              //   either all wind cw or all
48005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                                              //   wind ccw.
48105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kConcave_ConvexHint                       //<! Path is known to be
48205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                                              //   concave
48305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
48405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
48505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
48605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
48787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerenum GrPlatformSurfaceType {
48887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    /**
48987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * Specifies that the object being created is a render target.
49087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     */
49187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    kRenderTarget_GrPlatformSurfaceType,
49287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    /**
49387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * Specifies that the object being created is a texture.
49487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     */
49587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    kTexture_GrPlatformSurfaceType,
49687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    /**
49787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * Specifies that the object being created is a texture and a render
49887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * target.
49987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     */
50087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    kTextureRenderTarget_GrPlatformSurfaceType,
50187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger};
50287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
50387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerenum GrPlatformRenderTargetFlags {
50487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    kNone_GrPlatformRenderTargetFlagBit             = 0x0,
50587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    /**
50687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * Specifies that the object being created is multisampled.
50787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     */
50887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    kIsMultisampled_GrPlatformRenderTargetFlagBit   = 0x1,
50987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    /**
51087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * Gives permission to Gr to perform the downsample-resolve of a
51187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * multisampled render target. If this is not set then read pixel
51287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * operations may fail. If the object is both a texture and render target
51387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * then this *must* be set. Otherwise, if the client wants do its own
51487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * resolves it must create separate GrRenderTarget and GrTexture objects
51587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * and insert appropriate flushes and resolves betweeen data hazards.
51687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * GrRenderTarget has a flagForResolve()
51787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     */
51887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    kGrCanResolve_GrPlatformRenderTargetFlagBit     = 0x2,
51987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger};
52087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
52135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek SollenbergerGR_MAKE_BITFIELD_OPS(GrPlatformRenderTargetFlags)
52287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
52387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger// opaque type for 3D API object handles
52487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergertypedef intptr_t GrPlatform3DObject;
52587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
52687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger/**
52787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Description of platform surface to create. See below for GL example.
52887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */
52987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstruct GrPlatformSurfaceDesc {
53087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    GrPlatformSurfaceType           fSurfaceType;   // type of surface to create
53187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    /**
53287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * Flags for kRenderTarget and kTextureRenderTarget surface types
53387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     */
53487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    GrPlatformRenderTargetFlags     fRenderTargetFlags;
53587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
53687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    int                             fWidth;         // width in pixels
53787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    int                             fHeight;        // height in pixels
53887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    GrPixelConfig                   fConfig;        // color format
53987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    /**
54087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * Number of per sample stencil buffer. Only relevant if kIsRenderTarget is
54187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * set in fFlags.
54287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     */
54387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    int                             fStencilBits;
54487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    /**
54587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * Texture object in 3D API. Only relevant if fSurfaceType is kTexture or
54687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * kTextureRenderTarget.
54787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * GL: this is a texture object (glGenTextures)
54887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     */
54987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    GrPlatform3DObject              fPlatformTexture;
55087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    /**
55187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * Render target object in 3D API. Only relevant if fSurfaceType is
55287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * kRenderTarget or kTextureRenderTarget
55387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * GL: this is a FBO object (glGenFramebuffers)
55487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     */
55587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    GrPlatform3DObject              fPlatformRenderTarget;
55687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    /**
55787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * 3D API object used as destination of resolve. Only relevant if
55887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * fSurfaceType is kRenderTarget or kTextureRenderTarget and
55987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * kGrCanResolve is set in fRenderTargetFlags.
56087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * fFlags.
56187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     * GL: this is a FBO object (glGenFramebuffers)
56287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     */
56387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    GrPlatform3DObject              fPlatformResolveDestination;
56487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
56587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    void reset() { memset(this, 0, sizeof(GrPlatformSurfaceDesc)); }
56687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger};
56787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
56887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger/**
56987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Example of how to wrap render-to-texture-with-MSAA GL objects with a GrPlatformSurace
57087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger *
57187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * GLint colorBufferID;
57287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * glGenRenderbuffers(1, &colorID);
57387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * glBindRenderbuffer(GL_RENDERBUFFER, colorBufferID);
57487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * glRenderbufferStorageMultisample(GL_RENDERBUFFER, S, GL_RGBA, W, H);
57587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger *
57687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * GLint stencilBufferID;
57787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * glGenRenderBuffers(1, &stencilBufferID);
57887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * glBindRenderbuffer(GL_RENDERBUFFER, stencilBufferID);
57987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * glRenderbufferStorageMultisample(GL_RENDERBUFFER, S, GL_STENCIL_INDEX8, W, H);
58087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger *
58187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * GLint drawFBOID;
58287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * glGenFramebuffers(1, &drawFBOID);
58387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * glBindFramebuffer(GL_FRAMEBUFFER, drawFBOID);
58487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorBufferID);
58587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, stencilBufferID);
58687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger *
58787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * GLint textureID;
58887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * glGenTextures(1, &textureID);
58987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * glBindTexture(GL_TEXTURE_2D, textureID);
59087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, W, H, ...);
59187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger *
59287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * GLint readFBOID;
59387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * glGenFramebuffers(1, &readFBOID);
59487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * glBindFramebuffer(GL_FRAMEBUFFER, readFBOID);
59587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, textureID, 0);
59687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger *
59787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * GrPlatformSurfaceDesc renderTargetTextureDesc;
59887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * renderTargetTextureDesc.fSurfaceType       = kTextureRenderTarget_GrPlatformSurfaceType;
59987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * renderTargetTextureDesc.fRenderTargetFlags = (kIsMultisampled_GrPlatformRenderTargetFlagBit | kGrCanResolve_GrPlatformRenderTargetFlagBit);
60087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * renderTargetTextureDesc.fWidth = W;
60187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * renderTargetTextureDesc.fHeight = H;
60287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * renderTargetTextureDesc.fConfig = kRGBA_8888_GrPixelConfig
60387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * renderTargetTextureDesc.fStencilBits = 8;
60487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * renderTargetTextureDesc.fPlatformTexture = textureID;
60587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * renderTargetTextureDesc.fPlatformRenderTarget = drawFBOID;
60687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * renderTargetTextureDesc.fPlatformResolveDestination = readFBOID;
60787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger *
60887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * GrTexture* texture = static_cast<GrTexture*>(grContext->createPlatrformSurface(renderTargetTextureDesc));
60987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */
61087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
61187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
61287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger///////////////////////////////////////////////////////////////////////////////
61387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
61405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger// this is included only to make it easy to use this debugging facility
61505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrInstanceCounter.h"
61605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
61705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif
618