PNGSTUB0.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. }
  63. /* Allocate memory.  For reasonable files, size should never exceed
  64.    64K.  However, zlib may allocate more then 64K if you don't tell
  65.    it not to.  See zconf.h and png.h for more information. zlib does
  66.    need to allocate exactly 64K, so whatever you call here must
  67.    have the ability to do that. */
  68. /* Borland compilers have this habit of not giving you 64K chunks
  69.    that start on the segment in DOS mode.  This has not been observed
  70.    in Windows, and of course it doesn't matter in 32 bit mode, as there
  71.    are no segments.  Now libpng doesn't need that much memory normally,
  72.    but zlib does, so we have to normalize it, if necessary.  It would be
  73.    better if zlib worked in less then 64K, but it doesn't, so we
  74.    have to deal with it.  Truely, we are misusing farmalloc here,
  75.    as it is designed for use with huge pointers, which don't care
  76.    about segments.  So we allocate a large amount of memory, and
  77.    divvy off segments when needed.
  78.    */
  79. #ifdef __TURBOC__
  80. #ifndef __WIN32__
  81. /* NUM_SEG is the number of segments allocated at once */
  82. #define NUM_SEG 4
  83. typedef struct borland_seg_struct
  84. {
  85.    void *mem_ptr;
  86.    void *seg_ptr[NUM_SEG];
  87.    int seg_used[NUM_SEG];
  88.    int num_used;
  89. } borland_seg;
  90. borland_seg *save_array;
  91. int num_save_array;
  92. int max_save_array;
  93. #endif
  94. #endif
  95. void *
  96. png_large_malloc(png_struct *png_ptr, png_uint_32 size)
  97. {
  98.    void *ret;
  99. #ifdef PNG_MAX_MALLOC_64K
  100.    if (size > (png_uint_32)65536L)
  101.       png_error(png_ptr, "Cannot Allocate > 64K");
  102. #endif
  103. #ifdef __TURBOC__
  104. #  ifdef __WIN32__
  105.    ret = farmalloc(size);
  106. #  else
  107.    if (size == 65536L)
  108.    {
  109.       unsigned long offset;
  110.       if (!save_array)
  111.       {
  112.          ret = farmalloc(size);
  113.          offset = (unsigned long)(ret);
  114.          offset &= 0xffffL;
  115.       }
  116.       else
  117.       {
  118.          ret = (void *)0;
  119.       }
  120.       if (save_array || offset)
  121.       {
  122.          int i, j;
  123.          if (ret)
  124.             farfree(ret);
  125.          ret = (void *)0;
  126.          if (!save_array)
  127.          {
  128.             unsigned long offset;
  129.             png_byte huge *ptr;
  130.             int i;
  131.             num_save_array = 1;
  132.             save_array = malloc(num_save_array * sizeof (borland_seg));
  133.             if (!save_array)
  134.                png_error(png_ptr, "Out of Memory");
  135.             save_array->mem_ptr = farmalloc(
  136.                (unsigned long)(NUM_SEG) * 65536L + 65528L);
  137.             if (!save_array->mem_ptr)
  138.                png_error(png_ptr, "Out of Memory");
  139.             offset = (unsigned long)(ret);
  140.             offset &= 0xffffL;
  141.             ptr = save_array->mem_ptr;
  142.             if (offset)
  143.                ptr += 65536L - offset;
  144.             for (i = 0; i < NUM_SEG; i++, ptr += 65536L)
  145.             {
  146.                save_array->seg_ptr[i] = ptr;
  147.                save_array->seg_used[i] = 0;
  148.             }
  149.             save_array->num_used = 0;
  150.          }
  151.          for (i = 0; i < num_save_array; i++)
  152.          {
  153.             for (j = 0; j < NUM_SEG; j++)
  154.             {
  155.                if (!save_array[i].seg_used[j])
  156.                {
  157.                   ret = save_array[i].seg_ptr[j];
  158.                   save_array[i].seg_used[j] = 1;
  159.                   save_array[i].num_used++;
  160.                   break;
  161.                }
  162.             }
  163.             if (ret)
  164.                break;
  165.          }
  166.          if (!ret)
  167.          {
  168.             unsigned long offset;
  169.             png_byte huge *ptr;
  170.             save_array = realloc(save_array,
  171.                (num_save_array + 1) * sizeof (borland_seg));
  172.             if (!save_array)
  173.                png_error(png_ptr, "Out of Memory");
  174.             save_array[num_save_array].mem_ptr = farmalloc(
  175.                (unsigned long)(NUM_SEG) * 65536L + 65528L);
  176.             if (!save_array[num_save_array].mem_ptr)
  177.                png_error(png_ptr, "Out of Memory");
  178.             offset = (unsigned long)(ret);
  179.             offset &= 0xffffL;
  180.             ptr = save_array[num_save_array].mem_ptr;
  181.             if (offset)
  182.                ptr += 65536L - offset;
  183.             for (i = 0; i < NUM_SEG; i++, ptr += 65536L)
  184.             {
  185.                save_array[num_save_array].seg_ptr[i] = ptr;
  186.                save_array[num_save_array].seg_used[i] = 0;
  187.             }
  188.             ret = save_array[num_save_array].seg_ptr[0];
  189.             save_array[num_save_array].seg_used[0] = 1;
  190.             save_array[num_save_array].num_used = 1;
  191.             num_save_array++;
  192.          }
  193.       }
  194.    }
  195.    else
  196.    {
  197.       ret = farmalloc(size);
  198.    }
  199. #  endif /* __WIN32__ */
  200. #else /* __TURBOC__ */
  201. #  ifdef _MSC_VER
  202.    ret = halloc(size, 1);
  203. #  else
  204.    /* everybody else, so normal malloc should do it. */
  205.    ret = malloc(size);
  206. #  endif
  207. #endif
  208.    if (!ret)
  209.    {
  210.       png_error(png_ptr, "Out of Memory");
  211.    }
  212.    return ret;
  213. }
  214. /* free a pointer allocated by png_large_malloc().  In the default
  215.   configuration, png_ptr is not used, but is passed in case it
  216.   is needed.  If ptr is NULL, return without taking any action. */
  217. void
  218. png_large_free(png_struct *png_ptr, void *ptr)
  219. {
  220.    if (!png_ptr)
  221.       return;
  222.    if (ptr != (void *)0)
  223.    {
  224. #ifdef __TURBOC__
  225. #  ifndef __WIN32__
  226.       int i, j;
  227.       for (i = 0; i < num_save_array; i++)
  228.       {
  229.          for (j = 0; j < NUM_SEG; j++)
  230.          {
  231.             if (ptr == save_array[i].seg_ptr[j])
  232.             {
  233. printf("freeing pointer: i, j: %d, %dn", i, j);
  234.                save_array[i].seg_used[j] = 0;
  235.                ptr = 0;
  236.                save_array[i].num_used--;
  237.                if (!save_array[i].num_used)
  238.                {
  239.                   int k;
  240. printf("freeing array: %dn", i);
  241.                   num_save_array--;
  242.                   farfree(save_array[i].mem_ptr);
  243.                   for (k = i; k < num_save_array; k++)
  244.                      save_array[k] = save_array[k + 1];
  245.                   if (!num_save_array)
  246.                   {
  247.                      free(save_array);
  248.                      save_array = 0;
  249.                   }
  250.                }
  251.                break;
  252.             }
  253.          }
  254.          if (!ptr)
  255.             break;
  256.       }
  257. #  endif
  258.       if (ptr)
  259.          farfree(ptr);
  260. #else
  261. #  ifdef _MSC_VER
  262.       hfree(ptr);
  263. #  else
  264.       free(ptr);
  265. #  endif
  266. #endif
  267.    }
  268. }
  269. /* Allocate memory.  This is called for smallish blocks only  It
  270.    should not get anywhere near 64K. */
  271. void *
  272. png_malloc(png_struct *png_ptr, png_uint_32 size)
  273. {
  274.    void *ret;
  275.    if (!png_ptr)
  276.       return ((void *)0);
  277. #ifdef PNG_MAX_MALLOC_64K
  278.    if (size > (png_uint_32)65536L)
  279.       png_error(png_ptr, "Cannot Allocate > 64K");
  280. #endif
  281.    ret = malloc((png_size_t)size);
  282.    if (!ret)
  283.    {
  284.       png_error(png_ptr, "Out of Memory");
  285.    }
  286.    return ret;
  287. }
  288. /* Reallocate memory.  This will not get near 64K on a
  289.    even marginally reasonable file. */
  290. void *
  291. png_realloc(png_struct *png_ptr, void *ptr, png_uint_32 size)
  292. {
  293.    void *ret;
  294.    if (!png_ptr)
  295.       return ((void *)0);
  296. #ifdef PNG_MAX_MALLOC_64K
  297.    if (size > (png_uint_32)65536L)
  298.       png_error(png_ptr, "Cannot Allocate > 64K");
  299. #endif
  300.    ret = realloc(ptr, (png_size_t)size);
  301.    if (!ret)
  302.    {
  303.       png_error(png_ptr, "Out of Memory");
  304.    }
  305.    return ret;
  306. }
  307. /* free a pointer allocated by png_malloc().  In the default
  308.   configuration, png_ptr is not used, but is passed incase it
  309.   is needed.  If ptr is NULL, return without taking any action. */
  310. void
  311. png_free(png_struct *png_ptr, void *ptr)
  312. {
  313.    if (!png_ptr)
  314.       return;
  315.    if (ptr != (void *)0)
  316.       free(ptr);
  317. }
  318. /* This function is called whenever there is an error.  Replace with
  319.    however you wish to handle the error.  Note that this function
  320.    MUST NOT return, or the program will crash */
  321. void
  322. png_error(png_struct *png_ptr, char *message)
  323. {
  324.    fprintf(stderr, "libpng error: %sn", message);
  325.    longjmp(png_ptr->jmpbuf, 1);
  326. }
  327. /* This function is called when there is a warning, but the library
  328.    thinks it can continue anyway.  You don't have to do anything here
  329.    if you don't want to.  In the default configuration, png_ptr is
  330.    not used, but it is passed in case it may be useful. */
  331. void
  332. png_warning(png_struct *png_ptr, char *message)
  333. {
  334.    if (!png_ptr)
  335.       return;
  336.    fprintf(stderr, "libpng warning: %sn", message);
  337. }