Permalink
Showing
with
178 additions
and 2 deletions.
| @@ -0,0 +1,175 @@ | ||
| diff -u metapixel-1.0.2/debian/changelog metapixel-1.0.2/debian/changelog | ||
| --- rwimg/rwpng.c | ||
| +++ rwimg/rwpng.c | ||
| @@ -57,19 +57,39 @@ | ||
| data->end_info = png_create_info_struct(data->png_ptr); | ||
| assert(data->end_info != 0); | ||
|
|
||
| +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 | ||
| + if (setjmp(png_jmpbuf((data->png_ptr)))) | ||
| +#else | ||
| if (setjmp(data->png_ptr->jmpbuf)) | ||
| +#endif | ||
| assert(0); | ||
|
|
||
| - png_init_io(data->png_ptr, data->file); | ||
| - | ||
| +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 | ||
| + png_init_io(data->png_ptr, data->file); | ||
| + png_read_info(data->png_ptr, data->info_ptr); | ||
| +#else | ||
| + png_init_io(data->png_ptr, data->file); | ||
| png_read_info(data->png_ptr, data->info_ptr); | ||
| +#endif | ||
|
|
||
| +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 | ||
| + *width = png_get_image_width(data->png_ptr, data->info_ptr); | ||
| + *height = png_get_image_height(data->png_ptr, data->info_ptr); | ||
| + { | ||
| + png_byte value = png_get_bit_depth(data->png_ptr, data->info_ptr); | ||
| + assert(value == 8 || value == 16); | ||
| + value = png_get_color_type(data->png_ptr, data->info_ptr); | ||
| + assert(value == PNG_COLOR_TYPE_RGB || value == PNG_COLOR_TYPE_RGB_ALPHA); | ||
| + value = png_get_interlace_type(data->png_ptr, data->info_ptr); | ||
| + assert(value == PNG_INTERLACE_NONE); | ||
| + } | ||
| +#else | ||
| *width = data->info_ptr->width; | ||
| *height = data->info_ptr->height; | ||
| - | ||
| assert(data->info_ptr->bit_depth == 8 || data->info_ptr->bit_depth == 16); | ||
| assert(data->info_ptr->color_type == PNG_COLOR_TYPE_RGB || data->info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA); | ||
| assert(data->info_ptr->interlace_type == PNG_INTERLACE_NONE); | ||
| +#endif | ||
|
|
||
| data->have_read = 0; | ||
|
|
||
| @@ -81,32 +101,51 @@ | ||
| { | ||
| png_data_t *data = (png_data_t*)_data; | ||
| int i; | ||
| - int bps, spp; | ||
| + int bps, spp, width; | ||
| unsigned char *row; | ||
|
|
||
| +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 | ||
| + | ||
| + if (setjmp(png_jmpbuf((data->png_ptr)))) | ||
| +#else | ||
| if (setjmp(data->png_ptr->jmpbuf)) | ||
| +#endif | ||
| assert(0); | ||
|
|
||
| +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 | ||
| + if(png_get_color_type(data->png_ptr, data->info_ptr) == PNG_COLOR_TYPE_RGB) | ||
| +#else | ||
| if (data->info_ptr->color_type == PNG_COLOR_TYPE_RGB) | ||
| +#endif | ||
| spp = 3; | ||
| else | ||
| spp = 4; | ||
|
|
||
| +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 | ||
| + if(png_get_bit_depth(data->png_ptr, data->info_ptr) == 16) | ||
| +#else | ||
| if (data->info_ptr->bit_depth == 16) | ||
| +#endif | ||
| bps = 2; | ||
| else | ||
| bps = 1; | ||
|
|
||
| - row = (unsigned char*)malloc(data->info_ptr->width * spp * bps); | ||
| +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 | ||
| + width = png_get_image_width(data->png_ptr, data->info_ptr); | ||
| +#else | ||
| + width = data->info_ptr->width: | ||
| +#endif | ||
| + | ||
| + row = (unsigned char*)malloc(width * spp * bps); | ||
|
|
||
| for (i = 0; i < num_lines; ++i) | ||
| { | ||
| int j, channel; | ||
|
|
||
| png_read_row(data->png_ptr, (png_bytep)row, 0); | ||
| - for (j = 0; j < data->info_ptr->width; ++j) | ||
| + for (j = 0; j < width; ++j) | ||
| for (channel = 0; channel < 3; ++channel) | ||
| - lines[i * data->info_ptr->width * 3 + j * 3 + channel] = row[j * spp * bps + channel * bps]; | ||
| + lines[i * width * 3 + j * 3 + channel] = row[j * spp * bps + channel * bps]; | ||
| } | ||
|
|
||
| free(row); | ||
| @@ -119,7 +158,11 @@ | ||
| { | ||
| png_data_t *data = (png_data_t*)_data; | ||
|
|
||
| +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 | ||
| + if (setjmp(png_jmpbuf((data->png_ptr)))) | ||
| +#else | ||
| if (setjmp(data->png_ptr->jmpbuf)) | ||
| +#endif | ||
| assert(0); | ||
|
|
||
| if (data->have_read) | ||
| @@ -148,7 +191,11 @@ | ||
| data->info_ptr = png_create_info_struct(data->png_ptr); | ||
| assert(data->info_ptr != 0); | ||
|
|
||
| +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 | ||
| + if (setjmp(png_jmpbuf((data->png_ptr)))) | ||
| +#else | ||
| if (setjmp(data->png_ptr->jmpbuf)) | ||
| +#endif | ||
| assert(0); | ||
|
|
||
| if (pixel_stride == 4) | ||
| @@ -156,6 +203,16 @@ | ||
|
|
||
| png_init_io(data->png_ptr, data->file); | ||
|
|
||
| +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 | ||
| + png_set_IHDR(data->png_ptr, data->info_ptr, | ||
| + width, height, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, | ||
| + PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); | ||
| + | ||
| + /* Maybe does not need following. */ | ||
| + png_set_tRNS(data->png_ptr, data->info_ptr, NULL, 0, NULL); | ||
| + png_set_PLTE(data->png_ptr, data->info_ptr, NULL, 0); | ||
| + png_set_invalid(data->png_ptr, data->info_ptr, 0); | ||
| +#else | ||
| data->info_ptr->width = width; | ||
| data->info_ptr->height = height; | ||
| data->info_ptr->valid = 0; | ||
| @@ -168,6 +225,7 @@ | ||
| data->info_ptr->compression_type = PNG_COMPRESSION_TYPE_DEFAULT; | ||
| data->info_ptr->filter_type = PNG_FILTER_TYPE_DEFAULT; | ||
| data->info_ptr->interlace_type = PNG_INTERLACE_NONE; | ||
| +#endif | ||
|
|
||
| png_write_info(data->png_ptr, data->info_ptr); | ||
|
|
||
| @@ -182,7 +240,11 @@ | ||
| png_data_t *data = (png_data_t*)_data; | ||
| int i; | ||
|
|
||
| +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 | ||
| + if (setjmp(png_jmpbuf((data->png_ptr)))) | ||
| +#else | ||
| if (setjmp(data->png_ptr->jmpbuf)) | ||
| +#endif | ||
| assert(0); | ||
|
|
||
| for (i = 0; i < num_lines; ++i) | ||
| @@ -194,7 +256,11 @@ | ||
| { | ||
| png_data_t *data = (png_data_t*)_data; | ||
|
|
||
| +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 | ||
| + if (setjmp(png_jmpbuf((data->png_ptr)))) | ||
| +#else | ||
| if (setjmp(data->png_ptr->jmpbuf)) | ||
| +#endif | ||
| assert(0); | ||
|
|
||
| png_write_end(data->png_ptr, data->info_ptr); |