SkTypes.h revision fab44db294846ff05d837b9cf0bf97a073891da7
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Copyright 2006 The Android Open Source Project 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * found in the LICENSE file. 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef SkTypes_DEFINED 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SkTypes_DEFINED 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "SkPreConfig.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "SkUserConfig.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "SkPostConfig.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <stdint.h> 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** \file SkTypes.h 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/ 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** See SkGraphics::GetVersion() to retrieve these at runtime 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SKIA_VERSION_MAJOR 1 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SKIA_VERSION_MINOR 0 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SKIA_VERSION_PATCH 0 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory wrappers to be implemented by the porting layer (platform) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/ 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** Called internally if we run out of memory. The platform implementation must 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) not return, but should either throw an exception or otherwise exit. 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/ 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SK_API extern void sk_out_of_memory(void); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** Called internally if we hit an unrecoverable error. 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) The platform implementation must not return, but should either throw 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) an exception or otherwise exit. 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/ 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SK_API extern void sk_throw(void); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum { 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SK_MALLOC_TEMP = 0x01, //!< hint to sk_malloc that the requested memory will be freed in the scope of the stack frame 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SK_MALLOC_THROW = 0x02 //!< instructs sk_malloc to call sk_throw if the memory cannot be allocated. 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** Return a block of memory (at least 4-byte aligned) of at least the 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) specified size. If the requested memory cannot be returned, either 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return null (if SK_MALLOC_TEMP bit is clear) or throw an exception 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (if SK_MALLOC_TEMP bit is set). To free the memory, call sk_free(). 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/ 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SK_API extern void* sk_malloc_flags(size_t size, unsigned flags); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** Same as sk_malloc(), but hard coded to pass SK_MALLOC_THROW as the flag 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/ 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SK_API extern void* sk_malloc_throw(size_t size); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** Same as standard realloc(), but this one never returns null on failure. It will throw 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) an exception if it fails. 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/ 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SK_API extern void* sk_realloc_throw(void* buffer, size_t size); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** Free memory returned by sk_malloc(). It is safe to pass null. 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/ 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SK_API extern void sk_free(void*); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** Much like calloc: returns a pointer to at least size zero bytes, or NULL on failure. 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SK_API extern void* sk_calloc(size_t size); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** Same as sk_calloc, but throws an exception instead of returning NULL on failure. 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SK_API extern void* sk_calloc_throw(size_t size); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// bzero is safer than memset, but we can't rely on it, so... sk_bzero() 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline void sk_bzero(void* buffer, size_t size) { 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memset(buffer, 0, size); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifdef SK_OVERRIDE_GLOBAL_NEW 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <new> 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)inline void* operator new(size_t size) { 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return sk_malloc_throw(size); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)inline void operator delete(void* p) { 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sk_free(p); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SK_INIT_TO_AVOID_WARNING = 0 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef SkDebugf 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SkDebugf(const char format[], ...); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifdef SK_DEBUG 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SkASSERT(cond) SK_DEBUGBREAK(cond) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SkDEBUGFAIL(message) SkASSERT(false && message) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SkDEBUGCODE(code) code 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SkDECLAREPARAM(type, var) , type var 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SkPARAM(var) , var 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// #define SkDEBUGF(args ) SkDebugf##args 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SkDEBUGF(args ) SkDebugf args 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SkAssertResult(cond) SkASSERT(cond) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SkASSERT(cond) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SkDEBUGFAIL(message) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SkDEBUGCODE(code) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SkDEBUGF(args) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SkDECLAREPARAM(type, var) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SkPARAM(var) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // unlike SkASSERT, this guy executes its condition in the non-debug build 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SkAssertResult(cond) cond 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifdef SK_DEVELOPER 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SkDEVCODE(code) code 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the 'toString' helper functions convert Sk* objects to human-readable 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // form in developer mode 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SK_DEVELOPER_TO_STRING() virtual void toString(SkString* str) const SK_OVERRIDE; 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SkDEVCODE(code) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SK_DEVELOPER_TO_STRING() 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <bool> 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct SkCompileAssert { 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SK_COMPILE_ASSERT(expr, msg) \ 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef SkCompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1] SK_UNUSED 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Usage: SK_MACRO_CONCAT(a, b) to construct the symbol ab 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * SK_MACRO_CONCAT_IMPL_PRIV just exists to make this work. Do not use directly 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SK_MACRO_CONCAT(X, Y) SK_MACRO_CONCAT_IMPL_PRIV(X, Y) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SK_MACRO_CONCAT_IMPL_PRIV(X, Y) X ## Y 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Usage: SK_MACRO_APPEND_LINE(foo) to make foo123, where 123 is the current 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * line number. Easy way to construct 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * unique names for local functions or 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * variables. 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SK_MACRO_APPEND_LINE(name) SK_MACRO_CONCAT(name, __LINE__) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/////////////////////////////////////////////////////////////////////// 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Fast type for signed 8 bits. Use for parameter passing and local variables, 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * not for storage. 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef int S8CPU; 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Fast type for unsigned 8 bits. Use for parameter passing and local 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * variables, not for storage 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef unsigned U8CPU; 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Fast type for signed 16 bits. Use for parameter passing and local variables, 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * not for storage 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef int S16CPU; 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Fast type for unsigned 16 bits. Use for parameter passing and local 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * variables, not for storage 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef unsigned U16CPU; 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Meant to be faster than bool (doesn't promise to be 0 or 1, 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * just 0 or non-zero 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef int SkBool; 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Meant to be a small version of bool, for storage purposes. Will be 0 or 1 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef uint8_t SkBool8; 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifdef SK_DEBUG 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SK_API int8_t SkToS8(intmax_t); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SK_API uint8_t SkToU8(uintmax_t); 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SK_API int16_t SkToS16(intmax_t); 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SK_API uint16_t SkToU16(uintmax_t); 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SK_API int32_t SkToS32(intmax_t); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SK_API uint32_t SkToU32(uintmax_t); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SkToS8(x) ((int8_t)(x)) 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SkToU8(x) ((uint8_t)(x)) 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SkToS16(x) ((int16_t)(x)) 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SkToU16(x) ((uint16_t)(x)) 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SkToS32(x) ((int32_t)(x)) 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SkToU32(x) ((uint32_t)(x)) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** Returns 0 or 1 based on the condition 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/ 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SkToBool(cond) ((cond) != 0) 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SK_MaxS16 32767 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SK_MinS16 -32767 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SK_MaxU16 0xFFFF 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SK_MinU16 0 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SK_MaxS32 0x7FFFFFFF 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SK_MinS32 -SK_MaxS32 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SK_MaxU32 0xFFFFFFFF 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SK_MinU32 0 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SK_NaN32 (1 << 31) 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** Returns true if the value can be represented with signed 16bits 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline bool SkIsS16(long x) { 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (int16_t)x == x; 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** Returns true if the value can be represented with unsigned 16bits 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline bool SkIsU16(long x) { 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (uint16_t)x == x; 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////// 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef SK_OFFSETOF 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #define SK_OFFSETOF(type, field) (size_t)((char*)&(((type*)1)->field) - (char*)1) 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** Returns the number of entries in an array (not a pointer) 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/ 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SK_ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0])) 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SkAlign2(x) (((x) + 1) >> 1 << 1) 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SkIsAlign2(x) (0 == ((x) & 1)) 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SkAlign4(x) (((x) + 3) >> 2 << 2) 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SkIsAlign4(x) (0 == ((x) & 3)) 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SkAlign8(x) (((x) + 7) >> 3 << 3) 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SkIsAlign8(x) (0 == ((x) & 7)) 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef uint32_t SkFourByteTag; 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SkSetFourByteTag(a, b, c, d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d)) 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 32 bit integer to hold a unicode value 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/ 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef int32_t SkUnichar; 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 32 bit value to hold a millisecond count 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/ 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef uint32_t SkMSec; 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 1 second measured in milliseconds 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/ 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SK_MSec1 1000 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** maximum representable milliseconds 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/ 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SK_MSecMax 0x7FFFFFFF 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** Returns a < b for milliseconds, correctly handling wrap-around from 0xFFFFFFFF to 0 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/ 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SkMSec_LT(a, b) ((int32_t)(a) - (int32_t)(b) < 0) 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** Returns a <= b for milliseconds, correctly handling wrap-around from 0xFFFFFFFF to 0 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/ 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SkMSec_LE(a, b) ((int32_t)(a) - (int32_t)(b) <= 0) 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**************************************************************************** 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) The rest of these only build with C++ 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/ 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifdef __cplusplus 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** Faster than SkToBool for integral conditions. Returns 0 or 1 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/ 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline int Sk32ToBool(uint32_t n) { 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (n | (0-n)) >> 31; 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** Generic swap function. Classes with efficient swaps should specialize this function to take 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) their fast path. This function is used by SkTSort. */ 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename T> inline void SkTSwap(T& a, T& b) { 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) T c(a); 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) a = b; 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) b = c; 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline int32_t SkAbs32(int32_t value) { 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value < 0) { 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value = -value; 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return value; 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename T> inline T SkTAbs(T value) { 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value < 0) { 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value = -value; 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return value; 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline int32_t SkMax32(int32_t a, int32_t b) { 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (a < b) 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) a = b; 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return a; 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline int32_t SkMin32(int32_t a, int32_t b) { 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (a > b) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) a = b; 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return a; 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename T> const T& SkTMin(const T& a, const T& b) { 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (a < b) ? a : b; 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename T> const T& SkTMax(const T& a, const T& b) { 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (b < a) ? a : b; 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline int32_t SkSign32(int32_t a) { 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (a >> 31) | ((unsigned) -a >> 31); 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline int32_t SkFastMin32(int32_t value, int32_t max) { 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value > max) { 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value = max; 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return value; 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** Returns signed 32 bit value pinned between min and max, inclusively 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/ 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline int32_t SkPin32(int32_t value, int32_t min, int32_t max) { 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value < min) { 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value = min; 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value > max) { 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value = max; 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return value; 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline uint32_t SkSetClearShift(uint32_t bits, bool cond, 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned shift) { 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkASSERT((int)cond == 0 || (int)cond == 1); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (bits & ~(1 << shift)) | ((int)cond << shift); 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline uint32_t SkSetClearMask(uint32_t bits, bool cond, 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t mask) { 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return cond ? bits | mask : bits & ~mask; 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** Use to combine multiple bits in a bitmask in a type safe way. 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename T> 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)T SkTBitOr(T a, T b) { 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (T)(a | b); 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Use to cast a pointer to a different type, and maintaining strict-aliasing 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename Dst> Dst SkTCast(const void* ptr) { 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) union { 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const void* src; 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Dst dst; 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } data; 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data.src = ptr; 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return data.dst; 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////// 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** \class SkNoncopyable 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SkNoncopyable is the base class for objects that may do not want to 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)be copied. It hides its copy-constructor and its assignment-operator. 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/ 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SK_API SkNoncopyable { 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkNoncopyable() {} 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkNoncopyable(const SkNoncopyable&); 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkNoncopyable& operator=(const SkNoncopyable&); 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SkAutoFree : SkNoncopyable { 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkAutoFree() : fPtr(NULL) {} 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit SkAutoFree(void* ptr) : fPtr(ptr) {} 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~SkAutoFree() { sk_free(fPtr); } 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** Return the currently allocate buffer, or null 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* get() const { return fPtr; } 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** Assign a new ptr allocated with sk_malloc (or null), and return the 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) previous ptr. Note it is the caller's responsibility to sk_free the 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) returned ptr. 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* set(void* ptr) { 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* prev = fPtr; 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fPtr = ptr; 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return prev; 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** Transfer ownership of the current ptr to the caller, setting the 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal reference to null. Note the caller is reponsible for calling 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sk_free on the returned address. 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* detach() { return this->set(NULL); } 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** Free the current buffer, and set the internal reference to NULL. Same 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) as calling sk_free(detach()) 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void free() { 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sk_free(fPtr); 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fPtr = NULL; 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* fPtr; 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // illegal 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkAutoFree(const SkAutoFree&); 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkAutoFree& operator=(const SkAutoFree&); 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Manage an allocated block of heap memory. This object is the sole manager of 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * the lifetime of the block, so the caller must not call sk_free() or delete 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * on the block, unless detach() was called. 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SkAutoMalloc : public SkNoncopyable { 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit SkAutoMalloc(size_t size = 0) { 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fPtr = size ? sk_malloc_throw(size) : NULL; 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fSize = size; 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~SkAutoMalloc() { 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sk_free(fPtr); 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Passed to reset to specify what happens if the requested size is smaller 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * than the current size (and the current block was dynamically allocated). 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum OnShrink { 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * If the requested size is smaller than the current size, and the 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * current block is dynamically allocated, free the old block and 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * malloc a new block of the smaller size. 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kAlloc_OnShrink, 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * If the requested size is smaller than the current size, and the 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * current block is dynamically allocated, just return the old 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * block. 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kReuse_OnShrink 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Reallocates the block to a new size. The ptr may or may not change. 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* reset(size_t size, OnShrink shrink = kAlloc_OnShrink, bool* didChangeAlloc = NULL) { 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (size == fSize || (kReuse_OnShrink == shrink && size < fSize)) { 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (NULL != didChangeAlloc) { 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *didChangeAlloc = false; 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fPtr; 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sk_free(fPtr); 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fPtr = size ? sk_malloc_throw(size) : NULL; 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fSize = size; 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (NULL != didChangeAlloc) { 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *didChangeAlloc = true; 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fPtr; 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Releases the block back to the heap 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void free() { 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->reset(0); 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Return the allocated block. 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* get() { return fPtr; } 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const void* get() const { return fPtr; } 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** Transfer ownership of the current ptr to the caller, setting the 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal reference to null. Note the caller is reponsible for calling 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sk_free on the returned address. 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* detach() { 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* ptr = fPtr; 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fPtr = NULL; 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fSize = 0; 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ptr; 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* fPtr; 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t fSize; // can be larger than the requested size (see kReuse) 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Manage an allocated block of memory. If the requested size is <= kSize, then 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * the allocation will come from the stack rather than the heap. This object 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * is the sole manager of the lifetime of the block, so the caller must not 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * call sk_free() or delete on the block. 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <size_t kSize> class SkAutoSMalloc : SkNoncopyable { 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Creates initially empty storage. get() returns a ptr, but it is to 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * a zero-byte allocation. Must call reset(size) to return an allocated 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * block. 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkAutoSMalloc() { 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fPtr = fStorage; 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fSize = kSize; 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Allocate a block of the specified size. If size <= kSize, then the 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * allocation will come from the stack, otherwise it will be dynamically 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * allocated. 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit SkAutoSMalloc(size_t size) { 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fPtr = fStorage; 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fSize = kSize; 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->reset(size); 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Free the allocated block (if any). If the block was small enought to 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * have been allocated on the stack (size <= kSize) then this does nothing. 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~SkAutoSMalloc() { 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (fPtr != (void*)fStorage) { 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sk_free(fPtr); 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Return the allocated block. May return non-null even if the block is 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * of zero size. Since this may be on the stack or dynamically allocated, 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * the caller must not call sk_free() on it, but must rely on SkAutoSMalloc 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * to manage it. 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* get() const { return fPtr; } 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Return a new block of the requested size, freeing (as necessary) any 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * previously allocated block. As with the constructor, if size <= kSize 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * then the return block may be allocated locally, rather than from the 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * heap. 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* reset(size_t size, 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkAutoMalloc::OnShrink shrink = SkAutoMalloc::kAlloc_OnShrink, 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool* didChangeAlloc = NULL) { 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size = (size < kSize) ? kSize : size; 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool alloc = size != fSize && (SkAutoMalloc::kAlloc_OnShrink == shrink || size > fSize); 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (NULL != didChangeAlloc) { 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *didChangeAlloc = alloc; 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (alloc) { 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (fPtr != (void*)fStorage) { 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sk_free(fPtr); 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (size == kSize) { 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkASSERT(fPtr != fStorage); // otherwise we lied when setting didChangeAlloc. 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fPtr = fStorage; 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fPtr = sk_malloc_flags(size, SK_MALLOC_THROW | SK_MALLOC_TEMP); 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fSize = size; 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkASSERT(fSize >= size && fSize >= kSize); 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkASSERT((fPtr == fStorage) || fSize > kSize); 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fPtr; 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* fPtr; 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t fSize; // can be larger than the requested size (see kReuse) 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t fStorage[(kSize + 3) >> 2]; 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif /* C++ */ 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)