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