14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann/* pngwio.c - functions for data output
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * Last changed in libpng 1.6.15 [November 20, 2014]
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * This code is released under the libpng license.
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * For conditions of distribution and use, see the disclaimer
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * and license in png.h
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * This file provides a location for all output.  Users who need
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * special handling are expected to write functions that have the same
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * arguments as these and perform similar functions, but that possibly
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * use different output methods.  Note that you shouldn't change these
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * functions, but rather write replacement functions and then change
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * them at run time with png_set_write_fn(...).
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "pngpriv.h"
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_WRITE_SUPPORTED
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann/* Write the data to whatever output you are using.  The default routine
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * writes to a file pointer.  Note that this routine sometimes gets called
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * with very small lengths, so you should implement some kind of simple
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * buffering if you are using unbuffered writes.  This should never be asked
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * to write more than 64K on a 16-bit machine.
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid /* PRIVATE */
334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_write_data(png_structrp png_ptr, png_const_bytep data, png_size_t length)
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* NOTE: write_data_fn must not change the buffer! */
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr->write_data_fn != NULL )
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      (*(png_ptr->write_data_fn))(png_ptr, png_constcast(png_bytep,data),
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         length);
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   else
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_error(png_ptr, "Call to NULL write function");
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_STDIO_SUPPORTED
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann/* This is the function that does the actual writing of data.  If you are
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * not writing to a standard C stream, you should create a replacement
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * write_data function and use it at run time with png_set_write_fn(), rather
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * than changing the library.
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGCBAPI
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_size_t check;
544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL)
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   check = fwrite(data, 1, length, (png_FILE_p)(png_ptr->io_ptr));
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (check != length)
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_error(png_ptr, "Write Error");
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann/* This function is called to output any data pending writing (normally
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * to disk).  After png_flush is called, there should be no data pending
674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * writing in any buffers.
684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_WRITE_FLUSH_SUPPORTED
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid /* PRIVATE */
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_flush(png_structrp png_ptr)
724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr->output_flush_fn != NULL)
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      (*(png_ptr->output_flush_fn))(png_ptr);
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  ifdef PNG_STDIO_SUPPORTED
784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGCBAPI
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_default_flush(png_structp png_ptr)
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_FILE_p io_ptr;
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL)
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   io_ptr = png_voidcast(png_FILE_p, (png_ptr->io_ptr));
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   fflush(io_ptr);
884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  endif
904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann/* This function allows the application to supply new output functions for
934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * libpng if standard C streams aren't being used.
944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *
954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * This function takes as its arguments:
964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * png_ptr       - pointer to a png output data structure
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * io_ptr        - pointer to user supplied structure containing info about
984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *                 the output functions.  May be NULL.
994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * write_data_fn - pointer to a new output function that takes as its
1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *                 arguments a pointer to a png_struct, a pointer to
1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *                 data to be written, and a 32-bit unsigned int that is
1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *                 the number of bytes to be written.  The new write
1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *                 function should call png_error(png_ptr, "Error msg")
1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *                 to exit and output any fatal error messages.  May be
1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *                 NULL, in which case libpng's default function will
1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *                 be used.
1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * flush_data_fn - pointer to a new flush function that takes as its
1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *                 arguments a pointer to a png_struct.  After a call to
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *                 the flush function, there should be no data in any buffers
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *                 or pending transmission.  If the output method doesn't do
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *                 any buffering of output, a function prototype must still be
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *                 supplied although it doesn't have to do anything.  If
1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *                 PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile
1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *                 time, output_flush_fn will be ignored, although it must be
1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *                 supplied for compatibility.  May be NULL, in which case
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *                 libpng's default function will be used, if
1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *                 PNG_WRITE_FLUSH_SUPPORTED is defined.  This is not
1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *                 a good idea if io_ptr does not point to a standard
1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *                 *FILE structure.
1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */
1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_write_fn(png_structrp png_ptr, png_voidp io_ptr,
1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)
1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL)
1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_ptr->io_ptr = io_ptr;
1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_STDIO_SUPPORTED
1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (write_data_fn != NULL)
1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_ptr->write_data_fn = write_data_fn;
1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   else
1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_ptr->write_data_fn = png_default_write_data;
1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#else
1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_ptr->write_data_fn = write_data_fn;
1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_WRITE_FLUSH_SUPPORTED
1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  ifdef PNG_STDIO_SUPPORTED
1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (output_flush_fn != NULL)
1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_ptr->output_flush_fn = output_flush_fn;
1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   else
1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_ptr->output_flush_fn = png_default_flush;
1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  else
1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_ptr->output_flush_fn = output_flush_fn;
1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  endif
1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#else
1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   PNG_UNUSED(output_flush_fn)
1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif /* WRITE_FLUSH */
1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_READ_SUPPORTED
1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* It is an error to read while writing a png file */
1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr->read_data_fn != NULL)
1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_ptr->read_data_fn = NULL;
1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_warning(png_ptr,
1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          "Can't set both read_data_fn and write_data_fn in the"
1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          " same structure");
1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif /* WRITE */
169