18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* pngmem.c - stub functions for memory allocation 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 4c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * Last changed in libpng 1.2.41 [February 25, 2010] 5c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * Copyright (c) 1998-2010 Glenn Randers-Pehrson 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 9c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * This code is released under the libpng license. 10c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * For conditions of distribution and use, see the disclaimer 11c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * and license in png.h 12c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * This file provides a location for all memory allocation. Users who 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * need special memory handling are expected to supply replacement 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * functions for png_malloc() and png_free(), and to use 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * png_create_read_struct_2() and png_create_write_struct_2() to 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * identify the replacement functions. 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_INTERNAL 21c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#define PNG_NO_PEDANTIC_WARNINGS 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "png.h" 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Borland DOS special memory handler */ 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) 27c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner/* If you change this, be sure to change the one in png.h also */ 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Allocate memory for a png_struct. The malloc and memset can be replaced 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project by a single call to calloc() if this is thought to improve performance. */ 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp /* PRIVATE */ 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_create_struct(int type) 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL)); 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Alternate version of png_create_struct, for use with user-defined malloc. */ 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp /* PRIVATE */ 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t size; 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_voidp struct_ptr; 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (type == PNG_STRUCT_INFO) 47c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner size = png_sizeof(png_info); 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (type == PNG_STRUCT_PNG) 49c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner size = png_sizeof(png_struct); 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 51c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner return (png_get_copyright(NULL)); 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 54c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (malloc_fn != NULL) 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_struct dummy_struct; 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_structp png_ptr = &dummy_struct; 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mem_ptr=mem_ptr; 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct_ptr = (*(malloc_fn))(png_ptr, (png_uint_32)size); 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 63c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner struct_ptr = (png_voidp)farmalloc(size); 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (struct_ptr != NULL) 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memset(struct_ptr, 0, size); 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (struct_ptr); 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Free memory allocated by a png_create_struct() call */ 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_destroy_struct(png_voidp struct_ptr) 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL); 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Free memory allocated by a png_create_struct() call */ 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_voidp mem_ptr) 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (struct_ptr != NULL) 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 86c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (free_fn != NULL) 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_struct dummy_struct; 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_structp png_ptr = &dummy_struct; 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mem_ptr=mem_ptr; 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (*(free_fn))(png_ptr, struct_ptr); 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project farfree (struct_ptr); 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Allocate memory. For reasonable files, size should never exceed 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 64K. However, zlib may allocate more then 64K if you don't tell 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * it not to. See zconf.h and png.h for more information. zlib does 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * need to allocate exactly 64K, so whatever you call here must 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * have the ability to do that. 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Borland seems to have a problem in DOS mode for exactly 64K. 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * It gives you a segment with an offset of 8 (perhaps to store its 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * memory stuff). zlib doesn't like this at all, so we have to 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * detect and deal with it. This code should not be needed in 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Windows or OS/2 modes, and only in 16 bit mode. This code has 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * been updated by Alexander Lehmann for version 0.89 to waste less 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * memory. 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Note that we can't use png_size_t for the "size" declaration, 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * since on some systems a png_size_t is a 16-bit quantity, and as a 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * result, we would be truncating potentially larger memory requests 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (which should cause a fatal error) and introducing major problems. 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 118c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turnerpng_voidp /* PRIVATE */ 119c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turnerpng_calloc(png_structp png_ptr, png_uint_32 size) 120c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner{ 121c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_voidp ret; 122c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 123c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner ret = (png_malloc(png_ptr, size)); 124c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (ret != NULL) 125c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_memset(ret,0,(png_size_t)size); 126c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner return (ret); 127c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner} 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp PNGAPI 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_malloc(png_structp png_ptr, png_uint_32 size) 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_voidp ret; 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL || size == 0) 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (NULL); 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 138c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr->malloc_fn != NULL) 139c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 141c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner ret = (png_malloc_default(png_ptr, size)); 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Out of memory!"); 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (ret); 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp PNGAPI 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_malloc_default(png_structp png_ptr, png_uint_32 size) 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_voidp ret; 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL || size == 0) 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (NULL); 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (size > (png_uint_32)65536L) 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Cannot Allocate > 64K"); 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = NULL; 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (size != (size_t)size) 166c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner ret = NULL; 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (size == (png_uint_32)65536L) 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->offset_table == NULL) 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 171c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Try to see if we need to do any of this fancy stuff */ 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = farmalloc(size); 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret == NULL || ((png_size_t)ret & 0xffff)) 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int num_blocks; 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_uint_32 total_size; 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep table; 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_byte huge * hptr; 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret != NULL) 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project farfree(ret); 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = NULL; 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 187c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr->zlib_window_bits > 14) 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project num_blocks = (int)(1 << (png_ptr->zlib_window_bits - 14)); 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project num_blocks = 1; 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->zlib_mem_level >= 7) 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project num_blocks += (int)(1 << (png_ptr->zlib_mem_level - 7)); 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project num_blocks++; 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project total_size = ((png_uint_32)65536L) * (png_uint_32)num_blocks+16; 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project table = farmalloc(total_size); 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (table == NULL) 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_USER_MEM_SUPPORTED 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 204c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_error(png_ptr, "Out Of Memory."); /* Note "O", "M" */ 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Out Of Memory."); 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (NULL); 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((png_size_t)table & 0xfff0) 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_USER_MEM_SUPPORTED 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Farmalloc didn't return normalized pointer"); 2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Farmalloc didn't return normalized pointer"); 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (NULL); 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->offset_table = table; 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->offset_table_ptr = farmalloc(num_blocks * 226c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_sizeof(png_bytep)); 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->offset_table_ptr == NULL) 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_USER_MEM_SUPPORTED 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 232c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_error(png_ptr, "Out Of memory."); /* Note "O", "m" */ 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Out Of memory."); 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (NULL); 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hptr = (png_byte huge *)table; 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((png_size_t)hptr & 0xf) 2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hptr = (png_byte huge *)((long)(hptr) & 0xfffffff0L); 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hptr = hptr + 16L; /* "hptr += 16L" fails on Turbo C++ 3.0 */ 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < num_blocks; i++) 2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->offset_table_ptr[i] = (png_bytep)hptr; 2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hptr = hptr + (png_uint_32)65536L; /* "+=" fails on TC++3.0 */ 2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->offset_table_number = num_blocks; 2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->offset_table_count = 0; 2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->offset_table_count_free = 0; 2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->offset_table_count >= png_ptr->offset_table_number) 2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_USER_MEM_SUPPORTED 2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Out of Memory."); /* Note "o" and "M" */ 2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Out of Memory."); 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (NULL); 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = png_ptr->offset_table_ptr[png_ptr->offset_table_count++]; 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = farmalloc(size); 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_USER_MEM_SUPPORTED 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret == NULL) 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Out of memory."); /* Note "o" and "m" */ 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Out of memory."); /* Note "o" and "m" */ 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (ret); 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 286c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner/* Free a pointer allocated by png_malloc(). In the default 287c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * configuration, png_ptr is not used, but is passed in case it 288c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * is needed. If ptr is NULL, return without taking any action. 289c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner */ 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_free(png_structp png_ptr, png_voidp ptr) 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL || ptr == NULL) 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->free_fn != NULL) 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (*(png_ptr->free_fn))(png_ptr, ptr); 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 302c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner else 303c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_free_default(png_ptr, ptr); 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_free_default(png_structp png_ptr, png_voidp ptr) 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 311c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr == NULL || ptr == NULL) 312c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner return; 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->offset_table != NULL) 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < png_ptr->offset_table_count; i++) 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ptr == png_ptr->offset_table_ptr[i]) 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ptr = NULL; 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->offset_table_count_free++; 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->offset_table_count_free == png_ptr->offset_table_count) 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project farfree(png_ptr->offset_table); 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project farfree(png_ptr->offset_table_ptr); 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->offset_table = NULL; 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->offset_table_ptr = NULL; 3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ptr != NULL) 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project farfree(ptr); 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else /* Not the Borland DOS special memory handler */ 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Allocate memory for a png_struct or a png_info. The malloc and 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project memset can be replaced by a single call to calloc() if this is thought 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project to improve performance noticably. */ 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp /* PRIVATE */ 3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_create_struct(int type) 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL)); 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Allocate memory for a png_struct or a png_info. The malloc and 3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project memset can be replaced by a single call to calloc() if this is thought 3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project to improve performance noticably. */ 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp /* PRIVATE */ 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t size; 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_voidp struct_ptr; 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (type == PNG_STRUCT_INFO) 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project size = png_sizeof(png_info); 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (type == PNG_STRUCT_PNG) 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project size = png_sizeof(png_struct); 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (NULL); 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 372c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (malloc_fn != NULL) 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_struct dummy_struct; 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_structp png_ptr = &dummy_struct; 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mem_ptr=mem_ptr; 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct_ptr = (*(malloc_fn))(png_ptr, size); 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (struct_ptr != NULL) 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memset(struct_ptr, 0, size); 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (struct_ptr); 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(__TURBOC__) && !defined(__FLAT__) 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct_ptr = (png_voidp)farmalloc(size); 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# if defined(_MSC_VER) && defined(MAXSEG_64K) 388c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner struct_ptr = (png_voidp)halloc(size, 1); 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# else 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct_ptr = (png_voidp)malloc(size); 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (struct_ptr != NULL) 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memset(struct_ptr, 0, size); 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (struct_ptr); 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Free memory allocated by a png_create_struct() call */ 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_destroy_struct(png_voidp struct_ptr) 4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL); 4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Free memory allocated by a png_create_struct() call */ 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_voidp mem_ptr) 4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (struct_ptr != NULL) 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 417c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (free_fn != NULL) 4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_struct dummy_struct; 4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_structp png_ptr = &dummy_struct; 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mem_ptr=mem_ptr; 4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (*(free_fn))(png_ptr, struct_ptr); 4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(__TURBOC__) && !defined(__FLAT__) 4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project farfree(struct_ptr); 4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# if defined(_MSC_VER) && defined(MAXSEG_64K) 4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hfree(struct_ptr); 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# else 4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project free(struct_ptr); 4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Allocate memory. For reasonable files, size should never exceed 439c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * 64K. However, zlib may allocate more then 64K if you don't tell 440c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * it not to. See zconf.h and png.h for more information. zlib does 441c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * need to allocate exactly 64K, so whatever you call here must 442c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * have the ability to do that. 443c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner */ 444c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 445c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turnerpng_voidp /* PRIVATE */ 446c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turnerpng_calloc(png_structp png_ptr, png_uint_32 size) 447c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner{ 448c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_voidp ret; 449c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 450c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner ret = (png_malloc(png_ptr, size)); 451c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (ret != NULL) 452c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_memset(ret,0,(png_size_t)size); 453c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner return (ret); 454c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner} 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp PNGAPI 4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_malloc(png_structp png_ptr, png_uint_32 size) 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_voidp ret; 4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL || size == 0) 4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (NULL); 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 465c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr->malloc_fn != NULL) 466c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); 4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 468c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner ret = (png_malloc_default(png_ptr, size)); 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Out of Memory!"); 4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (ret); 4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp PNGAPI 4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_malloc_default(png_structp png_ptr, png_uint_32 size) 4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_voidp ret; 4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL || size == 0) 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (NULL); 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (size > (png_uint_32)65536L) 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_USER_MEM_SUPPORTED 487c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Cannot Allocate > 64K"); 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 495c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Check for overflow */ 4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(__TURBOC__) && !defined(__FLAT__) 497c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (size != (unsigned long)size) 498c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner ret = NULL; 499c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner else 500c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner ret = farmalloc(size); 5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# if defined(_MSC_VER) && defined(MAXSEG_64K) 503c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (size != (unsigned long)size) 504c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner ret = NULL; 505c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner else 506c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner ret = halloc(size, 1); 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# else 508c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (size != (size_t)size) 509c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner ret = NULL; 510c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner else 511c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner ret = malloc((size_t)size); 5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_USER_MEM_SUPPORTED 5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Out of Memory"); 5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (ret); 5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Free a pointer allocated by png_malloc(). If ptr is NULL, return 524c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * without taking any action. 525c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner */ 5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_free(png_structp png_ptr, png_voidp ptr) 5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL || ptr == NULL) 5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->free_fn != NULL) 5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (*(png_ptr->free_fn))(png_ptr, ptr); 5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 538c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner else 539c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_free_default(png_ptr, ptr); 5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_free_default(png_structp png_ptr, png_voidp ptr) 5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL || ptr == NULL) 5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(__TURBOC__) && !defined(__FLAT__) 5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project farfree(ptr); 5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# if defined(_MSC_VER) && defined(MAXSEG_64K) 5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hfree(ptr); 5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# else 5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project free(ptr); 5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* Not Borland DOS special memory handler */ 5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 562c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_1_0_X 5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define png_malloc_warn png_malloc 5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* This function was added at libpng version 1.2.3. The png_malloc_warn() 5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * function will set up png_malloc() to issue a png_warning and return NULL 5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * instead of issuing a png_error, if it fails to allocate the requested 5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * memory. 5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp PNGAPI 5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_malloc_warn(png_structp png_ptr, png_uint_32 size) 5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_voidp ptr; 5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_uint_32 save_flags; 575c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr == NULL) 576c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner return (NULL); 5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 578c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner save_flags = png_ptr->flags; 5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK; 5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ptr = (png_voidp)png_malloc((png_structp)png_ptr, size); 5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->flags=save_flags; 5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return(ptr); 5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp PNGAPI 5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_memcpy_check (png_structp png_ptr, png_voidp s1, png_voidp s2, 5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_uint_32 length) 5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t size; 5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project size = (png_size_t)length; 5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((png_uint_32)size != length) 594c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_error(png_ptr, "Overflow in png_memcpy_check."); 5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return(png_memcpy (s1, s2, size)); 5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp PNGAPI 6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_memset_check (png_structp png_ptr, png_voidp s1, int value, 6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_uint_32 length) 6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t size; 6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project size = (png_size_t)length; 6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((png_uint_32)size != length) 607c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_error(png_ptr, "Overflow in png_memset_check."); 6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (png_memset (s1, value, size)); 6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* This function is called when the application wants to use another method 6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * of allocating and freeing memory. 6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr 6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project malloc_fn, png_free_ptr free_fn) 6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 621c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr != NULL) 622c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner { 623c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->mem_ptr = mem_ptr; 624c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->malloc_fn = malloc_fn; 625c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->free_fn = free_fn; 6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* This function returns a pointer to the mem_ptr associated with the user 6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * functions. The application should free any memory associated with this 6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * pointer before png_write_destroy and png_read_destroy are called. 6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp PNGAPI 6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_get_mem_ptr(png_structp png_ptr) 6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 636c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr == NULL) 637c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner return (NULL); 6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return ((png_voidp)png_ptr->mem_ptr); 6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ 642