Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / core / src / fxcodec / fx_lpng / lpng_v163 / fx_pngwio.c
1 \r
2 /* pngwio.c - functions for data output\r
3  *\r
4  * Last changed in libpng 1.6.0 [February 14, 2013]\r
5  * Copyright (c) 1998-2013 Glenn Randers-Pehrson\r
6  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\r
7  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\r
8  *\r
9  * This code is released under the libpng license.\r
10  * For conditions of distribution and use, see the disclaimer\r
11  * and license in png.h\r
12  *\r
13  * This file provides a location for all output.  Users who need\r
14  * special handling are expected to write functions that have the same\r
15  * arguments as these and perform similar functions, but that possibly\r
16  * use different output methods.  Note that you shouldn't change these\r
17  * functions, but rather write replacement functions and then change\r
18  * them at run time with png_set_write_fn(...).\r
19  */\r
20 #if (!defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_) || defined(_PNG_DECODER_)) && !defined(_USE_ADDIN_) && !defined(_FX_EMB_NOUSE_DECODER_)\r
21 #include "pngpriv.h"\r
22 \r
23 #ifdef PNG_WRITE_SUPPORTED\r
24 \r
25 /* Write the data to whatever output you are using.  The default routine\r
26  * writes to a file pointer.  Note that this routine sometimes gets called\r
27  * with very small lengths, so you should implement some kind of simple\r
28  * buffering if you are using unbuffered writes.  This should never be asked\r
29  * to write more than 64K on a 16 bit machine.\r
30  */\r
31 \r
32 void /* PRIVATE */\r
33 png_write_data(png_structrp png_ptr, png_const_bytep data, png_size_t length)\r
34 {\r
35    /* NOTE: write_data_fn must not change the buffer! */\r
36    if (png_ptr->write_data_fn != NULL )\r
37       (*(png_ptr->write_data_fn))(png_ptr, png_constcast(png_bytep,data),\r
38          length);\r
39 \r
40    else\r
41       png_error(png_ptr, "Call to NULL write function");\r
42 }\r
43 \r
44 #ifdef PNG_STDIO_SUPPORTED\r
45 /* This is the function that does the actual writing of data.  If you are\r
46  * not writing to a standard C stream, you should create a replacement\r
47  * write_data function and use it at run time with png_set_write_fn(), rather\r
48  * than changing the library.\r
49  */\r
50 void PNGCBAPI\r
51 png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)\r
52 {\r
53    png_size_t check;\r
54 \r
55    if (png_ptr == NULL)\r
56       return;\r
57 \r
58    check = fwrite(data, 1, length, (png_FILE_p)(png_ptr->io_ptr));\r
59 \r
60    if (check != length)\r
61       png_error(png_ptr, "Write Error");\r
62 }\r
63 #endif\r
64 \r
65 /* This function is called to output any data pending writing (normally\r
66  * to disk).  After png_flush is called, there should be no data pending\r
67  * writing in any buffers.\r
68  */\r
69 #ifdef PNG_WRITE_FLUSH_SUPPORTED\r
70 void /* PRIVATE */\r
71 png_flush(png_structrp png_ptr)\r
72 {\r
73    if (png_ptr->output_flush_fn != NULL)\r
74       (*(png_ptr->output_flush_fn))(png_ptr);\r
75 }\r
76 \r
77 #  ifdef PNG_STDIO_SUPPORTED\r
78 void PNGCBAPI\r
79 png_default_flush(png_structp png_ptr)\r
80 {\r
81    png_FILE_p io_ptr;\r
82 \r
83    if (png_ptr == NULL)\r
84       return;\r
85 \r
86    io_ptr = png_voidcast(png_FILE_p, (png_ptr->io_ptr));\r
87    fflush(io_ptr);\r
88 }\r
89 #  endif\r
90 #endif\r
91 \r
92 /* This function allows the application to supply new output functions for\r
93  * libpng if standard C streams aren't being used.\r
94  *\r
95  * This function takes as its arguments:\r
96  * png_ptr       - pointer to a png output data structure\r
97  * io_ptr        - pointer to user supplied structure containing info about\r
98  *                 the output functions.  May be NULL.\r
99  * write_data_fn - pointer to a new output function that takes as its\r
100  *                 arguments a pointer to a png_struct, a pointer to\r
101  *                 data to be written, and a 32-bit unsigned int that is\r
102  *                 the number of bytes to be written.  The new write\r
103  *                 function should call png_error(png_ptr, "Error msg")\r
104  *                 to exit and output any fatal error messages.  May be\r
105  *                 NULL, in which case libpng's default function will\r
106  *                 be used.\r
107  * flush_data_fn - pointer to a new flush function that takes as its\r
108  *                 arguments a pointer to a png_struct.  After a call to\r
109  *                 the flush function, there should be no data in any buffers\r
110  *                 or pending transmission.  If the output method doesn't do\r
111  *                 any buffering of output, a function prototype must still be\r
112  *                 supplied although it doesn't have to do anything.  If\r
113  *                 PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile\r
114  *                 time, output_flush_fn will be ignored, although it must be\r
115  *                 supplied for compatibility.  May be NULL, in which case\r
116  *                 libpng's default function will be used, if\r
117  *                 PNG_WRITE_FLUSH_SUPPORTED is defined.  This is not\r
118  *                 a good idea if io_ptr does not point to a standard\r
119  *                 *FILE structure.\r
120  */\r
121 void PNGAPI\r
122 png_set_write_fn(png_structrp png_ptr, png_voidp io_ptr,\r
123     png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)\r
124 {\r
125    if (png_ptr == NULL)\r
126       return;\r
127 \r
128    png_ptr->io_ptr = io_ptr;\r
129 \r
130 #ifdef PNG_STDIO_SUPPORTED\r
131    if (write_data_fn != NULL)\r
132       png_ptr->write_data_fn = write_data_fn;\r
133 \r
134    else\r
135       png_ptr->write_data_fn = png_default_write_data;\r
136 #else\r
137    png_ptr->write_data_fn = write_data_fn;\r
138 #endif\r
139 \r
140 #ifdef PNG_WRITE_FLUSH_SUPPORTED\r
141 #  ifdef PNG_STDIO_SUPPORTED\r
142 \r
143    if (output_flush_fn != NULL)\r
144       png_ptr->output_flush_fn = output_flush_fn;\r
145 \r
146    else\r
147       png_ptr->output_flush_fn = png_default_flush;\r
148 \r
149 #  else\r
150    png_ptr->output_flush_fn = output_flush_fn;\r
151 #  endif\r
152 #endif /* PNG_WRITE_FLUSH_SUPPORTED */\r
153 \r
154    /* It is an error to read while writing a png file */\r
155    if (png_ptr->read_data_fn != NULL)\r
156    {\r
157       png_ptr->read_data_fn = NULL;\r
158 \r
159       png_warning(png_ptr,\r
160           "Can't set both read_data_fn and write_data_fn in the"\r
161           " same structure");\r
162    }\r
163 }\r
164 #endif /* PNG_WRITE_SUPPORTED */\r
165 #endif//_FPDFAPI_MINI_\r