Created
April 2, 2012 09:08
-
-
Save purcell/2281924 to your computer and use it in GitHub Desktop.
Metapixel patch for compatibility with libpng 1.5
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff -u metapixel-1.0.2/debian/changelog metapixel-1.0.2/debian/changelog | |
--- 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); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment