15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* pngwio.c - functions for data output
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Last changed in libpng 1.2.41 [December 3, 2009]
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 1998-2009 Glenn Randers-Pehrson
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This code is released under the libpng license.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * For conditions of distribution and use, see the disclaimer
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and license in png.h
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This file provides a location for all output.  Users who need
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * special handling are expected to write functions that have the same
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * arguments as these and perform similar functions, but that possibly
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * use different output methods.  Note that you shouldn't change these
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * functions, but rather write replacement functions and then change
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * them at run time with png_set_write_fn(...).
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_INTERNAL
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_NO_PEDANTIC_WARNINGS
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "png.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_WRITE_SUPPORTED
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Write the data to whatever output you are using.  The default routine
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * writes to a file pointer.  Note that this routine sometimes gets called
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * with very small lengths, so you should implement some kind of simple
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * buffering if you are using unbuffered writes.  This should never be asked
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to write more than 64K on a 16 bit machine.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->write_data_fn != NULL )
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (*(png_ptr->write_data_fn))(png_ptr, data, length);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_error(png_ptr, "Call to NULL write function");
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_STDIO_SUPPORTED
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This is the function that does the actual writing of data.  If you are
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * not writing to a standard C stream, you should create a replacement
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * write_data function and use it at run time with png_set_write_fn(), rather
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * than changing the library.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef USE_FAR_KEYWORD
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_uint_32 check;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef _WIN32_WCE
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( !WriteFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) )
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      check = 0;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   check = fwrite(data, 1, length, (png_FILE_p)(png_ptr->io_ptr));
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (check != length)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_error(png_ptr, "Write Error");
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This is the model-independent version. Since the standard I/O library
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * can't handle far buffers in the medium and small models, we have to copy
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the data.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NEAR_BUF_SIZE 1024
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MIN(a,b) (a <= b ? a : b)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_uint_32 check;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_byte *near_data;  /* Needs to be "png_byte *" instead of "png_bytep" */
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_FILE_p io_ptr;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Check if data really is near. If so, use usual code. */
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   near_data = (png_byte *)CVT_PTR_NOCHECK(data);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ((png_bytep)near_data == data)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef _WIN32_WCE
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ( !WriteFile(io_ptr, near_data, length, &check, NULL) )
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         check = 0;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      check = fwrite(near_data, 1, length, io_ptr);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_byte buf[NEAR_BUF_SIZE];
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_size_t written, remaining, err;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      check = 0;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      remaining = length;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      do
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         written = MIN(NEAR_BUF_SIZE, remaining);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_memcpy(buf, data, written); /* Copy far buffer to near buffer */
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef _WIN32_WCE
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if ( !WriteFile(io_ptr, buf, written, &err, NULL) )
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err = 0;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         err = fwrite(buf, 1, written, io_ptr);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (err != written)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         else
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            check += err;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         data += written;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         remaining -= written;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while (remaining != 0);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (check != length)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_error(png_ptr, "Write Error");
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This function is called to output any data pending writing (normally
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to disk).  After png_flush is called, there should be no data pending
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * writing in any buffers.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_WRITE_FLUSH_SUPPORTED
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_flush(png_structp png_ptr)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->output_flush_fn != NULL)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (*(png_ptr->output_flush_fn))(png_ptr);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_STDIO_SUPPORTED
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_default_flush(png_structp png_ptr)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef _WIN32_WCE
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_FILE_p io_ptr;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef _WIN32_WCE
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   io_ptr = (png_FILE_p)CVT_PTR((png_ptr->io_ptr));
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   fflush(io_ptr);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This function allows the application to supply new output functions for
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * libpng if standard C streams aren't being used.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This function takes as its arguments:
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * png_ptr       - pointer to a png output data structure
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * io_ptr        - pointer to user supplied structure containing info about
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                 the output functions.  May be NULL.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * write_data_fn - pointer to a new output function that takes as its
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                 arguments a pointer to a png_struct, a pointer to
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                 data to be written, and a 32-bit unsigned int that is
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                 the number of bytes to be written.  The new write
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                 function should call png_error(png_ptr, "Error msg")
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                 to exit and output any fatal error messages.  May be
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                 NULL, in which case libpng's default function will
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                 be used.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * flush_data_fn - pointer to a new flush function that takes as its
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                 arguments a pointer to a png_struct.  After a call to
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                 the flush function, there should be no data in any buffers
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                 or pending transmission.  If the output method doesn't do
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                 any buffering of output, a function prototype must still be
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                 supplied although it doesn't have to do anything.  If
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                 PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                 time, output_flush_fn will be ignored, although it must be
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                 supplied for compatibility.  May be NULL, in which case
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                 libpng's default function will be used, if
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                 PNG_WRITE_FLUSH_SUPPORTED is defined.  This is not
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                 a good idea if io_ptr does not point to a standard
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                 *FILE structure.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_write_fn(png_structp png_ptr, png_voidp io_ptr,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->io_ptr = io_ptr;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_STDIO_SUPPORTED
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (write_data_fn != NULL)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->write_data_fn = write_data_fn;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->write_data_fn = png_default_write_data;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->write_data_fn = write_data_fn;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_WRITE_FLUSH_SUPPORTED
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_STDIO_SUPPORTED
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (output_flush_fn != NULL)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->output_flush_fn = output_flush_fn;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->output_flush_fn = png_default_flush;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->output_flush_fn = output_flush_fn;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_WRITE_FLUSH_SUPPORTED */
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* It is an error to read while writing a png file */
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->read_data_fn != NULL)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->read_data_fn = NULL;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_warning(png_ptr,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "Attempted to set both read_data_fn and write_data_fn in");
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_warning(png_ptr,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "the same structure.  Resetting read_data_fn to NULL.");
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef USE_FAR_KEYWORD
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef _MSC_VER
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void *png_far_to_near(png_structp png_ptr, png_voidp ptr, int check)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   void *near_ptr;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   void FAR *far_ptr;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   FP_OFF(near_ptr) = FP_OFF(ptr);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   far_ptr = (void FAR *)near_ptr;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (check != 0)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (FP_SEG(ptr) != FP_SEG(far_ptr))
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_error(png_ptr, "segment lost in conversion");
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return(near_ptr);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  else
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void *png_far_to_near(png_structp png_ptr, png_voidp ptr, int check)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   void *near_ptr;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   void FAR *far_ptr;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   near_ptr = (void FAR *)ptr;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   far_ptr = (void FAR *)near_ptr;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (check != 0)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (far_ptr != ptr)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_error(png_ptr, "segment lost in conversion");
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return(near_ptr);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   endif
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   endif
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_WRITE_SUPPORTED */
261