Fork of DMemWin by
png/pngmem.c@4:20387dbf7ecf, 2016-06-02 (annotated)
- Committer:
- destinyXfate
- Date:
- Thu Jun 02 04:55:08 2016 +0000
- Revision:
- 4:20387dbf7ecf
- Parent:
- 2:0e2ef1edf01b
;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
destinyXfate | 2:0e2ef1edf01b | 1 | |
destinyXfate | 2:0e2ef1edf01b | 2 | /* pngmem.c - stub functions for memory allocation |
destinyXfate | 2:0e2ef1edf01b | 3 | * |
destinyXfate | 2:0e2ef1edf01b | 4 | * Last changed in libpng 1.2.13 November 13, 2006 |
destinyXfate | 2:0e2ef1edf01b | 5 | * For conditions of distribution and use, see copyright notice in png.h |
destinyXfate | 2:0e2ef1edf01b | 6 | * Copyright (c) 1998-2006 Glenn Randers-Pehrson |
destinyXfate | 2:0e2ef1edf01b | 7 | * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) |
destinyXfate | 2:0e2ef1edf01b | 8 | * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) |
destinyXfate | 2:0e2ef1edf01b | 9 | * |
destinyXfate | 2:0e2ef1edf01b | 10 | * This file provides a location for all memory allocation. Users who |
destinyXfate | 2:0e2ef1edf01b | 11 | * need special memory handling are expected to supply replacement |
destinyXfate | 2:0e2ef1edf01b | 12 | * functions for png_malloc() and png_free(), and to use |
destinyXfate | 2:0e2ef1edf01b | 13 | * png_create_read_struct_2() and png_create_write_struct_2() to |
destinyXfate | 2:0e2ef1edf01b | 14 | * identify the replacement functions. |
destinyXfate | 2:0e2ef1edf01b | 15 | */ |
destinyXfate | 2:0e2ef1edf01b | 16 | |
destinyXfate | 2:0e2ef1edf01b | 17 | #define PNG_INTERNAL |
destinyXfate | 2:0e2ef1edf01b | 18 | #include "png.h" |
destinyXfate | 2:0e2ef1edf01b | 19 | |
destinyXfate | 2:0e2ef1edf01b | 20 | #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) |
destinyXfate | 2:0e2ef1edf01b | 21 | |
destinyXfate | 2:0e2ef1edf01b | 22 | /* Borland DOS special memory handler */ |
destinyXfate | 2:0e2ef1edf01b | 23 | #if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) |
destinyXfate | 2:0e2ef1edf01b | 24 | /* if you change this, be sure to change the one in png.h also */ |
destinyXfate | 2:0e2ef1edf01b | 25 | |
destinyXfate | 2:0e2ef1edf01b | 26 | /* Allocate memory for a png_struct. The malloc and memset can be replaced |
destinyXfate | 2:0e2ef1edf01b | 27 | by a single call to calloc() if this is thought to improve performance. */ |
destinyXfate | 2:0e2ef1edf01b | 28 | png_voidp /* PRIVATE */ |
destinyXfate | 2:0e2ef1edf01b | 29 | png_create_struct(int type) |
destinyXfate | 2:0e2ef1edf01b | 30 | { |
destinyXfate | 2:0e2ef1edf01b | 31 | #ifdef PNG_USER_MEM_SUPPORTED |
destinyXfate | 2:0e2ef1edf01b | 32 | return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL)); |
destinyXfate | 2:0e2ef1edf01b | 33 | } |
destinyXfate | 2:0e2ef1edf01b | 34 | |
destinyXfate | 2:0e2ef1edf01b | 35 | /* Alternate version of png_create_struct, for use with user-defined malloc. */ |
destinyXfate | 2:0e2ef1edf01b | 36 | png_voidp /* PRIVATE */ |
destinyXfate | 2:0e2ef1edf01b | 37 | png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) |
destinyXfate | 2:0e2ef1edf01b | 38 | { |
destinyXfate | 2:0e2ef1edf01b | 39 | #endif /* PNG_USER_MEM_SUPPORTED */ |
destinyXfate | 2:0e2ef1edf01b | 40 | png_size_t size; |
destinyXfate | 2:0e2ef1edf01b | 41 | png_voidp struct_ptr; |
destinyXfate | 2:0e2ef1edf01b | 42 | |
destinyXfate | 2:0e2ef1edf01b | 43 | if (type == PNG_STRUCT_INFO) |
destinyXfate | 2:0e2ef1edf01b | 44 | size = png_sizeof(png_info); |
destinyXfate | 2:0e2ef1edf01b | 45 | else if (type == PNG_STRUCT_PNG) |
destinyXfate | 2:0e2ef1edf01b | 46 | size = png_sizeof(png_struct); |
destinyXfate | 2:0e2ef1edf01b | 47 | else |
destinyXfate | 2:0e2ef1edf01b | 48 | return (png_get_copyright(NULL)); |
destinyXfate | 2:0e2ef1edf01b | 49 | |
destinyXfate | 2:0e2ef1edf01b | 50 | #ifdef PNG_USER_MEM_SUPPORTED |
destinyXfate | 2:0e2ef1edf01b | 51 | if(malloc_fn != NULL) |
destinyXfate | 2:0e2ef1edf01b | 52 | { |
destinyXfate | 2:0e2ef1edf01b | 53 | png_struct dummy_struct; |
destinyXfate | 2:0e2ef1edf01b | 54 | png_structp png_ptr = &dummy_struct; |
destinyXfate | 2:0e2ef1edf01b | 55 | png_ptr->mem_ptr=mem_ptr; |
destinyXfate | 2:0e2ef1edf01b | 56 | struct_ptr = (*(malloc_fn))(png_ptr, (png_uint_32)size); |
destinyXfate | 2:0e2ef1edf01b | 57 | } |
destinyXfate | 2:0e2ef1edf01b | 58 | else |
destinyXfate | 2:0e2ef1edf01b | 59 | #endif /* PNG_USER_MEM_SUPPORTED */ |
destinyXfate | 2:0e2ef1edf01b | 60 | struct_ptr = (png_voidp)farmalloc(size); |
destinyXfate | 2:0e2ef1edf01b | 61 | if (struct_ptr != NULL) |
destinyXfate | 2:0e2ef1edf01b | 62 | png_memset(struct_ptr, 0, size); |
destinyXfate | 2:0e2ef1edf01b | 63 | return (struct_ptr); |
destinyXfate | 2:0e2ef1edf01b | 64 | } |
destinyXfate | 2:0e2ef1edf01b | 65 | |
destinyXfate | 2:0e2ef1edf01b | 66 | /* Free memory allocated by a png_create_struct() call */ |
destinyXfate | 2:0e2ef1edf01b | 67 | void /* PRIVATE */ |
destinyXfate | 2:0e2ef1edf01b | 68 | png_destroy_struct(png_voidp struct_ptr) |
destinyXfate | 2:0e2ef1edf01b | 69 | { |
destinyXfate | 2:0e2ef1edf01b | 70 | #ifdef PNG_USER_MEM_SUPPORTED |
destinyXfate | 2:0e2ef1edf01b | 71 | png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL); |
destinyXfate | 2:0e2ef1edf01b | 72 | } |
destinyXfate | 2:0e2ef1edf01b | 73 | |
destinyXfate | 2:0e2ef1edf01b | 74 | /* Free memory allocated by a png_create_struct() call */ |
destinyXfate | 2:0e2ef1edf01b | 75 | void /* PRIVATE */ |
destinyXfate | 2:0e2ef1edf01b | 76 | png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, |
destinyXfate | 2:0e2ef1edf01b | 77 | png_voidp mem_ptr) |
destinyXfate | 2:0e2ef1edf01b | 78 | { |
destinyXfate | 2:0e2ef1edf01b | 79 | #endif |
destinyXfate | 2:0e2ef1edf01b | 80 | if (struct_ptr != NULL) |
destinyXfate | 2:0e2ef1edf01b | 81 | { |
destinyXfate | 2:0e2ef1edf01b | 82 | #ifdef PNG_USER_MEM_SUPPORTED |
destinyXfate | 2:0e2ef1edf01b | 83 | if(free_fn != NULL) |
destinyXfate | 2:0e2ef1edf01b | 84 | { |
destinyXfate | 2:0e2ef1edf01b | 85 | png_struct dummy_struct; |
destinyXfate | 2:0e2ef1edf01b | 86 | png_structp png_ptr = &dummy_struct; |
destinyXfate | 2:0e2ef1edf01b | 87 | png_ptr->mem_ptr=mem_ptr; |
destinyXfate | 2:0e2ef1edf01b | 88 | (*(free_fn))(png_ptr, struct_ptr); |
destinyXfate | 2:0e2ef1edf01b | 89 | return; |
destinyXfate | 2:0e2ef1edf01b | 90 | } |
destinyXfate | 2:0e2ef1edf01b | 91 | #endif /* PNG_USER_MEM_SUPPORTED */ |
destinyXfate | 2:0e2ef1edf01b | 92 | farfree (struct_ptr); |
destinyXfate | 2:0e2ef1edf01b | 93 | } |
destinyXfate | 2:0e2ef1edf01b | 94 | } |
destinyXfate | 2:0e2ef1edf01b | 95 | |
destinyXfate | 2:0e2ef1edf01b | 96 | /* Allocate memory. For reasonable files, size should never exceed |
destinyXfate | 2:0e2ef1edf01b | 97 | * 64K. However, zlib may allocate more then 64K if you don't tell |
destinyXfate | 2:0e2ef1edf01b | 98 | * it not to. See zconf.h and png.h for more information. zlib does |
destinyXfate | 2:0e2ef1edf01b | 99 | * need to allocate exactly 64K, so whatever you call here must |
destinyXfate | 2:0e2ef1edf01b | 100 | * have the ability to do that. |
destinyXfate | 2:0e2ef1edf01b | 101 | * |
destinyXfate | 2:0e2ef1edf01b | 102 | * Borland seems to have a problem in DOS mode for exactly 64K. |
destinyXfate | 2:0e2ef1edf01b | 103 | * It gives you a segment with an offset of 8 (perhaps to store its |
destinyXfate | 2:0e2ef1edf01b | 104 | * memory stuff). zlib doesn't like this at all, so we have to |
destinyXfate | 2:0e2ef1edf01b | 105 | * detect and deal with it. This code should not be needed in |
destinyXfate | 2:0e2ef1edf01b | 106 | * Windows or OS/2 modes, and only in 16 bit mode. This code has |
destinyXfate | 2:0e2ef1edf01b | 107 | * been updated by Alexander Lehmann for version 0.89 to waste less |
destinyXfate | 2:0e2ef1edf01b | 108 | * memory. |
destinyXfate | 2:0e2ef1edf01b | 109 | * |
destinyXfate | 2:0e2ef1edf01b | 110 | * Note that we can't use png_size_t for the "size" declaration, |
destinyXfate | 2:0e2ef1edf01b | 111 | * since on some systems a png_size_t is a 16-bit quantity, and as a |
destinyXfate | 2:0e2ef1edf01b | 112 | * result, we would be truncating potentially larger memory requests |
destinyXfate | 2:0e2ef1edf01b | 113 | * (which should cause a fatal error) and introducing major problems. |
destinyXfate | 2:0e2ef1edf01b | 114 | */ |
destinyXfate | 2:0e2ef1edf01b | 115 | |
destinyXfate | 2:0e2ef1edf01b | 116 | png_voidp PNGAPI |
destinyXfate | 2:0e2ef1edf01b | 117 | png_malloc(png_structp png_ptr, png_uint_32 size) |
destinyXfate | 2:0e2ef1edf01b | 118 | { |
destinyXfate | 2:0e2ef1edf01b | 119 | png_voidp ret; |
destinyXfate | 2:0e2ef1edf01b | 120 | |
destinyXfate | 2:0e2ef1edf01b | 121 | if (png_ptr == NULL || size == 0) |
destinyXfate | 2:0e2ef1edf01b | 122 | return (NULL); |
destinyXfate | 2:0e2ef1edf01b | 123 | |
destinyXfate | 2:0e2ef1edf01b | 124 | #ifdef PNG_USER_MEM_SUPPORTED |
destinyXfate | 2:0e2ef1edf01b | 125 | if(png_ptr->malloc_fn != NULL) |
destinyXfate | 2:0e2ef1edf01b | 126 | ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); |
destinyXfate | 2:0e2ef1edf01b | 127 | else |
destinyXfate | 2:0e2ef1edf01b | 128 | ret = (png_malloc_default(png_ptr, size)); |
destinyXfate | 2:0e2ef1edf01b | 129 | if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) |
destinyXfate | 2:0e2ef1edf01b | 130 | png_error(png_ptr, "Out of memory!"); |
destinyXfate | 2:0e2ef1edf01b | 131 | return (ret); |
destinyXfate | 2:0e2ef1edf01b | 132 | } |
destinyXfate | 2:0e2ef1edf01b | 133 | |
destinyXfate | 2:0e2ef1edf01b | 134 | png_voidp PNGAPI |
destinyXfate | 2:0e2ef1edf01b | 135 | png_malloc_default(png_structp png_ptr, png_uint_32 size) |
destinyXfate | 2:0e2ef1edf01b | 136 | { |
destinyXfate | 2:0e2ef1edf01b | 137 | png_voidp ret; |
destinyXfate | 2:0e2ef1edf01b | 138 | #endif /* PNG_USER_MEM_SUPPORTED */ |
destinyXfate | 2:0e2ef1edf01b | 139 | |
destinyXfate | 2:0e2ef1edf01b | 140 | if (png_ptr == NULL || size == 0) |
destinyXfate | 2:0e2ef1edf01b | 141 | return (NULL); |
destinyXfate | 2:0e2ef1edf01b | 142 | |
destinyXfate | 2:0e2ef1edf01b | 143 | #ifdef PNG_MAX_MALLOC_64K |
destinyXfate | 2:0e2ef1edf01b | 144 | if (size > (png_uint_32)65536L) |
destinyXfate | 2:0e2ef1edf01b | 145 | { |
destinyXfate | 2:0e2ef1edf01b | 146 | png_warning(png_ptr, "Cannot Allocate > 64K"); |
destinyXfate | 2:0e2ef1edf01b | 147 | ret = NULL; |
destinyXfate | 2:0e2ef1edf01b | 148 | } |
destinyXfate | 2:0e2ef1edf01b | 149 | else |
destinyXfate | 2:0e2ef1edf01b | 150 | #endif |
destinyXfate | 2:0e2ef1edf01b | 151 | |
destinyXfate | 2:0e2ef1edf01b | 152 | if (size != (size_t)size) |
destinyXfate | 2:0e2ef1edf01b | 153 | ret = NULL; |
destinyXfate | 2:0e2ef1edf01b | 154 | else if (size == (png_uint_32)65536L) |
destinyXfate | 2:0e2ef1edf01b | 155 | { |
destinyXfate | 2:0e2ef1edf01b | 156 | if (png_ptr->offset_table == NULL) |
destinyXfate | 2:0e2ef1edf01b | 157 | { |
destinyXfate | 2:0e2ef1edf01b | 158 | /* try to see if we need to do any of this fancy stuff */ |
destinyXfate | 2:0e2ef1edf01b | 159 | ret = farmalloc(size); |
destinyXfate | 2:0e2ef1edf01b | 160 | if (ret == NULL || ((png_size_t)ret & 0xffff)) |
destinyXfate | 2:0e2ef1edf01b | 161 | { |
destinyXfate | 2:0e2ef1edf01b | 162 | int num_blocks; |
destinyXfate | 2:0e2ef1edf01b | 163 | png_uint_32 total_size; |
destinyXfate | 2:0e2ef1edf01b | 164 | png_bytep table; |
destinyXfate | 2:0e2ef1edf01b | 165 | int i; |
destinyXfate | 2:0e2ef1edf01b | 166 | png_byte huge * hptr; |
destinyXfate | 2:0e2ef1edf01b | 167 | |
destinyXfate | 2:0e2ef1edf01b | 168 | if (ret != NULL) |
destinyXfate | 2:0e2ef1edf01b | 169 | { |
destinyXfate | 2:0e2ef1edf01b | 170 | farfree(ret); |
destinyXfate | 2:0e2ef1edf01b | 171 | ret = NULL; |
destinyXfate | 2:0e2ef1edf01b | 172 | } |
destinyXfate | 2:0e2ef1edf01b | 173 | |
destinyXfate | 2:0e2ef1edf01b | 174 | if(png_ptr->zlib_window_bits > 14) |
destinyXfate | 2:0e2ef1edf01b | 175 | num_blocks = (int)(1 << (png_ptr->zlib_window_bits - 14)); |
destinyXfate | 2:0e2ef1edf01b | 176 | else |
destinyXfate | 2:0e2ef1edf01b | 177 | num_blocks = 1; |
destinyXfate | 2:0e2ef1edf01b | 178 | if (png_ptr->zlib_mem_level >= 7) |
destinyXfate | 2:0e2ef1edf01b | 179 | num_blocks += (int)(1 << (png_ptr->zlib_mem_level - 7)); |
destinyXfate | 2:0e2ef1edf01b | 180 | else |
destinyXfate | 2:0e2ef1edf01b | 181 | num_blocks++; |
destinyXfate | 2:0e2ef1edf01b | 182 | |
destinyXfate | 2:0e2ef1edf01b | 183 | total_size = ((png_uint_32)65536L) * (png_uint_32)num_blocks+16; |
destinyXfate | 2:0e2ef1edf01b | 184 | |
destinyXfate | 2:0e2ef1edf01b | 185 | table = farmalloc(total_size); |
destinyXfate | 2:0e2ef1edf01b | 186 | |
destinyXfate | 2:0e2ef1edf01b | 187 | if (table == NULL) |
destinyXfate | 2:0e2ef1edf01b | 188 | { |
destinyXfate | 2:0e2ef1edf01b | 189 | #ifndef PNG_USER_MEM_SUPPORTED |
destinyXfate | 2:0e2ef1edf01b | 190 | if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) |
destinyXfate | 2:0e2ef1edf01b | 191 | png_error(png_ptr, "Out Of Memory."); /* Note "O" and "M" */ |
destinyXfate | 2:0e2ef1edf01b | 192 | else |
destinyXfate | 2:0e2ef1edf01b | 193 | png_warning(png_ptr, "Out Of Memory."); |
destinyXfate | 2:0e2ef1edf01b | 194 | #endif |
destinyXfate | 2:0e2ef1edf01b | 195 | return (NULL); |
destinyXfate | 2:0e2ef1edf01b | 196 | } |
destinyXfate | 2:0e2ef1edf01b | 197 | |
destinyXfate | 2:0e2ef1edf01b | 198 | if ((png_size_t)table & 0xfff0) |
destinyXfate | 2:0e2ef1edf01b | 199 | { |
destinyXfate | 2:0e2ef1edf01b | 200 | #ifndef PNG_USER_MEM_SUPPORTED |
destinyXfate | 2:0e2ef1edf01b | 201 | if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) |
destinyXfate | 2:0e2ef1edf01b | 202 | png_error(png_ptr, |
destinyXfate | 2:0e2ef1edf01b | 203 | "Farmalloc didn't return normalized pointer"); |
destinyXfate | 2:0e2ef1edf01b | 204 | else |
destinyXfate | 2:0e2ef1edf01b | 205 | png_warning(png_ptr, |
destinyXfate | 2:0e2ef1edf01b | 206 | "Farmalloc didn't return normalized pointer"); |
destinyXfate | 2:0e2ef1edf01b | 207 | #endif |
destinyXfate | 2:0e2ef1edf01b | 208 | return (NULL); |
destinyXfate | 2:0e2ef1edf01b | 209 | } |
destinyXfate | 2:0e2ef1edf01b | 210 | |
destinyXfate | 2:0e2ef1edf01b | 211 | png_ptr->offset_table = table; |
destinyXfate | 2:0e2ef1edf01b | 212 | png_ptr->offset_table_ptr = farmalloc(num_blocks * |
destinyXfate | 2:0e2ef1edf01b | 213 | png_sizeof (png_bytep)); |
destinyXfate | 2:0e2ef1edf01b | 214 | |
destinyXfate | 2:0e2ef1edf01b | 215 | if (png_ptr->offset_table_ptr == NULL) |
destinyXfate | 2:0e2ef1edf01b | 216 | { |
destinyXfate | 2:0e2ef1edf01b | 217 | #ifndef PNG_USER_MEM_SUPPORTED |
destinyXfate | 2:0e2ef1edf01b | 218 | if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) |
destinyXfate | 2:0e2ef1edf01b | 219 | png_error(png_ptr, "Out Of memory."); /* Note "O" and "M" */ |
destinyXfate | 2:0e2ef1edf01b | 220 | else |
destinyXfate | 2:0e2ef1edf01b | 221 | png_warning(png_ptr, "Out Of memory."); |
destinyXfate | 2:0e2ef1edf01b | 222 | #endif |
destinyXfate | 2:0e2ef1edf01b | 223 | return (NULL); |
destinyXfate | 2:0e2ef1edf01b | 224 | } |
destinyXfate | 2:0e2ef1edf01b | 225 | |
destinyXfate | 2:0e2ef1edf01b | 226 | hptr = (png_byte huge *)table; |
destinyXfate | 2:0e2ef1edf01b | 227 | if ((png_size_t)hptr & 0xf) |
destinyXfate | 2:0e2ef1edf01b | 228 | { |
destinyXfate | 2:0e2ef1edf01b | 229 | hptr = (png_byte huge *)((long)(hptr) & 0xfffffff0L); |
destinyXfate | 2:0e2ef1edf01b | 230 | hptr = hptr + 16L; /* "hptr += 16L" fails on Turbo C++ 3.0 */ |
destinyXfate | 2:0e2ef1edf01b | 231 | } |
destinyXfate | 2:0e2ef1edf01b | 232 | for (i = 0; i < num_blocks; i++) |
destinyXfate | 2:0e2ef1edf01b | 233 | { |
destinyXfate | 2:0e2ef1edf01b | 234 | png_ptr->offset_table_ptr[i] = (png_bytep)hptr; |
destinyXfate | 2:0e2ef1edf01b | 235 | hptr = hptr + (png_uint_32)65536L; /* "+=" fails on TC++3.0 */ |
destinyXfate | 2:0e2ef1edf01b | 236 | } |
destinyXfate | 2:0e2ef1edf01b | 237 | |
destinyXfate | 2:0e2ef1edf01b | 238 | png_ptr->offset_table_number = num_blocks; |
destinyXfate | 2:0e2ef1edf01b | 239 | png_ptr->offset_table_count = 0; |
destinyXfate | 2:0e2ef1edf01b | 240 | png_ptr->offset_table_count_free = 0; |
destinyXfate | 2:0e2ef1edf01b | 241 | } |
destinyXfate | 2:0e2ef1edf01b | 242 | } |
destinyXfate | 2:0e2ef1edf01b | 243 | |
destinyXfate | 2:0e2ef1edf01b | 244 | if (png_ptr->offset_table_count >= png_ptr->offset_table_number) |
destinyXfate | 2:0e2ef1edf01b | 245 | { |
destinyXfate | 2:0e2ef1edf01b | 246 | #ifndef PNG_USER_MEM_SUPPORTED |
destinyXfate | 2:0e2ef1edf01b | 247 | if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) |
destinyXfate | 2:0e2ef1edf01b | 248 | png_error(png_ptr, "Out of Memory."); /* Note "o" and "M" */ |
destinyXfate | 2:0e2ef1edf01b | 249 | else |
destinyXfate | 2:0e2ef1edf01b | 250 | png_warning(png_ptr, "Out of Memory."); |
destinyXfate | 2:0e2ef1edf01b | 251 | #endif |
destinyXfate | 2:0e2ef1edf01b | 252 | return (NULL); |
destinyXfate | 2:0e2ef1edf01b | 253 | } |
destinyXfate | 2:0e2ef1edf01b | 254 | |
destinyXfate | 2:0e2ef1edf01b | 255 | ret = png_ptr->offset_table_ptr[png_ptr->offset_table_count++]; |
destinyXfate | 2:0e2ef1edf01b | 256 | } |
destinyXfate | 2:0e2ef1edf01b | 257 | else |
destinyXfate | 2:0e2ef1edf01b | 258 | ret = farmalloc(size); |
destinyXfate | 2:0e2ef1edf01b | 259 | |
destinyXfate | 2:0e2ef1edf01b | 260 | #ifndef PNG_USER_MEM_SUPPORTED |
destinyXfate | 2:0e2ef1edf01b | 261 | if (ret == NULL) |
destinyXfate | 2:0e2ef1edf01b | 262 | { |
destinyXfate | 2:0e2ef1edf01b | 263 | if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) |
destinyXfate | 2:0e2ef1edf01b | 264 | png_error(png_ptr, "Out of memory."); /* Note "o" and "m" */ |
destinyXfate | 2:0e2ef1edf01b | 265 | else |
destinyXfate | 2:0e2ef1edf01b | 266 | png_warning(png_ptr, "Out of memory."); /* Note "o" and "m" */ |
destinyXfate | 2:0e2ef1edf01b | 267 | } |
destinyXfate | 2:0e2ef1edf01b | 268 | #endif |
destinyXfate | 2:0e2ef1edf01b | 269 | |
destinyXfate | 2:0e2ef1edf01b | 270 | return (ret); |
destinyXfate | 2:0e2ef1edf01b | 271 | } |
destinyXfate | 2:0e2ef1edf01b | 272 | |
destinyXfate | 2:0e2ef1edf01b | 273 | /* free a pointer allocated by png_malloc(). In the default |
destinyXfate | 2:0e2ef1edf01b | 274 | configuration, png_ptr is not used, but is passed in case it |
destinyXfate | 2:0e2ef1edf01b | 275 | is needed. If ptr is NULL, return without taking any action. */ |
destinyXfate | 2:0e2ef1edf01b | 276 | void PNGAPI |
destinyXfate | 2:0e2ef1edf01b | 277 | png_free(png_structp png_ptr, png_voidp ptr) |
destinyXfate | 2:0e2ef1edf01b | 278 | { |
destinyXfate | 2:0e2ef1edf01b | 279 | if (png_ptr == NULL || ptr == NULL) |
destinyXfate | 2:0e2ef1edf01b | 280 | return; |
destinyXfate | 2:0e2ef1edf01b | 281 | |
destinyXfate | 2:0e2ef1edf01b | 282 | #ifdef PNG_USER_MEM_SUPPORTED |
destinyXfate | 2:0e2ef1edf01b | 283 | if (png_ptr->free_fn != NULL) |
destinyXfate | 2:0e2ef1edf01b | 284 | { |
destinyXfate | 2:0e2ef1edf01b | 285 | (*(png_ptr->free_fn))(png_ptr, ptr); |
destinyXfate | 2:0e2ef1edf01b | 286 | return; |
destinyXfate | 2:0e2ef1edf01b | 287 | } |
destinyXfate | 2:0e2ef1edf01b | 288 | else png_free_default(png_ptr, ptr); |
destinyXfate | 2:0e2ef1edf01b | 289 | } |
destinyXfate | 2:0e2ef1edf01b | 290 | |
destinyXfate | 2:0e2ef1edf01b | 291 | void PNGAPI |
destinyXfate | 2:0e2ef1edf01b | 292 | png_free_default(png_structp png_ptr, png_voidp ptr) |
destinyXfate | 2:0e2ef1edf01b | 293 | { |
destinyXfate | 2:0e2ef1edf01b | 294 | #endif /* PNG_USER_MEM_SUPPORTED */ |
destinyXfate | 2:0e2ef1edf01b | 295 | |
destinyXfate | 2:0e2ef1edf01b | 296 | if(png_ptr == NULL) return; |
destinyXfate | 2:0e2ef1edf01b | 297 | |
destinyXfate | 2:0e2ef1edf01b | 298 | if (png_ptr->offset_table != NULL) |
destinyXfate | 2:0e2ef1edf01b | 299 | { |
destinyXfate | 2:0e2ef1edf01b | 300 | int i; |
destinyXfate | 2:0e2ef1edf01b | 301 | |
destinyXfate | 2:0e2ef1edf01b | 302 | for (i = 0; i < png_ptr->offset_table_count; i++) |
destinyXfate | 2:0e2ef1edf01b | 303 | { |
destinyXfate | 2:0e2ef1edf01b | 304 | if (ptr == png_ptr->offset_table_ptr[i]) |
destinyXfate | 2:0e2ef1edf01b | 305 | { |
destinyXfate | 2:0e2ef1edf01b | 306 | ptr = NULL; |
destinyXfate | 2:0e2ef1edf01b | 307 | png_ptr->offset_table_count_free++; |
destinyXfate | 2:0e2ef1edf01b | 308 | break; |
destinyXfate | 2:0e2ef1edf01b | 309 | } |
destinyXfate | 2:0e2ef1edf01b | 310 | } |
destinyXfate | 2:0e2ef1edf01b | 311 | if (png_ptr->offset_table_count_free == png_ptr->offset_table_count) |
destinyXfate | 2:0e2ef1edf01b | 312 | { |
destinyXfate | 2:0e2ef1edf01b | 313 | farfree(png_ptr->offset_table); |
destinyXfate | 2:0e2ef1edf01b | 314 | farfree(png_ptr->offset_table_ptr); |
destinyXfate | 2:0e2ef1edf01b | 315 | png_ptr->offset_table = NULL; |
destinyXfate | 2:0e2ef1edf01b | 316 | png_ptr->offset_table_ptr = NULL; |
destinyXfate | 2:0e2ef1edf01b | 317 | } |
destinyXfate | 2:0e2ef1edf01b | 318 | } |
destinyXfate | 2:0e2ef1edf01b | 319 | |
destinyXfate | 2:0e2ef1edf01b | 320 | if (ptr != NULL) |
destinyXfate | 2:0e2ef1edf01b | 321 | { |
destinyXfate | 2:0e2ef1edf01b | 322 | farfree(ptr); |
destinyXfate | 2:0e2ef1edf01b | 323 | } |
destinyXfate | 2:0e2ef1edf01b | 324 | } |
destinyXfate | 2:0e2ef1edf01b | 325 | |
destinyXfate | 2:0e2ef1edf01b | 326 | #else /* Not the Borland DOS special memory handler */ |
destinyXfate | 2:0e2ef1edf01b | 327 | |
destinyXfate | 2:0e2ef1edf01b | 328 | /* Allocate memory for a png_struct or a png_info. The malloc and |
destinyXfate | 2:0e2ef1edf01b | 329 | memset can be replaced by a single call to calloc() if this is thought |
destinyXfate | 2:0e2ef1edf01b | 330 | to improve performance noticably. */ |
destinyXfate | 2:0e2ef1edf01b | 331 | png_voidp /* PRIVATE */ |
destinyXfate | 2:0e2ef1edf01b | 332 | png_create_struct(int type) |
destinyXfate | 2:0e2ef1edf01b | 333 | { |
destinyXfate | 2:0e2ef1edf01b | 334 | #ifdef PNG_USER_MEM_SUPPORTED |
destinyXfate | 2:0e2ef1edf01b | 335 | return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL)); |
destinyXfate | 2:0e2ef1edf01b | 336 | } |
destinyXfate | 2:0e2ef1edf01b | 337 | |
destinyXfate | 2:0e2ef1edf01b | 338 | /* Allocate memory for a png_struct or a png_info. The malloc and |
destinyXfate | 2:0e2ef1edf01b | 339 | memset can be replaced by a single call to calloc() if this is thought |
destinyXfate | 2:0e2ef1edf01b | 340 | to improve performance noticably. */ |
destinyXfate | 2:0e2ef1edf01b | 341 | png_voidp /* PRIVATE */ |
destinyXfate | 2:0e2ef1edf01b | 342 | png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) |
destinyXfate | 2:0e2ef1edf01b | 343 | { |
destinyXfate | 2:0e2ef1edf01b | 344 | #endif /* PNG_USER_MEM_SUPPORTED */ |
destinyXfate | 2:0e2ef1edf01b | 345 | png_size_t size; |
destinyXfate | 2:0e2ef1edf01b | 346 | png_voidp struct_ptr; |
destinyXfate | 2:0e2ef1edf01b | 347 | |
destinyXfate | 2:0e2ef1edf01b | 348 | if (type == PNG_STRUCT_INFO) |
destinyXfate | 2:0e2ef1edf01b | 349 | size = png_sizeof(png_info); |
destinyXfate | 2:0e2ef1edf01b | 350 | else if (type == PNG_STRUCT_PNG) |
destinyXfate | 2:0e2ef1edf01b | 351 | size = png_sizeof(png_struct); |
destinyXfate | 2:0e2ef1edf01b | 352 | else |
destinyXfate | 2:0e2ef1edf01b | 353 | return (NULL); |
destinyXfate | 2:0e2ef1edf01b | 354 | |
destinyXfate | 2:0e2ef1edf01b | 355 | #ifdef PNG_USER_MEM_SUPPORTED |
destinyXfate | 2:0e2ef1edf01b | 356 | if(malloc_fn != NULL) |
destinyXfate | 2:0e2ef1edf01b | 357 | { |
destinyXfate | 2:0e2ef1edf01b | 358 | png_struct dummy_struct; |
destinyXfate | 2:0e2ef1edf01b | 359 | png_structp png_ptr = &dummy_struct; |
destinyXfate | 2:0e2ef1edf01b | 360 | png_ptr->mem_ptr=mem_ptr; |
destinyXfate | 2:0e2ef1edf01b | 361 | struct_ptr = (*(malloc_fn))(png_ptr, size); |
destinyXfate | 2:0e2ef1edf01b | 362 | if (struct_ptr != NULL) |
destinyXfate | 2:0e2ef1edf01b | 363 | png_memset(struct_ptr, 0, size); |
destinyXfate | 2:0e2ef1edf01b | 364 | return (struct_ptr); |
destinyXfate | 2:0e2ef1edf01b | 365 | } |
destinyXfate | 2:0e2ef1edf01b | 366 | #endif /* PNG_USER_MEM_SUPPORTED */ |
destinyXfate | 2:0e2ef1edf01b | 367 | |
destinyXfate | 2:0e2ef1edf01b | 368 | #if defined(__TURBOC__) && !defined(__FLAT__) |
destinyXfate | 2:0e2ef1edf01b | 369 | struct_ptr = (png_voidp)farmalloc(size); |
destinyXfate | 2:0e2ef1edf01b | 370 | #else |
destinyXfate | 2:0e2ef1edf01b | 371 | # if defined(_MSC_VER) && defined(MAXSEG_64K) |
destinyXfate | 2:0e2ef1edf01b | 372 | struct_ptr = (png_voidp)halloc(size,1); |
destinyXfate | 2:0e2ef1edf01b | 373 | # else |
destinyXfate | 2:0e2ef1edf01b | 374 | struct_ptr = (png_voidp)malloc(size); |
destinyXfate | 2:0e2ef1edf01b | 375 | # endif |
destinyXfate | 2:0e2ef1edf01b | 376 | #endif |
destinyXfate | 2:0e2ef1edf01b | 377 | if (struct_ptr != NULL) |
destinyXfate | 2:0e2ef1edf01b | 378 | png_memset(struct_ptr, 0, size); |
destinyXfate | 2:0e2ef1edf01b | 379 | |
destinyXfate | 2:0e2ef1edf01b | 380 | return (struct_ptr); |
destinyXfate | 2:0e2ef1edf01b | 381 | } |
destinyXfate | 2:0e2ef1edf01b | 382 | |
destinyXfate | 2:0e2ef1edf01b | 383 | |
destinyXfate | 2:0e2ef1edf01b | 384 | /* Free memory allocated by a png_create_struct() call */ |
destinyXfate | 2:0e2ef1edf01b | 385 | void /* PRIVATE */ |
destinyXfate | 2:0e2ef1edf01b | 386 | png_destroy_struct(png_voidp struct_ptr) |
destinyXfate | 2:0e2ef1edf01b | 387 | { |
destinyXfate | 2:0e2ef1edf01b | 388 | #ifdef PNG_USER_MEM_SUPPORTED |
destinyXfate | 2:0e2ef1edf01b | 389 | png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL); |
destinyXfate | 2:0e2ef1edf01b | 390 | } |
destinyXfate | 2:0e2ef1edf01b | 391 | |
destinyXfate | 2:0e2ef1edf01b | 392 | /* Free memory allocated by a png_create_struct() call */ |
destinyXfate | 2:0e2ef1edf01b | 393 | void /* PRIVATE */ |
destinyXfate | 2:0e2ef1edf01b | 394 | png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, |
destinyXfate | 2:0e2ef1edf01b | 395 | png_voidp mem_ptr) |
destinyXfate | 2:0e2ef1edf01b | 396 | { |
destinyXfate | 2:0e2ef1edf01b | 397 | #endif /* PNG_USER_MEM_SUPPORTED */ |
destinyXfate | 2:0e2ef1edf01b | 398 | if (struct_ptr != NULL) |
destinyXfate | 2:0e2ef1edf01b | 399 | { |
destinyXfate | 2:0e2ef1edf01b | 400 | #ifdef PNG_USER_MEM_SUPPORTED |
destinyXfate | 2:0e2ef1edf01b | 401 | if(free_fn != NULL) |
destinyXfate | 2:0e2ef1edf01b | 402 | { |
destinyXfate | 2:0e2ef1edf01b | 403 | png_struct dummy_struct; |
destinyXfate | 2:0e2ef1edf01b | 404 | png_structp png_ptr = &dummy_struct; |
destinyXfate | 2:0e2ef1edf01b | 405 | png_ptr->mem_ptr=mem_ptr; |
destinyXfate | 2:0e2ef1edf01b | 406 | (*(free_fn))(png_ptr, struct_ptr); |
destinyXfate | 2:0e2ef1edf01b | 407 | return; |
destinyXfate | 2:0e2ef1edf01b | 408 | } |
destinyXfate | 2:0e2ef1edf01b | 409 | #endif /* PNG_USER_MEM_SUPPORTED */ |
destinyXfate | 2:0e2ef1edf01b | 410 | #if defined(__TURBOC__) && !defined(__FLAT__) |
destinyXfate | 2:0e2ef1edf01b | 411 | farfree(struct_ptr); |
destinyXfate | 2:0e2ef1edf01b | 412 | #else |
destinyXfate | 2:0e2ef1edf01b | 413 | # if defined(_MSC_VER) && defined(MAXSEG_64K) |
destinyXfate | 2:0e2ef1edf01b | 414 | hfree(struct_ptr); |
destinyXfate | 2:0e2ef1edf01b | 415 | # else |
destinyXfate | 2:0e2ef1edf01b | 416 | free(struct_ptr); |
destinyXfate | 2:0e2ef1edf01b | 417 | # endif |
destinyXfate | 2:0e2ef1edf01b | 418 | #endif |
destinyXfate | 2:0e2ef1edf01b | 419 | } |
destinyXfate | 2:0e2ef1edf01b | 420 | } |
destinyXfate | 2:0e2ef1edf01b | 421 | |
destinyXfate | 2:0e2ef1edf01b | 422 | /* Allocate memory. For reasonable files, size should never exceed |
destinyXfate | 2:0e2ef1edf01b | 423 | 64K. However, zlib may allocate more then 64K if you don't tell |
destinyXfate | 2:0e2ef1edf01b | 424 | it not to. See zconf.h and png.h for more information. zlib does |
destinyXfate | 2:0e2ef1edf01b | 425 | need to allocate exactly 64K, so whatever you call here must |
destinyXfate | 2:0e2ef1edf01b | 426 | have the ability to do that. */ |
destinyXfate | 2:0e2ef1edf01b | 427 | |
destinyXfate | 2:0e2ef1edf01b | 428 | png_voidp PNGAPI |
destinyXfate | 2:0e2ef1edf01b | 429 | png_malloc(png_structp png_ptr, png_uint_32 size) |
destinyXfate | 2:0e2ef1edf01b | 430 | { |
destinyXfate | 2:0e2ef1edf01b | 431 | png_voidp ret; |
destinyXfate | 2:0e2ef1edf01b | 432 | |
destinyXfate | 2:0e2ef1edf01b | 433 | #ifdef PNG_USER_MEM_SUPPORTED |
destinyXfate | 2:0e2ef1edf01b | 434 | if (png_ptr == NULL || size == 0) |
destinyXfate | 2:0e2ef1edf01b | 435 | return (NULL); |
destinyXfate | 2:0e2ef1edf01b | 436 | |
destinyXfate | 2:0e2ef1edf01b | 437 | if(png_ptr->malloc_fn != NULL) |
destinyXfate | 2:0e2ef1edf01b | 438 | ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); |
destinyXfate | 2:0e2ef1edf01b | 439 | else |
destinyXfate | 2:0e2ef1edf01b | 440 | ret = (png_malloc_default(png_ptr, size)); |
destinyXfate | 2:0e2ef1edf01b | 441 | if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) |
destinyXfate | 2:0e2ef1edf01b | 442 | png_error(png_ptr, "Out of Memory!"); |
destinyXfate | 2:0e2ef1edf01b | 443 | return (ret); |
destinyXfate | 2:0e2ef1edf01b | 444 | } |
destinyXfate | 2:0e2ef1edf01b | 445 | |
destinyXfate | 2:0e2ef1edf01b | 446 | png_voidp PNGAPI |
destinyXfate | 2:0e2ef1edf01b | 447 | png_malloc_default(png_structp png_ptr, png_uint_32 size) |
destinyXfate | 2:0e2ef1edf01b | 448 | { |
destinyXfate | 2:0e2ef1edf01b | 449 | png_voidp ret; |
destinyXfate | 2:0e2ef1edf01b | 450 | #endif /* PNG_USER_MEM_SUPPORTED */ |
destinyXfate | 2:0e2ef1edf01b | 451 | |
destinyXfate | 2:0e2ef1edf01b | 452 | if (png_ptr == NULL || size == 0) |
destinyXfate | 2:0e2ef1edf01b | 453 | return (NULL); |
destinyXfate | 2:0e2ef1edf01b | 454 | |
destinyXfate | 2:0e2ef1edf01b | 455 | #ifdef PNG_MAX_MALLOC_64K |
destinyXfate | 2:0e2ef1edf01b | 456 | if (size > (png_uint_32)65536L) |
destinyXfate | 2:0e2ef1edf01b | 457 | { |
destinyXfate | 2:0e2ef1edf01b | 458 | #ifndef PNG_USER_MEM_SUPPORTED |
destinyXfate | 2:0e2ef1edf01b | 459 | if(png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) |
destinyXfate | 2:0e2ef1edf01b | 460 | png_error(png_ptr, "Cannot Allocate > 64K"); |
destinyXfate | 2:0e2ef1edf01b | 461 | else |
destinyXfate | 2:0e2ef1edf01b | 462 | #endif |
destinyXfate | 2:0e2ef1edf01b | 463 | return NULL; |
destinyXfate | 2:0e2ef1edf01b | 464 | } |
destinyXfate | 2:0e2ef1edf01b | 465 | #endif |
destinyXfate | 2:0e2ef1edf01b | 466 | |
destinyXfate | 2:0e2ef1edf01b | 467 | /* Check for overflow */ |
destinyXfate | 2:0e2ef1edf01b | 468 | #if defined(__TURBOC__) && !defined(__FLAT__) |
destinyXfate | 2:0e2ef1edf01b | 469 | if (size != (unsigned long)size) |
destinyXfate | 2:0e2ef1edf01b | 470 | ret = NULL; |
destinyXfate | 2:0e2ef1edf01b | 471 | else |
destinyXfate | 2:0e2ef1edf01b | 472 | ret = farmalloc(size); |
destinyXfate | 2:0e2ef1edf01b | 473 | #else |
destinyXfate | 2:0e2ef1edf01b | 474 | # if defined(_MSC_VER) && defined(MAXSEG_64K) |
destinyXfate | 2:0e2ef1edf01b | 475 | if (size != (unsigned long)size) |
destinyXfate | 2:0e2ef1edf01b | 476 | ret = NULL; |
destinyXfate | 2:0e2ef1edf01b | 477 | else |
destinyXfate | 2:0e2ef1edf01b | 478 | ret = halloc(size, 1); |
destinyXfate | 2:0e2ef1edf01b | 479 | # else |
destinyXfate | 2:0e2ef1edf01b | 480 | if (size != (size_t)size) |
destinyXfate | 2:0e2ef1edf01b | 481 | ret = NULL; |
destinyXfate | 2:0e2ef1edf01b | 482 | else |
destinyXfate | 2:0e2ef1edf01b | 483 | ret = malloc((size_t)size); |
destinyXfate | 2:0e2ef1edf01b | 484 | # endif |
destinyXfate | 2:0e2ef1edf01b | 485 | #endif |
destinyXfate | 2:0e2ef1edf01b | 486 | |
destinyXfate | 2:0e2ef1edf01b | 487 | #ifndef PNG_USER_MEM_SUPPORTED |
destinyXfate | 2:0e2ef1edf01b | 488 | if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) |
destinyXfate | 2:0e2ef1edf01b | 489 | png_error(png_ptr, "Out of Memory"); |
destinyXfate | 2:0e2ef1edf01b | 490 | #endif |
destinyXfate | 2:0e2ef1edf01b | 491 | |
destinyXfate | 2:0e2ef1edf01b | 492 | return (ret); |
destinyXfate | 2:0e2ef1edf01b | 493 | } |
destinyXfate | 2:0e2ef1edf01b | 494 | |
destinyXfate | 2:0e2ef1edf01b | 495 | /* Free a pointer allocated by png_malloc(). If ptr is NULL, return |
destinyXfate | 2:0e2ef1edf01b | 496 | without taking any action. */ |
destinyXfate | 2:0e2ef1edf01b | 497 | void PNGAPI |
destinyXfate | 2:0e2ef1edf01b | 498 | png_free(png_structp png_ptr, png_voidp ptr) |
destinyXfate | 2:0e2ef1edf01b | 499 | { |
destinyXfate | 2:0e2ef1edf01b | 500 | if (png_ptr == NULL || ptr == NULL) |
destinyXfate | 2:0e2ef1edf01b | 501 | return; |
destinyXfate | 2:0e2ef1edf01b | 502 | |
destinyXfate | 2:0e2ef1edf01b | 503 | #ifdef PNG_USER_MEM_SUPPORTED |
destinyXfate | 2:0e2ef1edf01b | 504 | if (png_ptr->free_fn != NULL) |
destinyXfate | 2:0e2ef1edf01b | 505 | { |
destinyXfate | 2:0e2ef1edf01b | 506 | (*(png_ptr->free_fn))(png_ptr, ptr); |
destinyXfate | 2:0e2ef1edf01b | 507 | return; |
destinyXfate | 2:0e2ef1edf01b | 508 | } |
destinyXfate | 2:0e2ef1edf01b | 509 | else png_free_default(png_ptr, ptr); |
destinyXfate | 2:0e2ef1edf01b | 510 | } |
destinyXfate | 2:0e2ef1edf01b | 511 | void PNGAPI |
destinyXfate | 2:0e2ef1edf01b | 512 | png_free_default(png_structp png_ptr, png_voidp ptr) |
destinyXfate | 2:0e2ef1edf01b | 513 | { |
destinyXfate | 2:0e2ef1edf01b | 514 | if (png_ptr == NULL || ptr == NULL) |
destinyXfate | 2:0e2ef1edf01b | 515 | return; |
destinyXfate | 2:0e2ef1edf01b | 516 | |
destinyXfate | 2:0e2ef1edf01b | 517 | #endif /* PNG_USER_MEM_SUPPORTED */ |
destinyXfate | 2:0e2ef1edf01b | 518 | |
destinyXfate | 2:0e2ef1edf01b | 519 | #if defined(__TURBOC__) && !defined(__FLAT__) |
destinyXfate | 2:0e2ef1edf01b | 520 | farfree(ptr); |
destinyXfate | 2:0e2ef1edf01b | 521 | #else |
destinyXfate | 2:0e2ef1edf01b | 522 | # if defined(_MSC_VER) && defined(MAXSEG_64K) |
destinyXfate | 2:0e2ef1edf01b | 523 | hfree(ptr); |
destinyXfate | 2:0e2ef1edf01b | 524 | # else |
destinyXfate | 2:0e2ef1edf01b | 525 | free(ptr); |
destinyXfate | 2:0e2ef1edf01b | 526 | # endif |
destinyXfate | 2:0e2ef1edf01b | 527 | #endif |
destinyXfate | 2:0e2ef1edf01b | 528 | } |
destinyXfate | 2:0e2ef1edf01b | 529 | |
destinyXfate | 2:0e2ef1edf01b | 530 | #endif /* Not Borland DOS special memory handler */ |
destinyXfate | 2:0e2ef1edf01b | 531 | |
destinyXfate | 2:0e2ef1edf01b | 532 | #if defined(PNG_1_0_X) |
destinyXfate | 2:0e2ef1edf01b | 533 | # define png_malloc_warn png_malloc |
destinyXfate | 2:0e2ef1edf01b | 534 | #else |
destinyXfate | 2:0e2ef1edf01b | 535 | /* This function was added at libpng version 1.2.3. The png_malloc_warn() |
destinyXfate | 2:0e2ef1edf01b | 536 | * function will set up png_malloc() to issue a png_warning and return NULL |
destinyXfate | 2:0e2ef1edf01b | 537 | * instead of issuing a png_error, if it fails to allocate the requested |
destinyXfate | 2:0e2ef1edf01b | 538 | * memory. |
destinyXfate | 2:0e2ef1edf01b | 539 | */ |
destinyXfate | 2:0e2ef1edf01b | 540 | png_voidp PNGAPI |
destinyXfate | 2:0e2ef1edf01b | 541 | png_malloc_warn(png_structp png_ptr, png_uint_32 size) |
destinyXfate | 2:0e2ef1edf01b | 542 | { |
destinyXfate | 2:0e2ef1edf01b | 543 | png_voidp ptr; |
destinyXfate | 2:0e2ef1edf01b | 544 | png_uint_32 save_flags; |
destinyXfate | 2:0e2ef1edf01b | 545 | if(png_ptr == NULL) return (NULL); |
destinyXfate | 2:0e2ef1edf01b | 546 | |
destinyXfate | 2:0e2ef1edf01b | 547 | save_flags=png_ptr->flags; |
destinyXfate | 2:0e2ef1edf01b | 548 | png_ptr->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK; |
destinyXfate | 2:0e2ef1edf01b | 549 | ptr = (png_voidp)png_malloc((png_structp)png_ptr, size); |
destinyXfate | 2:0e2ef1edf01b | 550 | png_ptr->flags=save_flags; |
destinyXfate | 2:0e2ef1edf01b | 551 | return(ptr); |
destinyXfate | 2:0e2ef1edf01b | 552 | } |
destinyXfate | 2:0e2ef1edf01b | 553 | #endif |
destinyXfate | 2:0e2ef1edf01b | 554 | |
destinyXfate | 2:0e2ef1edf01b | 555 | png_voidp PNGAPI |
destinyXfate | 2:0e2ef1edf01b | 556 | png_memcpy_check (png_structp png_ptr, png_voidp s1, png_voidp s2, |
destinyXfate | 2:0e2ef1edf01b | 557 | png_uint_32 length) |
destinyXfate | 2:0e2ef1edf01b | 558 | { |
destinyXfate | 2:0e2ef1edf01b | 559 | png_size_t size; |
destinyXfate | 2:0e2ef1edf01b | 560 | |
destinyXfate | 2:0e2ef1edf01b | 561 | size = (png_size_t)length; |
destinyXfate | 2:0e2ef1edf01b | 562 | if ((png_uint_32)size != length) |
destinyXfate | 2:0e2ef1edf01b | 563 | png_error(png_ptr,"Overflow in png_memcpy_check."); |
destinyXfate | 2:0e2ef1edf01b | 564 | |
destinyXfate | 2:0e2ef1edf01b | 565 | return(png_memcpy (s1, s2, size)); |
destinyXfate | 2:0e2ef1edf01b | 566 | } |
destinyXfate | 2:0e2ef1edf01b | 567 | |
destinyXfate | 2:0e2ef1edf01b | 568 | png_voidp PNGAPI |
destinyXfate | 2:0e2ef1edf01b | 569 | png_memset_check (png_structp png_ptr, png_voidp s1, int value, |
destinyXfate | 2:0e2ef1edf01b | 570 | png_uint_32 length) |
destinyXfate | 2:0e2ef1edf01b | 571 | { |
destinyXfate | 2:0e2ef1edf01b | 572 | png_size_t size; |
destinyXfate | 2:0e2ef1edf01b | 573 | |
destinyXfate | 2:0e2ef1edf01b | 574 | size = (png_size_t)length; |
destinyXfate | 2:0e2ef1edf01b | 575 | if ((png_uint_32)size != length) |
destinyXfate | 2:0e2ef1edf01b | 576 | png_error(png_ptr,"Overflow in png_memset_check."); |
destinyXfate | 2:0e2ef1edf01b | 577 | |
destinyXfate | 2:0e2ef1edf01b | 578 | return (png_memset (s1, value, size)); |
destinyXfate | 2:0e2ef1edf01b | 579 | |
destinyXfate | 2:0e2ef1edf01b | 580 | } |
destinyXfate | 2:0e2ef1edf01b | 581 | |
destinyXfate | 2:0e2ef1edf01b | 582 | #ifdef PNG_USER_MEM_SUPPORTED |
destinyXfate | 2:0e2ef1edf01b | 583 | /* This function is called when the application wants to use another method |
destinyXfate | 2:0e2ef1edf01b | 584 | * of allocating and freeing memory. |
destinyXfate | 2:0e2ef1edf01b | 585 | */ |
destinyXfate | 2:0e2ef1edf01b | 586 | void PNGAPI |
destinyXfate | 2:0e2ef1edf01b | 587 | png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr |
destinyXfate | 2:0e2ef1edf01b | 588 | malloc_fn, png_free_ptr free_fn) |
destinyXfate | 2:0e2ef1edf01b | 589 | { |
destinyXfate | 2:0e2ef1edf01b | 590 | if(png_ptr != NULL) { |
destinyXfate | 2:0e2ef1edf01b | 591 | png_ptr->mem_ptr = mem_ptr; |
destinyXfate | 2:0e2ef1edf01b | 592 | png_ptr->malloc_fn = malloc_fn; |
destinyXfate | 2:0e2ef1edf01b | 593 | png_ptr->free_fn = free_fn; |
destinyXfate | 2:0e2ef1edf01b | 594 | } |
destinyXfate | 2:0e2ef1edf01b | 595 | } |
destinyXfate | 2:0e2ef1edf01b | 596 | |
destinyXfate | 2:0e2ef1edf01b | 597 | /* This function returns a pointer to the mem_ptr associated with the user |
destinyXfate | 2:0e2ef1edf01b | 598 | * functions. The application should free any memory associated with this |
destinyXfate | 2:0e2ef1edf01b | 599 | * pointer before png_write_destroy and png_read_destroy are called. |
destinyXfate | 2:0e2ef1edf01b | 600 | */ |
destinyXfate | 2:0e2ef1edf01b | 601 | png_voidp PNGAPI |
destinyXfate | 2:0e2ef1edf01b | 602 | png_get_mem_ptr(png_structp png_ptr) |
destinyXfate | 2:0e2ef1edf01b | 603 | { |
destinyXfate | 2:0e2ef1edf01b | 604 | if(png_ptr == NULL) return (NULL); |
destinyXfate | 2:0e2ef1edf01b | 605 | return ((png_voidp)png_ptr->mem_ptr); |
destinyXfate | 2:0e2ef1edf01b | 606 | } |
destinyXfate | 2:0e2ef1edf01b | 607 | #endif /* PNG_USER_MEM_SUPPORTED */ |
destinyXfate | 2:0e2ef1edf01b | 608 | #endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ |
destinyXfate | 2:0e2ef1edf01b | 609 |