| OLD | NEW |
| 1 | 1 |
| 2 /* pngwrite.c - general routines to write a PNG file | 2 /* pngwrite.c - general routines to write a PNG file |
| 3 * | 3 * |
| 4 * Last changed in libpng 1.2.34 [December 18, 2008] | 4 * Last changed in libpng 1.2.37 [June 4, 2009] |
| 5 * For conditions of distribution and use, see copyright notice in png.h | 5 * For conditions of distribution and use, see copyright notice in png.h |
| 6 * Copyright (c) 1998-2008 Glenn Randers-Pehrson | 6 * Copyright (c) 1998-2009 Glenn Randers-Pehrson |
| 7 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) | 7 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) |
| 8 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) | 8 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 /* get internal access to png.h */ | 11 /* Get internal access to png.h */ |
| 12 #define PNG_INTERNAL | 12 #define PNG_INTERNAL |
| 13 #include "png.h" | 13 #include "png.h" |
| 14 #ifdef PNG_WRITE_SUPPORTED | 14 #ifdef PNG_WRITE_SUPPORTED |
| 15 | 15 |
| 16 /* Writes all the PNG information. This is the suggested way to use the | 16 /* Writes all the PNG information. This is the suggested way to use the |
| 17 * library. If you have a new chunk to add, make a function to write it, | 17 * library. If you have a new chunk to add, make a function to write it, |
| 18 * and put it in the correct location here. If you want the chunk written | 18 * and put it in the correct location here. If you want the chunk written |
| 19 * after the image data, put it in png_write_end(). I strongly encourage | 19 * after the image data, put it in png_write_end(). I strongly encourage |
| 20 * you to supply a PNG_INFO_ flag, and check info_ptr->valid before writing | 20 * you to supply a PNG_INFO_ flag, and check info_ptr->valid before writing |
| 21 * the chunk, as that will keep the code from breaking if you want to just | 21 * the chunk, as that will keep the code from breaking if you want to just |
| 22 * write a plain PNG file. If you have long comments, I suggest writing | 22 * write a plain PNG file. If you have long comments, I suggest writing |
| 23 * them in png_write_end(), and compressing them. | 23 * them in png_write_end(), and compressing them. |
| 24 */ | 24 */ |
| 25 void PNGAPI | 25 void PNGAPI |
| 26 png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr) | 26 png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr) |
| 27 { | 27 { |
| 28 png_debug(1, "in png_write_info_before_PLTE"); | 28 png_debug(1, "in png_write_info_before_PLTE"); |
| 29 if (png_ptr == NULL || info_ptr == NULL) | 29 if (png_ptr == NULL || info_ptr == NULL) |
| 30 return; | 30 return; |
| 31 if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) | 31 if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) |
| 32 { | 32 { |
| 33 png_write_sig(png_ptr); /* write PNG signature */ | 33 png_write_sig(png_ptr); /* Write PNG signature */ |
| 34 #if defined(PNG_MNG_FEATURES_SUPPORTED) | 34 #if defined(PNG_MNG_FEATURES_SUPPORTED) |
| 35 if ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&(png_ptr->mng_features_permitted)
) | 35 if ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&(png_ptr->mng_features_permitted)
) |
| 36 { | 36 { |
| 37 png_warning(png_ptr, "MNG features are not allowed in a PNG datastream"); | 37 png_warning(png_ptr, "MNG features are not allowed in a PNG datastream"); |
| 38 png_ptr->mng_features_permitted=0; | 38 png_ptr->mng_features_permitted=0; |
| 39 } | 39 } |
| 40 #endif | 40 #endif |
| 41 /* write IHDR information. */ | 41 /* Write IHDR information. */ |
| 42 png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height, | 42 png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height, |
| 43 info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type, | 43 info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type, |
| 44 info_ptr->filter_type, | 44 info_ptr->filter_type, |
| 45 #if defined(PNG_WRITE_INTERLACING_SUPPORTED) | 45 #if defined(PNG_WRITE_INTERLACING_SUPPORTED) |
| 46 info_ptr->interlace_type); | 46 info_ptr->interlace_type); |
| 47 #else | 47 #else |
| 48 0); | 48 0); |
| 49 #endif | 49 #endif |
| 50 /* the rest of these check to see if the valid field has the appropriate | 50 /* The rest of these check to see if the valid field has the appropriate |
| 51 flag set, and if it does, writes the chunk. */ | 51 * flag set, and if it does, writes the chunk. |
| 52 */ |
| 52 #if defined(PNG_WRITE_gAMA_SUPPORTED) | 53 #if defined(PNG_WRITE_gAMA_SUPPORTED) |
| 53 if (info_ptr->valid & PNG_INFO_gAMA) | 54 if (info_ptr->valid & PNG_INFO_gAMA) |
| 54 { | 55 { |
| 55 # ifdef PNG_FLOATING_POINT_SUPPORTED | 56 # ifdef PNG_FLOATING_POINT_SUPPORTED |
| 56 png_write_gAMA(png_ptr, info_ptr->gamma); | 57 png_write_gAMA(png_ptr, info_ptr->gamma); |
| 57 #else | 58 #else |
| 58 #ifdef PNG_FIXED_POINT_SUPPORTED | 59 #ifdef PNG_FIXED_POINT_SUPPORTED |
| 59 png_write_gAMA_fixed(png_ptr, info_ptr->int_gamma); | 60 png_write_gAMA_fixed(png_ptr, info_ptr->int_gamma); |
| 60 # endif | 61 # endif |
| 61 #endif | 62 #endif |
| (...skipping 28 matching lines...) Expand all Loading... |
| 90 info_ptr->int_x_red, info_ptr->int_y_red, | 91 info_ptr->int_x_red, info_ptr->int_y_red, |
| 91 info_ptr->int_x_green, info_ptr->int_y_green, | 92 info_ptr->int_x_green, info_ptr->int_y_green, |
| 92 info_ptr->int_x_blue, info_ptr->int_y_blue); | 93 info_ptr->int_x_blue, info_ptr->int_y_blue); |
| 93 # endif | 94 # endif |
| 94 #endif | 95 #endif |
| 95 } | 96 } |
| 96 #endif | 97 #endif |
| 97 #if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) | 98 #if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) |
| 98 if (info_ptr->unknown_chunks_num) | 99 if (info_ptr->unknown_chunks_num) |
| 99 { | 100 { |
| 100 png_unknown_chunk *up; | 101 png_unknown_chunk *up; |
| 101 | 102 |
| 102 png_debug(5, "writing extra chunks"); | 103 png_debug(5, "writing extra chunks"); |
| 103 | 104 |
| 104 for (up = info_ptr->unknown_chunks; | 105 for (up = info_ptr->unknown_chunks; |
| 105 up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; | 106 up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; |
| 106 up++) | 107 up++) |
| 107 { | 108 { |
| 108 int keep=png_handle_as_unknown(png_ptr, up->name); | 109 int keep=png_handle_as_unknown(png_ptr, up->name); |
| 109 if (keep != PNG_HANDLE_CHUNK_NEVER && | 110 if (keep != PNG_HANDLE_CHUNK_NEVER && |
| 110 up->location && !(up->location & PNG_HAVE_PLTE) && | 111 up->location && !(up->location & PNG_HAVE_PLTE) && |
| 111 !(up->location & PNG_HAVE_IDAT) && | 112 !(up->location & PNG_HAVE_IDAT) && |
| 112 ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || | 113 ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || |
| 113 (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) | 114 (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) |
| 114 { | 115 { |
| 115 if (up->size == 0) | 116 if (up->size == 0) |
| 116 png_warning(png_ptr, "Writing zero-length unknown chunk"); | 117 png_warning(png_ptr, "Writing zero-length unknown chunk"); |
| 117 png_write_chunk(png_ptr, up->name, up->data, up->size); | 118 png_write_chunk(png_ptr, up->name, up->data, up->size); |
| 118 } | 119 } |
| 119 } | 120 } |
| 120 } | 121 } |
| 121 #endif | 122 #endif |
| 122 png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE; | 123 png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE; |
| 123 } | 124 } |
| 124 } | 125 } |
| 125 | 126 |
| 126 void PNGAPI | 127 void PNGAPI |
| 127 png_write_info(png_structp png_ptr, png_infop info_ptr) | 128 png_write_info(png_structp png_ptr, png_infop info_ptr) |
| 128 { | 129 { |
| 129 #if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) | 130 #if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) |
| 130 int i; | 131 int i; |
| 131 #endif | 132 #endif |
| 132 | 133 |
| 133 png_debug(1, "in png_write_info"); | 134 png_debug(1, "in png_write_info"); |
| 134 | 135 |
| 135 if (png_ptr == NULL || info_ptr == NULL) | 136 if (png_ptr == NULL || info_ptr == NULL) |
| 136 return; | 137 return; |
| 137 | 138 |
| 138 png_write_info_before_PLTE(png_ptr, info_ptr); | 139 png_write_info_before_PLTE(png_ptr, info_ptr); |
| 139 | 140 |
| 140 if (info_ptr->valid & PNG_INFO_PLTE) | 141 if (info_ptr->valid & PNG_INFO_PLTE) |
| 141 png_write_PLTE(png_ptr, info_ptr->palette, | 142 png_write_PLTE(png_ptr, info_ptr->palette, |
| 142 (png_uint_32)info_ptr->num_palette); | 143 (png_uint_32)info_ptr->num_palette); |
| 143 else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) | 144 else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) |
| 144 png_error(png_ptr, "Valid palette required for paletted images"); | 145 png_error(png_ptr, "Valid palette required for paletted images"); |
| 145 | 146 |
| 146 #if defined(PNG_WRITE_tRNS_SUPPORTED) | 147 #if defined(PNG_WRITE_tRNS_SUPPORTED) |
| 147 if (info_ptr->valid & PNG_INFO_tRNS) | 148 if (info_ptr->valid & PNG_INFO_tRNS) |
| 149 { |
| 150 #if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) |
| 151 /* Invert the alpha channel (in tRNS) */ |
| 152 if ((png_ptr->transformations & PNG_INVERT_ALPHA) && |
| 153 info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) |
| 148 { | 154 { |
| 149 #if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) | 155 int j; |
| 150 /* invert the alpha channel (in tRNS) */ | 156 for (j=0; j<(int)info_ptr->num_trans; j++) |
| 151 if ((png_ptr->transformations & PNG_INVERT_ALPHA) && | 157 info_ptr->trans[j] = (png_byte)(255 - info_ptr->trans[j]); |
| 152 info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) | 158 } |
| 153 { | |
| 154 int j; | |
| 155 for (j=0; j<(int)info_ptr->num_trans; j++) | |
| 156 info_ptr->trans[j] = (png_byte)(255 - info_ptr->trans[j]); | |
| 157 } | |
| 158 #endif | 159 #endif |
| 159 png_write_tRNS(png_ptr, info_ptr->trans, &(info_ptr->trans_values), | 160 png_write_tRNS(png_ptr, info_ptr->trans, &(info_ptr->trans_values), |
| 160 info_ptr->num_trans, info_ptr->color_type); | 161 info_ptr->num_trans, info_ptr->color_type); |
| 161 } | 162 } |
| 162 #endif | 163 #endif |
| 163 #if defined(PNG_WRITE_bKGD_SUPPORTED) | 164 #if defined(PNG_WRITE_bKGD_SUPPORTED) |
| 164 if (info_ptr->valid & PNG_INFO_bKGD) | 165 if (info_ptr->valid & PNG_INFO_bKGD) |
| 165 png_write_bKGD(png_ptr, &(info_ptr->background), info_ptr->color_type); | 166 png_write_bKGD(png_ptr, &(info_ptr->background), info_ptr->color_type); |
| 166 #endif | 167 #endif |
| 167 #if defined(PNG_WRITE_hIST_SUPPORTED) | 168 #if defined(PNG_WRITE_hIST_SUPPORTED) |
| 168 if (info_ptr->valid & PNG_INFO_hIST) | 169 if (info_ptr->valid & PNG_INFO_hIST) |
| 169 png_write_hIST(png_ptr, info_ptr->hist, info_ptr->num_palette); | 170 png_write_hIST(png_ptr, info_ptr->hist, info_ptr->num_palette); |
| 170 #endif | 171 #endif |
| 171 #if defined(PNG_WRITE_oFFs_SUPPORTED) | 172 #if defined(PNG_WRITE_oFFs_SUPPORTED) |
| 172 if (info_ptr->valid & PNG_INFO_oFFs) | 173 if (info_ptr->valid & PNG_INFO_oFFs) |
| 173 png_write_oFFs(png_ptr, info_ptr->x_offset, info_ptr->y_offset, | 174 png_write_oFFs(png_ptr, info_ptr->x_offset, info_ptr->y_offset, |
| 174 info_ptr->offset_unit_type); | 175 info_ptr->offset_unit_type); |
| 175 #endif | 176 #endif |
| 176 #if defined(PNG_WRITE_pCAL_SUPPORTED) | 177 #if defined(PNG_WRITE_pCAL_SUPPORTED) |
| 177 if (info_ptr->valid & PNG_INFO_pCAL) | 178 if (info_ptr->valid & PNG_INFO_pCAL) |
| 178 png_write_pCAL(png_ptr, info_ptr->pcal_purpose, info_ptr->pcal_X0, | 179 png_write_pCAL(png_ptr, info_ptr->pcal_purpose, info_ptr->pcal_X0, |
| 179 info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams, | 180 info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams, |
| 180 info_ptr->pcal_units, info_ptr->pcal_params); | 181 info_ptr->pcal_units, info_ptr->pcal_params); |
| 181 #endif | 182 #endif |
| 183 |
| 184 #if defined(PNG_sCAL_SUPPORTED) |
| 185 if (info_ptr->valid & PNG_INFO_sCAL) |
| 182 #if defined(PNG_WRITE_sCAL_SUPPORTED) | 186 #if defined(PNG_WRITE_sCAL_SUPPORTED) |
| 183 if (info_ptr->valid & PNG_INFO_sCAL) | |
| 184 #if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO) | 187 #if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO) |
| 185 png_write_sCAL(png_ptr, (int)info_ptr->scal_unit, | 188 png_write_sCAL(png_ptr, (int)info_ptr->scal_unit, |
| 186 info_ptr->scal_pixel_width, info_ptr->scal_pixel_height); | 189 info_ptr->scal_pixel_width, info_ptr->scal_pixel_height); |
| 187 #else | 190 #else /* !FLOATING_POINT */ |
| 188 #ifdef PNG_FIXED_POINT_SUPPORTED | 191 #ifdef PNG_FIXED_POINT_SUPPORTED |
| 189 png_write_sCAL_s(png_ptr, (int)info_ptr->scal_unit, | 192 png_write_sCAL_s(png_ptr, (int)info_ptr->scal_unit, |
| 190 info_ptr->scal_s_width, info_ptr->scal_s_height); | 193 info_ptr->scal_s_width, info_ptr->scal_s_height); |
| 191 #else | 194 #endif /* FIXED_POINT */ |
| 195 #endif /* FLOATING_POINT */ |
| 196 #else /* !WRITE_sCAL */ |
| 192 png_warning(png_ptr, | 197 png_warning(png_ptr, |
| 193 "png_write_sCAL not supported; sCAL chunk not written."); | 198 "png_write_sCAL not supported; sCAL chunk not written."); |
| 194 #endif | 199 #endif /* WRITE_sCAL */ |
| 195 #endif | 200 #endif /* sCAL */ |
| 196 #endif | 201 |
| 197 #if defined(PNG_WRITE_pHYs_SUPPORTED) | 202 #if defined(PNG_WRITE_pHYs_SUPPORTED) |
| 198 if (info_ptr->valid & PNG_INFO_pHYs) | 203 if (info_ptr->valid & PNG_INFO_pHYs) |
| 199 png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit, | 204 png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit, |
| 200 info_ptr->y_pixels_per_unit, info_ptr->phys_unit_type); | 205 info_ptr->y_pixels_per_unit, info_ptr->phys_unit_type); |
| 201 #endif | 206 #endif /* pHYs */ |
| 207 |
| 202 #if defined(PNG_WRITE_tIME_SUPPORTED) | 208 #if defined(PNG_WRITE_tIME_SUPPORTED) |
| 203 if (info_ptr->valid & PNG_INFO_tIME) | 209 if (info_ptr->valid & PNG_INFO_tIME) |
| 204 { | 210 { |
| 205 png_write_tIME(png_ptr, &(info_ptr->mod_time)); | 211 png_write_tIME(png_ptr, &(info_ptr->mod_time)); |
| 206 png_ptr->mode |= PNG_WROTE_tIME; | 212 png_ptr->mode |= PNG_WROTE_tIME; |
| 207 } | 213 } |
| 208 #endif | 214 #endif /* tIME */ |
| 215 |
| 209 #if defined(PNG_WRITE_sPLT_SUPPORTED) | 216 #if defined(PNG_WRITE_sPLT_SUPPORTED) |
| 210 if (info_ptr->valid & PNG_INFO_sPLT) | 217 if (info_ptr->valid & PNG_INFO_sPLT) |
| 211 for (i = 0; i < (int)info_ptr->splt_palettes_num; i++) | 218 for (i = 0; i < (int)info_ptr->splt_palettes_num; i++) |
| 212 png_write_sPLT(png_ptr, info_ptr->splt_palettes + i); | 219 png_write_sPLT(png_ptr, info_ptr->splt_palettes + i); |
| 213 #endif | 220 #endif /* sPLT */ |
| 221 |
| 214 #if defined(PNG_WRITE_TEXT_SUPPORTED) | 222 #if defined(PNG_WRITE_TEXT_SUPPORTED) |
| 215 /* Check to see if we need to write text chunks */ | 223 /* Check to see if we need to write text chunks */ |
| 216 for (i = 0; i < info_ptr->num_text; i++) | 224 for (i = 0; i < info_ptr->num_text; i++) |
| 217 { | 225 { |
| 218 png_debug2(2, "Writing header text chunk %d, type %d", i, | 226 png_debug2(2, "Writing header text chunk %d, type %d", i, |
| 219 info_ptr->text[i].compression); | 227 info_ptr->text[i].compression); |
| 220 /* an internationalized chunk? */ | 228 /* An internationalized chunk? */ |
| 221 if (info_ptr->text[i].compression > 0) | 229 if (info_ptr->text[i].compression > 0) |
| 222 { | 230 { |
| 223 #if defined(PNG_WRITE_iTXt_SUPPORTED) | 231 #if defined(PNG_WRITE_iTXt_SUPPORTED) |
| 224 /* write international chunk */ | 232 /* Write international chunk */ |
| 225 png_write_iTXt(png_ptr, | 233 png_write_iTXt(png_ptr, |
| 226 info_ptr->text[i].compression, | 234 info_ptr->text[i].compression, |
| 227 info_ptr->text[i].key, | 235 info_ptr->text[i].key, |
| 228 info_ptr->text[i].lang, | 236 info_ptr->text[i].lang, |
| 229 info_ptr->text[i].lang_key, | 237 info_ptr->text[i].lang_key, |
| 230 info_ptr->text[i].text); | 238 info_ptr->text[i].text); |
| 231 #else | 239 #else |
| 232 png_warning(png_ptr, "Unable to write international text"); | 240 png_warning(png_ptr, "Unable to write international text"); |
| 233 #endif | 241 #endif |
| 234 /* Mark this chunk as written */ | 242 /* Mark this chunk as written */ |
| 235 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; | 243 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; |
| 236 } | 244 } |
| 237 /* If we want a compressed text chunk */ | 245 /* If we want a compressed text chunk */ |
| 238 else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_zTXt) | 246 else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_zTXt) |
| 239 { | 247 { |
| 240 #if defined(PNG_WRITE_zTXt_SUPPORTED) | 248 #if defined(PNG_WRITE_zTXt_SUPPORTED) |
| 241 /* write compressed chunk */ | 249 /* Write compressed chunk */ |
| 242 png_write_zTXt(png_ptr, info_ptr->text[i].key, | 250 png_write_zTXt(png_ptr, info_ptr->text[i].key, |
| 243 info_ptr->text[i].text, 0, | 251 info_ptr->text[i].text, 0, |
| 244 info_ptr->text[i].compression); | 252 info_ptr->text[i].compression); |
| 245 #else | 253 #else |
| 246 png_warning(png_ptr, "Unable to write compressed text"); | 254 png_warning(png_ptr, "Unable to write compressed text"); |
| 247 #endif | 255 #endif |
| 248 /* Mark this chunk as written */ | 256 /* Mark this chunk as written */ |
| 249 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; | 257 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; |
| 250 } | 258 } |
| 251 else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) | 259 else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) |
| 252 { | 260 { |
| 253 #if defined(PNG_WRITE_tEXt_SUPPORTED) | 261 #if defined(PNG_WRITE_tEXt_SUPPORTED) |
| 254 /* write uncompressed chunk */ | 262 /* Write uncompressed chunk */ |
| 255 png_write_tEXt(png_ptr, info_ptr->text[i].key, | 263 png_write_tEXt(png_ptr, info_ptr->text[i].key, |
| 256 info_ptr->text[i].text, | 264 info_ptr->text[i].text, |
| 257 0); | 265 0); |
| 266 /* Mark this chunk as written */ |
| 267 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; |
| 258 #else | 268 #else |
| 269 /* Can't get here */ |
| 259 png_warning(png_ptr, "Unable to write uncompressed text"); | 270 png_warning(png_ptr, "Unable to write uncompressed text"); |
| 260 #endif | 271 #endif |
| 261 /* Mark this chunk as written */ | |
| 262 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; | |
| 263 } | 272 } |
| 264 } | 273 } |
| 265 #endif | 274 #endif /* tEXt */ |
| 275 |
| 266 #if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) | 276 #if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) |
| 267 if (info_ptr->unknown_chunks_num) | 277 if (info_ptr->unknown_chunks_num) |
| 268 { | 278 { |
| 269 png_unknown_chunk *up; | 279 png_unknown_chunk *up; |
| 270 | 280 |
| 271 png_debug(5, "writing extra chunks"); | 281 png_debug(5, "writing extra chunks"); |
| 272 | 282 |
| 273 for (up = info_ptr->unknown_chunks; | 283 for (up = info_ptr->unknown_chunks; |
| 274 up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; | 284 up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; |
| 275 up++) | 285 up++) |
| (...skipping 19 matching lines...) Expand all Loading... |
| 295 */ | 305 */ |
| 296 void PNGAPI | 306 void PNGAPI |
| 297 png_write_end(png_structp png_ptr, png_infop info_ptr) | 307 png_write_end(png_structp png_ptr, png_infop info_ptr) |
| 298 { | 308 { |
| 299 png_debug(1, "in png_write_end"); | 309 png_debug(1, "in png_write_end"); |
| 300 if (png_ptr == NULL) | 310 if (png_ptr == NULL) |
| 301 return; | 311 return; |
| 302 if (!(png_ptr->mode & PNG_HAVE_IDAT)) | 312 if (!(png_ptr->mode & PNG_HAVE_IDAT)) |
| 303 png_error(png_ptr, "No IDATs written into file"); | 313 png_error(png_ptr, "No IDATs written into file"); |
| 304 | 314 |
| 305 /* see if user wants us to write information chunks */ | 315 /* See if user wants us to write information chunks */ |
| 306 if (info_ptr != NULL) | 316 if (info_ptr != NULL) |
| 307 { | 317 { |
| 308 #if defined(PNG_WRITE_TEXT_SUPPORTED) | 318 #if defined(PNG_WRITE_TEXT_SUPPORTED) |
| 309 int i; /* local index variable */ | 319 int i; /* Local index variable */ |
| 310 #endif | 320 #endif |
| 311 #if defined(PNG_WRITE_tIME_SUPPORTED) | 321 #if defined(PNG_WRITE_tIME_SUPPORTED) |
| 312 /* check to see if user has supplied a time chunk */ | 322 /* Check to see if user has supplied a time chunk */ |
| 313 if ((info_ptr->valid & PNG_INFO_tIME) && | 323 if ((info_ptr->valid & PNG_INFO_tIME) && |
| 314 !(png_ptr->mode & PNG_WROTE_tIME)) | 324 !(png_ptr->mode & PNG_WROTE_tIME)) |
| 315 png_write_tIME(png_ptr, &(info_ptr->mod_time)); | 325 png_write_tIME(png_ptr, &(info_ptr->mod_time)); |
| 316 #endif | 326 #endif |
| 317 #if defined(PNG_WRITE_TEXT_SUPPORTED) | 327 #if defined(PNG_WRITE_TEXT_SUPPORTED) |
| 318 /* loop through comment chunks */ | 328 /* Loop through comment chunks */ |
| 319 for (i = 0; i < info_ptr->num_text; i++) | 329 for (i = 0; i < info_ptr->num_text; i++) |
| 320 { | 330 { |
| 321 png_debug2(2, "Writing trailer text chunk %d, type %d", i, | 331 png_debug2(2, "Writing trailer text chunk %d, type %d", i, |
| 322 info_ptr->text[i].compression); | 332 info_ptr->text[i].compression); |
| 323 /* an internationalized chunk? */ | 333 /* An internationalized chunk? */ |
| 324 if (info_ptr->text[i].compression > 0) | 334 if (info_ptr->text[i].compression > 0) |
| 325 { | 335 { |
| 326 #if defined(PNG_WRITE_iTXt_SUPPORTED) | 336 #if defined(PNG_WRITE_iTXt_SUPPORTED) |
| 327 /* write international chunk */ | 337 /* Write international chunk */ |
| 328 png_write_iTXt(png_ptr, | 338 png_write_iTXt(png_ptr, |
| 329 info_ptr->text[i].compression, | 339 info_ptr->text[i].compression, |
| 330 info_ptr->text[i].key, | 340 info_ptr->text[i].key, |
| 331 info_ptr->text[i].lang, | 341 info_ptr->text[i].lang, |
| 332 info_ptr->text[i].lang_key, | 342 info_ptr->text[i].lang_key, |
| 333 info_ptr->text[i].text); | 343 info_ptr->text[i].text); |
| 334 #else | 344 #else |
| 335 png_warning(png_ptr, "Unable to write international text"); | 345 png_warning(png_ptr, "Unable to write international text"); |
| 336 #endif | 346 #endif |
| 337 /* Mark this chunk as written */ | 347 /* Mark this chunk as written */ |
| 338 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; | 348 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; |
| 339 } | 349 } |
| 340 else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt) | 350 else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt) |
| 341 { | 351 { |
| 342 #if defined(PNG_WRITE_zTXt_SUPPORTED) | 352 #if defined(PNG_WRITE_zTXt_SUPPORTED) |
| 343 /* write compressed chunk */ | 353 /* Write compressed chunk */ |
| 344 png_write_zTXt(png_ptr, info_ptr->text[i].key, | 354 png_write_zTXt(png_ptr, info_ptr->text[i].key, |
| 345 info_ptr->text[i].text, 0, | 355 info_ptr->text[i].text, 0, |
| 346 info_ptr->text[i].compression); | 356 info_ptr->text[i].compression); |
| 347 #else | 357 #else |
| 348 png_warning(png_ptr, "Unable to write compressed text"); | 358 png_warning(png_ptr, "Unable to write compressed text"); |
| 349 #endif | 359 #endif |
| 350 /* Mark this chunk as written */ | 360 /* Mark this chunk as written */ |
| 351 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; | 361 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; |
| 352 } | 362 } |
| 353 else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) | 363 else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) |
| 354 { | 364 { |
| 355 #if defined(PNG_WRITE_tEXt_SUPPORTED) | 365 #if defined(PNG_WRITE_tEXt_SUPPORTED) |
| 356 /* write uncompressed chunk */ | 366 /* Write uncompressed chunk */ |
| 357 png_write_tEXt(png_ptr, info_ptr->text[i].key, | 367 png_write_tEXt(png_ptr, info_ptr->text[i].key, |
| 358 info_ptr->text[i].text, 0); | 368 info_ptr->text[i].text, 0); |
| 359 #else | 369 #else |
| 360 png_warning(png_ptr, "Unable to write uncompressed text"); | 370 png_warning(png_ptr, "Unable to write uncompressed text"); |
| 361 #endif | 371 #endif |
| 362 | 372 |
| 363 /* Mark this chunk as written */ | 373 /* Mark this chunk as written */ |
| 364 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; | 374 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; |
| 365 } | 375 } |
| 366 } | 376 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 384 { | 394 { |
| 385 png_write_chunk(png_ptr, up->name, up->data, up->size); | 395 png_write_chunk(png_ptr, up->name, up->data, up->size); |
| 386 } | 396 } |
| 387 } | 397 } |
| 388 } | 398 } |
| 389 #endif | 399 #endif |
| 390 } | 400 } |
| 391 | 401 |
| 392 png_ptr->mode |= PNG_AFTER_IDAT; | 402 png_ptr->mode |= PNG_AFTER_IDAT; |
| 393 | 403 |
| 394 /* write end of PNG file */ | 404 /* Write end of PNG file */ |
| 395 png_write_IEND(png_ptr); | 405 png_write_IEND(png_ptr); |
| 396 /* This flush, added in libpng-1.0.8, removed from libpng-1.0.9beta03, | 406 /* This flush, added in libpng-1.0.8, removed from libpng-1.0.9beta03, |
| 397 * and restored again in libpng-1.2.30, may cause some applications that | 407 * and restored again in libpng-1.2.30, may cause some applications that |
| 398 * do not set png_ptr->output_flush_fn to crash. If your application | 408 * do not set png_ptr->output_flush_fn to crash. If your application |
| 399 * experiences a problem, please try building libpng with | 409 * experiences a problem, please try building libpng with |
| 400 * PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED defined, and report the event to | 410 * PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED defined, and report the event to |
| 401 * png-mng-implement at lists.sf.net . This kludge will be removed | 411 * png-mng-implement at lists.sf.net . This kludge will be removed |
| 402 * from libpng-1.4.0. | 412 * from libpng-1.4.0. |
| 403 */ | 413 */ |
| 404 #if defined(PNG_WRITE_FLUSH_SUPPORTED) && \ | 414 #if defined(PNG_WRITE_FLUSH_SUPPORTED) && \ |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 464 png_debug(1, "in png_create_write_struct"); | 474 png_debug(1, "in png_create_write_struct"); |
| 465 #ifdef PNG_USER_MEM_SUPPORTED | 475 #ifdef PNG_USER_MEM_SUPPORTED |
| 466 png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG, | 476 png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG, |
| 467 (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr); | 477 (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr); |
| 468 #else | 478 #else |
| 469 png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); | 479 png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); |
| 470 #endif /* PNG_USER_MEM_SUPPORTED */ | 480 #endif /* PNG_USER_MEM_SUPPORTED */ |
| 471 if (png_ptr == NULL) | 481 if (png_ptr == NULL) |
| 472 return (NULL); | 482 return (NULL); |
| 473 | 483 |
| 474 /* added at libpng-1.2.6 */ | 484 /* Added at libpng-1.2.6 */ |
| 475 #ifdef PNG_SET_USER_LIMITS_SUPPORTED | 485 #ifdef PNG_SET_USER_LIMITS_SUPPORTED |
| 476 png_ptr->user_width_max=PNG_USER_WIDTH_MAX; | 486 png_ptr->user_width_max=PNG_USER_WIDTH_MAX; |
| 477 png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; | 487 png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; |
| 478 #endif | 488 #endif |
| 479 | 489 |
| 480 #ifdef PNG_SETJMP_SUPPORTED | 490 #ifdef PNG_SETJMP_SUPPORTED |
| 481 #ifdef USE_FAR_KEYWORD | 491 #ifdef USE_FAR_KEYWORD |
| 482 if (setjmp(jmpbuf)) | 492 if (setjmp(jmpbuf)) |
| 483 #else | 493 #else |
| 484 if (setjmp(png_ptr->jmpbuf)) | 494 if (setjmp(png_ptr->jmpbuf)) |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 535 png_warning(png_ptr, msg); | 545 png_warning(png_ptr, msg); |
| 536 #endif | 546 #endif |
| 537 #ifdef PNG_ERROR_NUMBERS_SUPPORTED | 547 #ifdef PNG_ERROR_NUMBERS_SUPPORTED |
| 538 png_ptr->flags=0; | 548 png_ptr->flags=0; |
| 539 #endif | 549 #endif |
| 540 png_error(png_ptr, | 550 png_error(png_ptr, |
| 541 "Incompatible libpng version in application and library"); | 551 "Incompatible libpng version in application and library"); |
| 542 } | 552 } |
| 543 } | 553 } |
| 544 | 554 |
| 545 /* initialize zbuf - compression buffer */ | 555 /* Initialize zbuf - compression buffer */ |
| 546 png_ptr->zbuf_size = PNG_ZBUF_SIZE; | 556 png_ptr->zbuf_size = PNG_ZBUF_SIZE; |
| 547 png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, | 557 png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, |
| 548 (png_uint_32)png_ptr->zbuf_size); | 558 (png_uint_32)png_ptr->zbuf_size); |
| 549 | 559 |
| 550 png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL, | 560 png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL, |
| 551 png_flush_ptr_NULL); | 561 png_flush_ptr_NULL); |
| 552 | 562 |
| 553 #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) | 563 #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) |
| 554 png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT, | 564 png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT, |
| 555 1, png_doublep_NULL, png_doublep_NULL); | 565 1, png_doublep_NULL, png_doublep_NULL); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 629 } | 639 } |
| 630 #endif /* PNG_1_0_X || PNG_1_2_X */ | 640 #endif /* PNG_1_0_X || PNG_1_2_X */ |
| 631 | 641 |
| 632 | 642 |
| 633 void PNGAPI | 643 void PNGAPI |
| 634 png_write_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver, | 644 png_write_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver, |
| 635 png_size_t png_struct_size) | 645 png_size_t png_struct_size) |
| 636 { | 646 { |
| 637 png_structp png_ptr=*ptr_ptr; | 647 png_structp png_ptr=*ptr_ptr; |
| 638 #ifdef PNG_SETJMP_SUPPORTED | 648 #ifdef PNG_SETJMP_SUPPORTED |
| 639 jmp_buf tmp_jmp; /* to save current jump buffer */ | 649 jmp_buf tmp_jmp; /* To save current jump buffer */ |
| 640 #endif | 650 #endif |
| 641 | 651 |
| 642 int i = 0; | 652 int i = 0; |
| 643 | 653 |
| 644 if (png_ptr == NULL) | 654 if (png_ptr == NULL) |
| 645 return; | 655 return; |
| 646 | 656 |
| 647 do | 657 do |
| 648 { | 658 { |
| 649 if (user_png_ver[i] != png_libpng_ver[i]) | 659 if (user_png_ver[i] != png_libpng_ver[i]) |
| 650 { | 660 { |
| 651 #ifdef PNG_LEGACY_SUPPORTED | 661 #ifdef PNG_LEGACY_SUPPORTED |
| 652 png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; | 662 png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; |
| 653 #else | 663 #else |
| 654 png_ptr->warning_fn=NULL; | 664 png_ptr->warning_fn=NULL; |
| 655 png_warning(png_ptr, | 665 png_warning(png_ptr, |
| 656 "Application uses deprecated png_write_init() and should be recompiled."); | 666 "Application uses deprecated png_write_init() and should be recompiled."); |
| 657 break; | 667 break; |
| 658 #endif | 668 #endif |
| 659 } | 669 } |
| 660 } while (png_libpng_ver[i++]); | 670 } while (png_libpng_ver[i++]); |
| 661 | 671 |
| 662 png_debug(1, "in png_write_init_3"); | 672 png_debug(1, "in png_write_init_3"); |
| 663 | 673 |
| 664 #ifdef PNG_SETJMP_SUPPORTED | 674 #ifdef PNG_SETJMP_SUPPORTED |
| 665 /* save jump buffer and error functions */ | 675 /* Save jump buffer and error functions */ |
| 666 png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf)); | 676 png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf)); |
| 667 #endif | 677 #endif |
| 668 | 678 |
| 669 if (png_sizeof(png_struct) > png_struct_size) | 679 if (png_sizeof(png_struct) > png_struct_size) |
| 670 { | 680 { |
| 671 png_destroy_struct(png_ptr); | 681 png_destroy_struct(png_ptr); |
| 672 png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); | 682 png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); |
| 673 *ptr_ptr = png_ptr; | 683 *ptr_ptr = png_ptr; |
| 674 } | 684 } |
| 675 | 685 |
| 676 /* reset all variables to 0 */ | 686 /* Reset all variables to 0 */ |
| 677 png_memset(png_ptr, 0, png_sizeof(png_struct)); | 687 png_memset(png_ptr, 0, png_sizeof(png_struct)); |
| 678 | 688 |
| 679 /* added at libpng-1.2.6 */ | 689 /* Added at libpng-1.2.6 */ |
| 680 #ifdef PNG_SET_USER_LIMITS_SUPPORTED | 690 #ifdef PNG_SET_USER_LIMITS_SUPPORTED |
| 681 png_ptr->user_width_max=PNG_USER_WIDTH_MAX; | 691 png_ptr->user_width_max=PNG_USER_WIDTH_MAX; |
| 682 png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; | 692 png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; |
| 683 #endif | 693 #endif |
| 684 | 694 |
| 685 #ifdef PNG_SETJMP_SUPPORTED | 695 #ifdef PNG_SETJMP_SUPPORTED |
| 686 /* restore jump buffer */ | 696 /* Restore jump buffer */ |
| 687 png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf)); | 697 png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf)); |
| 688 #endif | 698 #endif |
| 689 | 699 |
| 690 png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL, | 700 png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL, |
| 691 png_flush_ptr_NULL); | 701 png_flush_ptr_NULL); |
| 692 | 702 |
| 693 /* initialize zbuf - compression buffer */ | 703 /* Initialize zbuf - compression buffer */ |
| 694 png_ptr->zbuf_size = PNG_ZBUF_SIZE; | 704 png_ptr->zbuf_size = PNG_ZBUF_SIZE; |
| 695 png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, | 705 png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, |
| 696 (png_uint_32)png_ptr->zbuf_size); | 706 (png_uint_32)png_ptr->zbuf_size); |
| 697 | 707 |
| 698 #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) | 708 #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) |
| 699 png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT, | 709 png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT, |
| 700 1, png_doublep_NULL, png_doublep_NULL); | 710 1, png_doublep_NULL, png_doublep_NULL); |
| 701 #endif | 711 #endif |
| 702 } | 712 } |
| 703 | 713 |
| 704 /* Write a few rows of image data. If the image is interlaced, | 714 /* Write a few rows of image data. If the image is interlaced, |
| 705 * either you will have to write the 7 sub images, or, if you | 715 * either you will have to write the 7 sub images, or, if you |
| 706 * have called png_set_interlace_handling(), you will have to | 716 * have called png_set_interlace_handling(), you will have to |
| 707 * "write" the image seven times. | 717 * "write" the image seven times. |
| 708 */ | 718 */ |
| 709 void PNGAPI | 719 void PNGAPI |
| 710 png_write_rows(png_structp png_ptr, png_bytepp row, | 720 png_write_rows(png_structp png_ptr, png_bytepp row, |
| 711 png_uint_32 num_rows) | 721 png_uint_32 num_rows) |
| 712 { | 722 { |
| 713 png_uint_32 i; /* row counter */ | 723 png_uint_32 i; /* Row counter */ |
| 714 png_bytepp rp; /* row pointer */ | 724 png_bytepp rp; /* Row pointer */ |
| 715 | 725 |
| 716 png_debug(1, "in png_write_rows"); | 726 png_debug(1, "in png_write_rows"); |
| 717 | 727 |
| 718 if (png_ptr == NULL) | 728 if (png_ptr == NULL) |
| 719 return; | 729 return; |
| 720 | 730 |
| 721 /* loop through the rows */ | 731 /* Loop through the rows */ |
| 722 for (i = 0, rp = row; i < num_rows; i++, rp++) | 732 for (i = 0, rp = row; i < num_rows; i++, rp++) |
| 723 { | 733 { |
| 724 png_write_row(png_ptr, *rp); | 734 png_write_row(png_ptr, *rp); |
| 725 } | 735 } |
| 726 } | 736 } |
| 727 | 737 |
| 728 /* Write the image. You only need to call this function once, even | 738 /* Write the image. You only need to call this function once, even |
| 729 * if you are writing an interlaced image. | 739 * if you are writing an interlaced image. |
| 730 */ | 740 */ |
| 731 void PNGAPI | 741 void PNGAPI |
| 732 png_write_image(png_structp png_ptr, png_bytepp image) | 742 png_write_image(png_structp png_ptr, png_bytepp image) |
| 733 { | 743 { |
| 734 png_uint_32 i; /* row index */ | 744 png_uint_32 i; /* Row index */ |
| 735 int pass, num_pass; /* pass variables */ | 745 int pass, num_pass; /* Pass variables */ |
| 736 png_bytepp rp; /* points to current row */ | 746 png_bytepp rp; /* Points to current row */ |
| 737 | 747 |
| 738 if (png_ptr == NULL) | 748 if (png_ptr == NULL) |
| 739 return; | 749 return; |
| 740 | 750 |
| 741 png_debug(1, "in png_write_image"); | 751 png_debug(1, "in png_write_image"); |
| 742 #if defined(PNG_WRITE_INTERLACING_SUPPORTED) | 752 #if defined(PNG_WRITE_INTERLACING_SUPPORTED) |
| 743 /* intialize interlace handling. If image is not interlaced, | 753 /* Initialize interlace handling. If image is not interlaced, |
| 744 this will set pass to 1 */ | 754 * this will set pass to 1 |
| 755 */ |
| 745 num_pass = png_set_interlace_handling(png_ptr); | 756 num_pass = png_set_interlace_handling(png_ptr); |
| 746 #else | 757 #else |
| 747 num_pass = 1; | 758 num_pass = 1; |
| 748 #endif | 759 #endif |
| 749 /* loop through passes */ | 760 /* Loop through passes */ |
| 750 for (pass = 0; pass < num_pass; pass++) | 761 for (pass = 0; pass < num_pass; pass++) |
| 751 { | 762 { |
| 752 /* loop through image */ | 763 /* Loop through image */ |
| 753 for (i = 0, rp = image; i < png_ptr->height; i++, rp++) | 764 for (i = 0, rp = image; i < png_ptr->height; i++, rp++) |
| 754 { | 765 { |
| 755 png_write_row(png_ptr, *rp); | 766 png_write_row(png_ptr, *rp); |
| 756 } | 767 } |
| 757 } | 768 } |
| 758 } | 769 } |
| 759 | 770 |
| 760 /* called by user to write a row of image data */ | 771 /* Called by user to write a row of image data */ |
| 761 void PNGAPI | 772 void PNGAPI |
| 762 png_write_row(png_structp png_ptr, png_bytep row) | 773 png_write_row(png_structp png_ptr, png_bytep row) |
| 763 { | 774 { |
| 764 if (png_ptr == NULL) | 775 if (png_ptr == NULL) |
| 765 return; | 776 return; |
| 766 png_debug2(1, "in png_write_row (row %ld, pass %d)", | 777 png_debug2(1, "in png_write_row (row %ld, pass %d)", |
| 767 png_ptr->row_number, png_ptr->pass); | 778 png_ptr->row_number, png_ptr->pass); |
| 768 | 779 |
| 769 /* initialize transformations and other stuff if first time */ | 780 /* Initialize transformations and other stuff if first time */ |
| 770 if (png_ptr->row_number == 0 && png_ptr->pass == 0) | 781 if (png_ptr->row_number == 0 && png_ptr->pass == 0) |
| 771 { | 782 { |
| 772 /* make sure we wrote the header info */ | 783 /* Make sure we wrote the header info */ |
| 773 if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) | 784 if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) |
| 774 png_error(png_ptr, | 785 png_error(png_ptr, |
| 775 "png_write_info was never called before png_write_row."); | 786 "png_write_info was never called before png_write_row."); |
| 776 | 787 |
| 777 /* check for transforms that have been set but were defined out */ | 788 /* Check for transforms that have been set but were defined out */ |
| 778 #if !defined(PNG_WRITE_INVERT_SUPPORTED) && defined(PNG_READ_INVERT_SUPPORTED) | 789 #if !defined(PNG_WRITE_INVERT_SUPPORTED) && defined(PNG_READ_INVERT_SUPPORTED) |
| 779 if (png_ptr->transformations & PNG_INVERT_MONO) | 790 if (png_ptr->transformations & PNG_INVERT_MONO) |
| 780 png_warning(png_ptr, "PNG_WRITE_INVERT_SUPPORTED is not defined."); | 791 png_warning(png_ptr, "PNG_WRITE_INVERT_SUPPORTED is not defined."); |
| 781 #endif | 792 #endif |
| 782 #if !defined(PNG_WRITE_FILLER_SUPPORTED) && defined(PNG_READ_FILLER_SUPPORTED) | 793 #if !defined(PNG_WRITE_FILLER_SUPPORTED) && defined(PNG_READ_FILLER_SUPPORTED) |
| 783 if (png_ptr->transformations & PNG_FILLER) | 794 if (png_ptr->transformations & PNG_FILLER) |
| 784 png_warning(png_ptr, "PNG_WRITE_FILLER_SUPPORTED is not defined."); | 795 png_warning(png_ptr, "PNG_WRITE_FILLER_SUPPORTED is not defined."); |
| 785 #endif | 796 #endif |
| 786 #if !defined(PNG_WRITE_PACKSWAP_SUPPORTED) && defined(PNG_READ_PACKSWAP_SUPPORTE
D) | 797 #if !defined(PNG_WRITE_PACKSWAP_SUPPORTED) && defined(PNG_READ_PACKSWAP_SUPPORTE
D) |
| 787 if (png_ptr->transformations & PNG_PACKSWAP) | 798 if (png_ptr->transformations & PNG_PACKSWAP) |
| 788 png_warning(png_ptr, "PNG_WRITE_PACKSWAP_SUPPORTED is not defined."); | 799 png_warning(png_ptr, "PNG_WRITE_PACKSWAP_SUPPORTED is not defined."); |
| 789 #endif | 800 #endif |
| 790 #if !defined(PNG_WRITE_PACK_SUPPORTED) && defined(PNG_READ_PACK_SUPPORTED) | 801 #if !defined(PNG_WRITE_PACK_SUPPORTED) && defined(PNG_READ_PACK_SUPPORTED) |
| 791 if (png_ptr->transformations & PNG_PACK) | 802 if (png_ptr->transformations & PNG_PACK) |
| 792 png_warning(png_ptr, "PNG_WRITE_PACK_SUPPORTED is not defined."); | 803 png_warning(png_ptr, "PNG_WRITE_PACK_SUPPORTED is not defined."); |
| 793 #endif | 804 #endif |
| 794 #if !defined(PNG_WRITE_SHIFT_SUPPORTED) && defined(PNG_READ_SHIFT_SUPPORTED) | 805 #if !defined(PNG_WRITE_SHIFT_SUPPORTED) && defined(PNG_READ_SHIFT_SUPPORTED) |
| 795 if (png_ptr->transformations & PNG_SHIFT) | 806 if (png_ptr->transformations & PNG_SHIFT) |
| 796 png_warning(png_ptr, "PNG_WRITE_SHIFT_SUPPORTED is not defined."); | 807 png_warning(png_ptr, "PNG_WRITE_SHIFT_SUPPORTED is not defined."); |
| 797 #endif | 808 #endif |
| 798 #if !defined(PNG_WRITE_BGR_SUPPORTED) && defined(PNG_READ_BGR_SUPPORTED) | 809 #if !defined(PNG_WRITE_BGR_SUPPORTED) && defined(PNG_READ_BGR_SUPPORTED) |
| 799 if (png_ptr->transformations & PNG_BGR) | 810 if (png_ptr->transformations & PNG_BGR) |
| 800 png_warning(png_ptr, "PNG_WRITE_BGR_SUPPORTED is not defined."); | 811 png_warning(png_ptr, "PNG_WRITE_BGR_SUPPORTED is not defined."); |
| 801 #endif | 812 #endif |
| 802 #if !defined(PNG_WRITE_SWAP_SUPPORTED) && defined(PNG_READ_SWAP_SUPPORTED) | 813 #if !defined(PNG_WRITE_SWAP_SUPPORTED) && defined(PNG_READ_SWAP_SUPPORTED) |
| 803 if (png_ptr->transformations & PNG_SWAP_BYTES) | 814 if (png_ptr->transformations & PNG_SWAP_BYTES) |
| 804 png_warning(png_ptr, "PNG_WRITE_SWAP_SUPPORTED is not defined."); | 815 png_warning(png_ptr, "PNG_WRITE_SWAP_SUPPORTED is not defined."); |
| 805 #endif | 816 #endif |
| 806 | 817 |
| 807 png_write_start_row(png_ptr); | 818 png_write_start_row(png_ptr); |
| 808 } | 819 } |
| 809 | 820 |
| 810 #if defined(PNG_WRITE_INTERLACING_SUPPORTED) | 821 #if defined(PNG_WRITE_INTERLACING_SUPPORTED) |
| 811 /* if interlaced and not interested in row, return */ | 822 /* If interlaced and not interested in row, return */ |
| 812 if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) | 823 if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) |
| 813 { | 824 { |
| 814 switch (png_ptr->pass) | 825 switch (png_ptr->pass) |
| 815 { | 826 { |
| 816 case 0: | 827 case 0: |
| 817 if (png_ptr->row_number & 0x07) | 828 if (png_ptr->row_number & 0x07) |
| 818 { | 829 { |
| 819 png_write_finish_row(png_ptr); | 830 png_write_finish_row(png_ptr); |
| 820 return; | 831 return; |
| 821 } | 832 } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 859 if (!(png_ptr->row_number & 0x01)) | 870 if (!(png_ptr->row_number & 0x01)) |
| 860 { | 871 { |
| 861 png_write_finish_row(png_ptr); | 872 png_write_finish_row(png_ptr); |
| 862 return; | 873 return; |
| 863 } | 874 } |
| 864 break; | 875 break; |
| 865 } | 876 } |
| 866 } | 877 } |
| 867 #endif | 878 #endif |
| 868 | 879 |
| 869 /* set up row info for transformations */ | 880 /* Set up row info for transformations */ |
| 870 png_ptr->row_info.color_type = png_ptr->color_type; | 881 png_ptr->row_info.color_type = png_ptr->color_type; |
| 871 png_ptr->row_info.width = png_ptr->usr_width; | 882 png_ptr->row_info.width = png_ptr->usr_width; |
| 872 png_ptr->row_info.channels = png_ptr->usr_channels; | 883 png_ptr->row_info.channels = png_ptr->usr_channels; |
| 873 png_ptr->row_info.bit_depth = png_ptr->usr_bit_depth; | 884 png_ptr->row_info.bit_depth = png_ptr->usr_bit_depth; |
| 874 png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth * | 885 png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth * |
| 875 png_ptr->row_info.channels); | 886 png_ptr->row_info.channels); |
| 876 | 887 |
| 877 png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, | 888 png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, |
| 878 png_ptr->row_info.width); | 889 png_ptr->row_info.width); |
| 879 | 890 |
| 880 png_debug1(3, "row_info->color_type = %d", png_ptr->row_info.color_type); | 891 png_debug1(3, "row_info->color_type = %d", png_ptr->row_info.color_type); |
| 881 png_debug1(3, "row_info->width = %lu", png_ptr->row_info.width); | 892 png_debug1(3, "row_info->width = %lu", png_ptr->row_info.width); |
| 882 png_debug1(3, "row_info->channels = %d", png_ptr->row_info.channels); | 893 png_debug1(3, "row_info->channels = %d", png_ptr->row_info.channels); |
| 883 png_debug1(3, "row_info->bit_depth = %d", png_ptr->row_info.bit_depth); | 894 png_debug1(3, "row_info->bit_depth = %d", png_ptr->row_info.bit_depth); |
| 884 png_debug1(3, "row_info->pixel_depth = %d", png_ptr->row_info.pixel_depth); | 895 png_debug1(3, "row_info->pixel_depth = %d", png_ptr->row_info.pixel_depth); |
| 885 png_debug1(3, "row_info->rowbytes = %lu", png_ptr->row_info.rowbytes); | 896 png_debug1(3, "row_info->rowbytes = %lu", png_ptr->row_info.rowbytes); |
| 886 | 897 |
| 887 /* Copy user's row into buffer, leaving room for filter byte. */ | 898 /* Copy user's row into buffer, leaving room for filter byte. */ |
| 888 png_memcpy_check(png_ptr, png_ptr->row_buf + 1, row, | 899 png_memcpy_check(png_ptr, png_ptr->row_buf + 1, row, |
| 889 png_ptr->row_info.rowbytes); | 900 png_ptr->row_info.rowbytes); |
| 890 | 901 |
| 891 #if defined(PNG_WRITE_INTERLACING_SUPPORTED) | 902 #if defined(PNG_WRITE_INTERLACING_SUPPORTED) |
| 892 /* handle interlacing */ | 903 /* Handle interlacing */ |
| 893 if (png_ptr->interlaced && png_ptr->pass < 6 && | 904 if (png_ptr->interlaced && png_ptr->pass < 6 && |
| 894 (png_ptr->transformations & PNG_INTERLACE)) | 905 (png_ptr->transformations & PNG_INTERLACE)) |
| 895 { | 906 { |
| 896 png_do_write_interlace(&(png_ptr->row_info), | 907 png_do_write_interlace(&(png_ptr->row_info), |
| 897 png_ptr->row_buf + 1, png_ptr->pass); | 908 png_ptr->row_buf + 1, png_ptr->pass); |
| 898 /* this should always get caught above, but still ... */ | 909 /* This should always get caught above, but still ... */ |
| 899 if (!(png_ptr->row_info.width)) | 910 if (!(png_ptr->row_info.width)) |
| 900 { | 911 { |
| 901 png_write_finish_row(png_ptr); | 912 png_write_finish_row(png_ptr); |
| 902 return; | 913 return; |
| 903 } | 914 } |
| 904 } | 915 } |
| 905 #endif | 916 #endif |
| 906 | 917 |
| 907 /* handle other transformations */ | 918 /* Handle other transformations */ |
| 908 if (png_ptr->transformations) | 919 if (png_ptr->transformations) |
| 909 png_do_write_transformations(png_ptr); | 920 png_do_write_transformations(png_ptr); |
| 910 | 921 |
| 911 #if defined(PNG_MNG_FEATURES_SUPPORTED) | 922 #if defined(PNG_MNG_FEATURES_SUPPORTED) |
| 912 /* Write filter_method 64 (intrapixel differencing) only if | 923 /* Write filter_method 64 (intrapixel differencing) only if |
| 913 * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and | 924 * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and |
| 914 * 2. Libpng did not write a PNG signature (this filter_method is only | 925 * 2. Libpng did not write a PNG signature (this filter_method is only |
| 915 * used in PNG datastreams that are embedded in MNG datastreams) and | 926 * used in PNG datastreams that are embedded in MNG datastreams) and |
| 916 * 3. The application called png_permit_mng_features with a mask that | 927 * 3. The application called png_permit_mng_features with a mask that |
| 917 * included PNG_FLAG_MNG_FILTER_64 and | 928 * included PNG_FLAG_MNG_FILTER_64 and |
| (...skipping 19 matching lines...) Expand all Loading... |
| 937 /* Set the automatic flush interval or 0 to turn flushing off */ | 948 /* Set the automatic flush interval or 0 to turn flushing off */ |
| 938 void PNGAPI | 949 void PNGAPI |
| 939 png_set_flush(png_structp png_ptr, int nrows) | 950 png_set_flush(png_structp png_ptr, int nrows) |
| 940 { | 951 { |
| 941 png_debug(1, "in png_set_flush"); | 952 png_debug(1, "in png_set_flush"); |
| 942 if (png_ptr == NULL) | 953 if (png_ptr == NULL) |
| 943 return; | 954 return; |
| 944 png_ptr->flush_dist = (nrows < 0 ? 0 : nrows); | 955 png_ptr->flush_dist = (nrows < 0 ? 0 : nrows); |
| 945 } | 956 } |
| 946 | 957 |
| 947 /* flush the current output buffers now */ | 958 /* Flush the current output buffers now */ |
| 948 void PNGAPI | 959 void PNGAPI |
| 949 png_write_flush(png_structp png_ptr) | 960 png_write_flush(png_structp png_ptr) |
| 950 { | 961 { |
| 951 int wrote_IDAT; | 962 int wrote_IDAT; |
| 952 | 963 |
| 953 png_debug(1, "in png_write_flush"); | 964 png_debug(1, "in png_write_flush"); |
| 954 if (png_ptr == NULL) | 965 if (png_ptr == NULL) |
| 955 return; | 966 return; |
| 956 /* We have already written out all of the data */ | 967 /* We have already written out all of the data */ |
| 957 if (png_ptr->row_number >= png_ptr->num_rows) | 968 if (png_ptr->row_number >= png_ptr->num_rows) |
| 958 return; | 969 return; |
| 959 | 970 |
| 960 do | 971 do |
| 961 { | 972 { |
| 962 int ret; | 973 int ret; |
| 963 | 974 |
| 964 /* compress the data */ | 975 /* Compress the data */ |
| 965 ret = deflate(&png_ptr->zstream, Z_SYNC_FLUSH); | 976 ret = deflate(&png_ptr->zstream, Z_SYNC_FLUSH); |
| 966 wrote_IDAT = 0; | 977 wrote_IDAT = 0; |
| 967 | 978 |
| 968 /* check for compression errors */ | 979 /* Check for compression errors */ |
| 969 if (ret != Z_OK) | 980 if (ret != Z_OK) |
| 970 { | 981 { |
| 971 if (png_ptr->zstream.msg != NULL) | 982 if (png_ptr->zstream.msg != NULL) |
| 972 png_error(png_ptr, png_ptr->zstream.msg); | 983 png_error(png_ptr, png_ptr->zstream.msg); |
| 973 else | 984 else |
| 974 png_error(png_ptr, "zlib error"); | 985 png_error(png_ptr, "zlib error"); |
| 975 } | 986 } |
| 976 | 987 |
| 977 if (!(png_ptr->zstream.avail_out)) | 988 if (!(png_ptr->zstream.avail_out)) |
| 978 { | 989 { |
| 979 /* write the IDAT and reset the zlib output buffer */ | 990 /* Write the IDAT and reset the zlib output buffer */ |
| 980 png_write_IDAT(png_ptr, png_ptr->zbuf, | 991 png_write_IDAT(png_ptr, png_ptr->zbuf, |
| 981 png_ptr->zbuf_size); | 992 png_ptr->zbuf_size); |
| 982 png_ptr->zstream.next_out = png_ptr->zbuf; | 993 png_ptr->zstream.next_out = png_ptr->zbuf; |
| 983 png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; | 994 png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; |
| 984 wrote_IDAT = 1; | 995 wrote_IDAT = 1; |
| 985 } | 996 } |
| 986 } while(wrote_IDAT == 1); | 997 } while(wrote_IDAT == 1); |
| 987 | 998 |
| 988 /* If there is any data left to be output, write it into a new IDAT */ | 999 /* If there is any data left to be output, write it into a new IDAT */ |
| 989 if (png_ptr->zbuf_size != png_ptr->zstream.avail_out) | 1000 if (png_ptr->zbuf_size != png_ptr->zstream.avail_out) |
| 990 { | 1001 { |
| 991 /* write the IDAT and reset the zlib output buffer */ | 1002 /* Write the IDAT and reset the zlib output buffer */ |
| 992 png_write_IDAT(png_ptr, png_ptr->zbuf, | 1003 png_write_IDAT(png_ptr, png_ptr->zbuf, |
| 993 png_ptr->zbuf_size - png_ptr->zstream.avail_out); | 1004 png_ptr->zbuf_size - png_ptr->zstream.avail_out); |
| 994 png_ptr->zstream.next_out = png_ptr->zbuf; | 1005 png_ptr->zstream.next_out = png_ptr->zbuf; |
| 995 png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; | 1006 png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; |
| 996 } | 1007 } |
| 997 png_ptr->flush_rows = 0; | 1008 png_ptr->flush_rows = 0; |
| 998 png_flush(png_ptr); | 1009 png_flush(png_ptr); |
| 999 } | 1010 } |
| 1000 #endif /* PNG_WRITE_FLUSH_SUPPORTED */ | 1011 #endif /* PNG_WRITE_FLUSH_SUPPORTED */ |
| 1001 | 1012 |
| 1002 /* free all memory used by the write */ | 1013 /* Free all memory used by the write */ |
| 1003 void PNGAPI | 1014 void PNGAPI |
| 1004 png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr) | 1015 png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr) |
| 1005 { | 1016 { |
| 1006 png_structp png_ptr = NULL; | 1017 png_structp png_ptr = NULL; |
| 1007 png_infop info_ptr = NULL; | 1018 png_infop info_ptr = NULL; |
| 1008 #ifdef PNG_USER_MEM_SUPPORTED | 1019 #ifdef PNG_USER_MEM_SUPPORTED |
| 1009 png_free_ptr free_fn = NULL; | 1020 png_free_ptr free_fn = NULL; |
| 1010 png_voidp mem_ptr = NULL; | 1021 png_voidp mem_ptr = NULL; |
| 1011 #endif | 1022 #endif |
| 1012 | 1023 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1068 *png_ptr_ptr = NULL; | 1079 *png_ptr_ptr = NULL; |
| 1069 } | 1080 } |
| 1070 } | 1081 } |
| 1071 | 1082 |
| 1072 | 1083 |
| 1073 /* Free any memory used in png_ptr struct (old method) */ | 1084 /* Free any memory used in png_ptr struct (old method) */ |
| 1074 void /* PRIVATE */ | 1085 void /* PRIVATE */ |
| 1075 png_write_destroy(png_structp png_ptr) | 1086 png_write_destroy(png_structp png_ptr) |
| 1076 { | 1087 { |
| 1077 #ifdef PNG_SETJMP_SUPPORTED | 1088 #ifdef PNG_SETJMP_SUPPORTED |
| 1078 jmp_buf tmp_jmp; /* save jump buffer */ | 1089 jmp_buf tmp_jmp; /* Save jump buffer */ |
| 1079 #endif | 1090 #endif |
| 1080 png_error_ptr error_fn; | 1091 png_error_ptr error_fn; |
| 1081 png_error_ptr warning_fn; | 1092 png_error_ptr warning_fn; |
| 1082 png_voidp error_ptr; | 1093 png_voidp error_ptr; |
| 1083 #ifdef PNG_USER_MEM_SUPPORTED | 1094 #ifdef PNG_USER_MEM_SUPPORTED |
| 1084 png_free_ptr free_fn; | 1095 png_free_ptr free_fn; |
| 1085 #endif | 1096 #endif |
| 1086 | 1097 |
| 1087 png_debug(1, "in png_write_destroy"); | 1098 png_debug(1, "in png_write_destroy"); |
| 1088 /* free any memory zlib uses */ | 1099 /* Free any memory zlib uses */ |
| 1089 deflateEnd(&png_ptr->zstream); | 1100 deflateEnd(&png_ptr->zstream); |
| 1090 | 1101 |
| 1091 /* free our memory. png_free checks NULL for us. */ | 1102 /* Free our memory. png_free checks NULL for us. */ |
| 1092 png_free(png_ptr, png_ptr->zbuf); | 1103 png_free(png_ptr, png_ptr->zbuf); |
| 1093 png_free(png_ptr, png_ptr->row_buf); | 1104 png_free(png_ptr, png_ptr->row_buf); |
| 1094 #ifndef PNG_NO_WRITE_FILTER | 1105 #ifndef PNG_NO_WRITE_FILTER |
| 1095 png_free(png_ptr, png_ptr->prev_row); | 1106 png_free(png_ptr, png_ptr->prev_row); |
| 1096 png_free(png_ptr, png_ptr->sub_row); | 1107 png_free(png_ptr, png_ptr->sub_row); |
| 1097 png_free(png_ptr, png_ptr->up_row); | 1108 png_free(png_ptr, png_ptr->up_row); |
| 1098 png_free(png_ptr, png_ptr->avg_row); | 1109 png_free(png_ptr, png_ptr->avg_row); |
| 1099 png_free(png_ptr, png_ptr->paeth_row); | 1110 png_free(png_ptr, png_ptr->paeth_row); |
| 1100 #endif | 1111 #endif |
| 1101 | 1112 |
| 1102 #if defined(PNG_TIME_RFC1123_SUPPORTED) | 1113 #if defined(PNG_TIME_RFC1123_SUPPORTED) |
| 1103 png_free(png_ptr, png_ptr->time_buffer); | 1114 png_free(png_ptr, png_ptr->time_buffer); |
| 1104 #endif | 1115 #endif |
| 1105 | 1116 |
| 1106 #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) | 1117 #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) |
| 1107 png_free(png_ptr, png_ptr->prev_filters); | 1118 png_free(png_ptr, png_ptr->prev_filters); |
| 1108 png_free(png_ptr, png_ptr->filter_weights); | 1119 png_free(png_ptr, png_ptr->filter_weights); |
| 1109 png_free(png_ptr, png_ptr->inv_filter_weights); | 1120 png_free(png_ptr, png_ptr->inv_filter_weights); |
| 1110 png_free(png_ptr, png_ptr->filter_costs); | 1121 png_free(png_ptr, png_ptr->filter_costs); |
| 1111 png_free(png_ptr, png_ptr->inv_filter_costs); | 1122 png_free(png_ptr, png_ptr->inv_filter_costs); |
| 1112 #endif | 1123 #endif |
| 1113 | 1124 |
| 1114 #ifdef PNG_SETJMP_SUPPORTED | 1125 #ifdef PNG_SETJMP_SUPPORTED |
| 1115 /* reset structure */ | 1126 /* Reset structure */ |
| 1116 png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf)); | 1127 png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf)); |
| 1117 #endif | 1128 #endif |
| 1118 | 1129 |
| 1119 error_fn = png_ptr->error_fn; | 1130 error_fn = png_ptr->error_fn; |
| 1120 warning_fn = png_ptr->warning_fn; | 1131 warning_fn = png_ptr->warning_fn; |
| 1121 error_ptr = png_ptr->error_ptr; | 1132 error_ptr = png_ptr->error_ptr; |
| 1122 #ifdef PNG_USER_MEM_SUPPORTED | 1133 #ifdef PNG_USER_MEM_SUPPORTED |
| 1123 free_fn = png_ptr->free_fn; | 1134 free_fn = png_ptr->free_fn; |
| 1124 #endif | 1135 #endif |
| 1125 | 1136 |
| (...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1408 void PNGAPI | 1419 void PNGAPI |
| 1409 png_set_compression_window_bits(png_structp png_ptr, int window_bits) | 1420 png_set_compression_window_bits(png_structp png_ptr, int window_bits) |
| 1410 { | 1421 { |
| 1411 if (png_ptr == NULL) | 1422 if (png_ptr == NULL) |
| 1412 return; | 1423 return; |
| 1413 if (window_bits > 15) | 1424 if (window_bits > 15) |
| 1414 png_warning(png_ptr, "Only compression windows <= 32k supported by PNG"); | 1425 png_warning(png_ptr, "Only compression windows <= 32k supported by PNG"); |
| 1415 else if (window_bits < 8) | 1426 else if (window_bits < 8) |
| 1416 png_warning(png_ptr, "Only compression windows >= 256 supported by PNG"); | 1427 png_warning(png_ptr, "Only compression windows >= 256 supported by PNG"); |
| 1417 #ifndef WBITS_8_OK | 1428 #ifndef WBITS_8_OK |
| 1418 /* avoid libpng bug with 256-byte windows */ | 1429 /* Avoid libpng bug with 256-byte windows */ |
| 1419 if (window_bits == 8) | 1430 if (window_bits == 8) |
| 1420 { | 1431 { |
| 1421 png_warning(png_ptr, "Compression window is being reset to 512"); | 1432 png_warning(png_ptr, "Compression window is being reset to 512"); |
| 1422 window_bits=9; | 1433 window_bits=9; |
| 1423 } | 1434 } |
| 1424 #endif | 1435 #endif |
| 1425 png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS; | 1436 png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS; |
| 1426 png_ptr->zlib_window_bits = window_bits; | 1437 png_ptr->zlib_window_bits = window_bits; |
| 1427 } | 1438 } |
| 1428 | 1439 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1461 | 1472 |
| 1462 | 1473 |
| 1463 #if defined(PNG_INFO_IMAGE_SUPPORTED) | 1474 #if defined(PNG_INFO_IMAGE_SUPPORTED) |
| 1464 void PNGAPI | 1475 void PNGAPI |
| 1465 png_write_png(png_structp png_ptr, png_infop info_ptr, | 1476 png_write_png(png_structp png_ptr, png_infop info_ptr, |
| 1466 int transforms, voidp params) | 1477 int transforms, voidp params) |
| 1467 { | 1478 { |
| 1468 if (png_ptr == NULL || info_ptr == NULL) | 1479 if (png_ptr == NULL || info_ptr == NULL) |
| 1469 return; | 1480 return; |
| 1470 #if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) | 1481 #if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) |
| 1471 /* invert the alpha channel from opacity to transparency */ | 1482 /* Invert the alpha channel from opacity to transparency */ |
| 1472 if (transforms & PNG_TRANSFORM_INVERT_ALPHA) | 1483 if (transforms & PNG_TRANSFORM_INVERT_ALPHA) |
| 1473 png_set_invert_alpha(png_ptr); | 1484 png_set_invert_alpha(png_ptr); |
| 1474 #endif | 1485 #endif |
| 1475 | 1486 |
| 1476 /* Write the file header information. */ | 1487 /* Write the file header information. */ |
| 1477 png_write_info(png_ptr, info_ptr); | 1488 png_write_info(png_ptr, info_ptr); |
| 1478 | 1489 |
| 1479 /* ------ these transformations don't touch the info structure ------- */ | 1490 /* ------ these transformations don't touch the info structure ------- */ |
| 1480 | 1491 |
| 1481 #if defined(PNG_WRITE_INVERT_SUPPORTED) | 1492 #if defined(PNG_WRITE_INVERT_SUPPORTED) |
| 1482 /* invert monochrome pixels */ | 1493 /* Invert monochrome pixels */ |
| 1483 if (transforms & PNG_TRANSFORM_INVERT_MONO) | 1494 if (transforms & PNG_TRANSFORM_INVERT_MONO) |
| 1484 png_set_invert_mono(png_ptr); | 1495 png_set_invert_mono(png_ptr); |
| 1485 #endif | 1496 #endif |
| 1486 | 1497 |
| 1487 #if defined(PNG_WRITE_SHIFT_SUPPORTED) | 1498 #if defined(PNG_WRITE_SHIFT_SUPPORTED) |
| 1488 /* Shift the pixels up to a legal bit depth and fill in | 1499 /* Shift the pixels up to a legal bit depth and fill in |
| 1489 * as appropriate to correctly scale the image. | 1500 * as appropriate to correctly scale the image. |
| 1490 */ | 1501 */ |
| 1491 if ((transforms & PNG_TRANSFORM_SHIFT) | 1502 if ((transforms & PNG_TRANSFORM_SHIFT) |
| 1492 && (info_ptr->valid & PNG_INFO_sBIT)) | 1503 && (info_ptr->valid & PNG_INFO_sBIT)) |
| 1493 png_set_shift(png_ptr, &info_ptr->sig_bit); | 1504 png_set_shift(png_ptr, &info_ptr->sig_bit); |
| 1494 #endif | 1505 #endif |
| 1495 | 1506 |
| 1496 #if defined(PNG_WRITE_PACK_SUPPORTED) | 1507 #if defined(PNG_WRITE_PACK_SUPPORTED) |
| 1497 /* pack pixels into bytes */ | 1508 /* Pack pixels into bytes */ |
| 1498 if (transforms & PNG_TRANSFORM_PACKING) | 1509 if (transforms & PNG_TRANSFORM_PACKING) |
| 1499 png_set_packing(png_ptr); | 1510 png_set_packing(png_ptr); |
| 1500 #endif | 1511 #endif |
| 1501 | 1512 |
| 1502 #if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) | 1513 #if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) |
| 1503 /* swap location of alpha bytes from ARGB to RGBA */ | 1514 /* Swap location of alpha bytes from ARGB to RGBA */ |
| 1504 if (transforms & PNG_TRANSFORM_SWAP_ALPHA) | 1515 if (transforms & PNG_TRANSFORM_SWAP_ALPHA) |
| 1505 png_set_swap_alpha(png_ptr); | 1516 png_set_swap_alpha(png_ptr); |
| 1506 #endif | 1517 #endif |
| 1507 | 1518 |
| 1508 #if defined(PNG_WRITE_FILLER_SUPPORTED) | 1519 #if defined(PNG_WRITE_FILLER_SUPPORTED) |
| 1509 /* Pack XRGB/RGBX/ARGB/RGBA into * RGB (4 channels -> 3 channels) */ | 1520 /* Pack XRGB/RGBX/ARGB/RGBA into * RGB (4 channels -> 3 channels) */ |
| 1510 if (transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER) | 1521 if (transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER) |
| 1511 png_set_filler(png_ptr, 0, PNG_FILLER_AFTER); | 1522 png_set_filler(png_ptr, 0, PNG_FILLER_AFTER); |
| 1512 else if (transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) | 1523 else if (transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) |
| 1513 png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); | 1524 png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); |
| 1514 #endif | 1525 #endif |
| 1515 | 1526 |
| 1516 #if defined(PNG_WRITE_BGR_SUPPORTED) | 1527 #if defined(PNG_WRITE_BGR_SUPPORTED) |
| 1517 /* flip BGR pixels to RGB */ | 1528 /* Flip BGR pixels to RGB */ |
| 1518 if (transforms & PNG_TRANSFORM_BGR) | 1529 if (transforms & PNG_TRANSFORM_BGR) |
| 1519 png_set_bgr(png_ptr); | 1530 png_set_bgr(png_ptr); |
| 1520 #endif | 1531 #endif |
| 1521 | 1532 |
| 1522 #if defined(PNG_WRITE_SWAP_SUPPORTED) | 1533 #if defined(PNG_WRITE_SWAP_SUPPORTED) |
| 1523 /* swap bytes of 16-bit files to most significant byte first */ | 1534 /* Swap bytes of 16-bit files to most significant byte first */ |
| 1524 if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) | 1535 if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) |
| 1525 png_set_swap(png_ptr); | 1536 png_set_swap(png_ptr); |
| 1526 #endif | 1537 #endif |
| 1527 | 1538 |
| 1528 #if defined(PNG_WRITE_PACKSWAP_SUPPORTED) | 1539 #if defined(PNG_WRITE_PACKSWAP_SUPPORTED) |
| 1529 /* swap bits of 1, 2, 4 bit packed pixel formats */ | 1540 /* Swap bits of 1, 2, 4 bit packed pixel formats */ |
| 1530 if (transforms & PNG_TRANSFORM_PACKSWAP) | 1541 if (transforms & PNG_TRANSFORM_PACKSWAP) |
| 1531 png_set_packswap(png_ptr); | 1542 png_set_packswap(png_ptr); |
| 1532 #endif | 1543 #endif |
| 1533 | 1544 |
| 1534 /* ----------------------- end of transformations ------------------- */ | 1545 /* ----------------------- end of transformations ------------------- */ |
| 1535 | 1546 |
| 1536 /* write the bits */ | 1547 /* Write the bits */ |
| 1537 if (info_ptr->valid & PNG_INFO_IDAT) | 1548 if (info_ptr->valid & PNG_INFO_IDAT) |
| 1538 png_write_image(png_ptr, info_ptr->row_pointers); | 1549 png_write_image(png_ptr, info_ptr->row_pointers); |
| 1539 | 1550 |
| 1540 /* It is REQUIRED to call this to finish writing the rest of the file */ | 1551 /* It is REQUIRED to call this to finish writing the rest of the file */ |
| 1541 png_write_end(png_ptr, info_ptr); | 1552 png_write_end(png_ptr, info_ptr); |
| 1542 | 1553 |
| 1543 transforms = transforms; /* quiet compiler warnings */ | 1554 transforms = transforms; /* Quiet compiler warnings */ |
| 1544 params = params; | 1555 params = params; |
| 1545 } | 1556 } |
| 1546 #endif | 1557 #endif |
| 1547 #endif /* PNG_WRITE_SUPPORTED */ | 1558 #endif /* PNG_WRITE_SUPPORTED */ |
| OLD | NEW |