SkTypes.h revision 37bbfe3ea4745170df3f5ef2f4c1e1332af49cea
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 8237bbfe3ea4745170df3f5ef2f4c1e1332af49ceaMike Klein// SkASSERT, SkASSERTF and SkASSERT_RELEASE can be used as stand alone assertion expressions, e.g. 8337bbfe3ea4745170df3f5ef2f4c1e1332af49ceaMike Klein// uint32_t foo(int x) { 8437bbfe3ea4745170df3f5ef2f4c1e1332af49ceaMike Klein// SkASSERT(x > 4); 8537bbfe3ea4745170df3f5ef2f4c1e1332af49ceaMike Klein// return x - 4; 8637bbfe3ea4745170df3f5ef2f4c1e1332af49ceaMike Klein// } 8737bbfe3ea4745170df3f5ef2f4c1e1332af49ceaMike Klein// and are also written to be compatible with constexpr functions: 8837bbfe3ea4745170df3f5ef2f4c1e1332af49ceaMike Klein// constexpr uint32_t foo(int x) { 8937bbfe3ea4745170df3f5ef2f4c1e1332af49ceaMike Klein// return SkASSERT(x > 4), 9037bbfe3ea4745170df3f5ef2f4c1e1332af49ceaMike Klein// x - 4; 9137bbfe3ea4745170df3f5ef2f4c1e1332af49ceaMike Klein// } 92d6562000efca50bc2bfddae8dcb69dce6b8c0950caryclark#define SkASSERT_RELEASE(cond) \ 9337bbfe3ea4745170df3f5ef2f4c1e1332af49ceaMike Klein static_cast<void>( (cond) ? (void)0 : []{ SK_ABORT("assert(" #cond ")"); }() ) 94f2b340fc885ad2a12d2d73974eff9c8f4c94192cdjsollen 958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG 9637bbfe3ea4745170df3f5ef2f4c1e1332af49ceaMike Klein #define SkASSERT(cond) SkASSERT_RELEASE(cond) 9737bbfe3ea4745170df3f5ef2f4c1e1332af49ceaMike Klein #define SkASSERTF(cond, fmt, ...) static_cast<void>( (cond) ? (void)0 : [&]{ \ 9837bbfe3ea4745170df3f5ef2f4c1e1332af49ceaMike Klein SkDebugf(fmt"\n", __VA_ARGS__); \ 9937bbfe3ea4745170df3f5ef2f4c1e1332af49ceaMike Klein SK_ABORT("assert(" #cond ")"); \ 10037bbfe3ea4745170df3f5ef2f4c1e1332af49ceaMike Klein }() ) 1011f790aaeef47b02fe72b9b62d1e8c7ead85ae442bungeman #define SkDEBUGFAIL(message) SK_ABORT(message) 102966e3d30baf676dc399dc9c97ef15cc2c4f8d461herb #define SkDEBUGFAILF(fmt, ...) SkASSERTF(false, fmt, ##__VA_ARGS__) 103ceeaa78713dde9cc6e3ccd688aca6021b260af4dcsmartdalton #define SkDEBUGCODE(...) __VA_ARGS__ 1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define SkDEBUGF(args ) SkDebugf args 1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define SkAssertResult(cond) SkASSERT(cond) 1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else 10737bbfe3ea4745170df3f5ef2f4c1e1332af49ceaMike Klein #define SkASSERT(cond) static_cast<void>(0) 10837bbfe3ea4745170df3f5ef2f4c1e1332af49ceaMike Klein #define SkASSERTF(cond, fmt, ...) static_cast<void>(0) 1090c00f21fee3f5cfa3aa7e5d46ff94cb8cf340451tomhudson@google.com #define SkDEBUGFAIL(message) 110e6f8ff00136b589c5ee1fc04de5d910d188fa98dhstern #define SkDEBUGFAILF(fmt, ...) 111ceeaa78713dde9cc6e3ccd688aca6021b260af4dcsmartdalton #define SkDEBUGCODE(...) 1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define SkDEBUGF(args) 1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1149daa4b92d73a1ae441c864a0ae73dda6c3397acbbsalomon // unlike SkASSERT, this guy executes its condition in the non-debug build. 1151b4c01c66081cd163535eab21b29a3996b01a6cfbsalomon // The if is present so that this can be used with functions marked SK_WARN_UNUSED_RESULT. 1161b4c01c66081cd163535eab21b29a3996b01a6cfbsalomon #define SkAssertResult(cond) if (cond) {} do {} while(false) 1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1190f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org#ifdef SK_IGNORE_TO_STRING 120bc3d92a7d84b56eb235d6c2d9b7de00625200713skia.committer@gmail.com #define SK_TO_STRING_NONVIRT() 121bc3d92a7d84b56eb235d6c2d9b7de00625200713skia.committer@gmail.com #define SK_TO_STRING_VIRT() 1220f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org #define SK_TO_STRING_PUREVIRT() 1230f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org #define SK_TO_STRING_OVERRIDE() 1240f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org#else 125d3ebb48320cf1b7e969974673e4bd7743816985ebungeman class SkString; 1260f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org // the 'toString' helper functions convert Sk* objects to human-readable 1270f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org // form in developer mode 1280f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org #define SK_TO_STRING_NONVIRT() void toString(SkString* str) const; 1290f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org #define SK_TO_STRING_VIRT() virtual void toString(SkString* str) const; 1300f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org #define SK_TO_STRING_PUREVIRT() virtual void toString(SkString* str) const = 0; 13136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein #define SK_TO_STRING_OVERRIDE() void toString(SkString* str) const override; 13276f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com#endif 13376f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com 13449a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com/* 13549a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com * Usage: SK_MACRO_CONCAT(a, b) to construct the symbol ab 13649a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com * 13749a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com * SK_MACRO_CONCAT_IMPL_PRIV just exists to make this work. Do not use directly 13849a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com * 13949a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com */ 14049a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com#define SK_MACRO_CONCAT(X, Y) SK_MACRO_CONCAT_IMPL_PRIV(X, Y) 14149a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com#define SK_MACRO_CONCAT_IMPL_PRIV(X, Y) X ## Y 14249a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com 14349a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com/* 14449a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com * Usage: SK_MACRO_APPEND_LINE(foo) to make foo123, where 123 is the current 14549a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com * line number. Easy way to construct 14649a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com * unique names for local functions or 14749a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com * variables. 14849a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com */ 14949a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com#define SK_MACRO_APPEND_LINE(name) SK_MACRO_CONCAT(name, __LINE__) 15049a5b1967ac5bbc6699bee9a2c66088c42aef6fdreed@google.com 151e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org/** 152e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * For some classes, it's almost always an error to instantiate one without a name, e.g. 153e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * { 154e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * SkAutoMutexAcquire(&mutex); 155e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * <some code> 156e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * } 157e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * In this case, the writer meant to hold mutex while the rest of the code in the block runs, 158e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * but instead the mutex is acquired and then immediately released. The correct usage is 159e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * { 160e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * SkAutoMutexAcquire lock(&mutex); 161e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * <some code> 162e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * } 163e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * 164e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * To prevent callers from instantiating your class without a name, use SK_REQUIRE_LOCAL_VAR 165e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * like this: 166e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * class classname { 167e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * <your class> 168e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * }; 169e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * #define classname(...) SK_REQUIRE_LOCAL_VAR(classname) 170e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * 171e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * This won't work with templates, and you must inline the class' constructors and destructors. 172e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org * Take a look at SkAutoFree and SkAutoMalloc in this file for examples. 173e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org */ 174e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org#define SK_REQUIRE_LOCAL_VAR(classname) \ 17599fe82260633fcf5d92cca38d12ef0937ecca61cbungeman static_assert(false, "missing name for " #classname) 176e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org 1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////// 1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 17937a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com/** 18037a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com * Fast type for signed 8 bits. Use for parameter passing and local variables, 18137a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com * not for storage. 18237a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com */ 18337a3133d2009b276f2126ccb61be1f69074cacb9reed@google.comtypedef int S8CPU; 1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 18537a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com/** 18637a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com * Fast type for unsigned 8 bits. Use for parameter passing and local 18737a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com * variables, not for storage 18837a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com */ 18937a3133d2009b276f2126ccb61be1f69074cacb9reed@google.comtypedef unsigned U8CPU; 19037a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com 19137a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com/** 19237a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com * Fast type for signed 16 bits. Use for parameter passing and local variables, 19337a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com * not for storage 19437a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com */ 19537a3133d2009b276f2126ccb61be1f69074cacb9reed@google.comtypedef int S16CPU; 19637a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com 19737a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com/** 19837a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com * Fast type for unsigned 16 bits. Use for parameter passing and local 19937a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com * variables, not for storage 20037a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com */ 20137a3133d2009b276f2126ccb61be1f69074cacb9reed@google.comtypedef unsigned U16CPU; 20237a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com 20337a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com/** 20437a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com * Meant to be a small version of bool, for storage purposes. Will be 0 or 1 20537a3133d2009b276f2126ccb61be1f69074cacb9reed@google.com */ 20637a3133d2009b276f2126ccb61be1f69074cacb9reed@google.comtypedef uint8_t SkBool8; 2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 20868c14d9b3244ef9d58727ff11f2742be9236f46ebungeman#include "../private/SkTFitsIn.h" 20968c14d9b3244ef9d58727ff11f2742be9236f46ebungemantemplate <typename D, typename S> D SkTo(S s) { 21068c14d9b3244ef9d58727ff11f2742be9236f46ebungeman SkASSERT(SkTFitsIn<D>(s)); 21168c14d9b3244ef9d58727ff11f2742be9236f46ebungeman return static_cast<D>(s); 21268c14d9b3244ef9d58727ff11f2742be9236f46ebungeman} 21368c14d9b3244ef9d58727ff11f2742be9236f46ebungeman#define SkToS8(x) SkTo<int8_t>(x) 21468c14d9b3244ef9d58727ff11f2742be9236f46ebungeman#define SkToU8(x) SkTo<uint8_t>(x) 21568c14d9b3244ef9d58727ff11f2742be9236f46ebungeman#define SkToS16(x) SkTo<int16_t>(x) 21668c14d9b3244ef9d58727ff11f2742be9236f46ebungeman#define SkToU16(x) SkTo<uint16_t>(x) 21768c14d9b3244ef9d58727ff11f2742be9236f46ebungeman#define SkToS32(x) SkTo<int32_t>(x) 21868c14d9b3244ef9d58727ff11f2742be9236f46ebungeman#define SkToU32(x) SkTo<uint32_t>(x) 21968c14d9b3244ef9d58727ff11f2742be9236f46ebungeman#define SkToInt(x) SkTo<int>(x) 22068c14d9b3244ef9d58727ff11f2742be9236f46ebungeman#define SkToUInt(x) SkTo<unsigned>(x) 22168c14d9b3244ef9d58727ff11f2742be9236f46ebungeman#define SkToSizeT(x) SkTo<size_t>(x) 2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Returns 0 or 1 based on the condition 2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 2255b071782585024bd75a203f3cde0429bfb7ec99dBen Wagner#define SkToBool(cond) ((cond) != 0) 2268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SK_MaxS16 32767 2288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SK_MinS16 -32767 2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SK_MaxU16 0xFFFF 2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SK_MinU16 0 2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SK_MaxS32 0x7FFFFFFF 232594dd3cd78e2f970d53bb0934fbbb63b41e1d40ccaryclark@google.com#define SK_MinS32 -SK_MaxS32 2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SK_MaxU32 0xFFFFFFFF 2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SK_MinU32 0 235952538ed50661ad7dff6ec2b7af3f921e1d91b52caryclark#define SK_NaN32 ((int) (1U << 31)) 2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2373127c99986dc932343aae5ccc575237d99c3aaeccaryclarkstatic inline int32_t SkLeftShift(int32_t value, int32_t shift) { 2383127c99986dc932343aae5ccc575237d99c3aaeccaryclark return (int32_t) ((uint32_t) value << shift); 2393127c99986dc932343aae5ccc575237d99c3aaeccaryclark} 2403127c99986dc932343aae5ccc575237d99c3aaeccaryclark 2413127c99986dc932343aae5ccc575237d99c3aaeccaryclarkstatic inline int64_t SkLeftShift(int64_t value, int32_t shift) { 2423127c99986dc932343aae5ccc575237d99c3aaeccaryclark return (int64_t) ((uint64_t) value << shift); 2433127c99986dc932343aae5ccc575237d99c3aaeccaryclark} 2443127c99986dc932343aae5ccc575237d99c3aaeccaryclark 245d4577757874d1dda1a3bffa3f2347c251859c27ereed@android.com////////////////////////////////////////////////////////////////////////////// 2468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 247fc00a7c5015ea534b0f28f8115bfb6253d275e1emtklein/** Returns the number of entries in an array (not a pointer) */ 248fc00a7c5015ea534b0f28f8115bfb6253d275e1emtkleintemplate <typename T, size_t N> char (&SkArrayCountHelper(T (&array)[N]))[N]; 24995b96d649547c6b89ae0eca0f88f965d90c531a5caryclark#define SK_ARRAY_COUNT(array) (sizeof(SkArrayCountHelper(array))) 2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 251b68ce74bd197a9ca4becd53cbcfee825b8d08e0emtklein// Can be used to bracket data types that must be dense, e.g. hash keys. 252b68ce74bd197a9ca4becd53cbcfee825b8d08e0emtklein#if defined(__clang__) // This should work on GCC too, but GCC diagnostic pop didn't seem to work! 253b68ce74bd197a9ca4becd53cbcfee825b8d08e0emtklein #define SK_BEGIN_REQUIRE_DENSE _Pragma("GCC diagnostic push") \ 254b68ce74bd197a9ca4becd53cbcfee825b8d08e0emtklein _Pragma("GCC diagnostic error \"-Wpadded\"") 255b68ce74bd197a9ca4becd53cbcfee825b8d08e0emtklein #define SK_END_REQUIRE_DENSE _Pragma("GCC diagnostic pop") 256b68ce74bd197a9ca4becd53cbcfee825b8d08e0emtklein#else 257b68ce74bd197a9ca4becd53cbcfee825b8d08e0emtklein #define SK_BEGIN_REQUIRE_DENSE 258b68ce74bd197a9ca4becd53cbcfee825b8d08e0emtklein #define SK_END_REQUIRE_DENSE 259b68ce74bd197a9ca4becd53cbcfee825b8d08e0emtklein#endif 260b68ce74bd197a9ca4becd53cbcfee825b8d08e0emtklein 2616a259bfcc80a7b4765b99c7503e5a5b98b7e1523mtklein#define SkAlign2(x) (((x) + 1) >> 1 << 1) 2626a259bfcc80a7b4765b99c7503e5a5b98b7e1523mtklein#define SkIsAlign2(x) (0 == ((x) & 1)) 263c6faa5a0c46004115739cf34e29f4a3aa56a2adcreed@google.com 2646a259bfcc80a7b4765b99c7503e5a5b98b7e1523mtklein#define SkAlign4(x) (((x) + 3) >> 2 << 2) 2656a259bfcc80a7b4765b99c7503e5a5b98b7e1523mtklein#define SkIsAlign4(x) (0 == ((x) & 3)) 2668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2676a259bfcc80a7b4765b99c7503e5a5b98b7e1523mtklein#define SkAlign8(x) (((x) + 7) >> 3 << 3) 2686a259bfcc80a7b4765b99c7503e5a5b98b7e1523mtklein#define SkIsAlign8(x) (0 == ((x) & 7)) 26901224d5d0a3228fe47e63d8346e0e433a87563a8tomhudson@google.com 2706a259bfcc80a7b4765b99c7503e5a5b98b7e1523mtklein#define SkAlign16(x) (((x) + 15) >> 4 << 4) 2716a259bfcc80a7b4765b99c7503e5a5b98b7e1523mtklein#define SkIsAlign16(x) (0 == ((x) & 15)) 272e2b0a0a0349b1c2acbd1eb5c1da7eed012f0980dreed 2736a259bfcc80a7b4765b99c7503e5a5b98b7e1523mtklein#define SkAlignPtr(x) (sizeof(void*) == 8 ? SkAlign8(x) : SkAlign4(x)) 2746a259bfcc80a7b4765b99c7503e5a5b98b7e1523mtklein#define SkIsAlignPtr(x) (sizeof(void*) == 8 ? SkIsAlign8(x) : SkIsAlign4(x)) 2750209e95cc2625a445c1cb6c4213d2182e5c832d7mtklein 2768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comtypedef uint32_t SkFourByteTag; 2778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkSetFourByteTag(a, b, c, d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d)) 2788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** 32 bit integer to hold a unicode value 2808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 2818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comtypedef int32_t SkUnichar; 282ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner 283d0e95a524c20932e0f4e68bab43995188a281395halcanary/** 16 bit unsigned integer to hold a glyph index 284d0e95a524c20932e0f4e68bab43995188a281395halcanary*/ 285d0e95a524c20932e0f4e68bab43995188a281395halcanarytypedef uint16_t SkGlyphID; 286d0e95a524c20932e0f4e68bab43995188a281395halcanary 287ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner/** 32 bit value to hold a millisecond duration 288ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner * Note that SK_MSecMax is about 25 days. 289ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner */ 2908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comtypedef uint32_t SkMSec; 2918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** 1 second measured in milliseconds 2928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 2938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SK_MSec1 1000 294ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner/** maximum representable milliseconds; 24d 20h 31m 23.647s. 2958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 2968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SK_MSecMax 0x7FFFFFFF 2978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Returns a < b for milliseconds, correctly handling wrap-around from 0xFFFFFFFF to 0 2988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 2998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkMSec_LT(a, b) ((int32_t)(a) - (int32_t)(b) < 0) 3008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Returns a <= b for milliseconds, correctly handling wrap-around from 0xFFFFFFFF to 0 3018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 3028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkMSec_LE(a, b) ((int32_t)(a) - (int32_t)(b) <= 0) 3038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3042b4e370a2fe00168838e43f5a78ccc3b371609f5commit-bot@chromium.org/** The generation IDs in Skia reserve 0 has an invalid marker. 3052b4e370a2fe00168838e43f5a78ccc3b371609f5commit-bot@chromium.org */ 3062b4e370a2fe00168838e43f5a78ccc3b371609f5commit-bot@chromium.org#define SK_InvalidGenID 0 3071c63bf6e90f160c9a0d7484dedfaf87c0aa341e9bsalomon/** The unique IDs in Skia reserve 0 has an invalid marker. 3081c63bf6e90f160c9a0d7484dedfaf87c0aa341e9bsalomon */ 3091c63bf6e90f160c9a0d7484dedfaf87c0aa341e9bsalomon#define SK_InvalidUniqueID 0 3102b4e370a2fe00168838e43f5a78ccc3b371609f5commit-bot@chromium.org 3118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/**************************************************************************** 3128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com The rest of these only build with C++ 3138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 3148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef __cplusplus 3158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Faster than SkToBool for integral conditions. Returns 0 or 1 3178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 3187a5bcc5f59bdf122217bc8ca7e756e8c76bae9e1bsalomonstatic inline constexpr int Sk32ToBool(uint32_t n) { 3198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return (n | (0-n)) >> 31; 3208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 322ff436617d8f11297f0eff93ddd49fb9022d0843bbsalomon@google.com/** Generic swap function. Classes with efficient swaps should specialize this function to take 323ff436617d8f11297f0eff93ddd49fb9022d0843bbsalomon@google.com their fast path. This function is used by SkTSort. */ 324bde64e438ae24f9f1c90fff5e1a12e71db5742deMike Kleintemplate <typename T> static inline void SkTSwap(T& a, T& b) { 3256f4293af6906721f09a12818ff3adc767badb3c7bungeman T c(std::move(a)); 3266f4293af6906721f09a12818ff3adc767badb3c7bungeman a = std::move(b); 3276f4293af6906721f09a12818ff3adc767badb3c7bungeman b = std::move(c); 3288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 330d4577757874d1dda1a3bffa3f2347c251859c27ereed@android.comstatic inline int32_t SkAbs32(int32_t value) { 33109a22e9597e271c44dc7c2b71c72cf62a7de1e19mtklein SkASSERT(value != SK_NaN32); // The most negative int32_t can't be negated. 33238bad32cf5297ec6908620fd174cd08c937d331acommit-bot@chromium.org if (value < 0) { 3338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com value = -value; 33438bad32cf5297ec6908620fd174cd08c937d331acommit-bot@chromium.org } 3358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return value; 3368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 338bde64e438ae24f9f1c90fff5e1a12e71db5742deMike Kleintemplate <typename T> static inline T SkTAbs(T value) { 3392b57dc6bb241a6627c4375ee54b73039983d03dareed@google.com if (value < 0) { 3402b57dc6bb241a6627c4375ee54b73039983d03dareed@google.com value = -value; 3412b57dc6bb241a6627c4375ee54b73039983d03dareed@google.com } 3422b57dc6bb241a6627c4375ee54b73039983d03dareed@google.com return value; 3432b57dc6bb241a6627c4375ee54b73039983d03dareed@google.com} 3442b57dc6bb241a6627c4375ee54b73039983d03dareed@google.com 345d4577757874d1dda1a3bffa3f2347c251859c27ereed@android.comstatic inline int32_t SkMax32(int32_t a, int32_t b) { 3468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (a < b) 3478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com a = b; 3488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return a; 3498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 351d4577757874d1dda1a3bffa3f2347c251859c27ereed@android.comstatic inline int32_t SkMin32(int32_t a, int32_t b) { 3528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (a > b) 3538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com a = b; 3548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return a; 3558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 357a0af771612db5ae36b74f1f536bfb335ecd0ec99halcanarytemplate <typename T> constexpr const T& SkTMin(const T& a, const T& b) { 3583b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com return (a < b) ? a : b; 3593b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com} 3603b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com 361a0af771612db5ae36b74f1f536bfb335ecd0ec99halcanarytemplate <typename T> constexpr const T& SkTMax(const T& a, const T& b) { 3623b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com return (b < a) ? a : b; 3633b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com} 3643b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com 365d4577757874d1dda1a3bffa3f2347c251859c27ereed@android.comstatic inline int32_t SkSign32(int32_t a) { 3668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return (a >> 31) | ((unsigned) -a >> 31); 3678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 369d4577757874d1dda1a3bffa3f2347c251859c27ereed@android.comstatic inline int32_t SkFastMin32(int32_t value, int32_t max) { 37038bad32cf5297ec6908620fd174cd08c937d331acommit-bot@chromium.org if (value > max) { 3718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com value = max; 37238bad32cf5297ec6908620fd174cd08c937d331acommit-bot@chromium.org } 3738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return value; 3748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 37662ce0303fb3f9857ee3ab8df05934642c226b1a3bungeman/** Returns value pinned between min and max, inclusively. */ 377a0af771612db5ae36b74f1f536bfb335ecd0ec99halcanarytemplate <typename T> static constexpr const T& SkTPin(const T& value, const T& min, const T& max) { 37862ce0303fb3f9857ee3ab8df05934642c226b1a3bungeman return SkTMax(SkTMin(value, max), min); 3798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3815ec26ae9bfca635ccc98283aad5deda11519d826bsalomon 3825ec26ae9bfca635ccc98283aad5deda11519d826bsalomon/////////////////////////////////////////////////////////////////////////////// 3835ec26ae9bfca635ccc98283aad5deda11519d826bsalomon 3845ec26ae9bfca635ccc98283aad5deda11519d826bsalomon/** 3855ec26ae9bfca635ccc98283aad5deda11519d826bsalomon * Indicates whether an allocation should count against a cache budget. 3865ec26ae9bfca635ccc98283aad5deda11519d826bsalomon */ 3875ec26ae9bfca635ccc98283aad5deda11519d826bsalomonenum class SkBudgeted : bool { 3885ec26ae9bfca635ccc98283aad5deda11519d826bsalomon kNo = false, 3895ec26ae9bfca635ccc98283aad5deda11519d826bsalomon kYes = true 3905ec26ae9bfca635ccc98283aad5deda11519d826bsalomon}; 3915ec26ae9bfca635ccc98283aad5deda11519d826bsalomon 39276948d4faaca9fd7730576e2f79790ca8d93c10brobertphillips/** 39376948d4faaca9fd7730576e2f79790ca8d93c10brobertphillips * Indicates whether a backing store needs to be an exact match or can be larger 39476948d4faaca9fd7730576e2f79790ca8d93c10brobertphillips * than is strictly necessary 39576948d4faaca9fd7730576e2f79790ca8d93c10brobertphillips */ 39676948d4faaca9fd7730576e2f79790ca8d93c10brobertphillipsenum class SkBackingFit { 39776948d4faaca9fd7730576e2f79790ca8d93c10brobertphillips kApprox, 39876948d4faaca9fd7730576e2f79790ca8d93c10brobertphillips kExact 39976948d4faaca9fd7730576e2f79790ca8d93c10brobertphillips}; 40076948d4faaca9fd7730576e2f79790ca8d93c10brobertphillips 4011fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com/////////////////////////////////////////////////////////////////////////////// 4021fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com 403325cb9aa17b94258b362082eb3a799524f4345f3vandebo@chromium.org/** Use to combine multiple bits in a bitmask in a type safe way. 404325cb9aa17b94258b362082eb3a799524f4345f3vandebo@chromium.org */ 405325cb9aa17b94258b362082eb3a799524f4345f3vandebo@chromium.orgtemplate <typename T> 406325cb9aa17b94258b362082eb3a799524f4345f3vandebo@chromium.orgT SkTBitOr(T a, T b) { 407325cb9aa17b94258b362082eb3a799524f4345f3vandebo@chromium.org return (T)(a | b); 408325cb9aa17b94258b362082eb3a799524f4345f3vandebo@chromium.org} 409325cb9aa17b94258b362082eb3a799524f4345f3vandebo@chromium.org 4101fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com/** 4111fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com * Use to cast a pointer to a different type, and maintaining strict-aliasing 4121fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com */ 4131fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.comtemplate <typename Dst> Dst SkTCast(const void* ptr) { 4141fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com union { 4151fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com const void* src; 4161fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com Dst dst; 4171fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com } data; 4181fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com data.src = ptr; 4191fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com return data.dst; 4201fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com} 4211fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com 4228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////////////////////////////////////////////////////////////////////////// 4238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** \class SkNoncopyable 4258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 426055f6b59d879b2adac52748ea5a58c8a05bf501cfmalitaSkNoncopyable is the base class for objects that do not want to 4278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combe copied. It hides its copy-constructor and its assignment-operator. 4288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 4297ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.orgclass SK_API SkNoncopyable { 4308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 4312b6be207a1b4595646950324ab1ccf0e3b9f73acChris Blume SkNoncopyable() = default; 4321fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com 4332b6be207a1b4595646950324ab1ccf0e3b9f73acChris Blume SkNoncopyable(SkNoncopyable&&) = default; 4342b6be207a1b4595646950324ab1ccf0e3b9f73acChris Blume SkNoncopyable& operator =(SkNoncopyable&&) = default; 4352b6be207a1b4595646950324ab1ccf0e3b9f73acChris Blume 4362b6be207a1b4595646950324ab1ccf0e3b9f73acChris Blume SkNoncopyable(const SkNoncopyable&) = delete; 4372b6be207a1b4595646950324ab1ccf0e3b9f73acChris Blume SkNoncopyable& operator=(const SkNoncopyable&) = delete; 4388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 4398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif /* C++ */ 4418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 443