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