1 |
1 |
2 /* pngrio.c - functions for data input |
2 /* pngrio.c - functions for data input |
3 * |
3 * |
4 * Last changed in libpng 1.2.37 [June 4, 2009] |
4 * Last changed in libpng 1.4.0 [January 3, 2010] |
5 * Copyright (c) 1998-2009 Glenn Randers-Pehrson |
5 * Copyright (c) 1998-2010 Glenn Randers-Pehrson |
6 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) |
6 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) |
7 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) |
7 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) |
8 * |
8 * |
9 * This code is released under the libpng license. |
9 * This code is released under the libpng license. |
10 * For conditions of distribution and use, see the disclaimer |
10 * For conditions of distribution and use, see the disclaimer |
16 * has a different input method. Note that you shouldn't change this |
16 * has a different input method. Note that you shouldn't change this |
17 * function, but rather write a replacement function and then make |
17 * function, but rather write a replacement function and then make |
18 * libpng use it at run time with png_set_read_fn(...). |
18 * libpng use it at run time with png_set_read_fn(...). |
19 */ |
19 */ |
20 |
20 |
21 #define PNG_INTERNAL |
21 #define PNG_NO_PEDANTIC_WARNINGS |
22 #include "png.h" |
22 #include "png.h" |
23 #if defined(PNG_READ_SUPPORTED) |
23 #ifdef PNG_READ_SUPPORTED |
|
24 #include "pngpriv.h" |
24 |
25 |
25 /* Read the data from whatever input you are using. The default routine |
26 /* Read the data from whatever input you are using. The default routine |
26 * reads from a file pointer. Note that this routine sometimes gets called |
27 * reads from a file pointer. Note that this routine sometimes gets called |
27 * with very small lengths, so you should implement some kind of simple |
28 * with very small lengths, so you should implement some kind of simple |
28 * buffering if you are using unbuffered reads. This should never be asked |
29 * buffering if you are using unbuffered reads. This should never be asked |
30 */ |
31 */ |
31 void /* PRIVATE */ |
32 void /* PRIVATE */ |
32 png_read_data(png_structp png_ptr, png_bytep data, png_size_t length) |
33 png_read_data(png_structp png_ptr, png_bytep data, png_size_t length) |
33 { |
34 { |
34 png_debug1(4, "reading %d bytes", (int)length); |
35 png_debug1(4, "reading %d bytes", (int)length); |
|
36 |
35 if (png_ptr->read_data_fn != NULL) |
37 if (png_ptr->read_data_fn != NULL) |
36 (*(png_ptr->read_data_fn))(png_ptr, data, length); |
38 (*(png_ptr->read_data_fn))(png_ptr, data, length); |
37 else |
39 else |
38 png_error(png_ptr, "Call to NULL read function"); |
40 png_error(png_ptr, "Call to NULL read function"); |
39 } |
41 } |
40 |
42 |
41 #if !defined(PNG_NO_STDIO) |
43 #ifdef PNG_STDIO_SUPPORTED |
42 /* This is the function that does the actual reading of data. If you are |
44 /* This is the function that does the actual reading of data. If you are |
43 * not reading from a standard C stream, you should create a replacement |
45 * not reading from a standard C stream, you should create a replacement |
44 * read_data function and use it at run time with png_set_read_fn(), rather |
46 * read_data function and use it at run time with png_set_read_fn(), rather |
45 * than changing the library. |
47 * than changing the library. |
46 */ |
48 */ |
53 if (png_ptr == NULL) |
55 if (png_ptr == NULL) |
54 return; |
56 return; |
55 /* fread() returns 0 on error, so it is OK to store this in a png_size_t |
57 /* fread() returns 0 on error, so it is OK to store this in a png_size_t |
56 * instead of an int, which is what fread() actually returns. |
58 * instead of an int, which is what fread() actually returns. |
57 */ |
59 */ |
58 #if defined(_WIN32_WCE) |
60 check = fread(data, 1, length, (png_FILE_p)png_ptr->io_ptr); |
59 if ( !ReadFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) ) |
|
60 check = 0; |
|
61 #else |
|
62 check = (png_size_t)fread(data, (png_size_t)1, length, |
|
63 (png_FILE_p)png_ptr->io_ptr); |
|
64 #endif |
|
65 |
61 |
66 if (check != length) |
62 if (check != length) |
67 png_error(png_ptr, "Read Error"); |
63 png_error(png_ptr, "Read Error"); |
68 } |
64 } |
69 #else |
65 #else |
76 #define MIN(a,b) (a <= b ? a : b) |
72 #define MIN(a,b) (a <= b ? a : b) |
77 |
73 |
78 static void PNGAPI |
74 static void PNGAPI |
79 png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length) |
75 png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length) |
80 { |
76 { |
81 int check; |
77 png_size_t check; |
82 png_byte *n_data; |
78 png_byte *n_data; |
83 png_FILE_p io_ptr; |
79 png_FILE_p io_ptr; |
84 |
80 |
85 if (png_ptr == NULL) |
81 if (png_ptr == NULL) |
86 return; |
82 return; |
87 /* Check if data really is near. If so, use usual code. */ |
83 /* Check if data really is near. If so, use usual code. */ |
88 n_data = (png_byte *)CVT_PTR_NOCHECK(data); |
84 n_data = (png_byte *)CVT_PTR_NOCHECK(data); |
89 io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr); |
85 io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr); |
90 if ((png_bytep)n_data == data) |
86 if ((png_bytep)n_data == data) |
91 { |
87 { |
92 #if defined(_WIN32_WCE) |
|
93 if ( !ReadFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) ) |
|
94 check = 0; |
|
95 #else |
|
96 check = fread(n_data, 1, length, io_ptr); |
88 check = fread(n_data, 1, length, io_ptr); |
97 #endif |
|
98 } |
89 } |
99 else |
90 else |
100 { |
91 { |
101 png_byte buf[NEAR_BUF_SIZE]; |
92 png_byte buf[NEAR_BUF_SIZE]; |
102 png_size_t read, remaining, err; |
93 png_size_t read, remaining, err; |
103 check = 0; |
94 check = 0; |
104 remaining = length; |
95 remaining = length; |
105 do |
96 do |
106 { |
97 { |
107 read = MIN(NEAR_BUF_SIZE, remaining); |
98 read = MIN(NEAR_BUF_SIZE, remaining); |
108 #if defined(_WIN32_WCE) |
99 err = fread(buf, 1, read, io_ptr); |
109 if ( !ReadFile((HANDLE)(io_ptr), buf, read, &err, NULL) ) |
|
110 err = 0; |
|
111 #else |
|
112 err = fread(buf, (png_size_t)1, read, io_ptr); |
|
113 #endif |
|
114 png_memcpy(data, buf, read); /* copy far buffer to near buffer */ |
100 png_memcpy(data, buf, read); /* copy far buffer to near buffer */ |
115 if (err != read) |
101 if (err != read) |
116 break; |
102 break; |
117 else |
103 else |
118 check += err; |
104 check += err; |
149 { |
135 { |
150 if (png_ptr == NULL) |
136 if (png_ptr == NULL) |
151 return; |
137 return; |
152 png_ptr->io_ptr = io_ptr; |
138 png_ptr->io_ptr = io_ptr; |
153 |
139 |
154 #if !defined(PNG_NO_STDIO) |
140 #ifdef PNG_STDIO_SUPPORTED |
155 if (read_data_fn != NULL) |
141 if (read_data_fn != NULL) |
156 png_ptr->read_data_fn = read_data_fn; |
142 png_ptr->read_data_fn = read_data_fn; |
157 else |
143 else |
158 png_ptr->read_data_fn = png_default_read_data; |
144 png_ptr->read_data_fn = png_default_read_data; |
159 #else |
145 #else |
165 { |
151 { |
166 png_ptr->write_data_fn = NULL; |
152 png_ptr->write_data_fn = NULL; |
167 png_warning(png_ptr, |
153 png_warning(png_ptr, |
168 "It's an error to set both read_data_fn and write_data_fn in the "); |
154 "It's an error to set both read_data_fn and write_data_fn in the "); |
169 png_warning(png_ptr, |
155 png_warning(png_ptr, |
170 "same structure. Resetting write_data_fn to NULL."); |
156 "same structure. Resetting write_data_fn to NULL"); |
171 } |
157 } |
172 |
158 |
173 #if defined(PNG_WRITE_FLUSH_SUPPORTED) |
159 #ifdef PNG_WRITE_FLUSH_SUPPORTED |
174 png_ptr->output_flush_fn = NULL; |
160 png_ptr->output_flush_fn = NULL; |
175 #endif |
161 #endif |
176 } |
162 } |
177 #endif /* PNG_READ_SUPPORTED */ |
163 #endif /* PNG_READ_SUPPORTED */ |