00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #define PNG_INTERNAL
00019 #include "png.h"
00020 #ifdef PNG_WRITE_SUPPORTED
00021
00022
00023
00024
00025
00026
00027
00028 void
00029 png_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
00030 {
00031 if (png_ptr->write_data_fn != NULL )
00032 (*(png_ptr->write_data_fn))(png_ptr, data, length);
00033 else
00034 png_error(png_ptr, "Call to NULL write function");
00035 }
00036
00037 #if !defined(PNG_NO_STDIO)
00038
00039
00040
00041
00042 #ifndef USE_FAR_KEYWORD
00043 void PNGAPI
00044 png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
00045 {
00046 png_uint_32 check;
00047
00048 #if defined(_WIN32_WCE)
00049 if ( !WriteFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) )
00050 check = 0;
00051 #else
00052 check = fwrite(data, 1, length, (png_FILE_p)(png_ptr->io_ptr));
00053 #endif
00054 if (check != length)
00055 png_error(png_ptr, "Write Error");
00056 }
00057 #else
00058
00059
00060
00061
00062
00063 #define NEAR_BUF_SIZE 1024
00064 #define MIN(a,b) (a <= b ? a : b)
00065
00066 void PNGAPI
00067 png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
00068 {
00069 png_uint_32 check;
00070 png_byte *near_data;
00071 png_FILE_p io_ptr;
00072
00073
00074 near_data = (png_byte *)CVT_PTR_NOCHECK(data);
00075 io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr);
00076 if ((png_bytep)near_data == data)
00077 {
00078 #if defined(_WIN32_WCE)
00079 if ( !WriteFile(io_ptr, near_data, length, &check, NULL) )
00080 check = 0;
00081 #else
00082 check = fwrite(near_data, 1, length, io_ptr);
00083 #endif
00084 }
00085 else
00086 {
00087 png_byte buf[NEAR_BUF_SIZE];
00088 png_size_t written, remaining, err;
00089 check = 0;
00090 remaining = length;
00091 do
00092 {
00093 written = MIN(NEAR_BUF_SIZE, remaining);
00094 png_memcpy(buf, data, written);
00095 #if defined(_WIN32_WCE)
00096 if ( !WriteFile(io_ptr, buf, written, &err, NULL) )
00097 err = 0;
00098 #else
00099 err = fwrite(buf, 1, written, io_ptr);
00100 #endif
00101 if (err != written)
00102 break;
00103 else
00104 check += err;
00105 data += written;
00106 remaining -= written;
00107 }
00108 while (remaining != 0);
00109 }
00110 if (check != length)
00111 png_error(png_ptr, "Write Error");
00112 }
00113
00114 #endif
00115 #endif
00116
00117
00118
00119
00120 #if defined(PNG_WRITE_FLUSH_SUPPORTED)
00121 void
00122 png_flush(png_structp png_ptr)
00123 {
00124 if (png_ptr->output_flush_fn != NULL)
00125 (*(png_ptr->output_flush_fn))(png_ptr);
00126 }
00127
00128 #if !defined(PNG_NO_STDIO)
00129 void PNGAPI
00130 png_default_flush(png_structp png_ptr)
00131 {
00132 #if !defined(_WIN32_WCE)
00133 png_FILE_p io_ptr;
00134 io_ptr = (png_FILE_p)CVT_PTR((png_ptr->io_ptr));
00135 if (io_ptr != NULL)
00136 fflush(io_ptr);
00137 #endif
00138 }
00139 #endif
00140 #endif
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164 void PNGAPI
00165 png_set_write_fn(png_structp png_ptr, png_voidp io_ptr,
00166 png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)
00167 {
00168 png_ptr->io_ptr = io_ptr;
00169
00170 #if !defined(PNG_NO_STDIO)
00171 if (write_data_fn != NULL)
00172 png_ptr->write_data_fn = write_data_fn;
00173 else
00174 png_ptr->write_data_fn = png_default_write_data;
00175 #else
00176 png_ptr->write_data_fn = write_data_fn;
00177 #endif
00178
00179 #if defined(PNG_WRITE_FLUSH_SUPPORTED)
00180 #if !defined(PNG_NO_STDIO)
00181 if (output_flush_fn != NULL)
00182 png_ptr->output_flush_fn = output_flush_fn;
00183 else
00184 png_ptr->output_flush_fn = png_default_flush;
00185 #else
00186 png_ptr->output_flush_fn = output_flush_fn;
00187 #endif
00188 #endif
00189
00190
00191 if (png_ptr->read_data_fn != NULL)
00192 {
00193 png_ptr->read_data_fn = NULL;
00194 png_warning(png_ptr,
00195 "Attempted to set both read_data_fn and write_data_fn in");
00196 png_warning(png_ptr,
00197 "the same structure. Resetting read_data_fn to NULL.");
00198 }
00199 }
00200
00201 #if defined(USE_FAR_KEYWORD)
00202 #if defined(_MSC_VER)
00203 void *png_far_to_near(png_structp png_ptr,png_voidp ptr, int check)
00204 {
00205 void *near_ptr;
00206 void FAR *far_ptr;
00207 FP_OFF(near_ptr) = FP_OFF(ptr);
00208 far_ptr = (void FAR *)near_ptr;
00209 if(check != 0)
00210 if(FP_SEG(ptr) != FP_SEG(far_ptr))
00211 png_error(png_ptr,"segment lost in conversion");
00212 return(near_ptr);
00213 }
00214 # else
00215 void *png_far_to_near(png_structp png_ptr,png_voidp ptr, int check)
00216 {
00217 void *near_ptr;
00218 void FAR *far_ptr;
00219 near_ptr = (void FAR *)ptr;
00220 far_ptr = (void FAR *)near_ptr;
00221 if(check != 0)
00222 if(far_ptr != ptr)
00223 png_error(png_ptr,"segment lost in conversion");
00224 return(near_ptr);
00225 }
00226 # endif
00227 # endif
00228 #endif