Blame gtkmm-osx/libpng-1.2.5/pngrio.c

Carlos Lopez a09598
Carlos Lopez a09598
/* pngrio.c - functions for data input
Carlos Lopez a09598
 *
Carlos Lopez a09598
 * libpng 1.2.5 - October 3, 2002
Carlos Lopez a09598
 * For conditions of distribution and use, see copyright notice in png.h
Carlos Lopez a09598
 * Copyright (c) 1998-2002 Glenn Randers-Pehrson
Carlos Lopez a09598
 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
Carlos Lopez a09598
 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
Carlos Lopez a09598
 *
Carlos Lopez a09598
 * This file provides a location for all input.  Users who need
Carlos Lopez a09598
 * special handling are expected to write a function that has the same
Carlos Lopez a09598
 * arguments as this and performs a similar function, but that possibly
Carlos Lopez a09598
 * has a different input method.  Note that you shouldn't change this
Carlos Lopez a09598
 * function, but rather write a replacement function and then make
Carlos Lopez a09598
 * libpng use it at run time with png_set_read_fn(...).
Carlos Lopez a09598
 */
Carlos Lopez a09598
Carlos Lopez a09598
#define PNG_INTERNAL
Carlos Lopez a09598
#include "png.h"
Carlos Lopez a09598
Carlos Lopez a09598
/* Read the data from whatever input you are using.  The default routine
Carlos Lopez a09598
   reads from a file pointer.  Note that this routine sometimes gets called
Carlos Lopez a09598
   with very small lengths, so you should implement some kind of simple
Carlos Lopez a09598
   buffering if you are using unbuffered reads.  This should never be asked
Carlos Lopez a09598
   to read more then 64K on a 16 bit machine. */
Carlos Lopez a09598
void /* PRIVATE */
Carlos Lopez a09598
png_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
Carlos Lopez a09598
{
Carlos Lopez a09598
   png_debug1(4,"reading %d bytes\n", (int)length);
Carlos Lopez a09598
   if (png_ptr->read_data_fn != NULL)
Carlos Lopez a09598
      (*(png_ptr->read_data_fn))(png_ptr, data, length);
Carlos Lopez a09598
   else
Carlos Lopez a09598
      png_error(png_ptr, "Call to NULL read function");
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
#if !defined(PNG_NO_STDIO)
Carlos Lopez a09598
/* This is the function that does the actual reading of data.  If you are
Carlos Lopez a09598
   not reading from a standard C stream, you should create a replacement
Carlos Lopez a09598
   read_data function and use it at run time with png_set_read_fn(), rather
Carlos Lopez a09598
   than changing the library. */
Carlos Lopez a09598
#ifndef USE_FAR_KEYWORD
Carlos Lopez a09598
void PNGAPI
Carlos Lopez a09598
png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
Carlos Lopez a09598
{
Carlos Lopez a09598
   png_size_t check;
Carlos Lopez a09598
Carlos Lopez a09598
   /* fread() returns 0 on error, so it is OK to store this in a png_size_t
Carlos Lopez a09598
    * instead of an int, which is what fread() actually returns.
Carlos Lopez a09598
    */
Carlos Lopez a09598
#if defined(_WIN32_WCE)
Carlos Lopez a09598
   if ( !ReadFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) )
Carlos Lopez a09598
      check = 0;
Carlos Lopez a09598
#else
Carlos Lopez a09598
   check = (png_size_t)fread(data, (png_size_t)1, length,
Carlos Lopez a09598
      (png_FILE_p)png_ptr->io_ptr);
Carlos Lopez a09598
#endif
Carlos Lopez a09598
Carlos Lopez a09598
   if (check != length)
Carlos Lopez a09598
      png_error(png_ptr, "Read Error");
Carlos Lopez a09598
}
Carlos Lopez a09598
#else
Carlos Lopez a09598
/* this is the model-independent version. Since the standard I/O library
Carlos Lopez a09598
   can't handle far buffers in the medium and small models, we have to copy
Carlos Lopez a09598
   the data.
Carlos Lopez a09598
*/
Carlos Lopez a09598
Carlos Lopez a09598
#define NEAR_BUF_SIZE 1024
Carlos Lopez a09598
#define MIN(a,b) (a <= b ? a : b)
Carlos Lopez a09598
Carlos Lopez a09598
static void /* PRIVATE */
Carlos Lopez a09598
png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
Carlos Lopez a09598
{
Carlos Lopez a09598
   int check;
Carlos Lopez a09598
   png_byte *n_data;
Carlos Lopez a09598
   png_FILE_p io_ptr;
Carlos Lopez a09598
Carlos Lopez a09598
   /* Check if data really is near. If so, use usual code. */
Carlos Lopez a09598
   n_data = (png_byte *)CVT_PTR_NOCHECK(data);
Carlos Lopez a09598
   io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr);
Carlos Lopez a09598
   if ((png_bytep)n_data == data)
