PNGMEM.C
上传用户:wep9318
上传日期:2007-01-07
资源大小:893k
文件大小:10k
源码类别:

图片显示

开发平台:

Visual C++

  1. /* pngmem.c - stub functions for memory allocation
  2.    libpng 1.0 beta 3 - version 0.89
  3.    For conditions of distribution and use, see copyright notice in png.h
  4.    Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
  5.    May 25, 1996
  6.    This file provides a location for all memory allocation.  Users which
  7.    need special memory handling are expected to modify the code in this file
  8.    to meet their needs.  See the instructions at each function. */
  9. #define PNG_INTERNAL
  10. #include "png.h"
  11. /* Borland DOS special memory handler */
  12. #if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__)
  13. /* if you change this, be sure to change the one in png.h also */
  14. /* Allocate memory for a png_struct.  The malloc and memset can be replaced
  15.  * by a single call to calloc() if this is thought to improve performance.
  16.  */
  17. png_voidp
  18. png_create_struct(uInt type)
  19. {
  20.    png_size_t type;
  21.    png_voidp struct_ptr;
  22.    if (type == PNG_STRUCT_INFO)
  23.      size = sizeof(png_info);
  24.    else if (type == PNG_STRUCT_PNG)
  25.      size = sizeof(png_struct);
  26.    else
  27.      return (png_voidp)NULL;
  28.    if ((struct_ptr = (png_voidp)farmalloc(size)) != NULL)
  29.    {
  30.       png_memset(struct_ptr, 0, size);
  31.    }
  32.    return (struct_ptr);
  33. }
  34. /* Free memory allocated by a png_create_struct() call */
  35. void
  36. png_destroy_struct(png_voidp struct_ptr)
  37. {
  38.    if (struct_ptr)
  39.       farfree (struct_ptr);
  40. }
  41. /* Allocate memory.  For reasonable files, size should never exceed
  42.    64K.  However, zlib may allocate more then 64K if you don't tell
  43.    it not to.  See zconf.h and png.h for more information. zlib does
  44.    need to allocate exactly 64K, so whatever you call here must
  45.    have the ability to do that. */
  46. /* Borland seems to have a problem in DOS mode for exactly 64K.
  47.    It gives you a segment with an offset of 8 (perhaps to store it's
  48.    memory stuff).  zlib doesn't like this at all, so we have to
  49.    detect and deal with it.  This code should not be needed in
  50.    Windows or OS/2 modes, and only in 16 bit mode.  This code has
  51.    been updated by Alexander Lehmann for version 0.89 to waste less
  52.    memory.
  53. */
  54. png_voidp
  55. png_large_malloc(png_structp png_ptr, png_uint_32 size)
  56. {
  57.    png_voidp ret;
  58.    if (!png_ptr || !size)
  59.       return ((voidp)NULL);
  60. #ifdef PNG_MAX_MALLOC_64K
  61.    if (size > (png_uint_32)65536L)
  62.       png_error(png_ptr, "Cannot Allocate > 64K");
  63. #endif
  64.    if (size == (png_uint_32)(65536L))
  65.    {
  66.       if (!png_ptr->offset_table)
  67.       {
  68.          /* try to see if we need to do any of this fancy stuff */
  69.          ret = farmalloc(size);
  70.          if (!ret || ((long)ret & 0xffff))
  71.          {
  72.             int num_blocks;
  73.             png_uint_32 total_size;
  74.             png_bytep table;
  75.             int i;
  76.             png_byte huge * hptr;
  77.             if (ret)
  78.                farfree(ret);
  79.             ret = NULL;
  80.             num_blocks = (int)(1 << (png_ptr->zlib_window_bits - 14));
  81.             if (num_blocks < 1)
  82.                num_blocks = 1;
  83.             if (png_ptr->zlib_mem_level >= 7)
  84.                num_blocks += (int)(1 << (png_ptr->zlib_mem_level - 7));
  85.             else
  86.                num_blocks++;
  87.             total_size = ((png_uint_32)65536L) * (png_uint_32)num_blocks+16;
  88.             table = farmalloc(total_size);
  89.             if (!table)
  90.             {
  91.                png_error(png_ptr, "Out of Memory");
  92.             }
  93.             if ((long)table & 0xfff0)
  94.             {
  95.                png_error(png_ptr, "Farmalloc didn't return normalized pointer");
  96.             }
  97.             png_ptr->offset_table = table;
  98.             png_ptr->offset_table_ptr = farmalloc(
  99.                num_blocks * sizeof (png_bytep));
  100.             if (!png_ptr->offset_table_ptr)
  101.             {
  102.                png_error(png_ptr, "Out of memory");
  103.             }
  104.             hptr = (png_byte huge *)table;
  105.             if ((long)hptr & 0xf)
  106.             {
  107.                hptr = (png_byte huge *)((long)(hptr) & 0xfffffff0L);
  108.                hptr += 16L;
  109.             }
  110.             for (i = 0; i < num_blocks; i++)
  111.             {
  112.                png_ptr->offset_table_ptr[i] = (png_bytep)hptr;
  113.                hptr += 65536L;
  114.             }
  115.             png_ptr->offset_table_number = num_blocks;
  116.             png_ptr->offset_table_count = 0;
  117.             png_ptr->offset_table_count_free = 0;
  118.          }
  119.       }
  120.       if (png_ptr->offset_table_count >= png_ptr->offset_table_number)
  121.          png_error(png_ptr, "Out of Memory");
  122.       ret = png_ptr->offset_table_ptr[png_ptr->offset_table_count++];
  123.    }
  124.    else
  125.       ret = farmalloc(size);
  126.    if (ret == NULL)
  127.    {
  128.       png_error(png_ptr, "Out of Memory");
  129.    }
  130.    return ret;
  131. }
  132. /* free a pointer allocated by png_large_malloc().  In the default
  133.   configuration, png_ptr is not used, but is passed in case it
  134.   is needed.  If ptr is NULL, return without taking any action. */
  135. void
  136. png_large_free(png_structp png_ptr, png_voidp ptr)
  137. {
  138.    if (!png_ptr)
  139.       return;
  140.    if (ptr != NULL)
  141.    {
  142.       if (png_ptr->offset_table)
  143.       {
  144.          int i;
  145.          for (i = 0; i < png_ptr->offset_table_count; i++)
  146.          {
  147.             if (ptr == png_ptr->offset_table_ptr[i])
  148.             {
  149.                ptr = 0;
  150.                png_ptr->offset_table_count_free++;
  151.                break;
  152.             }
  153.          }
  154.          if (png_ptr->offset_table_count_free == png_ptr->offset_table_count)
  155.          {
  156.             farfree(png_ptr->offset_table);
  157.             farfree(png_ptr->offset_table_ptr);
  158.             png_ptr->offset_table = 0;
  159.             png_ptr->offset_table_ptr = 0;
  160.          }
  161.       }
  162.       if (ptr)
  163.          farfree(ptr);
  164.    }
  165. }
  166. #else /* Not the Borland DOS special memory handler */
  167. /* Allocate memory for a png_struct or a png_info.  The malloc and
  168.  * memset can be replaced by a single call to calloc() if this is thought
  169.  * to improve performance noticably.
  170.  */
  171. png_voidp
  172. png_create_struct(uInt type)
  173. {
  174.    size_t size;
  175.    png_voidp struct_ptr;
  176.    if (type == PNG_STRUCT_INFO)
  177.      size = sizeof(png_info);
  178.    else if (type == PNG_STRUCT_PNG)
  179.      size = sizeof(png_struct);
  180.    else
  181.      return (png_voidp)NULL;
  182. #if defined(__TURBOC__) && !defined(__FLAT__)
  183.    if ((struct_ptr = (png_voidp)farmalloc(size)) != NULL)
  184. #else
  185. # if defined(_MSC_VER) && defined(MAXSEG_64K)
  186.    if ((struct_ptr = (png_voidp)halloc(size,1)) != NULL)
  187. # else
  188.    if ((struct_ptr = (png_voidp)malloc(size)) != NULL)
  189. # endif
  190. #endif
  191.    {
  192.       png_memset(struct_ptr, 0, size);
  193.    }
  194.    return (struct_ptr);
  195. }
  196. /* Free memory allocated by a png_create_struct() call */
  197. void
  198. png_destroy_struct(png_voidp struct_ptr)
  199. {
  200.    if (struct_ptr)
  201. #if defined(__TURBOC__) && !defined(__FLAT__)
  202.       farfree(struct_ptr);
  203. #else
  204. # if defined(_MSC_VER) && defined(MAXSEG_64K)
  205.       hfree(struct_ptr);
  206. # else
  207.       free(struct_ptr);
  208. # endif
  209. #endif
  210. }
  211. /* Allocate memory.  For reasonable files, size should never exceed
  212.    64K.  However, zlib may allocate more then 64K if you don't tell
  213.    it not to.  See zconf.h and png.h for more information. zlib does
  214.    need to allocate exactly 64K, so whatever you call here must
  215.    have the ability to do that. */
  216. png_voidp
  217. png_large_malloc(png_structp png_ptr, png_uint_32 size)
  218. {
  219.    png_voidp ret;
  220.    if (!png_ptr || !size)
  221.       return ((voidp)0);
  222. #ifdef PNG_MAX_MALLOC_64K
  223.    if (size > (png_uint_32)65536L)
  224.       png_error(png_ptr, "Cannot Allocate > 64K");
  225. #endif
  226. #if defined(__TURBOC__) && !defined(__FLAT__)
  227.    ret = farmalloc(size);
  228. #else
  229. # if defined(_MSC_VER) && defined(MAXSEG_64K)
  230.    ret = halloc(size, 1);
  231. # else
  232.    ret = malloc(size);
  233. # endif
  234. #endif
  235.    if (ret == NULL)
  236.    {
  237.       png_error(png_ptr, "Out of Memory");
  238.    }
  239.    return ret;
  240. }
  241. /* free a pointer allocated by png_large_malloc().  In the default
  242.   configuration, png_ptr is not used, but is passed in case it
  243.   is needed.  If ptr is NULL, return without taking any action. */
  244. void
  245. png_large_free(png_structp png_ptr, png_voidp ptr)
  246. {
  247.    if (!png_ptr)
  248.       return;
  249.    if (ptr != NULL)
  250.    {
  251. #if defined(__TURBOC__) && !defined(__FLAT__)
  252.       farfree(ptr);
  253. #else
  254. # if defined(_MSC_VER) && defined(MAXSEG_64K)
  255.       hfree(ptr);
  256. # else
  257.       free(ptr);
  258. # endif
  259. #endif
  260.    }
  261. }
  262. #endif /* Not Borland DOS special memory handler */
  263. /* Allocate memory.  This is called for smallish blocks only  It
  264.    should not get anywhere near 64K.  On segmented machines, this
  265.    must come from the local heap (for zlib).  Currently, zlib is
  266.    the only one that uses this, so you should only get one call
  267.    to this, and that a small block. */
  268. void *
  269. png_malloc(png_structp png_ptr, png_uint_32 size)
  270. {
  271.    void *ret;
  272.    if (!png_ptr || !size)
  273.    {
  274.       return ((void *)0);
  275.    }
  276. #ifdef PNG_MAX_MALLOC_64K
  277.    if (size > (png_uint_32)65536L)
  278.       png_error(png_ptr, "Cannot Allocate > 64K");
  279. #endif
  280.    ret = malloc((png_size_t)size);
  281.    if (!ret)
  282.    {
  283.       png_error(png_ptr, "Out of Memory");
  284.    }
  285.    return ret;
  286. }
  287. /* Reallocate memory.  This will not get near 64K on a
  288.    even marginally reasonable file.  This is not used in
  289.    the current version of the library. */
  290. void *
  291. png_realloc(png_structp png_ptr, void * ptr, png_uint_32 size,
  292.    png_uint_32 old_size)
  293. {
  294.    void *ret;
  295.    if (!png_ptr || !old_size || !ptr || !size)
  296.       return ((void *)0);
  297. #ifdef PNG_MAX_MALLOC_64K
  298.    if (size > (png_uint_32)65536L)
  299.       png_error(png_ptr, "Cannot Allocate > 64K");
  300. #endif
  301.    ret = realloc(ptr, (png_size_t)size);
  302.    if (!ret)
  303.    {
  304.       png_error(png_ptr, "Out of Memory 7");
  305.    }
  306.    return ret;
  307. }
  308. /* free a pointer allocated by png_malloc().  In the default
  309.   configuration, png_ptr is not used, but is passed incase it
  310.   is needed.  If ptr is NULL, return without taking any action. */
  311. void
  312. png_free(png_structp png_ptr, void * ptr)
  313. {
  314.    if (!png_ptr)
  315.       return;
  316.    if (ptr != (void *)0)
  317.       free(ptr);
  318. }