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

图片显示

开发平台:

Visual C++

  1. /* pngstub.c - stub functions for i/o and memory allocation
  2.    libpng 1.0 beta 1 - version 0.71
  3. For conditions of distribution and use, see copyright notice in png.h
  4. Copyright (c) 1995 Guy Eric Schalnat, Group 42, Inc.
  5. June 26, 1995
  6.    This file provides a location for all input/output, memory location,
  7.    and error handling.  Users which need special handling in these areas
  8.    are expected to modify the code in this file to meet their needs.  See
  9.    the instructions at each function. */
  10. #define PNG_INTERNAL
  11. #include "png.h"
  12. /* Write the data to whatever output you are using.  The default
  13.    routine writes to a file pointer.  If you need to write to something
  14.    else, this is the place to do it.  We suggest saving the old code
  15.    for future use, possibly in a #define.  Note that this routine sometimes
  16.    gets called with very small lengths, so you should implement some kind
  17.    of simple buffering if you are using unbuffered writes.  This should
  18.    never be asked to write more then 64K on a 16 bit machine.  The cast
  19. to png_size_t is there for insurance, but if you are having problems
  20. with it, you can take it out.  Just be sure to cast length to whatever
  21.    fwrite needs in that spot if you don't have a function prototype for
  22.    it. */
  23. void
  24. png_write_data(png_struct *png_ptr, png_byte *data, png_uint_32 length)
  25. {
  26.    png_uint_32 check;
  27.    check = fwrite(data, 1, (png_size_t)length, png_ptr->fp);
  28.    if (check != length)
  29.    {
  30.       png_error(png_ptr, "Write Error");
  31.    }
  32. }
  33. /* Read the data from whatever input you are using.  The default
  34.    routine reads from a file pointer.  If you need to read from something
  35. else, this is the place to do it.  We suggest saving the old code
  36.    for future use.  Note that this routine sometimes gets called with
  37.    very small lengths, so you should implement some kind of simple
  38.    buffering if you are using unbuffered reads.  This should
  39.    never be asked to read more then 64K on a 16 bit machine.  The cast
  40.    to png_size_t is there for insurance, but if you are having problems
  41. with it, you can take it out.  Just be sure to cast length to whatever
  42.    fread needs in that spot if you don't have a function prototype for
  43.    it. */
  44. void
  45. png_read_data(png_struct *png_ptr, png_byte *data, png_uint_32 length)
  46. {
  47.    png_uint_32 check;
  48.    check = fread(data, 1, (size_t)length, png_ptr->fp);
  49.    if (check != length)
  50.    {
  51.       png_error(png_ptr, "Read Error");
  52. }
  53. }
  54. /* Initialize the input/output for the png file.  If you change
  55.    the read and write routines, you will probably need to change
  56.    this routine (or write your own).  If you change the parameters
  57. of this routine, remember to change png.h also. */
  58. void
  59. png_init_io(png_struct *png_ptr, FILE *fp)
  60. {
  61. png_ptr->fp = fp;
  62. // png_set_error(png_error_default, png_warning_default);
  63. }
  64. /* Allocate memory.  For reasonable files, size should never exceed
  65.    64K.  However, zlib may allocate more then 64K if you don't tell
  66.    it not to.  See zconf.h and png.h for more information. zlib does
  67.    need to allocate exactly 64K, so whatever you call here must
  68.    have the ability to do that. */
  69. /* Borland compilers have this habit of not giving you 64K chunks
  70.    that start on the segment in DOS mode.  This has not been observed
  71.    in Windows, and of course it doesn't matter in 32 bit mode, as there
  72.    are no segments.  Now libpng doesn't need that much memory normally,
  73.    but zlib does, so we have to normalize it, if necessary.  It would be
  74. better if zlib worked in less then 64K, but it doesn't, so we
  75.    have to deal with it.  Truely, we are misusing farmalloc here,
  76.    as it is designed for use with huge pointers, which don't care
  77.    about segments.  So we allocate a large amount of memory, and
  78. divvy off segments when needed.
  79.    */
  80. #ifdef __TURBOC__
  81. #ifndef __WIN32__
  82. /* NUM_SEG is the number of segments allocated at once */
  83. #define NUM_SEG 4
  84. typedef struct borland_seg_struct
  85. {
  86.    void *mem_ptr;
  87.    void *seg_ptr[NUM_SEG];
  88.    int seg_used[NUM_SEG];
  89.    int num_used;
  90. } borland_seg;
  91. borland_seg *save_array;
  92. int num_save_array;
  93. int max_save_array;
  94. #endif
  95. #endif
  96. void *
  97. png_large_malloc(png_struct *png_ptr, png_uint_32 size)
  98. {
  99.    void *ret;
  100. #ifdef PNG_MAX_MALLOC_64K
  101.    if (size > (png_uint_32)65536L)
  102.       png_error(png_ptr, "Cannot Allocate > 64K");
  103. #endif
  104. #ifdef __TURBOC__
  105. #  ifdef __WIN32__
  106.    ret = farmalloc(size);
  107. #  else
  108.    if (size == 65536L)
  109.    {
  110.       unsigned long offset;
  111.       if (!save_array)
  112.       {
  113.          ret = farmalloc(size);
  114.          offset = (unsigned long)(ret);
  115. offset &= 0xffffL;
  116.       }
  117.       else
  118.       {
  119.          ret = (void *)0;
  120.       }
  121. if (save_array || offset)
  122.       {
  123.          int i, j;
  124. if (ret)
  125.             farfree(ret);
  126.          ret = (void *)0;
  127.          if (!save_array)
  128.          {
  129.             unsigned long offset;
  130.             png_byte huge *ptr;
  131. int i;
  132.             num_save_array = 1;
  133.             save_array = malloc(num_save_array * sizeof (borland_seg));
  134.             if (!save_array)
  135.                png_error(png_ptr, "Out of Memory");
  136. save_array->mem_ptr = farmalloc(
  137.                (unsigned long)(NUM_SEG) * 65536L + 65528L);
  138.             if (!save_array->mem_ptr)
  139.                png_error(png_ptr, "Out of Memory");
  140. offset = (unsigned long)(ret);
  141.             offset &= 0xffffL;
  142.             ptr = save_array->mem_ptr;
  143.             if (offset)
  144.                ptr += 65536L - offset;
  145.             for (i = 0; i < NUM_SEG; i++, ptr += 65536L)
  146.             {
  147.                save_array->seg_ptr[i] = ptr;
  148. save_array->seg_used[i] = 0;
  149.             }
  150.             save_array->num_used = 0;
  151.          }
  152.          for (i = 0; i < num_save_array; i++)
  153. {
  154.             for (j = 0; j < NUM_SEG; j++)
  155.             {
  156.                if (!save_array[i].seg_used[j])
  157. {
  158.                   ret = save_array[i].seg_ptr[j];
  159.                   save_array[i].seg_used[j] = 1;
  160.                   save_array[i].num_used++;
  161.                   break;
  162.                }
  163.             }
  164.             if (ret)
  165. break;
  166.          }
  167.          if (!ret)
  168.          {
  169.             unsigned long offset;
  170. png_byte huge *ptr;
  171.             save_array = realloc(save_array,
  172.                (num_save_array + 1) * sizeof (borland_seg));
  173. if (!save_array)
  174.                png_error(png_ptr, "Out of Memory");
  175.             save_array[num_save_array].mem_ptr = farmalloc(
  176.                (unsigned long)(NUM_SEG) * 65536L + 65528L);
  177.             if (!save_array[num_save_array].mem_ptr)
  178.                png_error(png_ptr, "Out of Memory");
  179.             offset = (unsigned long)(ret);
  180.             offset &= 0xffffL;
  181. ptr = save_array[num_save_array].mem_ptr;
  182.             if (offset)
  183.                ptr += 65536L - offset;
  184.             for (i = 0; i < NUM_SEG; i++, ptr += 65536L)
  185.             {
  186.                save_array[num_save_array].seg_ptr[i] = ptr;
  187. save_array[num_save_array].seg_used[i] = 0;
  188.             }
  189.             ret = save_array[num_save_array].seg_ptr[0];
  190.             save_array[num_save_array].seg_used[0] = 1;
  191. save_array[num_save_array].num_used = 1;
  192.             num_save_array++;
  193.          }
  194.       }
  195.    }
  196.    else
  197.    {
  198.       ret = farmalloc(size);
  199. }
  200. #  endif /* __WIN32__ */
  201. #else /* __TURBOC__ */
  202. #  ifdef _MSC_VER
  203.    ret = halloc(size, 1);
  204. #  else
  205.    /* everybody else, so normal malloc should do it. */
  206.    ret = malloc(size);
  207. #  endif
  208. #endif
  209.    if (!ret)
  210.    {
  211.       png_error(png_ptr, "Out of Memory");
  212.    }
  213.    return ret;
  214. }
  215. /* free a pointer allocated by png_large_malloc().  In the default
  216.   configuration, png_ptr is not used, but is passed in case it
  217.   is needed.  If ptr is NULL, return without taking any action. */
  218. void
  219. png_large_free(png_struct *png_ptr, void *ptr)
  220. {
  221.    if (!png_ptr)
  222.       return;
  223.    if (ptr != (void *)0)
  224.    {
  225. #ifdef __TURBOC__
  226. #  ifndef __WIN32__
  227.       int i, j;
  228.       for (i = 0; i < num_save_array; i++)
  229. {
  230.          for (j = 0; j < NUM_SEG; j++)
  231.          {
  232.             if (ptr == save_array[i].seg_ptr[j])
  233.             {
  234. printf("freeing pointer: i, j: %d, %dn", i, j);
  235. save_array[i].seg_used[j] = 0;
  236.                ptr = 0;
  237.                save_array[i].num_used--;
  238.                if (!save_array[i].num_used)
  239. {
  240.                   int k;
  241. printf("freeing array: %dn", i);
  242.                   num_save_array--;
  243.                   farfree(save_array[i].mem_ptr);
  244.                   for (k = i; k < num_save_array; k++)
  245.                      save_array[k] = save_array[k + 1];
  246.                   if (!num_save_array)
  247. {
  248.                      free(save_array);
  249.                      save_array = 0;
  250.                   }
  251.                }
  252.                break;
  253. }
  254.          }
  255.          if (!ptr)
  256.             break;
  257. }
  258. #  endif
  259.       if (ptr)
  260.          farfree(ptr);
  261. #else
  262. #  ifdef _MSC_VER
  263.       hfree(ptr);
  264. #  else
  265.       free(ptr);
  266. #  endif
  267. #endif
  268.    }
  269. }
  270. /* Allocate memory.  This is called for smallish blocks only  It
  271.    should not get anywhere near 64K. */
  272. void *
  273. png_malloc(png_struct *png_ptr, png_uint_32 size)
  274. {
  275.    void *ret;
  276.    if (!png_ptr)
  277.       return ((void *)0);
  278. #ifdef PNG_MAX_MALLOC_64K
  279. if (size > (png_uint_32)65536L)
  280.       png_error(png_ptr, "Cannot Allocate > 64K");
  281. #endif
  282.    ret = malloc((png_size_t)size);
  283. if (!ret)
  284.    {
  285.       png_error(png_ptr, "Out of Memory");
  286.    }
  287.    return ret;
  288. }
  289. /* Reallocate memory.  This will not get near 64K on a
  290.    even marginally reasonable file. */
  291. void *
  292. png_realloc(png_struct *png_ptr, void *ptr, png_uint_32 size)
  293. {
  294.    void *ret;
  295.    if (!png_ptr)
  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");
  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_struct *png_ptr, void *ptr)
  313. {
  314.    if (!png_ptr)
  315.       return;
  316. if (ptr != (void *)0)
  317.       free(ptr);
  318. }
  319. /* This function is called whenever there is an error.  Replace with
  320. however you wish to handle the error.  Note that this function
  321. MUST NOT return, or the program will crash */
  322. void
  323. png_error_default(png_struct *png_ptr, char *message)
  324. {
  325. fprintf(stderr, "libpng error: %sn", message);
  326. longjmp(png_ptr->jmpbuf, 1);
  327. }
  328. /* This function is called when there is a warning, but the library
  329. thinks it can continue anyway.  You don't have to do anything here
  330. if you don't want to.  In the default configuration, png_ptr is
  331. not used, but it is passed in case it may be useful. */
  332. void
  333. png_warning_default(png_struct *png_ptr, char *message)
  334. {
  335. if (!png_ptr)
  336.       return;
  337. fprintf(stderr, "libpng warning: %sn", message);
  338. }
  339. /* Use blue, green, red order for pixels. */
  340. void png_set_error(void (*pngerror)(png_struct *, char *),
  341. void (*pngwarning)(png_struct *, char *))
  342. {
  343.   if (pngwarning) png_warning = pngwarning;
  344.   if (pngerror) png_error = pngerror;
  345.   else 
  346. fprintf(stderr, "libpng No lo hizo!n");
  347. }