Carlos Lopez a09598
   {
Carlos Lopez a09598
#if defined(_WIN32_WCE)
Carlos Lopez a09598
      if ( !ReadFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) )
Carlos Lopez a09598
         check = 0;
Carlos Lopez a09598
#else
Carlos Lopez a09598
      check = fread(n_data, 1, length, io_ptr);
Carlos Lopez a09598
#endif
Carlos Lopez a09598
   }
Carlos Lopez a09598
   else
Carlos Lopez a09598
   {
Carlos Lopez a09598
      png_byte buf[NEAR_BUF_SIZE];
Carlos Lopez a09598
      png_size_t read, remaining, err;
Carlos Lopez a09598
      check = 0;
Carlos Lopez a09598
      remaining = length;
Carlos Lopez a09598
      do
Carlos Lopez a09598
      {
Carlos Lopez a09598
         read = MIN(NEAR_BUF_SIZE, remaining);
Carlos Lopez a09598
#if defined(_WIN32_WCE)
Carlos Lopez a09598
         if ( !ReadFile((HANDLE)(io_ptr), buf, read, &err, NULL) )
Carlos Lopez a09598
            err = 0;
Carlos Lopez a09598
#else
Carlos Lopez a09598
         err = fread(buf, (png_size_t)1, read, io_ptr);
Carlos Lopez a09598
#endif
Carlos Lopez a09598
         png_memcpy(data, buf, read); /* copy far buffer to near buffer */
Carlos Lopez a09598
         if(err != read)
Carlos Lopez a09598
            break;
Carlos Lopez a09598
         else
Carlos Lopez a09598
            check += err;
Carlos Lopez a09598
         data += read;
Carlos Lopez a09598
         remaining -= read;
Carlos Lopez a09598
      }
Carlos Lopez a09598
      while (remaining != 0);
Carlos Lopez a09598
   }
Carlos Lopez a09598
   if ((png_uint_32)check != (png_uint_32)length)
Carlos Lopez a09598
      png_error(png_ptr, "read Error");
Carlos Lopez a09598
}
Carlos Lopez a09598
#endif
Carlos Lopez a09598
#endif
Carlos Lopez a09598
Carlos Lopez a09598
/* This function allows the application to supply a new input function
Carlos Lopez a09598
   for libpng if standard C streams aren't being used.
Carlos Lopez a09598
Carlos Lopez a09598
   This function takes as its arguments:
Carlos Lopez a09598
   png_ptr      - pointer to a png input data structure
Carlos Lopez a09598
   io_ptr       - pointer to user supplied structure containing info about
Carlos Lopez a09598
                  the input functions.  May be NULL.
Carlos Lopez a09598
   read_data_fn - pointer to a new input function that takes as its
Carlos Lopez a09598
                  arguments a pointer to a png_struct, a pointer to
Carlos Lopez a09598
                  a location where input data can be stored, and a 32-bit
Carlos Lopez a09598
                  unsigned int that is the number of bytes to be read.
Carlos Lopez a09598
                  To exit and output any fatal error messages the new write
Carlos Lopez a09598
                  function should call png_error(png_ptr, "Error msg"). */
Carlos Lopez a09598
void PNGAPI
Carlos Lopez a09598
png_set_read_fn(png_structp png_ptr, png_voidp io_ptr,
Carlos Lopez a09598
   png_rw_ptr read_data_fn)
Carlos Lopez a09598
{
Carlos Lopez a09598
   png_ptr->io_ptr = io_ptr;
Carlos Lopez a09598
Carlos Lopez a09598
#if !defined(PNG_NO_STDIO)
Carlos Lopez a09598
   if (read_data_fn != NULL)
Carlos Lopez a09598
      png_ptr->read_data_fn = read_data_fn;
Carlos Lopez a09598
   else
Carlos Lopez a09598
      png_ptr->read_data_fn = png_default_read_data;
Carlos Lopez a09598
#else
Carlos Lopez a09598
   png_ptr->read_data_fn = read_data_fn;
Carlos Lopez a09598
#endif
Carlos Lopez a09598
Carlos Lopez a09598
   /* It is an error to write to a read device */
Carlos Lopez a09598
   if (png_ptr->write_data_fn != NULL)
Carlos Lopez a09598
   {
Carlos Lopez a09598
      png_ptr->write_data_fn = NULL;
Carlos Lopez a09598
      png_warning(png_ptr,
Carlos Lopez a09598
         "It's an error to set both read_data_fn and write_data_fn in the ");
Carlos Lopez a09598
      png_warning(png_ptr,
Carlos Lopez a09598
         "same structure.  Resetting write_data_fn to NULL.");
Carlos Lopez a09598
   }
Carlos Lopez a09598
Carlos Lopez a09598
#if defined(PNG_WRITE_FLUSH_SUPPORTED)
Carlos Lopez a09598
   png_ptr->output_flush_fn = NULL;
Carlos Lopez a09598
#endif
Carlos Lopez a09598
}