--- metapixel-1.0.2.orig/rwimg/rwpng.c +++ metapixel-1.0.2/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);