1893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 2893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* pngmem.c - stub functions for memory allocation 3893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 45f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * Last changed in libpng 1.2.41 [February 25, 2010] 55f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * Copyright (c) 1998-2010 Glenn Randers-Pehrson 6893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 7893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) 8893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 9a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * This code is released under the libpng license. 10a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * For conditions of distribution and use, see the disclaimer 11a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * and license in png.h 12a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * 13893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * This file provides a location for all memory allocation. Users who 14893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * need special memory handling are expected to supply replacement 15893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * functions for png_malloc() and png_free(), and to use 16893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * png_create_read_struct_2() and png_create_write_struct_2() to 17893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * identify the replacement functions. 18893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 19893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 20893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_INTERNAL 215f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#define PNG_NO_PEDANTIC_WARNINGS 22893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include "png.h" 23893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) 24893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 25893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Borland DOS special memory handler */ 26893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) 27a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* If you change this, be sure to change the one in png.h also */ 28893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 29893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Allocate memory for a png_struct. The malloc and memset can be replaced 30893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project by a single call to calloc() if this is thought to improve performance. */ 31893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_voidp /* PRIVATE */ 32893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_create_struct(int type) 33893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 34893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 35893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL)); 36893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 37893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 38893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Alternate version of png_create_struct, for use with user-defined malloc. */ 39893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_voidp /* PRIVATE */ 40893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) 41893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 42893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 43893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t size; 44893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_voidp struct_ptr; 45893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 46893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (type == PNG_STRUCT_INFO) 47a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott size = png_sizeof(png_info); 48893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (type == PNG_STRUCT_PNG) 49a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott size = png_sizeof(png_struct); 50893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 51a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return (png_get_copyright(NULL)); 52893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 53893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 544215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (malloc_fn != NULL) 55893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 56893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_struct dummy_struct; 57893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_structp png_ptr = &dummy_struct; 58893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mem_ptr=mem_ptr; 59893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project struct_ptr = (*(malloc_fn))(png_ptr, (png_uint_32)size); 60893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 61893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 62893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 63a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott struct_ptr = (png_voidp)farmalloc(size); 64893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (struct_ptr != NULL) 65893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memset(struct_ptr, 0, size); 66893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (struct_ptr); 67893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 68893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 69893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Free memory allocated by a png_create_struct() call */ 70893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 71893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_destroy_struct(png_voidp struct_ptr) 72893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 73893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 74893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL); 75893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 76893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 77893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Free memory allocated by a png_create_struct() call */ 78893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 79893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, 80893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_voidp mem_ptr) 81893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 82893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 83893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (struct_ptr != NULL) 84893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 85893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 864215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (free_fn != NULL) 87893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 88893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_struct dummy_struct; 89893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_structp png_ptr = &dummy_struct; 90893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mem_ptr=mem_ptr; 91893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (*(free_fn))(png_ptr, struct_ptr); 92893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 93893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 94893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 95893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project farfree (struct_ptr); 96893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 97893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 98893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 99893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Allocate memory. For reasonable files, size should never exceed 100893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 64K. However, zlib may allocate more then 64K if you don't tell 101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * it not to. See zconf.h and png.h for more information. zlib does 102893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * need to allocate exactly 64K, so whatever you call here must 103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * have the ability to do that. 104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * Borland seems to have a problem in DOS mode for exactly 64K. 106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * It gives you a segment with an offset of 8 (perhaps to store its 107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * memory stuff). zlib doesn't like this at all, so we have to 108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * detect and deal with it. This code should not be needed in 109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * Windows or OS/2 modes, and only in 16 bit mode. This code has 110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * been updated by Alexander Lehmann for version 0.89 to waste less 111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * memory. 112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * Note that we can't use png_size_t for the "size" declaration, 114893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * since on some systems a png_size_t is a 16-bit quantity, and as a 115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * result, we would be truncating potentially larger memory requests 116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (which should cause a fatal error) and introducing major problems. 117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 1185f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scottpng_voidp /* PRIVATE */ 1195f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scottpng_calloc(png_structp png_ptr, png_uint_32 size) 1205f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott{ 1215f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_voidp ret; 1225f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 1235f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott ret = (png_malloc(png_ptr, size)); 1245f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott if (ret != NULL) 1255f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_memset(ret,0,(png_size_t)size); 1265f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott return (ret); 1275f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott} 128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_voidp PNGAPI 130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_malloc(png_structp png_ptr, png_uint_32 size) 131893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 132893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_voidp ret; 133893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL || size == 0) 135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (NULL); 136893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 137893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 1384215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_ptr->malloc_fn != NULL) 139a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); 140893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 141a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott ret = (png_malloc_default(png_ptr, size)); 142893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Out of memory!"); 144893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (ret); 145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 147893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_voidp PNGAPI 148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_malloc_default(png_structp png_ptr, png_uint_32 size) 149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 150893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_voidp ret; 151893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 153893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL || size == 0) 154893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (NULL); 155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 156893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K 157893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (size > (png_uint_32)65536L) 158893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Cannot Allocate > 64K"); 160893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ret = NULL; 161893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 162893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 163893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 164893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 165893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (size != (size_t)size) 166a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott ret = NULL; 167893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (size == (png_uint_32)65536L) 168893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 169893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->offset_table == NULL) 170893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 171a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Try to see if we need to do any of this fancy stuff */ 172893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ret = farmalloc(size); 173893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret == NULL || ((png_size_t)ret & 0xffff)) 174893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 175893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int num_blocks; 176893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 total_size; 177893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep table; 178893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i; 179893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_byte huge * hptr; 180893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 181893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret != NULL) 182893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 183893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project farfree(ret); 184893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ret = NULL; 185893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 186893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1874215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_ptr->zlib_window_bits > 14) 188893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project num_blocks = (int)(1 << (png_ptr->zlib_window_bits - 14)); 189893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 190893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project num_blocks = 1; 191893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->zlib_mem_level >= 7) 192893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project num_blocks += (int)(1 << (png_ptr->zlib_mem_level - 7)); 193893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 194893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project num_blocks++; 195893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 196893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project total_size = ((png_uint_32)65536L) * (png_uint_32)num_blocks+16; 197893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project table = farmalloc(total_size); 199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (table == NULL) 201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 202893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef PNG_USER_MEM_SUPPORTED 203893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 2045f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_error(png_ptr, "Out Of Memory."); /* Note "O", "M" */ 205893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 206893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Out Of Memory."); 207893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 208893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (NULL); 209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 210893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 211893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_size_t)table & 0xfff0) 212893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef PNG_USER_MEM_SUPPORTED 214893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 215893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, 216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "Farmalloc didn't return normalized pointer"); 217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, 219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "Farmalloc didn't return normalized pointer"); 220893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (NULL); 222893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 223893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 224893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->offset_table = table; 225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->offset_table_ptr = farmalloc(num_blocks * 2264215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_sizeof(png_bytep)); 227893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 228893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->offset_table_ptr == NULL) 229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef PNG_USER_MEM_SUPPORTED 231893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 2325f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_error(png_ptr, "Out Of memory."); /* Note "O", "m" */ 233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Out Of memory."); 235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 236893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (NULL); 237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 239893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project hptr = (png_byte huge *)table; 240893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_size_t)hptr & 0xf) 241893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 242893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project hptr = (png_byte huge *)((long)(hptr) & 0xfffffff0L); 243893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project hptr = hptr + 16L; /* "hptr += 16L" fails on Turbo C++ 3.0 */ 244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < num_blocks; i++) 246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 247893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->offset_table_ptr[i] = (png_bytep)hptr; 248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project hptr = hptr + (png_uint_32)65536L; /* "+=" fails on TC++3.0 */ 249893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->offset_table_number = num_blocks; 252893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->offset_table_count = 0; 253893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->offset_table_count_free = 0; 254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 255893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->offset_table_count >= png_ptr->offset_table_number) 258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef PNG_USER_MEM_SUPPORTED 260893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Out of Memory."); /* Note "o" and "M" */ 262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 263893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Out of Memory."); 264893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (NULL); 266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 267893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ret = png_ptr->offset_table_ptr[png_ptr->offset_table_count++]; 269893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 271893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ret = farmalloc(size); 272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 273893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef PNG_USER_MEM_SUPPORTED 274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret == NULL) 275893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Out of memory."); /* Note "o" and "m" */ 278893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Out of memory."); /* Note "o" and "m" */ 280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 281893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 282893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 283893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (ret); 284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 286a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Free a pointer allocated by png_malloc(). In the default 287a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * configuration, png_ptr is not used, but is passed in case it 288a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * is needed. If ptr is NULL, return without taking any action. 289a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott */ 290893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 291893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_free(png_structp png_ptr, png_voidp ptr) 292893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 293893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL || ptr == NULL) 294893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->free_fn != NULL) 298893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 299893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (*(png_ptr->free_fn))(png_ptr, ptr); 300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 301893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 302a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott else 303a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott png_free_default(png_ptr, ptr); 304893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 305893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 306893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 307893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_free_default(png_structp png_ptr, png_voidp ptr) 308893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 309893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 310893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 311a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr == NULL || ptr == NULL) 312a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return; 313893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 314893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->offset_table != NULL) 315893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 316893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i; 317893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 318893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < png_ptr->offset_table_count; i++) 319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 320893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ptr == png_ptr->offset_table_ptr[i]) 321893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ptr = NULL; 323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->offset_table_count_free++; 324893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 327893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->offset_table_count_free == png_ptr->offset_table_count) 328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project farfree(png_ptr->offset_table); 330893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project farfree(png_ptr->offset_table_ptr); 331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->offset_table = NULL; 332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->offset_table_ptr = NULL; 333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 334893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 335893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 336893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ptr != NULL) 337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 338893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project farfree(ptr); 339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 340893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else /* Not the Borland DOS special memory handler */ 343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 344893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Allocate memory for a png_struct or a png_info. The malloc and 345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project memset can be replaced by a single call to calloc() if this is thought 346893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project to improve performance noticably. */ 347893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_voidp /* PRIVATE */ 348893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_create_struct(int type) 349893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 350893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 351893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL)); 352893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 354893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Allocate memory for a png_struct or a png_info. The malloc and 355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project memset can be replaced by a single call to calloc() if this is thought 356893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project to improve performance noticably. */ 357893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_voidp /* PRIVATE */ 358893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) 359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 360893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 361893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t size; 362893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_voidp struct_ptr; 363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (type == PNG_STRUCT_INFO) 365893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project size = png_sizeof(png_info); 366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (type == PNG_STRUCT_PNG) 367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project size = png_sizeof(png_struct); 368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 369893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (NULL); 370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 371893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 3724215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (malloc_fn != NULL) 373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 374893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_struct dummy_struct; 375893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_structp png_ptr = &dummy_struct; 376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mem_ptr=mem_ptr; 377893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project struct_ptr = (*(malloc_fn))(png_ptr, size); 378893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (struct_ptr != NULL) 379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memset(struct_ptr, 0, size); 380893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (struct_ptr); 381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 383893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(__TURBOC__) && !defined(__FLAT__) 385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project struct_ptr = (png_voidp)farmalloc(size); 386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 387893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# if defined(_MSC_VER) && defined(MAXSEG_64K) 3884215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project struct_ptr = (png_voidp)halloc(size, 1); 389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# else 390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project struct_ptr = (png_voidp)malloc(size); 391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# endif 392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 393893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (struct_ptr != NULL) 394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memset(struct_ptr, 0, size); 395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (struct_ptr); 397893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 399893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Free memory allocated by a png_create_struct() call */ 401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_destroy_struct(png_voidp struct_ptr) 403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 404893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL); 406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 408893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Free memory allocated by a png_create_struct() call */ 409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, 411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_voidp mem_ptr) 412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 414893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (struct_ptr != NULL) 415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 4174215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (free_fn != NULL) 418893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_struct dummy_struct; 420893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_structp png_ptr = &dummy_struct; 421893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mem_ptr=mem_ptr; 422893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (*(free_fn))(png_ptr, struct_ptr); 423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 425893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 426893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(__TURBOC__) && !defined(__FLAT__) 427893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project farfree(struct_ptr); 428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# if defined(_MSC_VER) && defined(MAXSEG_64K) 430893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project hfree(struct_ptr); 431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# else 432893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project free(struct_ptr); 433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# endif 434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Allocate memory. For reasonable files, size should never exceed 439a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * 64K. However, zlib may allocate more then 64K if you don't tell 440a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * it not to. See zconf.h and png.h for more information. zlib does 441a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * need to allocate exactly 64K, so whatever you call here must 442a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * have the ability to do that. 443a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott */ 444a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 44566dce0da6a5db51ee0c2875517d3a6ca6cbbe53dEric Vannierpng_voidp /* PRIVATE */ 4465f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scottpng_calloc(png_structp png_ptr, png_uint_32 size) 4475f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott{ 4485f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_voidp ret; 4495f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 4505f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott ret = (png_malloc(png_ptr, size)); 4515f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott if (ret != NULL) 4525f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_memset(ret,0,(png_size_t)size); 4535f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott return (ret); 4545f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott} 455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 456893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_voidp PNGAPI 457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_malloc(png_structp png_ptr, png_uint_32 size) 458893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_voidp ret; 460893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 461893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 462893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL || size == 0) 463893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (NULL); 464893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 4654215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_ptr->malloc_fn != NULL) 466a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); 467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 468a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott ret = (png_malloc_default(png_ptr, size)); 469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Out of Memory!"); 471893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (ret); 472893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_voidp PNGAPI 475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_malloc_default(png_structp png_ptr, png_uint_32 size) 476893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_voidp ret; 478893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 479893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 480893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL || size == 0) 481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (NULL); 482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 483893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K 484893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (size > (png_uint_32)65536L) 485893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef PNG_USER_MEM_SUPPORTED 487893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Cannot Allocate > 64K"); 489893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 490893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 491893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return NULL; 492893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 493893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 494893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 495a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Check for overflow */ 496893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(__TURBOC__) && !defined(__FLAT__) 497a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (size != (unsigned long)size) 498a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott ret = NULL; 499a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott else 500a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott ret = farmalloc(size); 501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 502893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# if defined(_MSC_VER) && defined(MAXSEG_64K) 503a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (size != (unsigned long)size) 504a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott ret = NULL; 505a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott else 506a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott ret = halloc(size, 1); 507893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# else 508a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (size != (size_t)size) 509a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott ret = NULL; 510a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott else 511a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott ret = malloc((size_t)size); 512893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# endif 513893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 514893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 515893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef PNG_USER_MEM_SUPPORTED 516893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) 517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Out of Memory"); 518893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 519893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 520893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (ret); 521893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 522893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 523893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Free a pointer allocated by png_malloc(). If ptr is NULL, return 524a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * without taking any action. 525a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott */ 526893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 527893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_free(png_structp png_ptr, png_voidp ptr) 528893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 529893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL || ptr == NULL) 530893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 531893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 532893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 533893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->free_fn != NULL) 534893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 535893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (*(png_ptr->free_fn))(png_ptr, ptr); 536893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 537893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 538a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott else 539a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott png_free_default(png_ptr, ptr); 540893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 541893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 542893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_free_default(png_structp png_ptr, png_voidp ptr) 543893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 544893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL || ptr == NULL) 545893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 546893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 547893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 548893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 549893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(__TURBOC__) && !defined(__FLAT__) 550893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project farfree(ptr); 551893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 552893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# if defined(_MSC_VER) && defined(MAXSEG_64K) 553893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project hfree(ptr); 554893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# else 555893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project free(ptr); 556893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# endif 557893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 558893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 559893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 560893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* Not Borland DOS special memory handler */ 561893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 5625f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_1_0_X 563893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# define png_malloc_warn png_malloc 564893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 565893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* This function was added at libpng version 1.2.3. The png_malloc_warn() 566893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * function will set up png_malloc() to issue a png_warning and return NULL 567893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * instead of issuing a png_error, if it fails to allocate the requested 568893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * memory. 569893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 570893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_voidp PNGAPI 571893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_malloc_warn(png_structp png_ptr, png_uint_32 size) 572893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 573893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_voidp ptr; 574893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 save_flags; 575a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr == NULL) 576a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return (NULL); 577893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 5784215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project save_flags = png_ptr->flags; 579893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK; 580893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ptr = (png_voidp)png_malloc((png_structp)png_ptr, size); 581893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->flags=save_flags; 582893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return(ptr); 583893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 584893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 585893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 586893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_voidp PNGAPI 587893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_memcpy_check (png_structp png_ptr, png_voidp s1, png_voidp s2, 588893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 length) 589893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 590893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t size; 591893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 592893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project size = (png_size_t)length; 593893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_uint_32)size != length) 5944215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_error(png_ptr, "Overflow in png_memcpy_check."); 595893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 596893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return(png_memcpy (s1, s2, size)); 597893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 598893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 599893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_voidp PNGAPI 600893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_memset_check (png_structp png_ptr, png_voidp s1, int value, 601893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 length) 602893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 603893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t size; 604893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 605893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project size = (png_size_t)length; 606893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_uint_32)size != length) 6074215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_error(png_ptr, "Overflow in png_memset_check."); 608893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 609893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (png_memset (s1, value, size)); 610893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 611893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 612893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 613893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 614893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* This function is called when the application wants to use another method 615893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * of allocating and freeing memory. 616893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 617893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 618893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr 619893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project malloc_fn, png_free_ptr free_fn) 620893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 6214215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_ptr != NULL) 6224215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project { 6234215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->mem_ptr = mem_ptr; 6244215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->malloc_fn = malloc_fn; 6254215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->free_fn = free_fn; 626893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 627893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 628893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 629893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* This function returns a pointer to the mem_ptr associated with the user 630893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * functions. The application should free any memory associated with this 631893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * pointer before png_write_destroy and png_read_destroy are called. 632893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 633893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_voidp PNGAPI 634893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_get_mem_ptr(png_structp png_ptr) 635893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 636a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr == NULL) 637a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return (NULL); 638893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return ((png_voidp)png_ptr->mem_ptr); 639893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 640893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 641893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ 642