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