SkTypes.h revision 2b6be207a1b4595646950324ab1ccf0e3b9f73ac
18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project 38a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 68a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */ 78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkTypes_DEFINED 98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkTypes_DEFINED 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 11f20488b4f2139e6ca09fee7e39b731dd8ab467dbbungeman// IWYU pragma: begin_exports 12f48c62fa6ae703f0e4fa7b97a381eb06afaadc4bbsalomon 13f48c62fa6ae703f0e4fa7b97a381eb06afaadc4bbsalomon// In at least two known scenarios when using GCC with libc++: 14f48c62fa6ae703f0e4fa7b97a381eb06afaadc4bbsalomon// * GCC 4.8 targeting ARMv7 with NEON 15f48c62fa6ae703f0e4fa7b97a381eb06afaadc4bbsalomon// * GCC 4.9 targeting ARMv8 64 bit 16f48c62fa6ae703f0e4fa7b97a381eb06afaadc4bbsalomon// we need to typedef float float32_t (or include <arm_neon.h> which does that) 17f48c62fa6ae703f0e4fa7b97a381eb06afaadc4bbsalomon// before #including <memory>. This makes no sense. I'm not very interested in 18f48c62fa6ae703f0e4fa7b97a381eb06afaadc4bbsalomon// understanding why... these are old, bizarre platform configuration that we 19f48c62fa6ae703f0e4fa7b97a381eb06afaadc4bbsalomon// should just let die. 207ad42cfe87d07f20e629be5685b1507df931dd9ebungeman// See https://llvm.org/bugs/show_bug.cgi?id=25608 . 21f48c62fa6ae703f0e4fa7b97a381eb06afaadc4bbsalomon#include <ciso646> // Include something innocuous to define _LIBCPP_VERISON if it's libc++. 22f48c62fa6ae703f0e4fa7b97a381eb06afaadc4bbsalomon#if defined(__GNUC__) && __GNUC__ == 4 \ 237ad42cfe87d07f20e629be5685b1507df931dd9ebungeman && ((defined(__arm__) && (defined(__ARM_NEON__) || defined(__ARM_NEON))) || defined(__aarch64__)) \ 24f48c62fa6ae703f0e4fa7b97a381eb06afaadc4bbsalomon && defined(_LIBCPP_VERSION) 25f48c62fa6ae703f0e4fa7b97a381eb06afaadc4bbsalomon typedef float float32_t; 26f48c62fa6ae703f0e4fa7b97a381eb06afaadc4bbsalomon #include <memory> 27f48c62fa6ae703f0e4fa7b97a381eb06afaadc4bbsalomon#endif 28f48c62fa6ae703f0e4fa7b97a381eb06afaadc4bbsalomon 298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPreConfig.h" 308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkUserConfig.h" 318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPostConfig.h" 32f20488b4f2139e6ca09fee7e39b731dd8ab467dbbungeman#include <stddef.h> 33fab44db294846ff05d837b9cf0bf97a073891da7bungeman@google.com#include <stdint.h> 34f20488b4f2139e6ca09fee7e39b731dd8ab467dbbungeman// IWYU pragma: end_exports 35f20488b4f2139e6ca09fee7e39b731dd8ab467dbbungeman 36f20488b4f2139e6ca09fee7e39b731dd8ab467dbbungeman#include <string.h> 37d7b34a5ca0a9183e70737125c688d2a8b5310d81Herb Derby// TODO(herb): remove after chromuim skia/ext/SkMemory_new_handler.cpp 38b549cc38c8404c58642ada75c0b24907702cc005Herb Derby// has been updated to point to private/SkMalloc.h 39b549cc38c8404c58642ada75c0b24907702cc005Herb Derby#include "../private/SkMalloc.h" 4095cc012ccaea20f372893ae277ea0a8a6339d094mtklein 41ea5e676a7b75600edcde3912886486004ccd7626Mike Reed// enable to test new device-base clipping 42ea5e676a7b75600edcde3912886486004ccd7626Mike Reed//#define SK_USE_DEVICE_CLIPPING 43ea5e676a7b75600edcde3912886486004ccd7626Mike Reed 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** \file SkTypes.h 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 479aa8b32233702b19b97bebdc2c702e0c53407d45reed@android.com/** See SkGraphics::GetVersion() to retrieve these at runtime 489aa8b32233702b19b97bebdc2c702e0c53407d45reed@android.com */ 499aa8b32233702b19b97bebdc2c702e0c53407d45reed@android.com#define SKIA_VERSION_MAJOR 1 509aa8b32233702b19b97bebdc2c702e0c53407d45reed@android.com#define SKIA_VERSION_MINOR 0 519aa8b32233702b19b97bebdc2c702e0c53407d45reed@android.com#define SKIA_VERSION_PATCH 0 529aa8b32233702b19b97bebdc2c702e0c53407d45reed@android.com 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Called internally if we hit an unrecoverable error. 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com The platform implementation must not return, but should either throw 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com an exception or otherwise exit. 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 58f2b340fc885ad2a12d2d73974eff9c8f4c94192cdjsollenSK_API extern void sk_abort_no_print(void); 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 60bdf736133b513bb13f7c66e01c8c37ac526ce8d4reed@google.com/////////////////////////////////////////////////////////////////////////////// 61bdf736133b513bb13f7c66e01c8c37ac526ce8d4reed@google.com 6236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein#ifdef override_GLOBAL_NEW 63bdf736133b513bb13f7c66e01c8c37ac526ce8d4reed@google.com#include <new> 64bdf736133b513bb13f7c66e01c8c37ac526ce8d4reed@google.com 65bdf736133b513bb13f7c66e01c8c37ac526ce8d4reed@google.cominline void* operator new(size_t size) { 66bdf736133b513bb13f7c66e01c8c37ac526ce8d4reed@google.com return sk_malloc_throw(size); 67bdf736133b513bb13f7c66e01c8c37ac526ce8d4reed@google.com} 68bdf736133b513bb13f7c66e01c8c37ac526ce8d4reed@google.com 69bdf736133b513bb13f7c66e01c8c37ac526ce8d4reed@google.cominline void operator delete(void* p) { 70bdf736133b513bb13f7c66e01c8c37ac526ce8d4reed@google.com sk_free(p); 71bdf736133b513bb13f7c66e01c8c37ac526ce8d4reed@google.com} 72bdf736133b513bb13f7c66e01c8c37ac526ce8d4reed@google.com#endif 73bdf736133b513bb13f7c66e01c8c37ac526ce8d4reed@google.com 74bdf736133b513bb13f7c66e01c8c37ac526ce8d4reed@google.com/////////////////////////////////////////////////////////////////////////////// 758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SK_INIT_TO_AVOID_WARNING = 0 778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkDebugf 79c4ade57cd4ce5083e0fac19111a6ee6e32e18df4george SK_API void SkDebugf(const char format[], ...); 808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 82d6562000efca50bc2bfddae8dcb69dce6b8c0950caryclark#define SkREQUIRE_SEMICOLON_AFTER(code) do { code } while (false) 83d6562000efca50bc2bfddae8dcb69dce6b8c0950caryclark 84d6562000efca50bc2bfddae8dcb69dce6b8c0950caryclark#define SkASSERT_RELEASE(cond) \ 85d6562000efca50bc2bfddae8dcb69dce6b8c0950caryclark SkREQUIRE_SEMICOLON_AFTER(if (!(cond)) { SK_ABORT(#cond); } ) 86f2b340fc885ad2a12d2d73974eff9c8f4c94192cdjsollen 878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG 88d6562000efca50bc2bfddae8dcb69dce6b8c0950caryclark #define SkASSERT(cond) \ 89d6562000efca50bc2bfddae8dcb69dce6b8c0950caryclark SkREQUIRE_SEMICOLON_AFTER(if (!(cond)) { SK_ABORT("assert(" #cond ")"); }) 90d6562000efca50bc2bfddae8dcb69dce6b8c0950caryclark #define SkASSERTF(cond, fmt, ...) \ 91d6562000efca50bc2bfddae8dcb69dce6b8c0950caryclark SkREQUIRE_SEMICOLON_AFTER(if (!(cond)) { \ 92d6562000efca50bc2bfddae8dcb69dce6b8c0950caryclark SkDebugf(fmt"\n", __VA_ARGS__); \ 93d6562000efca50bc2bfddae8dcb69dce6b8c0950caryclark SK_ABORT("assert(" #cond ")"); \ 94d6562000efca50bc2bfddae8dcb69dce6b8c0950caryclark }) 951f790aaeef47b02fe72b9b62d1e8c7ead85ae442bungeman #define SkDEBUGFAIL(message) SK_ABORT(message) 96966e3d30baf676dc399dc9c97ef15cc2c4f8d461herb #define SkDEBUGFAILF(fmt, ...) SkASSERTF(false, fmt, ##__VA_ARGS__) 97ceeaa78713dde9cc6e3ccd688aca6021b260af4dcsmartdalton #define SkDEBUGCODE(...) __VA_ARGS__ 988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define SkDECLAREPARAM(type, var) , type var 998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define SkPARAM(var) , var 1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define SkDEBUGF(args ) SkDebugf args 1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define SkAssertResult(cond) SkASSERT(cond) 1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else 1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define SkASSERT(cond) 1041f790aaeef47b02fe72b9b62d1e8c7ead85ae442bungeman #define SkASSERTF(cond, fmt, ...) 1050c00f21fee3f5cfa3aa7e5d46ff94cb8cf340451tomhudson@google.com #define SkDEBUGFAIL(message) 106e6f8ff00136b589c5ee1fc04de5d910d188fa98dhstern #define SkDEBUGFAILF(fmt, ...) 107ceeaa78713dde9cc6e3ccd688aca6021b260af4dcsmartdalton #define SkDEBUGCODE(...) 1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define SkDEBUGF(args) 1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define SkDECLAREPARAM(type, var) 1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define SkPARAM(var) 1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1129daa4b92d73a1ae441c864a0ae73dda6c3397acbbsalomon // unlike SkASSERT, this guy executes its condition in the non-debug build. 1131b4c01c66081cd163535eab21b29a3996b01a6cfbsalomon // The if is present so that this can be used with functions marked SK_WARN_UNUSED_RESULT. 1141b4c01c66081cd163535eab21b29a3996b01a6cfbsalomon #define SkAssertResult(cond) if (cond) {} do {} while(false) 1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 117f2b340fc885ad2a12d2d73974eff9c8f4c94192cdjsollen// Legacy macro names for SK_ABORT 118f2b340fc885ad2a12d2d73974eff9c8f4c94192cdjsollen#define SkFAIL(message) SK_ABORT(message) 119f2b340fc885ad2a12d2d73974eff9c8f4c94192cdjsollen#define sk_throw() SK_ABORT("sk_throw") 12088cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org 1210f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org#ifdef SK_IGNORE_TO_STRING 122bc3d92a7d84b56eb235d6c2d9b7de00625200713skia.committer@gmail.com #define SK_TO_STRING_NONVIRT() 123bc3d92a7d84b56eb235d6c2d9b7de00625200713skia.committer@gmail.com #define SK_TO_STRING_VIRT() 1240f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org #define SK_TO_STRING_PUREVIRT() 1250f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org #define SK_TO_STRING_OVERRIDE() 1260f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org#else 127d3ebb48320cf1b7e969974673e4bd7743816985ebungeman class SkString; 1280f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org // the 'toString' helper functions convert Sk* objects to human-readable 1290f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org // form in developer mode 1300f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org #define SK_TO_STRING_NONVIRT() void toString(SkString* str) const; 1310f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org #define SK_TO_STRING_VIRT() virtual void toString(SkString* str) const; 1320f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org #define SK_TO_STRING_PUREVIRT() virtual void toString(SkString* str) const = 0; 13336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein #define SK_TO_STRING_OVERRIDE() void toString(SkString* str) const override; 13476f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com#endif 13576f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com 13649a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com/* 13749a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com * Usage: SK_MACRO_CONCAT(a, b) to construct the symbol ab 13849a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com * 13949a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com * SK_MACRO_CONCAT_IMPL_PRIV just exists to make this work. Do not use directly 14049a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com * 14149a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com */ 14249a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com#define SK_MACRO_CONCAT(X, Y) SK_MACRO_CONCAT_IMPL_PRIV(X, Y) 14349a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com#define SK_MACRO_CONCAT_IMPL_PRIV(X, Y) X ## Y 14449a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com 14549a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com/* 14649a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com * Usage: SK_MACRO_APPEND_LINE(foo) to make foo123, where 123 is the current 14749a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com * line number. Easy way to construct 14849a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com * unique names for local functions or 14949a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com * variables. 15049a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com */ 15149a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com#define SK_MACRO_APPEND_LINE(name) SK_MACRO_CONCAT(name, __LINE__) 15249a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com 153e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org/** 154e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * For some classes, it's almost always an error to instantiate one without a name, e.g. 155e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * { 156e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * SkAutoMutexAcquire(&mutex); 157e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * <some code> 158e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * } 159e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * In this case, the writer meant to hold mutex while the rest of the code in the block runs, 160e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * but instead the mutex is acquired and then immediately released. The correct usage is 161e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * { 162e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * SkAutoMutexAcquire lock(&mutex); 163e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * <some code> 164e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * } 165e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * 166e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * To prevent callers from instantiating your class without a name, use SK_REQUIRE_LOCAL_VAR 167e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * like this: 168e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * class classname { 169e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * <your class> 170e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * }; 171e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * #define classname(...) SK_REQUIRE_LOCAL_VAR(classname) 172e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * 173e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * This won't work with templates, and you must inline the class' constructors and destructors. 174e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * Take a look at SkAutoFree and SkAutoMalloc in this file for examples. 175e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org */ 176e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org#define SK_REQUIRE_LOCAL_VAR(classname) \ 17799fe82260633fcf5d92cca38d12ef0937ecca61cbungeman static_assert(false, "missing name for " #classname) 178e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org 1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////// 1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 18137a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com/** 18237a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com * Fast type for signed 8 bits. Use for parameter passing and local variables, 18337a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com * not for storage. 18437a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com */ 18537a3133d2009b276f2126ccb61be1f69074cacb9reed@google.comtypedef int S8CPU; 1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 18737a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com/** 18837a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com * Fast type for unsigned 8 bits. Use for parameter passing and local 18937a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com * variables, not for storage 19037a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com */ 19137a3133d2009b276f2126ccb61be1f69074cacb9reed@google.comtypedef unsigned U8CPU; 19237a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com 19337a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com/** 19437a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com * Fast type for signed 16 bits. Use for parameter passing and local variables, 19537a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com * not for storage 19637a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com */ 19737a3133d2009b276f2126ccb61be1f69074cacb9reed@google.comtypedef int S16CPU; 19837a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com 19937a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com/** 20037a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com * Fast type for unsigned 16 bits. Use for parameter passing and local 20137a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com * variables, not for storage 20237a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com */ 20337a3133d2009b276f2126ccb61be1f69074cacb9reed@google.comtypedef unsigned U16CPU; 20437a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com 20537a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com/** 20637a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com * Meant to be a small version of bool, for storage purposes. Will be 0 or 1 20737a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com */ 20837a3133d2009b276f2126ccb61be1f69074cacb9reed@google.comtypedef uint8_t SkBool8; 2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 21068c14d9b3244ef9d58727ff11f2742be9236f46ebungeman#include "../private/SkTFitsIn.h" 21168c14d9b3244ef9d58727ff11f2742be9236f46ebungemantemplate <typename D, typename S> D SkTo(S s) { 21268c14d9b3244ef9d58727ff11f2742be9236f46ebungeman SkASSERT(SkTFitsIn<D>(s)); 21368c14d9b3244ef9d58727ff11f2742be9236f46ebungeman return static_cast<D>(s); 21468c14d9b3244ef9d58727ff11f2742be9236f46ebungeman} 21568c14d9b3244ef9d58727ff11f2742be9236f46ebungeman#define SkToS8(x) SkTo<int8_t>(x) 21668c14d9b3244ef9d58727ff11f2742be9236f46ebungeman#define SkToU8(x) SkTo<uint8_t>(x) 21768c14d9b3244ef9d58727ff11f2742be9236f46ebungeman#define SkToS16(x) SkTo<int16_t>(x) 21868c14d9b3244ef9d58727ff11f2742be9236f46ebungeman#define SkToU16(x) SkTo<uint16_t>(x) 21968c14d9b3244ef9d58727ff11f2742be9236f46ebungeman#define SkToS32(x) SkTo<int32_t>(x) 22068c14d9b3244ef9d58727ff11f2742be9236f46ebungeman#define SkToU32(x) SkTo<uint32_t>(x) 22168c14d9b3244ef9d58727ff11f2742be9236f46ebungeman#define SkToInt(x) SkTo<int>(x) 22268c14d9b3244ef9d58727ff11f2742be9236f46ebungeman#define SkToUInt(x) SkTo<unsigned>(x) 22368c14d9b3244ef9d58727ff11f2742be9236f46ebungeman#define SkToSizeT(x) SkTo<size_t>(x) 2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Returns 0 or 1 based on the condition 2268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 2275c05d10511610c35f7912d48ede509c7e32e0a3cmtklein#define SkToBool(cond) ((cond) != 0) 2288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SK_MaxS16 32767 2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SK_MinS16 -32767 2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SK_MaxU16 0xFFFF 2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SK_MinU16 0 2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SK_MaxS32 0x7FFFFFFF 234594dd3cd78e2f970d53bb0934fbbb63b41e1d40ccaryclark@google.com#define SK_MinS32 -SK_MaxS32 2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SK_MaxU32 0xFFFFFFFF 2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SK_MinU32 0 237952538ed50661ad7dff6ec2b7af3f921e1d91b52caryclark#define SK_NaN32 ((int) (1U << 31)) 2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 239d4577757874d1dda1a3bffa3f2347c251859c27ereed@android.com/** Returns true if the value can be represented with signed 16bits 240d4577757874d1dda1a3bffa3f2347c251859c27ereed@android.com */ 24190209caa686464cad70dd9d60b53c3d967eb57dareed@android.comstatic inline bool SkIsS16(long x) { 242d4577757874d1dda1a3bffa3f2347c251859c27ereed@android.com return (int16_t)x == x; 243d4577757874d1dda1a3bffa3f2347c251859c27ereed@android.com} 244d4577757874d1dda1a3bffa3f2347c251859c27ereed@android.com 245d4577757874d1dda1a3bffa3f2347c251859c27ereed@android.com/** Returns true if the value can be represented with unsigned 16bits 246d4577757874d1dda1a3bffa3f2347c251859c27ereed@android.com */ 24790209caa686464cad70dd9d60b53c3d967eb57dareed@android.comstatic inline bool SkIsU16(long x) { 248d4577757874d1dda1a3bffa3f2347c251859c27ereed@android.com return (uint16_t)x == x; 249d4577757874d1dda1a3bffa3f2347c251859c27ereed@android.com} 250d4577757874d1dda1a3bffa3f2347c251859c27ereed@android.com 2513127c99986dc932343aae5ccc575237d99c3aaeccaryclarkstatic inline int32_t SkLeftShift(int32_t value, int32_t shift) { 2523127c99986dc932343aae5ccc575237d99c3aaeccaryclark return (int32_t) ((uint32_t) value << shift); 2533127c99986dc932343aae5ccc575237d99c3aaeccaryclark} 2543127c99986dc932343aae5ccc575237d99c3aaeccaryclark 2553127c99986dc932343aae5ccc575237d99c3aaeccaryclarkstatic inline int64_t SkLeftShift(int64_t value, int32_t shift) { 2563127c99986dc932343aae5ccc575237d99c3aaeccaryclark return (int64_t) ((uint64_t) value << shift); 2573127c99986dc932343aae5ccc575237d99c3aaeccaryclark} 2583127c99986dc932343aae5ccc575237d99c3aaeccaryclark 259d4577757874d1dda1a3bffa3f2347c251859c27ereed@android.com////////////////////////////////////////////////////////////////////////////// 2608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 261fc00a7c5015ea534b0f28f8115bfb6253d275e1emtklein/** Returns the number of entries in an array (not a pointer) */ 262fc00a7c5015ea534b0f28f8115bfb6253d275e1emtkleintemplate <typename T, size_t N> char (&SkArrayCountHelper(T (&array)[N]))[N]; 26395b96d649547c6b89ae0eca0f88f965d90c531a5caryclark#define SK_ARRAY_COUNT(array) (sizeof(SkArrayCountHelper(array))) 2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 265b68ce74bd197a9ca4becd53cbcfee825b8d08e0emtklein// Can be used to bracket data types that must be dense, e.g. hash keys. 266b68ce74bd197a9ca4becd53cbcfee825b8d08e0emtklein#if defined(__clang__) // This should work on GCC too, but GCC diagnostic pop didn't seem to work! 267b68ce74bd197a9ca4becd53cbcfee825b8d08e0emtklein #define SK_BEGIN_REQUIRE_DENSE _Pragma("GCC diagnostic push") \ 268b68ce74bd197a9ca4becd53cbcfee825b8d08e0emtklein _Pragma("GCC diagnostic error \"-Wpadded\"") 269b68ce74bd197a9ca4becd53cbcfee825b8d08e0emtklein #define SK_END_REQUIRE_DENSE _Pragma("GCC diagnostic pop") 270b68ce74bd197a9ca4becd53cbcfee825b8d08e0emtklein#else 271b68ce74bd197a9ca4becd53cbcfee825b8d08e0emtklein #define SK_BEGIN_REQUIRE_DENSE 272b68ce74bd197a9ca4becd53cbcfee825b8d08e0emtklein #define SK_END_REQUIRE_DENSE 273b68ce74bd197a9ca4becd53cbcfee825b8d08e0emtklein#endif 274b68ce74bd197a9ca4becd53cbcfee825b8d08e0emtklein 2756a259bfcc80a7b4765b99c7503e5a5b98b7e1523mtklein#define SkAlign2(x) (((x) + 1) >> 1 << 1) 2766a259bfcc80a7b4765b99c7503e5a5b98b7e1523mtklein#define SkIsAlign2(x) (0 == ((x) & 1)) 277c6faa5a0c46004115739cf34e29f4a3aa56a2adcreed@google.com 2786a259bfcc80a7b4765b99c7503e5a5b98b7e1523mtklein#define SkAlign4(x) (((x) + 3) >> 2 << 2) 2796a259bfcc80a7b4765b99c7503e5a5b98b7e1523mtklein#define SkIsAlign4(x) (0 == ((x) & 3)) 2808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2816a259bfcc80a7b4765b99c7503e5a5b98b7e1523mtklein#define SkAlign8(x) (((x) + 7) >> 3 << 3) 2826a259bfcc80a7b4765b99c7503e5a5b98b7e1523mtklein#define SkIsAlign8(x) (0 == ((x) & 7)) 28301224d5d0a3228fe47e63d8346e0e433a87563a8tomhudson@google.com 2846a259bfcc80a7b4765b99c7503e5a5b98b7e1523mtklein#define SkAlign16(x) (((x) + 15) >> 4 << 4) 2856a259bfcc80a7b4765b99c7503e5a5b98b7e1523mtklein#define SkIsAlign16(x) (0 == ((x) & 15)) 286e2b0a0a0349b1c2acbd1eb5c1da7eed012f0980dreed 2876a259bfcc80a7b4765b99c7503e5a5b98b7e1523mtklein#define SkAlignPtr(x) (sizeof(void*) == 8 ? SkAlign8(x) : SkAlign4(x)) 2886a259bfcc80a7b4765b99c7503e5a5b98b7e1523mtklein#define SkIsAlignPtr(x) (sizeof(void*) == 8 ? SkIsAlign8(x) : SkIsAlign4(x)) 2890209e95cc2625a445c1cb6c4213d2182e5c832d7mtklein 2908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comtypedef uint32_t SkFourByteTag; 2918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkSetFourByteTag(a, b, c, d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d)) 2928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** 32 bit integer to hold a unicode value 2948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 2958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comtypedef int32_t SkUnichar; 296ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner 297d0e95a524c20932e0f4e68bab43995188a281395halcanary/** 16 bit unsigned integer to hold a glyph index 298d0e95a524c20932e0f4e68bab43995188a281395halcanary*/ 299d0e95a524c20932e0f4e68bab43995188a281395halcanarytypedef uint16_t SkGlyphID; 300d0e95a524c20932e0f4e68bab43995188a281395halcanary 301ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner/** 32 bit value to hold a millisecond duration 302ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner * Note that SK_MSecMax is about 25 days. 303ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner */ 3048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comtypedef uint32_t SkMSec; 3058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** 1 second measured in milliseconds 3068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 3078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SK_MSec1 1000 308ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner/** maximum representable milliseconds; 24d 20h 31m 23.647s. 3098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 3108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SK_MSecMax 0x7FFFFFFF 3118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Returns a < b for milliseconds, correctly handling wrap-around from 0xFFFFFFFF to 0 3128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 3138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkMSec_LT(a, b) ((int32_t)(a) - (int32_t)(b) < 0) 3148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Returns a <= b for milliseconds, correctly handling wrap-around from 0xFFFFFFFF to 0 3158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 3168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkMSec_LE(a, b) ((int32_t)(a) - (int32_t)(b) <= 0) 3178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3182b4e370a2fe00168838e43f5a78ccc3b371609f5commit-bot@chromium.org/** The generation IDs in Skia reserve 0 has an invalid marker. 3192b4e370a2fe00168838e43f5a78ccc3b371609f5commit-bot@chromium.org */ 3202b4e370a2fe00168838e43f5a78ccc3b371609f5commit-bot@chromium.org#define SK_InvalidGenID 0 3211c63bf6e90f160c9a0d7484dedfaf87c0aa341e9bsalomon/** The unique IDs in Skia reserve 0 has an invalid marker. 3221c63bf6e90f160c9a0d7484dedfaf87c0aa341e9bsalomon */ 3231c63bf6e90f160c9a0d7484dedfaf87c0aa341e9bsalomon#define SK_InvalidUniqueID 0 3242b4e370a2fe00168838e43f5a78ccc3b371609f5commit-bot@chromium.org 3258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/**************************************************************************** 3268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com The rest of these only build with C++ 3278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 3288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef __cplusplus 3298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Faster than SkToBool for integral conditions. Returns 0 or 1 3318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 3327a5bcc5f59bdf122217bc8ca7e756e8c76bae9e1bsalomonstatic inline constexpr int Sk32ToBool(uint32_t n) { 3338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return (n | (0-n)) >> 31; 3348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 336ff436617d8f11297f0eff93ddd49fb9022d0843bbsalomon@google.com/** Generic swap function. Classes with efficient swaps should specialize this function to take 337ff436617d8f11297f0eff93ddd49fb9022d0843bbsalomon@google.com their fast path. This function is used by SkTSort. */ 338bde64e438ae24f9f1c90fff5e1a12e71db5742deMike Kleintemplate <typename T> static inline void SkTSwap(T& a, T& b) { 3396f4293af6906721f09a12818ff3adc767badb3c7bungeman T c(std::move(a)); 3406f4293af6906721f09a12818ff3adc767badb3c7bungeman a = std::move(b); 3416f4293af6906721f09a12818ff3adc767badb3c7bungeman b = std::move(c); 3428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 344d4577757874d1dda1a3bffa3f2347c251859c27ereed@android.comstatic inline int32_t SkAbs32(int32_t value) { 34509a22e9597e271c44dc7c2b71c72cf62a7de1e19mtklein SkASSERT(value != SK_NaN32); // The most negative int32_t can't be negated. 34638bad32cf5297ec6908620fd174cd08c937d331acommit-bot@chromium.org if (value < 0) { 3478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com value = -value; 34838bad32cf5297ec6908620fd174cd08c937d331acommit-bot@chromium.org } 3498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return value; 3508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 352bde64e438ae24f9f1c90fff5e1a12e71db5742deMike Kleintemplate <typename T> static inline T SkTAbs(T value) { 3532b57dc6bb241a6627c4375ee54b73039983d03dareed@google.com if (value < 0) { 3542b57dc6bb241a6627c4375ee54b73039983d03dareed@google.com value = -value; 3552b57dc6bb241a6627c4375ee54b73039983d03dareed@google.com } 3562b57dc6bb241a6627c4375ee54b73039983d03dareed@google.com return value; 3572b57dc6bb241a6627c4375ee54b73039983d03dareed@google.com} 3582b57dc6bb241a6627c4375ee54b73039983d03dareed@google.com 359d4577757874d1dda1a3bffa3f2347c251859c27ereed@android.comstatic inline int32_t SkMax32(int32_t a, int32_t b) { 3608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (a < b) 3618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com a = b; 3628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return a; 3638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 365d4577757874d1dda1a3bffa3f2347c251859c27ereed@android.comstatic inline int32_t SkMin32(int32_t a, int32_t b) { 3668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (a > b) 3678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com a = b; 3688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return a; 3698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 371a0af771612db5ae36b74f1f536bfb335ecd0ec99halcanarytemplate <typename T> constexpr const T& SkTMin(const T& a, const T& b) { 3723b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com return (a < b) ? a : b; 3733b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com} 3743b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com 375a0af771612db5ae36b74f1f536bfb335ecd0ec99halcanarytemplate <typename T> constexpr const T& SkTMax(const T& a, const T& b) { 3763b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com return (b < a) ? a : b; 3773b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com} 3783b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com 379d4577757874d1dda1a3bffa3f2347c251859c27ereed@android.comstatic inline int32_t SkSign32(int32_t a) { 3808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return (a >> 31) | ((unsigned) -a >> 31); 3818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 383d4577757874d1dda1a3bffa3f2347c251859c27ereed@android.comstatic inline int32_t SkFastMin32(int32_t value, int32_t max) { 38438bad32cf5297ec6908620fd174cd08c937d331acommit-bot@chromium.org if (value > max) { 3858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com value = max; 38638bad32cf5297ec6908620fd174cd08c937d331acommit-bot@chromium.org } 3878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return value; 3888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 39062ce0303fb3f9857ee3ab8df05934642c226b1a3bungeman/** Returns value pinned between min and max, inclusively. */ 391a0af771612db5ae36b74f1f536bfb335ecd0ec99halcanarytemplate <typename T> static constexpr const T& SkTPin(const T& value, const T& min, const T& max) { 39262ce0303fb3f9857ee3ab8df05934642c226b1a3bungeman return SkTMax(SkTMin(value, max), min); 3938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3955ec26ae9bfca635ccc98283aad5deda11519d826bsalomon 3965ec26ae9bfca635ccc98283aad5deda11519d826bsalomon/////////////////////////////////////////////////////////////////////////////// 3975ec26ae9bfca635ccc98283aad5deda11519d826bsalomon 3985ec26ae9bfca635ccc98283aad5deda11519d826bsalomon/** 3995ec26ae9bfca635ccc98283aad5deda11519d826bsalomon * Indicates whether an allocation should count against a cache budget. 4005ec26ae9bfca635ccc98283aad5deda11519d826bsalomon */ 4015ec26ae9bfca635ccc98283aad5deda11519d826bsalomonenum class SkBudgeted : bool { 4025ec26ae9bfca635ccc98283aad5deda11519d826bsalomon kNo = false, 4035ec26ae9bfca635ccc98283aad5deda11519d826bsalomon kYes = true 4045ec26ae9bfca635ccc98283aad5deda11519d826bsalomon}; 4055ec26ae9bfca635ccc98283aad5deda11519d826bsalomon 40676948d4faaca9fd7730576e2f79790ca8d93c10brobertphillips/** 40776948d4faaca9fd7730576e2f79790ca8d93c10brobertphillips * Indicates whether a backing store needs to be an exact match or can be larger 40876948d4faaca9fd7730576e2f79790ca8d93c10brobertphillips * than is strictly necessary 40976948d4faaca9fd7730576e2f79790ca8d93c10brobertphillips */ 41076948d4faaca9fd7730576e2f79790ca8d93c10brobertphillipsenum class SkBackingFit { 41176948d4faaca9fd7730576e2f79790ca8d93c10brobertphillips kApprox, 41276948d4faaca9fd7730576e2f79790ca8d93c10brobertphillips kExact 41376948d4faaca9fd7730576e2f79790ca8d93c10brobertphillips}; 41476948d4faaca9fd7730576e2f79790ca8d93c10brobertphillips 4151fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com/////////////////////////////////////////////////////////////////////////////// 4161fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com 417325cb9aa17b94258b362082eb3a799524f4345f3vandebo@chromium.org/** Use to combine multiple bits in a bitmask in a type safe way. 418325cb9aa17b94258b362082eb3a799524f4345f3vandebo@chromium.org */ 419325cb9aa17b94258b362082eb3a799524f4345f3vandebo@chromium.orgtemplate <typename T> 420325cb9aa17b94258b362082eb3a799524f4345f3vandebo@chromium.orgT SkTBitOr(T a, T b) { 421325cb9aa17b94258b362082eb3a799524f4345f3vandebo@chromium.org return (T)(a | b); 422325cb9aa17b94258b362082eb3a799524f4345f3vandebo@chromium.org} 423325cb9aa17b94258b362082eb3a799524f4345f3vandebo@chromium.org 4241fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com/** 4251fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com * Use to cast a pointer to a different type, and maintaining strict-aliasing 4261fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com */ 4271fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.comtemplate <typename Dst> Dst SkTCast(const void* ptr) { 4281fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com union { 4291fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com const void* src; 4301fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com Dst dst; 4311fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com } data; 4321fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com data.src = ptr; 4331fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com return data.dst; 4341fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com} 4351fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com 4368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////////////////////////////////////////////////////////////////////////// 4378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** \class SkNoncopyable 4398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 440055f6b59d879b2adac52748ea5a58c8a05bf501cfmalitaSkNoncopyable is the base class for objects that do not want to 4418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combe copied. It hides its copy-constructor and its assignment-operator. 4428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 4437ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.orgclass SK_API SkNoncopyable { 4448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 4452b6be207a1b4595646950324ab1ccf0e3b9f73acChris Blume SkNoncopyable() = default; 4461fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com 4472b6be207a1b4595646950324ab1ccf0e3b9f73acChris Blume SkNoncopyable(SkNoncopyable&&) = default; 4482b6be207a1b4595646950324ab1ccf0e3b9f73acChris Blume SkNoncopyable& operator =(SkNoncopyable&&) = default; 4492b6be207a1b4595646950324ab1ccf0e3b9f73acChris Blume 4502b6be207a1b4595646950324ab1ccf0e3b9f73acChris Blume SkNoncopyable(const SkNoncopyable&) = delete; 4512b6be207a1b4595646950324ab1ccf0e3b9f73acChris Blume SkNoncopyable& operator=(const SkNoncopyable&) = delete; 4528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 4538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif /* C++ */ 4558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 457