Subversion Repositories Kolibri OS

Rev

Rev 1897 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1.  
  2. /* pngrio.c - functions for data input
  3.  *
  4.  * Last changed in libpng 1.6.0 [February 14, 2013]
  5.  * Copyright (c) 1998-2013 Glenn Randers-Pehrson
  6.  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  7.  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  8.  *
  9.  * This code is released under the libpng license.
  10.  * For conditions of distribution and use, see the disclaimer
  11.  * and license in png.h
  12.  *
  13.  * This file provides a location for all input.  Users who need
  14.  * special handling are expected to write a function that has the same
  15.  * arguments as this and performs a similar function, but that possibly
  16.  * has a different input method.  Note that you shouldn't change this
  17.  * function, but rather write a replacement function and then make
  18.  * libpng use it at run time with png_set_read_fn(...).
  19.  */
  20.  
  21. #include "pngpriv.h"
  22.  
  23. #ifdef PNG_READ_SUPPORTED
  24.  
  25. /* Read the data from whatever input you are using.  The default routine
  26.  * reads from a file pointer.  Note that this routine sometimes gets called
  27.  * with very small lengths, so you should implement some kind of simple
  28.  * buffering if you are using unbuffered reads.  This should never be asked
  29.  * to read more then 64K on a 16 bit machine.
  30.  */
  31. void /* PRIVATE */
  32. png_read_data(png_structrp png_ptr, png_bytep data, png_size_t length)
  33. {
  34.    png_debug1(4, "reading %d bytes", (int)length);
  35.  
  36.    if (png_ptr->read_data_fn != NULL)
  37.       (*(png_ptr->read_data_fn))(png_ptr, data, length);
  38.  
  39.    else
  40.       png_error(png_ptr, "Call to NULL read function");
  41. }
  42.  
  43. #ifdef PNG_STDIO_SUPPORTED
  44. /* This is the function that does the actual reading of data.  If you are
  45.  * not reading from a standard C stream, you should create a replacement
  46.  * read_data function and use it at run time with png_set_read_fn(), rather
  47.  * than changing the library.
  48.  */
  49. void PNGCBAPI
  50. png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
  51. {
  52.    png_size_t check;
  53.  
  54.    if (png_ptr == NULL)
  55.       return;
  56.  
  57.    /* fread() returns 0 on error, so it is OK to store this in a png_size_t
  58.     * instead of an int, which is what fread() actually returns.
  59.     */
  60.    check = fread(data, 1, length, png_voidcast(png_FILE_p, png_ptr->io_ptr));
  61.  
  62.    if (check != length)
  63.       png_error(png_ptr, "Read Error");
  64. }
  65. #endif
  66.  
  67. /* This function allows the application to supply a new input function
  68.  * for libpng if standard C streams aren't being used.
  69.  *
  70.  * This function takes as its arguments:
  71.  *
  72.  * png_ptr      - pointer to a png input data structure
  73.  *
  74.  * io_ptr       - pointer to user supplied structure containing info about
  75.  *                the input functions.  May be NULL.
  76.  *
  77.  * read_data_fn - pointer to a new input function that takes as its
  78.  *                arguments a pointer to a png_struct, a pointer to
  79.  *                a location where input data can be stored, and a 32-bit
  80.  *                unsigned int that is the number of bytes to be read.
  81.  *                To exit and output any fatal error messages the new write
  82.  *                function should call png_error(png_ptr, "Error msg").
  83.  *                May be NULL, in which case libpng's default function will
  84.  *                be used.
  85.  */
  86. void PNGAPI
  87. png_set_read_fn(png_structrp png_ptr, png_voidp io_ptr,
  88.    png_rw_ptr read_data_fn)
  89. {
  90.    if (png_ptr == NULL)
  91.       return;
  92.  
  93.    png_ptr->io_ptr = io_ptr;
  94.  
  95. #ifdef PNG_STDIO_SUPPORTED
  96.    if (read_data_fn != NULL)
  97.       png_ptr->read_data_fn = read_data_fn;
  98.  
  99.    else
  100.       png_ptr->read_data_fn = png_default_read_data;
  101. #else
  102.    png_ptr->read_data_fn = read_data_fn;
  103. #endif
  104.  
  105.    /* It is an error to write to a read device */
  106.    if (png_ptr->write_data_fn != NULL)
  107.    {
  108.       png_ptr->write_data_fn = NULL;
  109.       png_warning(png_ptr,
  110.           "Can't set both read_data_fn and write_data_fn in the"
  111.           " same structure");
  112.    }
  113.  
  114. #ifdef PNG_WRITE_FLUSH_SUPPORTED
  115.    png_ptr->output_flush_fn = NULL;
  116. #endif
  117. }
  118. #endif /* PNG_READ_SUPPORTED */
  119.