/* * Copyright 2010 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrTypes_DEFINED #define GrTypes_DEFINED #include "SkTypes.h" #include "GrConfig.h" //////////////////////////////////////////////////////////////////////////////// /** * Defines overloaded bitwise operators to make it easier to use an enum as a * bitfield. */ #define GR_MAKE_BITFIELD_OPS(X) \ inline X operator | (X a, X b) { \ return (X) (+a | +b); \ } \ \ inline X operator & (X a, X b) { \ return (X) (+a & +b); \ } \ template \ inline X operator & (T a, X b) { \ return (X) (+a & +b); \ } \ template \ inline X operator & (X a, T b) { \ return (X) (+a & +b); \ } \ #define GR_DECL_BITFIELD_OPS_FRIENDS(X) \ friend X operator | (X a, X b); \ \ friend X operator & (X a, X b); \ \ template \ friend X operator & (T a, X b); \ \ template \ friend X operator & (X a, T b); \ //////////////////////////////////////////////////////////////////////////////// /** * Macro to round n up to the next multiple of 4, or return it unchanged if * n is already a multiple of 4 */ #define GrALIGN4(n) SkAlign4(n) #define GrIsALIGN4(n) (((n) & 3) == 0) template const T& GrMin(const T& a, const T& b) { return (a < b) ? a : b; } template const T& GrMax(const T& a, const T& b) { return (b < a) ? a : b; } // compile time versions of min/max #define GR_CT_MAX(a, b) (((b) < (a)) ? (a) : (b)) #define GR_CT_MIN(a, b) (((b) < (a)) ? (b) : (a)) /** * divide, rounding up */ static inline int32_t GrIDivRoundUp(int x, int y) { GrAssert(y > 0); return (x + (y-1)) / y; } static inline uint32_t GrUIDivRoundUp(uint32_t x, uint32_t y) { return (x + (y-1)) / y; } static inline size_t GrSizeDivRoundUp(size_t x, uint32_t y) { return (x + (y-1)) / y; } /** * align up */ static inline uint32_t GrUIAlignUp(uint32_t x, uint32_t alignment) { return GrUIDivRoundUp(x, alignment) * alignment; } static inline uint32_t GrSizeAlignUp(size_t x, uint32_t alignment) { return GrSizeDivRoundUp(x, alignment) * alignment; } /** * amount of pad needed to align up */ static inline uint32_t GrUIAlignUpPad(uint32_t x, uint32_t alignment) { return (alignment - x % alignment) % alignment; } static inline size_t GrSizeAlignUpPad(size_t x, uint32_t alignment) { return (alignment - x % alignment) % alignment; } /** * align down */ static inline uint32_t GrUIAlignDown(uint32_t x, uint32_t alignment) { return (x / alignment) * alignment; } static inline uint32_t GrSizeAlignDown(size_t x, uint32_t alignment) { return (x / alignment) * alignment; } /** * Count elements in an array */ #define GR_ARRAY_COUNT(array) SK_ARRAY_COUNT(array) //!< allocate a block of memory, will never return NULL extern void* GrMalloc(size_t bytes); //!< free block allocated by GrMalloc. ptr may be NULL extern void GrFree(void* ptr); static inline void Gr_bzero(void* dst, size_t size) { memset(dst, 0, size); } /////////////////////////////////////////////////////////////////////////////// /** * Return the number of leading zeros in n */ extern int Gr_clz(uint32_t n); /** * Return true if n is a power of 2 */ static inline bool GrIsPow2(unsigned n) { return n && 0 == (n & (n - 1)); } /** * Return the next power of 2 >= n. */ static inline uint32_t GrNextPow2(uint32_t n) { return n ? (1 << (32 - Gr_clz(n - 1))) : 1; } static inline int GrNextPow2(int n) { GrAssert(n >= 0); // this impl only works for non-neg. return n ? (1 << (32 - Gr_clz(n - 1))) : 1; } /////////////////////////////////////////////////////////////////////////////// /** * 16.16 fixed point type */ typedef int32_t GrFixed; #if GR_DEBUG static inline int16_t GrToS16(intptr_t x) { GrAssert((int16_t)x == x); return (int16_t)x; } #else #define GrToS16(x) x #endif /////////////////////////////////////////////////////////////////////////////// /** * Possible 3D APIs that may be used by Ganesh. */ enum GrEngine { kOpenGL_Shaders_GrEngine, kOpenGL_Fixed_GrEngine, }; /** * Engine-specific 3D context handle * GrGLInterface* for OpenGL. If NULL will use the default GL interface. */ typedef intptr_t GrPlatform3DContext; /////////////////////////////////////////////////////////////////////////////// /** * Type used to describe format of vertices in arrays * Values are defined in GrDrawTarget */ typedef int GrVertexLayout; /** * Geometric primitives used for drawing. */ enum GrPrimitiveType { kTriangles_PrimitiveType, kTriangleStrip_PrimitiveType, kTriangleFan_PrimitiveType, kPoints_PrimitiveType, kLines_PrimitiveType, // 1 pix wide only kLineStrip_PrimitiveType // 1 pix wide only }; static inline bool GrIsPrimTypeLines(GrPrimitiveType type) { return kLines_PrimitiveType == type || kLineStrip_PrimitiveType == type; } static inline bool GrIsPrimTypeTris(GrPrimitiveType type) { return kTriangles_PrimitiveType == type || kTriangleStrip_PrimitiveType == type || kTriangleFan_PrimitiveType == type; } /** * Coeffecients for alpha-blending. */ enum GrBlendCoeff { kZero_BlendCoeff, // 1 // kA565 (1) -> 2 // kA888 (2) -> 4 return 1 << (int)format; } /** * Pixel configurations. * Unpremultiplied configs are intended for conversion out from skia. They are * not supported as input (e.g. drawBitmap or a bitmap shader). */ enum GrPixelConfig { kUnknown_GrPixelConfig, kAlpha_8_GrPixelConfig, kIndex_8_GrPixelConfig, kRGB_565_GrPixelConfig, /** * Premultiplied */ kRGBA_4444_GrPixelConfig, /** * Premultiplied. Byte order is r,g,b,a */ kRGBA_8888_PM_GrPixelConfig, /** * Unpremultiplied. Byte order is r,g,b,a */ kRGBA_8888_UPM_GrPixelConfig, /** * Premultiplied. Byte order is b,g,r,a */ kBGRA_8888_PM_GrPixelConfig, /** * Unpremultiplied. Byte order is b,g,r,a */ kBGRA_8888_UPM_GrPixelConfig, }; // Aliases for pixel configs that match skia's byte order #ifndef SK_CPU_LENDIAN #error "Skia gpu currently assumes little endian" #endif #if 24 == SK_A32_SHIFT && 16 == SK_R32_SHIFT && \ 8 == SK_G32_SHIFT && 0 == SK_B32_SHIFT static const GrPixelConfig kSkia8888_PM_GrPixelConfig = kBGRA_8888_PM_GrPixelConfig; static const GrPixelConfig kSkia8888_UPM_GrPixelConfig = kBGRA_8888_UPM_GrPixelConfig; #elif 24 == SK_A32_SHIFT && 16 == SK_B32_SHIFT && \ 8 == SK_G32_SHIFT && 0 == SK_R32_SHIFT static const GrPixelConfig kSkia8888_PM_GrPixelConfig = kRGBA_8888_PM_GrPixelConfig; static const GrPixelConfig kSkia8888_UPM_GrPixelConfig = kRGBA_8888_UPM_GrPixelConfig; #else #error "SK_*32_SHIFT values must correspond to GL_BGRA or GL_RGBA format." #endif // WebKit is relying on this old name for the native skia PM config. This will // be deleted ASAP because it is so similar to kRGBA_PM_8888_GrPixelConfig but // has a different interpretation when skia is compiled BGRA. static const GrPixelConfig kRGBA_8888_GrPixelConfig = kSkia8888_PM_GrPixelConfig; // Returns true if the pixel config has 8bit r,g,b,a components in that byte // order static inline bool GrPixelConfigIsRGBA8888(GrPixelConfig config) { switch (config) { case kRGBA_8888_PM_GrPixelConfig: case kRGBA_8888_UPM_GrPixelConfig: return true; default: return false; } } // Returns true if the pixel config has 8bit b,g,r,a components in that byte // order static inline bool GrPixelConfigIsBGRA8888(GrPixelConfig config) { switch (config) { case kBGRA_8888_PM_GrPixelConfig: case kBGRA_8888_UPM_GrPixelConfig: return true; default: return false; } } // Returns true if the pixel config is 32 bits per pixel static inline bool GrPixelConfigIs32Bit(GrPixelConfig config) { switch (config) { case kRGBA_8888_PM_GrPixelConfig: case kRGBA_8888_UPM_GrPixelConfig: case kBGRA_8888_PM_GrPixelConfig: case kBGRA_8888_UPM_GrPixelConfig: return true; default: return false; } } // Takes a config and returns the equivalent config with the R and B order // swapped if such a config exists. Otherwise, kUnknown_GrPixelConfig static inline GrPixelConfig GrPixelConfigSwapRAndB(GrPixelConfig config) { switch (config) { case kBGRA_8888_PM_GrPixelConfig: return kRGBA_8888_PM_GrPixelConfig; case kBGRA_8888_UPM_GrPixelConfig: return kRGBA_8888_UPM_GrPixelConfig; case kRGBA_8888_PM_GrPixelConfig: return kBGRA_8888_PM_GrPixelConfig; case kRGBA_8888_UPM_GrPixelConfig: return kBGRA_8888_UPM_GrPixelConfig; default: return kUnknown_GrPixelConfig; } } static inline size_t GrBytesPerPixel(GrPixelConfig config) { switch (config) { case kAlpha_8_GrPixelConfig: case kIndex_8_GrPixelConfig: return 1; case kRGB_565_GrPixelConfig: case kRGBA_4444_GrPixelConfig: return 2; case kRGBA_8888_PM_GrPixelConfig: case kRGBA_8888_UPM_GrPixelConfig: case kBGRA_8888_PM_GrPixelConfig: case kBGRA_8888_UPM_GrPixelConfig: return 4; default: return 0; } } static inline bool GrPixelConfigIsOpaque(GrPixelConfig config) { switch (config) { case kRGB_565_GrPixelConfig: return true; default: return false; } } /** * Premultiplied alpha is the usual for skia. Therefore, configs that are * ambiguous (alpha-only or color-only) are considered premultiplied. */ static inline bool GrPixelConfigIsUnpremultiplied(GrPixelConfig config) { switch (config) { case kRGBA_8888_UPM_GrPixelConfig: case kBGRA_8888_UPM_GrPixelConfig: return true; default: return false; } } static inline bool GrPixelConfigIsAlphaOnly(GrPixelConfig config) { switch (config) { case kAlpha_8_GrPixelConfig: return true; default: return false; } } /** * Used to control the level of antialiasing available for a rendertarget. * Anti-alias quality levels depend on the underlying API/GPU capabilities. */ enum GrAALevels { kNone_GrAALevel, //(grContext->createPlatrformSurface(renderTargetTextureDesc)); */ /////////////////////////////////////////////////////////////////////////////// // this is included only to make it easy to use this debugging facility #include "GrInstanceCounter.h" #endif