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