18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* pngmem.c - stub functions for memory allocation
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Last changed in libpng 1.2.13 November 13, 2006
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * For conditions of distribution and use, see copyright notice in png.h
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (c) 1998-2006 Glenn Randers-Pehrson
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * This file provides a location for all memory allocation.  Users who
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * need special memory handling are expected to supply replacement
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * functions for png_malloc() and png_free(), and to use
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * png_create_read_struct_2() and png_create_write_struct_2() to
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * identify the replacement functions.
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_INTERNAL
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "png.h"
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Borland DOS special memory handler */
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__)
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* if you change this, be sure to change the one in png.h also */
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Allocate memory for a png_struct.  The malloc and memset can be replaced
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   by a single call to calloc() if this is thought to improve performance. */
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp /* PRIVATE */
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_create_struct(int type)
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL));
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Alternate version of png_create_struct, for use with user-defined malloc. */
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp /* PRIVATE */
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_size_t size;
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_voidp struct_ptr;
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (type == PNG_STRUCT_INFO)
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     size = png_sizeof(png_info);
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (type == PNG_STRUCT_PNG)
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     size = png_sizeof(png_struct);
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     return (png_get_copyright(NULL));
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(malloc_fn != NULL)
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_struct dummy_struct;
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_structp png_ptr = &dummy_struct;
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->mem_ptr=mem_ptr;
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      struct_ptr = (*(malloc_fn))(png_ptr, (png_uint_32)size);
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      struct_ptr = (png_voidp)farmalloc(size);
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (struct_ptr != NULL)
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_memset(struct_ptr, 0, size);
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   return (struct_ptr);
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Free memory allocated by a png_create_struct() call */
678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_destroy_struct(png_voidp struct_ptr)
698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL);
728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Free memory allocated by a png_create_struct() call */
758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn,
778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    png_voidp mem_ptr)
788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (struct_ptr != NULL)
818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if(free_fn != NULL)
848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_struct dummy_struct;
868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_structp png_ptr = &dummy_struct;
878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->mem_ptr=mem_ptr;
888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (*(free_fn))(png_ptr, struct_ptr);
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */
928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      farfree (struct_ptr);
938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Allocate memory.  For reasonable files, size should never exceed
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 64K.  However, zlib may allocate more then 64K if you don't tell
988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * it not to.  See zconf.h and png.h for more information. zlib does
998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * need to allocate exactly 64K, so whatever you call here must
1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * have the ability to do that.
1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Borland seems to have a problem in DOS mode for exactly 64K.
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * It gives you a segment with an offset of 8 (perhaps to store its
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * memory stuff).  zlib doesn't like this at all, so we have to
1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * detect and deal with it.  This code should not be needed in
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Windows or OS/2 modes, and only in 16 bit mode.  This code has
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * been updated by Alexander Lehmann for version 0.89 to waste less
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * memory.
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Note that we can't use png_size_t for the "size" declaration,
1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * since on some systems a png_size_t is a 16-bit quantity, and as a
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * result, we would be truncating potentially larger memory requests
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (which should cause a fatal error) and introducing major problems.
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp PNGAPI
1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_malloc(png_structp png_ptr, png_uint_32 size)
1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_voidp ret;
1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr == NULL || size == 0)
1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return (NULL);
1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr->malloc_fn != NULL)
1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size));
1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       ret = (png_malloc_default(png_ptr, size));
1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_error(png_ptr, "Out of memory!");
1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   return (ret);
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp PNGAPI
1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_malloc_default(png_structp png_ptr, png_uint_32 size)
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_voidp ret;
1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */
1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr == NULL || size == 0)
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return (NULL);
1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K
1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (size > (png_uint_32)65536L)
1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr, "Cannot Allocate > 64K");
1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      ret = NULL;
1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (size != (size_t)size)
1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     ret = NULL;
1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (size == (png_uint_32)65536L)
1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->offset_table == NULL)
1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         /* try to see if we need to do any of this fancy stuff */
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         ret = farmalloc(size);
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (ret == NULL || ((png_size_t)ret & 0xffff))
1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            int num_blocks;
1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_uint_32 total_size;
1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_bytep table;
1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            int i;
1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_byte huge * hptr;
1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (ret != NULL)
1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               farfree(ret);
1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               ret = NULL;
1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if(png_ptr->zlib_window_bits > 14)
1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               num_blocks = (int)(1 << (png_ptr->zlib_window_bits - 14));
1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            else
1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               num_blocks = 1;
1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (png_ptr->zlib_mem_level >= 7)
1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               num_blocks += (int)(1 << (png_ptr->zlib_mem_level - 7));
1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            else
1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               num_blocks++;
1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            total_size = ((png_uint_32)65536L) * (png_uint_32)num_blocks+16;
1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            table = farmalloc(total_size);
1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (table == NULL)
1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_USER_MEM_SUPPORTED
1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_error(png_ptr, "Out Of Memory."); /* Note "O" and "M" */
1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               else
1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_warning(png_ptr, "Out Of Memory.");
1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               return (NULL);
1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if ((png_size_t)table & 0xfff0)
1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_USER_MEM_SUPPORTED
2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_error(png_ptr,
2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    "Farmalloc didn't return normalized pointer");
2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               else
2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_warning(png_ptr,
2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    "Farmalloc didn't return normalized pointer");
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            png_ptr->offset_table = table;
2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->offset_table_ptr = farmalloc(num_blocks *
2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_sizeof (png_bytep));
2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (png_ptr->offset_table_ptr == NULL)
2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_USER_MEM_SUPPORTED
2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_error(png_ptr, "Out Of memory."); /* Note "O" and "M" */
2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               else
2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_warning(png_ptr, "Out Of memory.");
2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               return (NULL);
2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            hptr = (png_byte huge *)table;
2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if ((png_size_t)hptr & 0xf)
2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               hptr = (png_byte huge *)((long)(hptr) & 0xfffffff0L);
2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               hptr = hptr + 16L;  /* "hptr += 16L" fails on Turbo C++ 3.0 */
2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for (i = 0; i < num_blocks; i++)
2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_ptr->offset_table_ptr[i] = (png_bytep)hptr;
2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               hptr = hptr + (png_uint_32)65536L;  /* "+=" fails on TC++3.0 */
2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->offset_table_number = num_blocks;
2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->offset_table_count = 0;
2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->offset_table_count_free = 0;
2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->offset_table_count >= png_ptr->offset_table_number)
2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_USER_MEM_SUPPORTED
2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "Out of Memory."); /* Note "o" and "M" */
2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         else
2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_warning(png_ptr, "Out of Memory.");
2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return (NULL);
2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      ret = png_ptr->offset_table_ptr[png_ptr->offset_table_count++];
2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      ret = farmalloc(size);
2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_USER_MEM_SUPPORTED
2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (ret == NULL)
2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_error(png_ptr, "Out of memory."); /* Note "o" and "m" */
2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_warning(png_ptr, "Out of memory."); /* Note "o" and "m" */
2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   return (ret);
2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* free a pointer allocated by png_malloc().  In the default
2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   configuration, png_ptr is not used, but is passed in case it
2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   is needed.  If ptr is NULL, return without taking any action. */
2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_free(png_structp png_ptr, png_voidp ptr)
2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr == NULL || ptr == NULL)
2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return;
2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->free_fn != NULL)
2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      (*(png_ptr->free_fn))(png_ptr, ptr);
2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return;
2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else png_free_default(png_ptr, ptr);
2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_free_default(png_structp png_ptr, png_voidp ptr)
2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */
2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return;
2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->offset_table != NULL)
2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int i;
3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (i = 0; i < png_ptr->offset_table_count; i++)
3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (ptr == png_ptr->offset_table_ptr[i])
3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            ptr = NULL;
3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->offset_table_count_free++;
3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->offset_table_count_free == png_ptr->offset_table_count)
3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         farfree(png_ptr->offset_table);
3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         farfree(png_ptr->offset_table_ptr);
3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->offset_table = NULL;
3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->offset_table_ptr = NULL;
3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (ptr != NULL)
3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      farfree(ptr);
3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else /* Not the Borland DOS special memory handler */
3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Allocate memory for a png_struct or a png_info.  The malloc and
3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   memset can be replaced by a single call to calloc() if this is thought
3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   to improve performance noticably. */
3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp /* PRIVATE */
3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_create_struct(int type)
3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL));
3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Allocate memory for a png_struct or a png_info.  The malloc and
3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   memset can be replaced by a single call to calloc() if this is thought
3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   to improve performance noticably. */
3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp /* PRIVATE */
3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)
3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */
3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_size_t size;
3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_voidp struct_ptr;
3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (type == PNG_STRUCT_INFO)
3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      size = png_sizeof(png_info);
3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (type == PNG_STRUCT_PNG)
3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      size = png_sizeof(png_struct);
3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return (NULL);
3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(malloc_fn != NULL)
3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_struct dummy_struct;
3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_structp png_ptr = &dummy_struct;
3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->mem_ptr=mem_ptr;
3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      struct_ptr = (*(malloc_fn))(png_ptr, size);
3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (struct_ptr != NULL)
3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_memset(struct_ptr, 0, size);
3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return (struct_ptr);
3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */
3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(__TURBOC__) && !defined(__FLAT__)
3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   struct_ptr = (png_voidp)farmalloc(size);
3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# if defined(_MSC_VER) && defined(MAXSEG_64K)
3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   struct_ptr = (png_voidp)halloc(size,1);
3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# else
3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   struct_ptr = (png_voidp)malloc(size);
3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif
3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (struct_ptr != NULL)
3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_memset(struct_ptr, 0, size);
3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   return (struct_ptr);
3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Free memory allocated by a png_create_struct() call */
3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_destroy_struct(png_voidp struct_ptr)
3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL);
3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Free memory allocated by a png_create_struct() call */
3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn,
3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    png_voidp mem_ptr)
3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */
3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (struct_ptr != NULL)
3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if(free_fn != NULL)
4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_struct dummy_struct;
4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_structp png_ptr = &dummy_struct;
4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->mem_ptr=mem_ptr;
4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (*(free_fn))(png_ptr, struct_ptr);
4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */
4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(__TURBOC__) && !defined(__FLAT__)
4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      farfree(struct_ptr);
4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# if defined(_MSC_VER) && defined(MAXSEG_64K)
4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      hfree(struct_ptr);
4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# else
4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      free(struct_ptr);
4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif
4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Allocate memory.  For reasonable files, size should never exceed
4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   64K.  However, zlib may allocate more then 64K if you don't tell
4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   it not to.  See zconf.h and png.h for more information.  zlib does
4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   need to allocate exactly 64K, so whatever you call here must
4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   have the ability to do that. */
4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp PNGAPI
4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_malloc(png_structp png_ptr, png_uint_32 size)
4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_voidp ret;
4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr == NULL || size == 0)
4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return (NULL);
4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr->malloc_fn != NULL)
4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size));
4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       ret = (png_malloc_default(png_ptr, size));
4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_error(png_ptr, "Out of Memory!");
4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   return (ret);
4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp PNGAPI
4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_malloc_default(png_structp png_ptr, png_uint_32 size)
4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_voidp ret;
4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */
4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr == NULL || size == 0)
4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return (NULL);
4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K
4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (size > (png_uint_32)65536L)
4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_USER_MEM_SUPPORTED
4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if(png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_error(png_ptr, "Cannot Allocate > 64K");
4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return NULL;
4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Check for overflow */
4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(__TURBOC__) && !defined(__FLAT__)
4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (size != (unsigned long)size)
4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   ret = NULL;
4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else
4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   ret = farmalloc(size);
4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# if defined(_MSC_VER) && defined(MAXSEG_64K)
4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (size != (unsigned long)size)
4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   ret = NULL;
4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else
4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   ret = halloc(size, 1);
4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# else
4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (size != (size_t)size)
4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   ret = NULL;
4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else
4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   ret = malloc((size_t)size);
4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif
4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_USER_MEM_SUPPORTED
4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_error(png_ptr, "Out of Memory");
4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   return (ret);
4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Free a pointer allocated by png_malloc().  If ptr is NULL, return
4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   without taking any action. */
4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_free(png_structp png_ptr, png_voidp ptr)
4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr == NULL || ptr == NULL)
5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return;
5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->free_fn != NULL)
5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      (*(png_ptr->free_fn))(png_ptr, ptr);
5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return;
5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else png_free_default(png_ptr, ptr);
5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_free_default(png_structp png_ptr, png_voidp ptr)
5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr == NULL || ptr == NULL)
5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return;
5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */
5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(__TURBOC__) && !defined(__FLAT__)
5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   farfree(ptr);
5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# if defined(_MSC_VER) && defined(MAXSEG_64K)
5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   hfree(ptr);
5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# else
5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   free(ptr);
5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif
5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* Not Borland DOS special memory handler */
5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_1_0_X)
5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  define png_malloc_warn png_malloc
5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* This function was added at libpng version 1.2.3.  The png_malloc_warn()
5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * function will set up png_malloc() to issue a png_warning and return NULL
5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * instead of issuing a png_error, if it fails to allocate the requested
5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * memory.
5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp PNGAPI
5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_malloc_warn(png_structp png_ptr, png_uint_32 size)
5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_voidp ptr;
5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_uint_32 save_flags;
5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return (NULL);
5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   save_flags=png_ptr->flags;
5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK;
5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   ptr = (png_voidp)png_malloc((png_structp)png_ptr, size);
5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->flags=save_flags;
5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   return(ptr);
5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp PNGAPI
5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_memcpy_check (png_structp png_ptr, png_voidp s1, png_voidp s2,
5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_uint_32 length)
5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_size_t size;
5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   size = (png_size_t)length;
5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if ((png_uint_32)size != length)
5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_error(png_ptr,"Overflow in png_memcpy_check.");
5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   return(png_memcpy (s1, s2, size));
5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp PNGAPI
5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_memset_check (png_structp png_ptr, png_voidp s1, int value,
5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_uint_32 length)
5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_size_t size;
5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   size = (png_size_t)length;
5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if ((png_uint_32)size != length)
5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_error(png_ptr,"Overflow in png_memset_check.");
5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   return (png_memset (s1, value, size));
5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* This function is called when the application wants to use another method
5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * of allocating and freeing memory.
5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr
5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  malloc_fn, png_free_ptr free_fn)
5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr != NULL) {
5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->mem_ptr = mem_ptr;
5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->malloc_fn = malloc_fn;
5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->free_fn = free_fn;
5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* This function returns a pointer to the mem_ptr associated with the user
5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * functions.  The application should free any memory associated with this
5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * pointer before png_write_destroy and png_read_destroy are called.
6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp PNGAPI
6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_get_mem_ptr(png_structp png_ptr)
6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return (NULL);
6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   return ((png_voidp)png_ptr->mem_ptr);
6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */
6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
609