]>
git.saurik.com Git - wxWidgets.git/blob - src/png/pngrio.c
   2 /* pngrio.c - functions for data input 
   4  * libpng 1.0.3 - January 14, 1999 
   5  * For conditions of distribution and use, see copyright notice in png.h 
   6  * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. 
   7  * Copyright (c) 1996, 1997 Andreas Dilger 
   8  * Copyright (c) 1998, 1999 Glenn Randers-Pehrson 
  10  * This file provides a location for all input.  Users who need 
  11  * special handling are expected to write a function that has the same 
  12  * arguments as this and performs a similar function, but that possibly 
  13  * has a different input method.  Note that you shouldn't change this 
  14  * function, but rather write a replacement function and then make 
  15  * libpng use it at run time with png_set_read_fn(...). 
  21 /* Read the data from whatever input you are using.  The default routine 
  22    reads from a file pointer.  Note that this routine sometimes gets called 
  23    with very small lengths, so you should implement some kind of simple 
  24    buffering if you are using unbuffered reads.  This should never be asked 
  25    to read more then 64K on a 16 bit machine. */ 
  27 png_read_data(png_structp png_ptr
, png_bytep data
, png_size_t length
) 
  29    png_debug1(4,"reading %d bytes\n", length
); 
  30    if (png_ptr
->read_data_fn 
!= NULL
) 
  31       (*(png_ptr
->read_data_fn
))(png_ptr
, data
, length
); 
  33       png_error(png_ptr
, "Call to NULL read function"); 
  36 #if !defined(PNG_NO_STDIO) 
  37 /* This is the function that does the actual reading of data.  If you are 
  38    not reading from a standard C stream, you should create a replacement 
  39    read_data function and use it at run time with png_set_read_fn(), rather 
  40    than changing the library. */ 
  41 #ifndef USE_FAR_KEYWORD 
  44 png_default_read_data(png_structp png_ptr
, png_bytep data
, png_size_t length
) 
  47 png_default_read_data(png_structp png_ptr
, png_bytep data
, png_size_t length
) 
  52    /* fread() returns 0 on error, so it is OK to store this in a png_size_t 
  53     * instead of an int, which is what fread() actually returns. 
  55    check 
= (png_size_t
)fread(data
, (png_size_t
)1, length
, 
  56       (FILE *)png_ptr
->io_ptr
); 
  60       png_error(png_ptr
, "Read Error"); 
  64 /* this is the model-independent version. Since the standard I/O library 
  65    can't handle far buffers in the medium and small models, we have to copy 
  69 #define NEAR_BUF_SIZE 1024 
  70 #define MIN(a,b) (a <= b ? a : b) 
  73 png_default_read_data(png_structp png_ptr
, png_bytep data
, png_size_t length
) 
  79    /* Check if data really is near. If so, use usual code. */ 
  80    n_data 
= (png_byte 
*)CVT_PTR_NOCHECK(data
); 
  81    io_ptr 
= (FILE *)CVT_PTR(png_ptr
->io_ptr
); 
  82    if ((png_bytep
)n_data 
== data
) 
  84       check 
= fread(n_data
, 1, length
, io_ptr
); 
  88       png_byte buf
[NEAR_BUF_SIZE
]; 
  89       png_size_t read
, remaining
, err
; 
  94          read 
= MIN(NEAR_BUF_SIZE
, remaining
); 
  95          err 
= fread(buf
, (png_size_t
)1, read
, io_ptr
); 
  96          png_memcpy(data
, buf
, read
); /* copy far buffer to near buffer */ 
 104       while (remaining 
!= 0); 
 106    if ((png_uint_32
)check 
!= (png_uint_32
)length
) 
 108       png_error(png_ptr
, "read Error"); 
 114 /* This function allows the application to supply a new input function 
 115    for libpng if standard C streams aren't being used. 
 117    This function takes as its arguments: 
 118    png_ptr      - pointer to a png input data structure 
 119    io_ptr       - pointer to user supplied structure containing info about 
 120                   the input functions.  May be NULL. 
 121    read_data_fn - pointer to a new input function that takes as its 
 122                   arguments a pointer to a png_struct, a pointer to 
 123                   a location where input data can be stored, and a 32-bit 
 124                   unsigned int that is the number of bytes to be read. 
 125                   To exit and output any fatal error messages the new write 
 126                   function should call png_error(png_ptr, "Error msg"). */ 
 128 png_set_read_fn(png_structp png_ptr
, png_voidp io_ptr
, 
 129    png_rw_ptr read_data_fn
) 
 131    png_ptr
->io_ptr 
= io_ptr
; 
 133 #if !defined(PNG_NO_STDIO) 
 134    if (read_data_fn 
!= NULL
) 
 135       png_ptr
->read_data_fn 
= read_data_fn
; 
 137       png_ptr
->read_data_fn 
= png_default_read_data
; 
 139    png_ptr
->read_data_fn 
= read_data_fn
; 
 142    /* It is an error to write to a read device */ 
 143    if (png_ptr
->write_data_fn 
!= NULL
) 
 145       png_ptr
->write_data_fn 
= NULL
; 
 147          "It's an error to set both read_data_fn and write_data_fn in the "); 
 149          "same structure.  Resetting write_data_fn to NULL."); 
 152 #if defined(PNG_WRITE_FLUSH_SUPPORTED) 
 153    png_ptr
->output_flush_fn 
= NULL
; 
 154 #endif /* PNG_WRITE_FLUSH_SUPPORTED */