ftmemory.h revision d726e41c33e0ef052b313f4e48c5eae2823dd602
1c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/***************************************************************************/ 2c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* */ 3c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* ftmemory.h */ 4c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* */ 5c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* The FreeType memory management macros (specification). */ 6c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* */ 7c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* Copyright 1996-2001, 2002 by */ 8c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* David Turner, Robert Wilhelm, and Werner Lemberg */ 9c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* */ 10c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* This file is part of the FreeType project, and may only be used, */ 11c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* modified, and distributed under the terms of the FreeType project */ 12c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* this file you indicate that you have read the license and */ 14c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* understand and accept it fully. */ 15c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* */ 16c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/***************************************************************************/ 17c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 18c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 19c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#ifndef __FTMEMORY_H__ 20c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define __FTMEMORY_H__ 21c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 22c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 23c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include <ft2build.h> 24c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include FT_CONFIG_CONFIG_H 25c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include FT_TYPES_H 26c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 27c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 28c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarFT_BEGIN_HEADER 29c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 30c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 31c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /*************************************************************************/ 32c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* */ 33c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* <Macro> */ 34c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* FT_SET_ERROR */ 35c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* */ 36c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* <Description> */ 37c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* This macro is used to set an implicit `error' variable to a given */ 38c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* expression's value (usually a function call), and convert it to a */ 39c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* boolean which is set whenever the value is != 0. */ 40c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* */ 41c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#undef FT_SET_ERROR 42c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define FT_SET_ERROR( expression ) \ 43c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar ( ( error = (expression) ) != 0 ) 44c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 45c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 46c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /*************************************************************************/ 47c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /*************************************************************************/ 48c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /*************************************************************************/ 49c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /**** ****/ 50c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /**** ****/ 51c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /**** M E M O R Y ****/ 52c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /**** ****/ 53c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /**** ****/ 54c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /*************************************************************************/ 55c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /*************************************************************************/ 56c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /*************************************************************************/ 57c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 58c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#ifdef FT_DEBUG_MEMORY 59c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 60c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar FT_BASE( FT_Error ) 61c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar FT_Alloc_Debug( FT_Memory memory, 62c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar FT_Long size, 63c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar void* *P, 64c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar const char* file_name, 65c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar FT_Long line_no ); 66c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 67c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar FT_BASE( FT_Error ) 68c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar FT_Realloc_Debug( FT_Memory memory, 69c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar FT_Long current, 70c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar FT_Long size, 71c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar void* *P, 72c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar const char* file_name, 73c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar FT_Long line_no ); 74c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 75c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar FT_BASE( void ) 76c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar FT_Free_Debug( FT_Memory memory, 77c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar FT_Pointer block, 78c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar const char* file_name, 79c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar FT_Long line_no ); 80c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 81c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#endif 82c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 83c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 84c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /*************************************************************************/ 85c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* */ 86c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* <Function> */ 87c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* FT_Alloc */ 88c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* */ 89c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* <Description> */ 90c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* Allocates a new block of memory. The returned area is always */ 91c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* zero-filled; this is a strong convention in many FreeType parts. */ 92c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* */ 93c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* <Input> */ 94c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* memory :: A handle to a given `memory object' which handles */ 95c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* allocation. */ 96c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* */ 97c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* size :: The size in bytes of the block to allocate. */ 98c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* */ 99c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* <Output> */ 100c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* P :: A pointer to the fresh new block. It should be set to */ 101c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* NULL if `size' is 0, or in case of error. */ 102c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* */ 103c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* <Return> */ 104c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* FreeType error code. 0 means success. */ 105c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* */ 106c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar FT_BASE( FT_Error ) 107c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar FT_Alloc( FT_Memory memory, 108c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar FT_Long size, 109c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar void* *P ); 110c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 111c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 112c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /*************************************************************************/ 113c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* */ 114c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* <Function> */ 115c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* FT_Realloc */ 116c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* */ 117c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* <Description> */ 118c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* Reallocates a block of memory pointed to by `*P' to `Size' bytes */ 119c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* from the heap, possibly changing `*P'. */ 120c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* */ 121c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* <Input> */ 122c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* memory :: A handle to a given `memory object' which handles */ 123c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* reallocation. */ 124c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* */ 125c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* current :: The current block size in bytes. */ 126c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* */ 127c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* size :: The new block size in bytes. */ 128c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* */ 129c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* <InOut> */ 130c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* P :: A pointer to the fresh new block. It should be set to */ 131c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* NULL if `size' is 0, or in case of error. */ 132c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* */ 133c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar /* <Return> */ 134 /* FreeType error code. 0 means success. */ 135 /* */ 136 /* <Note> */ 137 /* All callers of FT_Realloc() _must_ provide the current block size */ 138 /* as well as the new one. */ 139 /* */ 140 FT_BASE( FT_Error ) 141 FT_Realloc( FT_Memory memory, 142 FT_Long current, 143 FT_Long size, 144 void* *P ); 145 146 147 /*************************************************************************/ 148 /* */ 149 /* <Function> */ 150 /* FT_Free */ 151 /* */ 152 /* <Description> */ 153 /* Releases a given block of memory allocated through FT_Alloc(). */ 154 /* */ 155 /* <Input> */ 156 /* memory :: A handle to a given `memory object' which handles */ 157 /* memory deallocation */ 158 /* */ 159 /* P :: This is the _address_ of a _pointer_ which points to the */ 160 /* allocated block. It is always set to NULL on exit. */ 161 /* */ 162 /* <Note> */ 163 /* If P or *P is NULL, this function should return successfully. */ 164 /* This is a strong convention within all of FreeType and its */ 165 /* drivers. */ 166 /* */ 167 FT_BASE( void ) 168 FT_Free( FT_Memory memory, 169 void* *P ); 170 171 172#define FT_MEM_SET( dest, byte, count ) ft_memset( dest, byte, count ) 173 174#define FT_MEM_COPY( dest, source, count ) ft_memcpy( dest, source, count ) 175 176#define FT_MEM_MOVE( dest, source, count ) ft_memmove( dest, source, count ) 177 178 179#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) 180 181#define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) ) 182 183 184 /*************************************************************************/ 185 /* */ 186 /* We first define FT_MEM_ALLOC, FT_MEM_REALLOC, and FT_MEM_FREE. All */ 187 /* macros use an _implicit_ `memory' parameter to access the current */ 188 /* memory allocator. */ 189 /* */ 190 191#ifdef FT_DEBUG_MEMORY 192 193#define FT_MEM_ALLOC( _pointer_, _size_ ) \ 194 FT_Alloc_Debug( memory, _size_, \ 195 (void**)&(_pointer_), __FILE__, __LINE__ ) 196 197#define FT_MEM_REALLOC( _pointer_, _current_, _size_ ) \ 198 FT_Realloc_Debug( memory, _current_, _size_, \ 199 (void**)&(_pointer_), __FILE__, __LINE__ ) 200 201#define FT_MEM_FREE( _pointer_ ) \ 202 FT_Free_Debug( memory, (void**)&(_pointer_), __FILE__, __LINE__ ) 203 204 205#else /* !FT_DEBUG_MEMORY */ 206 207 208#define FT_MEM_ALLOC( _pointer_, _size_ ) \ 209 FT_Alloc( memory, _size_, (void**)&(_pointer_) ) 210 211#define FT_MEM_FREE( _pointer_ ) \ 212 FT_Free( memory, (void**)&(_pointer_) ) 213 214#define FT_MEM_REALLOC( _pointer_, _current_, _size_ ) \ 215 FT_Realloc( memory, _current_, _size_, (void**)&(_pointer_) ) 216 217 218#endif /* !FT_DEBUG_MEMORY */ 219 220 221 /*************************************************************************/ 222 /* */ 223 /* The following functions macros expect that their pointer argument is */ 224 /* _typed_ in order to automatically compute array element sizes. */ 225 /* */ 226 227#define FT_MEM_NEW( _pointer_ ) \ 228 FT_MEM_ALLOC( _pointer_, sizeof ( *(_pointer_) ) ) 229 230#define FT_MEM_NEW_ARRAY( _pointer_, _count_ ) \ 231 FT_MEM_ALLOC( _pointer_, (_count_) * sizeof ( *(_pointer_) ) ) 232 233#define FT_MEM_RENEW_ARRAY( _pointer_, _old_, _new_ ) \ 234 FT_MEM_REALLOC( _pointer_, (_old_) * sizeof ( *(_pointer_) ), \ 235 (_new_) * sizeof ( *(_pointer_) ) ) 236 237 238 /*************************************************************************/ 239 /* */ 240 /* the following macros are obsolete but kept for compatibility reasons */ 241 /* */ 242 243#define FT_MEM_ALLOC_ARRAY( _pointer_, _count_, _type_ ) \ 244 FT_MEM_ALLOC( _pointer_, (_count_) * sizeof ( _type_ ) ) 245 246#define FT_MEM_REALLOC_ARRAY( _pointer_, _old_, _new_, _type_ ) \ 247 FT_MEM_REALLOC( _pointer_, (_old_) * sizeof ( _type ), \ 248 (_new_) * sizeof ( _type_ ) ) 249 250 251 /*************************************************************************/ 252 /* */ 253 /* The following macros are variants of their FT_MEM_XXXX equivalents; */ 254 /* they are used to set an _implicit_ `error' variable and return TRUE */ 255 /* if an error occured (i.e. if 'error != 0'). */ 256 /* */ 257 258#define FT_ALLOC( _pointer_, _size_ ) \ 259 FT_SET_ERROR( FT_MEM_ALLOC( _pointer_, _size_ ) ) 260 261#define FT_REALLOC( _pointer_, _current_, _size_ ) \ 262 FT_SET_ERROR( FT_MEM_REALLOC( _pointer_, _current_, _size_ ) ) 263 264#define FT_FREE( _pointer_ ) \ 265 FT_MEM_FREE( _pointer_ ) 266 267#define FT_NEW( _pointer_ ) \ 268 FT_SET_ERROR( FT_MEM_NEW( _pointer_ ) ) 269 270#define FT_NEW_ARRAY( _pointer_, _count_ ) \ 271 FT_SET_ERROR( FT_MEM_NEW_ARRAY( _pointer_, _count_ ) ) 272 273#define FT_RENEW_ARRAY( _pointer_, _old_, _new_ ) \ 274 FT_SET_ERROR( FT_MEM_RENEW_ARRAY( _pointer_, _old_, _new_ ) ) 275 276#define FT_ALLOC_ARRAY( _pointer_, _count_, _type_ ) \ 277 FT_SET_ERROR( FT_MEM_ALLOC( _pointer_, \ 278 (_count_) * sizeof ( _type_ ) ) ) 279 280#define FT_REALLOC_ARRAY( _pointer_, _old_, _new_, _type_ ) \ 281 FT_SET_ERROR( FT_MEM_REALLOC( _pointer_, \ 282 (_old_) * sizeof ( _type_ ), \ 283 (_new_) * sizeof ( _type_ ) ) ) 284 285 /* */ 286 287 288FT_END_HEADER 289 290#endif /* __FTMEMORY_H__ */ 291 292 293/* END */ 294