Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / core / src / fxcodec / fx_lpng / lpng_v163 / fx_pngrio.c
1 #if (!defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_) || defined(_PNG_DECODER_)) && !defined(_USE_ADDIN_) && !defined(_FX_EMB_NOUSE_DECODER_)\r
2 /* pngrio.c - functions for data input\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 input.  Users who need\r
14  * special handling are expected to write a function that has the same\r
15  * arguments as this and performs a similar function, but that possibly\r
16  * has a different input method.  Note that you shouldn't change this\r
17  * function, but rather write a replacement function and then make\r
18  * libpng use it at run time with png_set_read_fn(...).\r
19  */\r
20 \r
21 #include "pngpriv.h"\r
22 \r
23 #ifdef PNG_READ_SUPPORTED\r
24 \r
25 /* Read the data from whatever input you are using.  The default routine\r
26  * reads from 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 reads.  This should never be asked\r
29  * to read more then 64K on a 16 bit machine.\r
30  */\r
31 void /* PRIVATE */\r
32 png_read_data(png_structrp png_ptr, png_bytep data, png_size_t length)\r
33 {\r
34    png_debug1(4, "reading %d bytes", (int)length);\r
35 \r
36    if (png_ptr->read_data_fn != NULL)\r
37       (*(png_ptr->read_data_fn))(png_ptr, data, length);\r
38 \r
39    else\r
40       png_error(png_ptr, "Call to NULL read function");\r
41 }\r
42 \r
43 #ifdef PNG_STDIO_SUPPORTED\r
44 /* This is the function that does the actual reading of data.  If you are\r
45  * not reading from a standard C stream, you should create a replacement\r
46  * read_data function and use it at run time with png_set_read_fn(), rather\r
47  * than changing the library.\r
48  */\r
49 void PNGCBAPI\r
50 png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)\r
51 {\r
52    png_size_t check;\r
53 \r
54    if (png_ptr == NULL)\r
55       return;\r
56 \r
57    /* fread() returns 0 on error, so it is OK to store this in a png_size_t\r
58     * instead of an int, which is what fread() actually returns.\r
59     */\r
60    check = fread(data, 1, length, png_voidcast(png_FILE_p, png_ptr->io_ptr));\r
61 \r
62    if (check != length)\r
63       png_error(png_ptr, "Read Error");\r
64 }\r
65 #endif\r
66 \r
67 /* This function allows the application to supply a new input function\r
68  * for libpng if standard C streams aren't being used.\r
69  *\r
70  * This function takes as its arguments:\r
71  *\r
72  * png_ptr      - pointer to a png input data structure\r
73  *\r
74  * io_ptr       - pointer to user supplied structure containing info about\r
75  *                the input functions.  May be NULL.\r
76  *\r
77  * read_data_fn - pointer to a new input function that takes as its\r
78  *                arguments a pointer to a png_struct, a pointer to\r
79  *                a location where input data can be stored, and a 32-bit\r
80  *                unsigned int that is the number of bytes to be read.\r
81  *                To exit and output any fatal error messages the new write\r
82  *                function should call png_error(png_ptr, "Error msg").\r
83  *                May be NULL, in which case libpng's default function will\r
84  *                be used.\r
85  */\r
86 void PNGAPI\r
87 png_set_read_fn(png_structrp png_ptr, png_voidp io_ptr,\r
88    png_rw_ptr read_data_fn)\r
89 {\r
90    if (png_ptr == NULL)\r
91       return;\r
92 \r
93    png_ptr->io_ptr = io_ptr;\r
94 \r
95 #ifdef PNG_STDIO_SUPPORTED\r
96    if (read_data_fn != NULL)\r
97       png_ptr->read_data_fn = read_data_fn;\r
98 \r
99    else\r
100       png_ptr->read_data_fn = png_default_read_data;\r
101 #else\r
102    png_ptr->read_data_fn = read_data_fn;\r
103 #endif\r
104 \r
105    /* It is an error to write to a read device */\r
106    if (png_ptr->write_data_fn != NULL)\r
107    {\r
108       png_ptr->write_data_fn = NULL;\r
109       png_warning(png_ptr,\r
110           "Can't set both read_data_fn and write_data_fn in the"\r
111           " same structure");\r
112    }\r
113 \r
114 #ifdef PNG_WRITE_FLUSH_SUPPORTED\r
115    png_ptr->output_flush_fn = NULL;\r
116 #endif\r
117 }\r
118 #endif /* PNG_READ_SUPPORTED */\r
119 #endif\r