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