15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* pngmem.c - stub functions for memory allocation 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Last changed in libpng 1.2.41 [February 25, 2010] 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 1998-2010 Glenn Randers-Pehrson 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This code is released under the libpng license. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * For conditions of distribution and use, see the disclaimer 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and license in png.h 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This file provides a location for all memory allocation. Users who 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * need special memory handling are expected to supply replacement 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * functions for png_malloc() and png_free(), and to use 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * png_create_read_struct_2() and png_create_write_struct_2() to 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * identify the replacement functions. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_INTERNAL 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_NO_PEDANTIC_WARNINGS 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "png.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Borland DOS special memory handler */ 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* If you change this, be sure to change the one in png.h also */ 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Allocate memory for a png_struct. The malloc and memset can be replaced 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) by a single call to calloc() if this is thought to improve performance. */ 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp /* PRIVATE */ 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_create_struct(int type) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL)); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Alternate version of png_create_struct, for use with user-defined malloc. */ 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp /* PRIVATE */ 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */ 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_size_t size; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_voidp struct_ptr; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == PNG_STRUCT_INFO) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size = png_sizeof(png_info); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (type == PNG_STRUCT_PNG) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size = png_sizeof(png_struct); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (png_get_copyright(NULL)); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (malloc_fn != NULL) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_struct dummy_struct; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_structp png_ptr = &dummy_struct; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->mem_ptr=mem_ptr; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct_ptr = (*(malloc_fn))(png_ptr, (png_uint_32)size); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */ 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct_ptr = (png_voidp)farmalloc(size); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (struct_ptr != NULL) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memset(struct_ptr, 0, size); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (struct_ptr); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Free memory allocated by a png_create_struct() call */ 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_destroy_struct(png_voidp struct_ptr) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Free memory allocated by a png_create_struct() call */ 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_voidp mem_ptr) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (struct_ptr != NULL) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (free_fn != NULL) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_struct dummy_struct; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_structp png_ptr = &dummy_struct; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->mem_ptr=mem_ptr; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*(free_fn))(png_ptr, struct_ptr); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */ 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) farfree (struct_ptr); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Allocate memory. For reasonable files, size should never exceed 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 64K. However, zlib may allocate more then 64K if you don't tell 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * it not to. See zconf.h and png.h for more information. zlib does 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * need to allocate exactly 64K, so whatever you call here must 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * have the ability to do that. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Borland seems to have a problem in DOS mode for exactly 64K. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * It gives you a segment with an offset of 8 (perhaps to store its 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * memory stuff). zlib doesn't like this at all, so we have to 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * detect and deal with it. This code should not be needed in 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Windows or OS/2 modes, and only in 16 bit mode. This code has 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * been updated by Alexander Lehmann for version 0.89 to waste less 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * memory. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note that we can't use png_size_t for the "size" declaration, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * since on some systems a png_size_t is a 16-bit quantity, and as a 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * result, we would be truncating potentially larger memory requests 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (which should cause a fatal error) and introducing major problems. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp /* PRIVATE */ 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_calloc(png_structp png_ptr, png_uint_32 size) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_voidp ret; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = (png_malloc(png_ptr, size)); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != NULL) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memset(ret,0,(png_size_t)size); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp PNGAPI 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_malloc(png_structp png_ptr, png_uint_32 size) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_voidp ret; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL || size == 0) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->malloc_fn != NULL) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = (png_malloc_default(png_ptr, size)); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Out of memory!"); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp PNGAPI 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_malloc_default(png_structp png_ptr, png_uint_32 size) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_voidp ret; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */ 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL || size == 0) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_MAX_MALLOC_64K 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (size > (png_uint_32)65536L) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, "Cannot Allocate > 64K"); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = NULL; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (size != (size_t)size) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = NULL; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (size == (png_uint_32)65536L) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->offset_table == NULL) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Try to see if we need to do any of this fancy stuff */ 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = farmalloc(size); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL || ((png_size_t)ret & 0xffff)) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_blocks; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 total_size; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytep table; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_byte huge * hptr; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != NULL) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) farfree(ret); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = NULL; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->zlib_window_bits > 14) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_blocks = (int)(1 << (png_ptr->zlib_window_bits - 14)); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_blocks = 1; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->zlib_mem_level >= 7) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_blocks += (int)(1 << (png_ptr->zlib_mem_level - 7)); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_blocks++; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) total_size = ((png_uint_32)65536L) * (png_uint_32)num_blocks+16; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) table = farmalloc(total_size); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (table == NULL) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PNG_USER_MEM_SUPPORTED 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Out Of Memory."); /* Note "O", "M" */ 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, "Out Of Memory."); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((png_size_t)table & 0xfff0) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PNG_USER_MEM_SUPPORTED 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Farmalloc didn't return normalized pointer"); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Farmalloc didn't return normalized pointer"); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->offset_table = table; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->offset_table_ptr = farmalloc(num_blocks * 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_sizeof(png_bytep)); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->offset_table_ptr == NULL) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PNG_USER_MEM_SUPPORTED 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Out Of memory."); /* Note "O", "m" */ 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, "Out Of memory."); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hptr = (png_byte huge *)table; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((png_size_t)hptr & 0xf) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hptr = (png_byte huge *)((long)(hptr) & 0xfffffff0L); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hptr = hptr + 16L; /* "hptr += 16L" fails on Turbo C++ 3.0 */ 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < num_blocks; i++) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->offset_table_ptr[i] = (png_bytep)hptr; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hptr = hptr + (png_uint_32)65536L; /* "+=" fails on TC++3.0 */ 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->offset_table_number = num_blocks; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->offset_table_count = 0; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->offset_table_count_free = 0; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->offset_table_count >= png_ptr->offset_table_number) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PNG_USER_MEM_SUPPORTED 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Out of Memory."); /* Note "o" and "M" */ 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, "Out of Memory."); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = png_ptr->offset_table_ptr[png_ptr->offset_table_count++]; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = farmalloc(size); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PNG_USER_MEM_SUPPORTED 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Out of memory."); /* Note "o" and "m" */ 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, "Out of memory."); /* Note "o" and "m" */ 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Free a pointer allocated by png_malloc(). In the default 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * configuration, png_ptr is not used, but is passed in case it 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is needed. If ptr is NULL, return without taking any action. 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_free(png_structp png_ptr, png_voidp ptr) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL || ptr == NULL) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->free_fn != NULL) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*(png_ptr->free_fn))(png_ptr, ptr); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free_default(png_ptr, ptr); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_free_default(png_structp png_ptr, png_voidp ptr) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */ 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL || ptr == NULL) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->offset_table != NULL) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < png_ptr->offset_table_count; i++) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ptr == png_ptr->offset_table_ptr[i]) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr = NULL; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->offset_table_count_free++; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->offset_table_count_free == png_ptr->offset_table_count) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) farfree(png_ptr->offset_table); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) farfree(png_ptr->offset_table_ptr); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->offset_table = NULL; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->offset_table_ptr = NULL; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ptr != NULL) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) farfree(ptr); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else /* Not the Borland DOS special memory handler */ 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Allocate memory for a png_struct or a png_info. The malloc and 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset can be replaced by a single call to calloc() if this is thought 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to improve performance noticably. */ 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp /* PRIVATE */ 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_create_struct(int type) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL)); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Allocate memory for a png_struct or a png_info. The malloc and 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset can be replaced by a single call to calloc() if this is thought 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to improve performance noticably. */ 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp /* PRIVATE */ 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */ 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_size_t size; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_voidp struct_ptr; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == PNG_STRUCT_INFO) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size = png_sizeof(png_info); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (type == PNG_STRUCT_PNG) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size = png_sizeof(png_struct); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (malloc_fn != NULL) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_struct dummy_struct; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_structp png_ptr = &dummy_struct; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->mem_ptr=mem_ptr; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct_ptr = (*(malloc_fn))(png_ptr, size); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (struct_ptr != NULL) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memset(struct_ptr, 0, size); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (struct_ptr); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */ 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__TURBOC__) && !defined(__FLAT__) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct_ptr = (png_voidp)farmalloc(size); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(_MSC_VER) && defined(MAXSEG_64K) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct_ptr = (png_voidp)halloc(size, 1); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct_ptr = (png_voidp)malloc(size); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (struct_ptr != NULL) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memset(struct_ptr, 0, size); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (struct_ptr); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Free memory allocated by a png_create_struct() call */ 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_destroy_struct(png_voidp struct_ptr) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Free memory allocated by a png_create_struct() call */ 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_voidp mem_ptr) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */ 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (struct_ptr != NULL) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (free_fn != NULL) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_struct dummy_struct; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_structp png_ptr = &dummy_struct; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->mem_ptr=mem_ptr; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*(free_fn))(png_ptr, struct_ptr); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */ 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__TURBOC__) && !defined(__FLAT__) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) farfree(struct_ptr); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(_MSC_VER) && defined(MAXSEG_64K) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hfree(struct_ptr); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) free(struct_ptr); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Allocate memory. For reasonable files, size should never exceed 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 64K. However, zlib may allocate more then 64K if you don't tell 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * it not to. See zconf.h and png.h for more information. zlib does 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * need to allocate exactly 64K, so whatever you call here must 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * have the ability to do that. 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp /* PRIVATE */ 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_calloc(png_structp png_ptr, png_uint_32 size) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_voidp ret; 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = (png_malloc(png_ptr, size)); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != NULL) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memset(ret,0,(png_size_t)size); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp PNGAPI 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_malloc(png_structp png_ptr, png_uint_32 size) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_voidp ret; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL || size == 0) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->malloc_fn != NULL) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = (png_malloc_default(png_ptr, size)); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Out of Memory!"); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp PNGAPI 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_malloc_default(png_structp png_ptr, png_uint_32 size) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_voidp ret; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */ 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL || size == 0) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_MAX_MALLOC_64K 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (size > (png_uint_32)65536L) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PNG_USER_MEM_SUPPORTED 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Cannot Allocate > 64K"); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Check for overflow */ 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__TURBOC__) && !defined(__FLAT__) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (size != (unsigned long)size) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = NULL; 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = farmalloc(size); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(_MSC_VER) && defined(MAXSEG_64K) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (size != (unsigned long)size) 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = NULL; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = halloc(size, 1); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (size != (size_t)size) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = NULL; 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = malloc((size_t)size); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PNG_USER_MEM_SUPPORTED 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Out of Memory"); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Free a pointer allocated by png_malloc(). If ptr is NULL, return 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * without taking any action. 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_free(png_structp png_ptr, png_voidp ptr) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL || ptr == NULL) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->free_fn != NULL) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*(png_ptr->free_fn))(png_ptr, ptr); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free_default(png_ptr, ptr); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_free_default(png_structp png_ptr, png_voidp ptr) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL || ptr == NULL) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */ 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__TURBOC__) && !defined(__FLAT__) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) farfree(ptr); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(_MSC_VER) && defined(MAXSEG_64K) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hfree(ptr); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) free(ptr); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* Not Borland DOS special memory handler */ 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_1_0_X 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define png_malloc_warn png_malloc 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This function was added at libpng version 1.2.3. The png_malloc_warn() 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * function will set up png_malloc() to issue a png_warning and return NULL 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * instead of issuing a png_error, if it fails to allocate the requested 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * memory. 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp PNGAPI 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_malloc_warn(png_structp png_ptr, png_uint_32 size) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_voidp ptr; 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 save_flags; 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_flags = png_ptr->flags; 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr = (png_voidp)png_malloc((png_structp)png_ptr, size); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->flags=save_flags; 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ptr); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp PNGAPI 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_memcpy_check (png_structp png_ptr, png_voidp s1, png_voidp s2, 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 length) 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_size_t size; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size = (png_size_t)length; 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((png_uint_32)size != length) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Overflow in png_memcpy_check."); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(png_memcpy (s1, s2, size)); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp PNGAPI 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_memset_check (png_structp png_ptr, png_voidp s1, int value, 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 length) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_size_t size; 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size = (png_size_t)length; 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((png_uint_32)size != length) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Overflow in png_memset_check."); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (png_memset (s1, value, size)); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This function is called when the application wants to use another method 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of allocating and freeing memory. 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) malloc_fn, png_free_ptr free_fn) 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr != NULL) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->mem_ptr = mem_ptr; 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->malloc_fn = malloc_fn; 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->free_fn = free_fn; 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This function returns a pointer to the mem_ptr associated with the user 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * functions. The application should free any memory associated with this 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pointer before png_write_destroy and png_read_destroy are called. 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp PNGAPI 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_get_mem_ptr(png_structp png_ptr) 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ((png_voidp)png_ptr->mem_ptr); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */ 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ 642