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)