diff options
| author | Waldemar Brodkorb <wbx@openadk.org> | 2011-03-31 20:21:13 +0200 | 
|---|---|---|
| committer | Waldemar Brodkorb <wbx@openadk.org> | 2011-03-31 20:21:13 +0200 | 
| commit | f4e50548b0d41f5b4e6faae3ddc7283dd1a5dd6c (patch) | |
| tree | 50b3bae39301c2ef89bbbabdb843a62d679e034e /package/libpng/patches/001-apng.patch | |
| parent | c2bd3a43342e37a05a97e12581dd2bd52993877a (diff) | |
I am to tupid for git, today.
Revert "Revert "fix conflict, autoseect libgcj""
This reverts commit c2bd3a43342e37a05a97e12581dd2bd52993877a.
Diffstat (limited to 'package/libpng/patches/001-apng.patch')
| -rw-r--r-- | package/libpng/patches/001-apng.patch | 895 | 
1 files changed, 426 insertions, 469 deletions
| diff --git a/package/libpng/patches/001-apng.patch b/package/libpng/patches/001-apng.patch index 3af4a0547..3b68eea9f 100644 --- a/package/libpng/patches/001-apng.patch +++ b/package/libpng/patches/001-apng.patch @@ -1,51 +1,7 @@ -diff -Nur libpng-1.2.44.orig/png.c libpng-1.2.44/png.c ---- libpng-1.2.44.orig/png.c	2010-06-26 02:31:14.000000000 +0200 -+++ libpng-1.2.44/png.c	2010-07-08 21:21:33.745873377 +0200 -@@ -56,6 +56,11 @@ - PNG_tIME; - PNG_tRNS; - PNG_zTXt; -+#ifdef PNG_APNG_SUPPORTED -+PNG_acTL; -+PNG_fcTL; -+PNG_fdAT; -+#endif -  - #ifdef PNG_READ_SUPPORTED - /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ -diff -Nur libpng-1.2.44.orig/pngconf.h libpng-1.2.44/pngconf.h ---- libpng-1.2.44.orig/pngconf.h	2010-06-26 02:31:14.000000000 +0200 -+++ libpng-1.2.44/pngconf.h	2010-07-08 21:21:33.906029659 +0200 -@@ -951,6 +951,10 @@ - #  define PNG_NO_READ_tEXt - #  define PNG_NO_READ_zTXt - #endif -+#ifndef PNG_NO_READ_APNG -+#  define PNG_READ_APNG_SUPPORTED -+#  define PNG_APNG_SUPPORTED -+#endif - #ifndef PNG_NO_READ_bKGD - #  define PNG_READ_bKGD_SUPPORTED - #  define PNG_bKGD_SUPPORTED -@@ -1177,6 +1181,14 @@ - #    define PNG_TEXT_SUPPORTED - #  endif - #endif -+#ifndef PNG_NO_WRITE_APNG -+#  ifndef PNG_WRITE_APNG_SUPPORTED -+#    define PNG_WRITE_APNG_SUPPORTED -+#  endif -+#  ifndef PNG_APNG_SUPPORTED -+#    define PNG_APNG_SUPPORTED -+#  endif -+#endif -  - #ifdef PNG_WRITE_tIME_SUPPORTED - #  ifndef PNG_NO_CONVERT_tIME -diff -Nur libpng-1.2.44.orig/pngget.c libpng-1.2.44/pngget.c ---- libpng-1.2.44.orig/pngget.c	2010-06-26 02:31:14.000000000 +0200 -+++ libpng-1.2.44/pngget.c	2010-07-08 21:21:33.676118515 +0200 -@@ -842,6 +842,167 @@ +diff -Nur libpng-1.5.1.orig/pngget.c libpng-1.5.1/pngget.c +--- libpng-1.5.1.orig/pngget.c	2011-02-03 05:58:17.000000000 +0100 ++++ libpng-1.5.1/pngget.c	2011-03-27 19:43:38.404620874 +0200 +@@ -937,6 +937,167 @@   }   #endif @@ -55,7 +11,7 @@ diff -Nur libpng-1.2.44.orig/pngget.c libpng-1.2.44/pngget.c  +             png_uint_32 *num_frames, png_uint_32 *num_plays)  +{  +    png_debug1(1, "in %s retrieval function", "acTL"); -+     ++  +    if (png_ptr != NULL && info_ptr != NULL &&  +        (info_ptr->valid & PNG_INFO_acTL) &&  +        num_frames != NULL && num_plays != NULL) @@ -64,7 +20,7 @@ diff -Nur libpng-1.2.44.orig/pngget.c libpng-1.2.44/pngget.c  +        *num_plays = info_ptr->num_plays;  +        return (1);  +    } -+     ++  +    return (0);  +}  + @@ -72,7 +28,7 @@ diff -Nur libpng-1.2.44.orig/pngget.c libpng-1.2.44/pngget.c  +png_get_num_frames(png_structp png_ptr, png_infop info_ptr)  +{  +    png_debug(1, "in png_get_num_frames()"); -+     ++  +    if (png_ptr != NULL && info_ptr != NULL)  +        return (info_ptr->num_frames);  +    return (0); @@ -82,7 +38,7 @@ diff -Nur libpng-1.2.44.orig/pngget.c libpng-1.2.44/pngget.c  +png_get_num_plays(png_structp png_ptr, png_infop info_ptr)  +{  +    png_debug(1, "in png_get_num_plays()"); -+     ++  +    if (png_ptr != NULL && info_ptr != NULL)  +        return (info_ptr->num_plays);  +    return (0); @@ -96,7 +52,7 @@ diff -Nur libpng-1.2.44.orig/pngget.c libpng-1.2.44/pngget.c  +             png_byte *dispose_op, png_byte *blend_op)  +{  +    png_debug1(1, "in %s retrieval function", "fcTL"); -+     ++  +    if (png_ptr != NULL && info_ptr != NULL &&  +        (info_ptr->valid & PNG_INFO_fcTL) &&  +        width != NULL && height != NULL &&  @@ -114,7 +70,7 @@ diff -Nur libpng-1.2.44.orig/pngget.c libpng-1.2.44/pngget.c  +        *blend_op = info_ptr->next_frame_blend_op;  +        return (1);  +    } -+     ++  +    return (0);  +}  + @@ -122,7 +78,7 @@ diff -Nur libpng-1.2.44.orig/pngget.c libpng-1.2.44/pngget.c  +png_get_next_frame_width(png_structp png_ptr, png_infop info_ptr)  +{  +    png_debug(1, "in png_get_next_frame_width()"); -+     ++  +    if (png_ptr != NULL && info_ptr != NULL)  +        return (info_ptr->next_frame_width);  +    return (0); @@ -132,7 +88,7 @@ diff -Nur libpng-1.2.44.orig/pngget.c libpng-1.2.44/pngget.c  +png_get_next_frame_height(png_structp png_ptr, png_infop info_ptr)  +{  +    png_debug(1, "in png_get_next_frame_height()"); -+     ++  +    if (png_ptr != NULL && info_ptr != NULL)  +        return (info_ptr->next_frame_height);  +    return (0); @@ -142,7 +98,7 @@ diff -Nur libpng-1.2.44.orig/pngget.c libpng-1.2.44/pngget.c  +png_get_next_frame_x_offset(png_structp png_ptr, png_infop info_ptr)  +{  +    png_debug(1, "in png_get_next_frame_x_offset()"); -+     ++  +    if (png_ptr != NULL && info_ptr != NULL)  +        return (info_ptr->next_frame_x_offset);  +    return (0); @@ -152,7 +108,7 @@ diff -Nur libpng-1.2.44.orig/pngget.c libpng-1.2.44/pngget.c  +png_get_next_frame_y_offset(png_structp png_ptr, png_infop info_ptr)  +{  +    png_debug(1, "in png_get_next_frame_y_offset()"); -+     ++  +    if (png_ptr != NULL && info_ptr != NULL)  +        return (info_ptr->next_frame_y_offset);  +    return (0); @@ -162,7 +118,7 @@ diff -Nur libpng-1.2.44.orig/pngget.c libpng-1.2.44/pngget.c  +png_get_next_frame_delay_num(png_structp png_ptr, png_infop info_ptr)  +{  +    png_debug(1, "in png_get_next_frame_delay_num()"); -+     ++  +    if (png_ptr != NULL && info_ptr != NULL)  +        return (info_ptr->next_frame_delay_num);  +    return (0); @@ -172,7 +128,7 @@ diff -Nur libpng-1.2.44.orig/pngget.c libpng-1.2.44/pngget.c  +png_get_next_frame_delay_den(png_structp png_ptr, png_infop info_ptr)  +{  +    png_debug(1, "in png_get_next_frame_delay_den()"); -+     ++  +    if (png_ptr != NULL && info_ptr != NULL)  +        return (info_ptr->next_frame_delay_den);  +    return (0); @@ -182,7 +138,7 @@ diff -Nur libpng-1.2.44.orig/pngget.c libpng-1.2.44/pngget.c  +png_get_next_frame_dispose_op(png_structp png_ptr, png_infop info_ptr)  +{  +    png_debug(1, "in png_get_next_frame_dispose_op()"); -+     ++  +    if (png_ptr != NULL && info_ptr != NULL)  +        return (info_ptr->next_frame_dispose_op);  +    return (0); @@ -192,7 +148,7 @@ diff -Nur libpng-1.2.44.orig/pngget.c libpng-1.2.44/pngget.c  +png_get_next_frame_blend_op(png_structp png_ptr, png_infop info_ptr)  +{  +    png_debug(1, "in png_get_next_frame_blend_op()"); -+     ++  +    if (png_ptr != NULL && info_ptr != NULL)  +        return (info_ptr->next_frame_blend_op);  +    return (0); @@ -202,41 +158,32 @@ diff -Nur libpng-1.2.44.orig/pngget.c libpng-1.2.44/pngget.c  +png_get_first_frame_is_hidden(png_structp png_ptr, png_infop info_ptr)  +{  +    png_debug(1, "in png_first_frame_is_hidden()"); -+     ++  +    if (png_ptr != NULL)  +       return (png_byte)(png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN); -+     ++  +    return 0;  +}  +#endif /* PNG_APNG_SUPPORTED */  +   #ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED - png_uint_32 PNGAPI - png_get_unknown_chunks(png_structp png_ptr, png_infop info_ptr, -diff -Nur libpng-1.2.44.orig/png.h libpng-1.2.44/png.h ---- libpng-1.2.44.orig/png.h	2010-06-26 02:31:14.000000000 +0200 -+++ libpng-1.2.44/png.h	2010-07-08 21:21:33.796029652 +0200 -@@ -1041,6 +1041,19 @@ -    png_fixed_point int_y_blue PNG_DEPSTRUCT; + int PNGAPI + png_get_unknown_chunks(png_const_structp png_ptr, png_const_infop info_ptr, +diff -Nur libpng-1.5.1.orig/png.h libpng-1.5.1/png.h +--- libpng-1.5.1.orig/png.h	2011-02-03 05:58:16.000000000 +0100 ++++ libpng-1.5.1/png.h	2011-03-27 19:43:38.414620995 +0200 +@@ -404,6 +404,10 @@ + #   include "pnglibconf.h"   #endif -+#ifdef PNG_APNG_SUPPORTED -+   png_uint_32 num_frames; /* including default image */ -+   png_uint_32 num_plays; -+   png_uint_32 next_frame_width; -+   png_uint_32 next_frame_height; -+   png_uint_32 next_frame_x_offset; -+   png_uint_32 next_frame_y_offset; -+   png_uint_16 next_frame_delay_num; -+   png_uint_16 next_frame_delay_den; -+   png_byte next_frame_dispose_op; -+   png_byte next_frame_blend_op; -+#endif -+ - } png_info; -  - typedef png_info FAR * png_infop; -@@ -1142,6 +1155,10 @@ ++#define PNG_APNG_SUPPORTED ++#define PNG_READ_APNG_SUPPORTED ++#define PNG_WRITE_APNG_SUPPORTED ++ + #ifndef PNG_VERSION_INFO_ONLY + /* Standard header files (not needed for the version info) */ + #  ifdef PNG_SETJMP_SUPPORTED +@@ -766,6 +770,10 @@   #define PNG_INFO_sPLT 0x2000   /* ESR, 1.0.6 */   #define PNG_INFO_sCAL 0x4000   /* ESR, 1.0.6 */   #define PNG_INFO_IDAT 0x8000L  /* ESR, 1.0.6 */ @@ -247,257 +194,149 @@ diff -Nur libpng-1.2.44.orig/png.h libpng-1.2.44/png.h   /* This is used for the transformation routines, as some of them    * change these values for the row.  It also should enable using -@@ -1182,6 +1199,10 @@ - typedef void (PNGAPI *png_progressive_end_ptr) PNGARG((png_structp, png_infop)); - typedef void (PNGAPI *png_progressive_row_ptr) PNGARG((png_structp, png_bytep, -    png_uint_32, int)); +@@ -811,6 +819,10 @@ +     (png_structp, png_infop), ); + typedef PNG_CALLBACK(void, *png_progressive_row_ptr, +     (png_structp, png_bytep, png_uint_32, int), );  +#ifdef PNG_APNG_SUPPORTED -+typedef void (PNGAPI *png_progressive_frame_ptr) PNGARG((png_structp,  -+   png_uint_32)); ++typedef PNG_CALLBACK(void, *png_progressive_frame_ptr, (png_structp, ++    png_uint_32),);  +#endif   #endif   #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ -@@ -1527,6 +1548,39 @@ -    png_uint_32 user_height_max PNG_DEPSTRUCT; - #endif +@@ -1242,6 +1254,18 @@ + PNG_EXPORT(60, void, png_write_image, +     (png_structp png_ptr, png_bytepp image)); -+#ifdef PNG_APNG_SUPPORTED -+   png_uint_32 apng_flags; -+   png_uint_32 next_seq_num;         /* next fcTL/fdAT chunk sequence number */ -+   png_uint_32 first_frame_width; -+   png_uint_32 first_frame_height; -+ -+#ifdef PNG_READ_APNG_SUPPORTED -+   png_uint_32 num_frames_read;      /* incremented after all image data of */ -+                                     /* a frame is read */ -+#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -+   png_progressive_frame_ptr frame_info_fn; /* frame info read callback */ -+   png_progressive_frame_ptr frame_end_fn;  /* frame data read callback */ -+#endif -+#endif -+  +#ifdef PNG_WRITE_APNG_SUPPORTED -+   png_uint_32 num_frames_to_write; -+   png_uint_32 num_frames_written; -+#endif -+ -+/* For png_struct.apng_flags: */ -+#define PNG_FIRST_FRAME_HIDDEN       0x0001 -+ -+/* dispose_op flags from inside fcTL */ -+#define PNG_DISPOSE_OP_NONE        0x00 -+#define PNG_DISPOSE_OP_BACKGROUND  0x01 -+#define PNG_DISPOSE_OP_PREVIOUS    0x02 -+ -+/* blend_op flags from inside fcTL */ -+#define PNG_BLEND_OP_SOURCE        0x00 -+#define PNG_BLEND_OP_OVER          0x01 -+#endif /* PNG_APNG_SUPPORTED */ -+ - /* New member added in libpng-1.0.25 and 1.2.17 */ - #ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED -    /* Storage for unknown chunk that the library doesn't recognize. */ -@@ -1861,6 +1915,18 @@ - extern PNG_EXPORT(void,png_write_image) PNGARG((png_structp png_ptr, -    png_bytepp image)); -  -+#ifdef PNG_WRITE_APNG_SUPPORTED -+extern PNG_EXPORT (void,png_write_frame_head) PNGARG((png_structp png_ptr, -+   png_infop png_info, png_bytepp row_pointers, -+   png_uint_32 width, png_uint_32 height, -+   png_uint_32 x_offset, png_uint_32 y_offset,  -+   png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op, -+   png_byte blend_op)); ++PNG_EXPORT(1001, void, png_write_frame_head, (png_structp png_ptr, ++    png_infop info_ptr, png_bytepp row_pointers, ++    png_uint_32 width, png_uint_32 height, ++    png_uint_32 x_offset, png_uint_32 y_offset, ++    png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op, ++    png_byte blend_op));  + -+extern PNG_EXPORT (void,png_write_frame_tail) PNGARG((png_structp png_ptr, -+   png_infop png_info)); ++PNG_EXPORT(1002, void, png_write_frame_tail, (png_structp png_ptr, ++    png_infop info_ptr));  +#endif -+    - /* Writes the end of the PNG file. */ - extern PNG_EXPORT(void,png_write_end) PNGARG((png_structp png_ptr, -    png_infop info_ptr)); -@@ -2114,6 +2180,11 @@ -    png_voidp progressive_ptr, -    png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, -    png_progressive_end_ptr end_fn)); ++ + /* Write the end of the PNG file. */ + PNG_EXPORT(61, void, png_write_end, +     (png_structp png_ptr, png_infop info_ptr)); +@@ -1496,6 +1520,11 @@ + PNG_EXPORT(90, void, png_set_progressive_read_fn, (png_structp png_ptr,  +     png_voidp progressive_ptr, png_progressive_info_ptr info_fn,  +     png_progressive_row_ptr row_fn, png_progressive_end_ptr end_fn));  +#ifdef PNG_READ_APNG_SUPPORTED -+extern PNG_EXPORT(void,png_set_progressive_frame_fn) PNGARG((png_structp png_ptr, -+   png_progressive_frame_ptr frame_info_fn, -+   png_progressive_frame_ptr frame_end_fn)); ++PNG_EXPORT(1003, void, png_set_progressive_frame_fn, (png_structp png_ptr, ++    png_progressive_frame_ptr frame_info_fn, ++    png_progressive_frame_ptr frame_end_fn));  +#endif   /* Returns the user pointer associated with the push read functions */ - extern PNG_EXPORT(png_voidp,png_get_progressive_ptr) -@@ -2554,6 +2625,59 @@ - #endif - #endif /* PNG_sCAL_SUPPORTED || PNG_WRITE_sCAL_SUPPORTED */ + PNG_EXPORT(91, png_voidp, png_get_progressive_ptr, (png_const_structp png_ptr)); +@@ -1970,6 +1999,62 @@ +     int unit, png_const_charp swidth, png_const_charp sheight)); + #endif /* PNG_sCAL_SUPPORTED */  +#ifdef PNG_APNG_SUPPORTED -+extern PNG_EXPORT(png_uint_32,png_get_acTL) PNGARG((png_structp png_ptr, ++PNG_EXPORT(1004, png_uint_32, png_get_acTL, (png_structp png_ptr,  +   png_infop info_ptr, png_uint_32 *num_frames, png_uint_32 *num_plays)); -+extern PNG_EXPORT(png_uint_32,png_set_acTL) PNGARG((png_structp png_ptr,  ++PNG_EXPORT(1005, png_uint_32, png_set_acTL, (png_structp png_ptr,  +   png_infop info_ptr, png_uint_32 num_frames, png_uint_32 num_plays)); -+extern PNG_EXPORT(png_uint_32,png_get_num_frames) PNGARG((png_structp png_ptr, ++PNG_EXPORT(1006, png_uint_32, png_get_num_frames, (png_structp png_ptr, ++   png_infop info_ptr)); ++PNG_EXPORT(1007, png_uint_32,png_get_num_plays, (png_structp png_ptr,  +   png_infop info_ptr)); -+extern PNG_EXPORT(png_uint_32,png_get_num_plays)  -+   PNGARG((png_structp png_ptr, png_infop info_ptr));  + -+extern PNG_EXPORT(png_uint_32,png_get_next_frame_fcTL)  -+   PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 *width,  -+   png_uint_32 *height, png_uint_32 *x_offset, png_uint_32 *y_offset,  ++PNG_EXPORT(1008, png_uint_32, png_get_next_frame_fcTL, ++   (png_structp png_ptr, png_infop info_ptr, png_uint_32 *width, ++   png_uint_32 *height, png_uint_32 *x_offset, png_uint_32 *y_offset,  +   png_uint_16 *delay_num, png_uint_16 *delay_den, png_byte *dispose_op,  +   png_byte *blend_op)); -+extern PNG_EXPORT(png_uint_32,png_set_next_frame_fcTL)  -+   PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 width,  -+   png_uint_32 height, png_uint_32 x_offset, png_uint_32 y_offset,  ++PNG_EXPORT(1009, png_uint_32, png_set_next_frame_fcTL, ++   (png_structp png_ptr, png_infop info_ptr, png_uint_32 width, ++   png_uint_32 height, png_uint_32 x_offset, png_uint_32 y_offset,  +   png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op,  +   png_byte blend_op)); -+extern PNG_EXPORT(void,png_ensure_fcTL_is_valid) -+   PNGARG((png_structp png_ptr, -+   png_uint_32 width, png_uint_32 height, -+   png_uint_32 x_offset, png_uint_32 y_offset, -+   png_uint_16 delay_num, png_uint_16 delay_den, -+   png_byte dispose_op, png_byte blend_op)); -+extern PNG_EXPORT(png_uint_32,png_get_next_frame_width) -+   PNGARG((png_structp png_ptr, png_infop info_ptr)); -+extern PNG_EXPORT(png_uint_32,png_get_next_frame_height) -+   PNGARG((png_structp png_ptr, png_infop info_ptr)); -+extern PNG_EXPORT(png_uint_32,png_get_next_frame_x_offset) -+   PNGARG((png_structp png_ptr, png_infop info_ptr)); -+extern PNG_EXPORT(png_uint_32,png_get_next_frame_y_offset) -+   PNGARG((png_structp png_ptr, png_infop info_ptr)); -+extern PNG_EXPORT(png_uint_16,png_get_next_frame_delay_num) -+   PNGARG((png_structp png_ptr, png_infop info_ptr)); -+extern PNG_EXPORT(png_uint_16,png_get_next_frame_delay_den) -+   PNGARG((png_structp png_ptr, png_infop info_ptr)); -+extern PNG_EXPORT(png_byte,png_get_next_frame_dispose_op) -+   PNGARG((png_structp png_ptr, png_infop info_ptr)); -+extern PNG_EXPORT(png_byte,png_get_next_frame_blend_op) -+   PNGARG((png_structp png_ptr, png_infop info_ptr)); -+extern PNG_EXPORT(png_byte,png_get_first_frame_is_hidden) -+   PNGARG((png_structp png_ptr, png_infop info_ptr)); -+extern PNG_EXPORT(png_uint_32,png_set_first_frame_is_hidden) -+   PNGARG((png_structp png_ptr, png_infop info_ptr, png_byte is_hidden)); ++PNG_EXPORT(1010, png_uint_32, png_get_next_frame_width, ++   (png_structp png_ptr, png_infop info_ptr)); ++PNG_EXPORT(1011, png_uint_32, png_get_next_frame_height, ++   (png_structp png_ptr, png_infop info_ptr)); ++PNG_EXPORT(1012, png_uint_32, png_get_next_frame_x_offset, ++   (png_structp png_ptr, png_infop info_ptr)); ++PNG_EXPORT(1013, png_uint_32, png_get_next_frame_y_offset, ++   (png_structp png_ptr, png_infop info_ptr)); ++PNG_EXPORT(1014, png_uint_16, png_get_next_frame_delay_num, ++   (png_structp png_ptr, png_infop info_ptr)); ++PNG_EXPORT(1015, png_uint_16, png_get_next_frame_delay_den, ++   (png_structp png_ptr, png_infop info_ptr)); ++PNG_EXPORT(1016, png_byte, png_get_next_frame_dispose_op, ++   (png_structp png_ptr, png_infop info_ptr)); ++PNG_EXPORT(1017, png_byte, png_get_next_frame_blend_op, ++   (png_structp png_ptr, png_infop info_ptr)); ++PNG_EXPORT(1018, png_byte, png_get_first_frame_is_hidden, ++   (png_structp png_ptr, png_infop info_ptr)); ++PNG_EXPORT(1019, png_uint_32, png_set_first_frame_is_hidden, ++   (png_structp png_ptr, png_infop info_ptr, png_byte is_hidden)); ++ ++/* dispose_op flags from inside fcTL */ ++#define PNG_DISPOSE_OP_NONE        0x00 ++#define PNG_DISPOSE_OP_BACKGROUND  0x01 ++#define PNG_DISPOSE_OP_PREVIOUS    0x02 ++ ++/* blend_op flags from inside fcTL */ ++#define PNG_BLEND_OP_SOURCE        0x00 ++#define PNG_BLEND_OP_OVER          0x01  +#endif /* PNG_APNG_SUPPORTED */  +  +#ifdef PNG_READ_APNG_SUPPORTED -+extern PNG_EXPORT(void,png_read_frame_head) PNGARG((png_structp png_ptr, ++PNG_EXPORT(1020, void, png_read_frame_head, (png_structp png_ptr,  +   png_infop info_ptr));  +#endif  +   #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED   /* Provide a list of chunks and how they are to be handled, if the built-in      handling or default unknown chunk handling is not desired.  Any chunks not -@@ -2918,6 +3042,10 @@ - #define PNG_BACKGROUND_IS_GRAY     0x800 - #define PNG_HAVE_PNG_SIGNATURE    0x1000 - #define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */ -+#ifdef PNG_APNG_SUPPORTED -+#define PNG_HAVE_acTL             0x4000 -+#define PNG_HAVE_fcTL             0x8000L -+#endif -  - /* Flags for the transformations the PNG library does on the image data */ - #define PNG_BGR                0x0001 -@@ -3060,6 +3188,11 @@ - #define PNG_tIME png_byte png_tIME[5] = {116,  73,  77,  69, '\0'} - #define PNG_tRNS png_byte png_tRNS[5] = {116,  82,  78,  83, '\0'} - #define PNG_zTXt png_byte png_zTXt[5] = {122,  84,  88, 116, '\0'} -+#ifdef PNG_APNG_SUPPORTED -+#define PNG_acTL png_byte png_acTL[5] = { 97,  99,  84,  76, '\0'} -+#define PNG_fcTL png_byte png_fcTL[5] = {102,  99,  84,  76, '\0'} -+#define PNG_fdAT png_byte png_fdAT[5] = {102, 100,  65,  84, '\0'} -+#endif -  - #ifdef PNG_USE_GLOBAL_ARRAYS - PNG_EXPORT_VAR (png_byte FARDATA) png_IHDR[5]; -@@ -3083,6 +3216,11 @@ - PNG_EXPORT_VAR (png_byte FARDATA) png_tIME[5]; - PNG_EXPORT_VAR (png_byte FARDATA) png_tRNS[5]; - PNG_EXPORT_VAR (png_byte FARDATA) png_zTXt[5]; -+#ifdef PNG_APNG_SUPPORTED -+PNG_EXPORT_VAR (png_byte FARDATA) png_acTL[5]; -+PNG_EXPORT_VAR (png_byte FARDATA) png_fcTL[5]; -+PNG_EXPORT_VAR (png_byte FARDATA) png_fdAT[5]; -+#endif - #endif /* PNG_USE_GLOBAL_ARRAYS */ -  - #if defined(PNG_1_0_X) || defined (PNG_1_2_X) -@@ -3365,6 +3503,17 @@ - #endif +diff -Nur libpng-1.5.1.orig/pnginfo.h libpng-1.5.1/pnginfo.h +--- libpng-1.5.1.orig/pnginfo.h	2011-02-03 05:58:17.000000000 +0100 ++++ libpng-1.5.1/pnginfo.h	2011-03-27 19:43:38.543370848 +0200 +@@ -266,5 +266,18 @@ +    png_bytepp row_pointers;        /* the image bits */   #endif -+#ifdef PNG_WRITE_APNG_SUPPORTED -+PNG_EXTERN void png_write_acTL PNGARG((png_structp png_ptr, -+   png_uint_32 num_frames, png_uint_32 num_plays)); -+ -+PNG_EXTERN void png_write_fcTL PNGARG((png_structp png_ptr,  -+   png_uint_32 width, png_uint_32 height,  -+   png_uint_32 x_offset, png_uint_32 y_offset,  -+   png_uint_16 delay_num, png_uint_16 delay_den, -+   png_byte dispose_op, png_byte blend_op)); -+#endif -+ - /* Called when finished processing a row of data */ - PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr)) PNG_PRIVATE; -  -@@ -3417,6 +3566,20 @@ - PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr, -    png_infop info_ptr)) PNG_PRIVATE; -  -+#ifdef PNG_READ_APNG_SUPPORTED -+/* Private, reset some things to become ready for reading next frame */ -+PNG_EXTERN void png_read_reset PNGARG((png_structp png_ptr)); -+PNG_EXTERN void png_read_reinit PNGARG((png_structp png_ptr, -+   png_infop info_ptr)); -+PNG_EXTERN void png_progressive_read_reset PNGARG((png_structp png_ptr)); -+#endif -+#ifdef PNG_WRITE_APNG_SUPPORTED -+/* Private, reset some things to become ready for writing next frame */ -+PNG_EXTERN void png_write_reset PNGARG((png_structp png_ptr)); -+PNG_EXTERN void png_write_reinit PNGARG((png_structp png_ptr,  -+   png_infop info_ptr, png_uint_32 width, png_uint_32 height)); -+#endif -+ - /* These are the functions that do the transformations */ - #ifdef PNG_READ_FILLER_SUPPORTED - PNG_EXTERN void png_do_read_filler PNGARG((png_row_infop row_info, -@@ -3640,6 +3803,18 @@ -    png_uint_32 length)) PNG_PRIVATE; - #endif -  -+#ifdef PNG_READ_APNG_SUPPORTED -+PNG_EXTERN void png_handle_acTL PNGARG((png_structp png_ptr, png_infop info_ptr, -+   png_uint_32 length)); -+PNG_EXTERN void png_handle_fcTL PNGARG((png_structp png_ptr, png_infop info_ptr, -+   png_uint_32 length)); -+PNG_EXTERN void png_have_info PNGARG((png_structp png_ptr, png_infop info_ptr)); -+PNG_EXTERN void png_handle_fdAT PNGARG((png_structp png_ptr, png_infop info_ptr, -+   png_uint_32 length)); -+PNG_EXTERN void png_ensure_sequence_number PNGARG((png_structp png_ptr,  -+   png_uint_32 length)); ++#ifdef PNG_APNG_SUPPORTED ++   png_uint_32 num_frames; /* including default image */ ++   png_uint_32 num_plays; ++   png_uint_32 next_frame_width; ++   png_uint_32 next_frame_height; ++   png_uint_32 next_frame_x_offset; ++   png_uint_32 next_frame_y_offset; ++   png_uint_16 next_frame_delay_num; ++   png_uint_16 next_frame_delay_den; ++   png_byte next_frame_dispose_op; ++   png_byte next_frame_blend_op;  +#endif  + - PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr, -    png_infop info_ptr, png_uint_32 length)) PNG_PRIVATE; -  -diff -Nur libpng-1.2.44.orig/pngpread.c libpng-1.2.44/pngpread.c ---- libpng-1.2.44.orig/pngpread.c	2010-06-26 02:31:14.000000000 +0200 -+++ libpng-1.2.44/pngpread.c	2010-07-08 21:21:33.947205863 +0200 -@@ -206,6 +206,11 @@ + }; + #endif /* PNGINFO_H */ +diff -Nur libpng-1.5.1.orig/pngpread.c libpng-1.5.1/pngpread.c +--- libpng-1.5.1.orig/pngpread.c	2011-02-03 05:58:17.000000000 +0100 ++++ libpng-1.5.1/pngpread.c	2011-03-27 19:43:38.673370990 +0200 +@@ -263,6 +263,11 @@   #ifdef PNG_READ_zTXt_SUPPORTED -       PNG_CONST PNG_zTXt; +       PNG_zTXt;   #endif  +#ifdef PNG_READ_APNG_SUPPORTED -+      PNG_CONST PNG_acTL; -+      PNG_CONST PNG_fcTL; -+      PNG_CONST PNG_fdAT; ++      PNG_acTL; ++      PNG_fcTL; ++      PNG_fdAT;  +#endif - #endif /* PNG_USE_LOCAL_ARRAYS */      /* First we make sure we have enough data for the 4 byte chunk name -@@ -232,6 +237,103 @@ +     * and the 4 byte chunk length before proceeding with decoding the +@@ -288,6 +293,103 @@         png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;      } @@ -510,7 +349,7 @@ diff -Nur libpng-1.2.44.orig/pngpread.c libpng-1.2.44/pngpread.c  +         /* Discard trailing IDATs for the first frame */  +         if (png_ptr->mode & PNG_HAVE_fcTL || png_ptr->num_frames_read > 1)  +            png_error(png_ptr, "out of place IDAT"); -+          ++  +         if (png_ptr->push_length + 4 > png_ptr->buffer_size)  +         {  +            png_push_save_buffer(png_ptr); @@ -528,13 +367,13 @@ diff -Nur libpng-1.2.44.orig/pngpread.c libpng-1.2.44/pngpread.c  +            return;  +         }  +         png_ensure_sequence_number(png_ptr, 4); -+          ++  +         if (!(png_ptr->mode & PNG_HAVE_fcTL))  +         {  +            /* Discard trailing fdATs for frames other than the first */  +            if (png_ptr->num_frames_read < 2)  +               png_error(png_ptr, "out of place fdAT"); -+             ++  +            if (png_ptr->push_length + 4 > png_ptr->buffer_size)  +            {  +               png_push_save_buffer(png_ptr); @@ -550,7 +389,7 @@ diff -Nur libpng-1.2.44.orig/pngpread.c libpng-1.2.44/pngpread.c  +            png_ptr->idat_size = png_ptr->push_length - 4;  +            png_ptr->mode |= PNG_HAVE_IDAT;  +            png_ptr->process_mode = PNG_READ_IDAT_MODE; -+             ++  +            return;  +         }  +      } @@ -561,23 +400,23 @@ diff -Nur libpng-1.2.44.orig/pngpread.c libpng-1.2.44/pngpread.c  +            png_push_save_buffer(png_ptr);  +            return;  +         } -+          ++  +         png_read_reset(png_ptr);  +         png_ptr->mode &= ~PNG_HAVE_fcTL; -+          ++  +         png_handle_fcTL(png_ptr, info_ptr, png_ptr->push_length); -+          ++  +         if (!(png_ptr->mode & PNG_HAVE_fcTL))  +            png_error(png_ptr, "missing required fcTL chunk"); -+          ++  +         png_read_reinit(png_ptr, info_ptr);  +         png_progressive_read_reset(png_ptr); -+          ++  +         if (png_ptr->frame_info_fn != NULL)  +            (*(png_ptr->frame_info_fn))(png_ptr, png_ptr->num_frames_read); -+          ++  +         png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; -+          ++  +         return;  +      }  +      else @@ -593,16 +432,16 @@ diff -Nur libpng-1.2.44.orig/pngpread.c libpng-1.2.44/pngpread.c  +         png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;  +         return;  +      } -+       ++  +      return;  +   }  +#endif /* PNG_READ_APNG_SUPPORTED */  +      if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) -      if (png_ptr->mode & PNG_AFTER_IDAT) -         png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; -@@ -327,6 +429,9 @@ -             png_error(png_ptr, "Too many IDAT's found"); +       if (png_ptr->mode & PNG_AFTER_IDAT) +          png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; +@@ -383,6 +485,9 @@ +             png_benign_error(png_ptr, "Too many IDATs found");         }  +#ifdef PNG_READ_APNG_SUPPORTED @@ -611,7 +450,7 @@ diff -Nur libpng-1.2.44.orig/pngpread.c libpng-1.2.44/pngpread.c         png_ptr->idat_size = png_ptr->push_length;         png_ptr->mode |= PNG_HAVE_IDAT;         png_ptr->process_mode = PNG_READ_IDAT_MODE; -@@ -559,6 +664,38 @@ +@@ -615,6 +720,38 @@      }   #endif @@ -650,17 +489,14 @@ diff -Nur libpng-1.2.44.orig/pngpread.c libpng-1.2.44/pngpread.c      else      {         if (png_ptr->push_length + 4 > png_ptr->buffer_size) -@@ -738,13 +875,17 @@ +@@ -810,11 +947,15 @@   png_push_read_IDAT(png_structp png_ptr)   { - #ifdef PNG_USE_LOCAL_ARRAYS --   PNG_CONST PNG_IDAT; -+   PNG_IDAT; +    PNG_IDAT;  +#ifdef PNG_READ_APNG_SUPPORTED  +   PNG_fdAT;  +   PNG_IEND;  +#endif - #endif      if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))      {         png_byte chunk_length[4]; @@ -670,13 +506,13 @@ diff -Nur libpng-1.2.44.orig/pngpread.c libpng-1.2.44/pngpread.c         {            png_push_save_buffer(png_ptr);            return; -@@ -756,15 +897,62 @@ +@@ -826,17 +967,64 @@         png_crc_read(png_ptr, png_ptr->chunk_name, 4);         png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;  -      if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))  +#ifdef PNG_READ_APNG_SUPPORTED -+      if (png_memcmp(png_ptr->chunk_name, (png_bytep)png_fdAT, 4) ++      if (png_memcmp(png_ptr->chunk_name, png_fdAT, 4)  +          && png_ptr->num_frames_read > 0)  +      {  +          if (png_ptr->flags & PNG_FLAG_ZLIB_FINISHED) @@ -712,8 +548,10 @@ diff -Nur libpng-1.2.44.orig/pngpread.c libpng-1.2.44/pngpread.c  +         )         {            png_ptr->process_mode = PNG_READ_CHUNK_MODE; +             if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))               png_error(png_ptr, "Not enough compressed data"); +   +#ifdef PNG_READ_APNG_SUPPORTED  +         if (png_ptr->frame_end_fn != NULL)  +            (*(png_ptr->frame_end_fn))(png_ptr, png_ptr->num_frames_read); @@ -734,7 +572,7 @@ diff -Nur libpng-1.2.44.orig/pngpread.c libpng-1.2.44/pngpread.c      }      if (png_ptr->idat_size && png_ptr->save_buffer_size)      { -@@ -1763,6 +1951,17 @@ +@@ -1843,6 +2031,17 @@      png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer);   } @@ -750,25 +588,119 @@ diff -Nur libpng-1.2.44.orig/pngpread.c libpng-1.2.44/pngpread.c  +#endif  +   png_voidp PNGAPI - png_get_progressive_ptr(png_structp png_ptr) + png_get_progressive_ptr(png_const_structp png_ptr)   { -diff -Nur libpng-1.2.44.orig/pngread.c libpng-1.2.44/pngread.c ---- libpng-1.2.44.orig/pngread.c	2010-06-26 02:31:14.000000000 +0200 -+++ libpng-1.2.44/pngread.c	2010-07-08 21:21:33.676118515 +0200 -@@ -437,6 +437,11 @@ +diff -Nur libpng-1.5.1.orig/pngpriv.h libpng-1.5.1/pngpriv.h +--- libpng-1.5.1.orig/pngpriv.h	2011-02-03 05:58:17.000000000 +0100 ++++ libpng-1.5.1/pngpriv.h	2011-03-27 19:43:38.503370856 +0200 +@@ -275,6 +275,10 @@ + #define PNG_BACKGROUND_IS_GRAY     0x800 + #define PNG_HAVE_PNG_SIGNATURE    0x1000 + #define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */ ++#ifdef PNG_APNG_SUPPORTED ++#define PNG_HAVE_acTL             0x4000 ++#define PNG_HAVE_fcTL             0x8000L ++#endif +  + /* Flags for the transformations the PNG library does on the image data */ + #define PNG_BGR                 0x0001 +@@ -457,6 +461,14 @@ + #define PNG_tIME PNG_CONST png_byte png_tIME[5] = {116,  73,  77,  69, '\0'} + #define PNG_tRNS PNG_CONST png_byte png_tRNS[5] = {116,  82,  78,  83, '\0'} + #define PNG_zTXt PNG_CONST png_byte png_zTXt[5] = {122,  84,  88, 116, '\0'} ++#ifdef PNG_APNG_SUPPORTED ++#define PNG_acTL PNG_CONST png_byte png_acTL[5] = { 97,  99,  84,  76, '\0'} ++#define PNG_fcTL PNG_CONST png_byte png_fcTL[5] = {102,  99,  84,  76, '\0'} ++#define PNG_fdAT PNG_CONST png_byte png_fdAT[5] = {102, 100,  65,  84, '\0'} ++ ++/* For png_struct.apng_flags: */ ++#define PNG_FIRST_FRAME_HIDDEN       0x0001 ++#endif +  +  + /* Inhibit C++ name-mangling for libpng functions but not for system calls. */ +@@ -696,6 +708,17 @@ +     int unit, png_const_charp width, png_const_charp height)); + #endif +  ++#ifdef PNG_WRITE_APNG_SUPPORTED ++PNG_EXTERN void png_write_acTL PNGARG((png_structp png_ptr, ++   png_uint_32 num_frames, png_uint_32 num_plays)); ++ ++PNG_EXTERN void png_write_fcTL PNGARG((png_structp png_ptr,  ++   png_uint_32 width, png_uint_32 height,  ++   png_uint_32 x_offset, png_uint_32 y_offset,  ++   png_uint_16 delay_num, png_uint_16 delay_den, ++   png_byte dispose_op, png_byte blend_op)); ++#endif ++ + /* Called when finished processing a row of data */ + PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr)); +  +@@ -744,6 +767,20 @@ + PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr, +     png_infop info_ptr)); +  ++#ifdef PNG_READ_APNG_SUPPORTED ++/* Private, reset some things to become ready for reading next frame */ ++PNG_EXTERN void png_read_reset PNGARG((png_structp png_ptr)); ++PNG_EXTERN void png_read_reinit PNGARG((png_structp png_ptr, ++   png_infop info_ptr)); ++PNG_EXTERN void png_progressive_read_reset PNGARG((png_structp png_ptr)); ++#endif ++#ifdef PNG_WRITE_APNG_SUPPORTED ++/* Private, reset some things to become ready for writing next frame */ ++PNG_EXTERN void png_write_reset PNGARG((png_structp png_ptr)); ++PNG_EXTERN void png_write_reinit PNGARG((png_structp png_ptr,  ++   png_infop info_ptr, png_uint_32 width, png_uint_32 height)); ++#endif ++ + /* These are the functions that do the transformations */ + #ifdef PNG_READ_FILLER_SUPPORTED + PNG_EXTERN void png_do_read_filler PNGARG((png_row_infop row_info, +@@ -972,6 +1009,25 @@ +     png_uint_32 length)); + #endif +  ++#ifdef PNG_READ_APNG_SUPPORTED ++PNG_EXTERN void png_handle_acTL PNGARG((png_structp png_ptr, png_infop info_ptr, ++   png_uint_32 length)); ++PNG_EXTERN void png_handle_fcTL PNGARG((png_structp png_ptr, png_infop info_ptr, ++   png_uint_32 length)); ++PNG_EXTERN void png_have_info PNGARG((png_structp png_ptr, png_infop info_ptr)); ++PNG_EXTERN void png_handle_fdAT PNGARG((png_structp png_ptr, png_infop info_ptr, ++   png_uint_32 length)); ++PNG_EXTERN void png_ensure_sequence_number PNGARG((png_structp png_ptr,  ++   png_uint_32 length)); ++#endif ++#ifdef PNG_APNG_SUPPORTED ++PNG_EXTERN void png_ensure_fcTL_is_valid PNGARG((png_structp png_ptr, ++   png_uint_32 width, png_uint_32 height, ++   png_uint_32 x_offset, png_uint_32 y_offset, ++   png_uint_16 delay_num, png_uint_16 delay_den, ++   png_byte dispose_op, png_byte blend_op)); ++#endif ++ + PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr, +     png_infop info_ptr, png_uint_32 length)); +  +diff -Nur libpng-1.5.1.orig/pngread.c libpng-1.5.1/pngread.c +--- libpng-1.5.1.orig/pngread.c	2011-02-03 05:58:17.000000000 +0100 ++++ libpng-1.5.1/pngread.c	2011-03-27 19:43:38.383370613 +0200 +@@ -292,6 +292,11 @@   #ifdef PNG_READ_zTXt_SUPPORTED -       PNG_CONST PNG_zTXt; +       PNG_zTXt;   #endif  +#ifdef PNG_READ_APNG_SUPPORTED -+      PNG_CONST PNG_acTL; -+      PNG_CONST PNG_fcTL; -+      PNG_CONST PNG_fdAT; ++      PNG_acTL; ++      PNG_fcTL; ++      PNG_fdAT;  +#endif - #endif /* PNG_USE_LOCAL_ARRAYS */         png_uint_32 length = png_read_chunk_header(png_ptr);         PNG_CONST png_bytep chunk_name = png_ptr->chunk_name; -@@ -481,6 +486,9 @@ -                   !(png_ptr->mode & PNG_HAVE_PLTE)) +  +@@ -344,6 +349,9 @@ +              !(png_ptr->mode & PNG_HAVE_PLTE))               png_error(png_ptr, "Missing PLTE before IDAT");  +#ifdef PNG_READ_APNG_SUPPORTED @@ -777,10 +709,10 @@ diff -Nur libpng-1.2.44.orig/pngread.c libpng-1.2.44/pngread.c            png_ptr->idat_size = length;            png_ptr->mode |= PNG_HAVE_IDAT;            break; -@@ -553,12 +561,97 @@ -       else if (!png_memcmp(chunk_name, png_iTXt, 4)) +@@ -434,12 +442,96 @@            png_handle_iTXt(png_ptr, info_ptr, length);   #endif +   +#ifdef PNG_READ_APNG_SUPPORTED  +      else if (!png_memcmp(chunk_name, png_acTL, 4))  +         png_handle_acTL(png_ptr, info_ptr, length); @@ -789,6 +721,7 @@ diff -Nur libpng-1.2.44.orig/pngread.c libpng-1.2.44/pngread.c  +      else if (!png_memcmp(chunk_name, png_fdAT, 4))  +         png_handle_fdAT(png_ptr, info_ptr, length);  +#endif ++         else            png_handle_unknown(png_ptr, info_ptr, length);      } @@ -800,39 +733,37 @@ diff -Nur libpng-1.2.44.orig/pngread.c libpng-1.2.44/pngread.c  +png_read_frame_head(png_structp png_ptr, png_infop info_ptr)  +{  +    png_byte have_chunk_after_DAT; /* after IDAT or after fdAT */ -+     ++  +    png_debug(0, "Reading frame head"); -+     ++  +    if (!(png_ptr->mode & PNG_HAVE_acTL))  +        png_error(png_ptr, "attempt to png_read_frame_head() but "  +                           "no acTL present"); -+     ++  +    /* do nothing for the main IDAT */  +    if (png_ptr->num_frames_read == 0)  +        return; -+     ++  +    png_crc_finish(png_ptr, 0); /* CRC from last IDAT or fdAT chunk */ -+     ++  +    png_read_reset(png_ptr);  +    png_ptr->mode &= ~PNG_HAVE_fcTL; -+     ++  +    have_chunk_after_DAT = 0;  +    for (;;)  +    { -+#ifdef PNG_USE_LOCAL_ARRAYS  +        PNG_IDAT;  +        PNG_fdAT;  +        PNG_fcTL; -+#endif  +        png_byte chunk_length[4];  +        png_uint_32 length; -+         ++  +        png_read_data(png_ptr, chunk_length, 4);  +        length = png_get_uint_31(png_ptr, chunk_length); -+         ++  +        png_reset_crc(png_ptr);  +        png_crc_read(png_ptr, png_ptr->chunk_name, 4); -+         ++  +        if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))  +        {  +            /* discard trailing IDATs for the first frame */ @@ -848,7 +779,7 @@ diff -Nur libpng-1.2.44.orig/pngread.c libpng-1.2.44/pngread.c  +        else if (!png_memcmp(png_ptr->chunk_name, png_fdAT, 4))  +        {  +            png_ensure_sequence_number(png_ptr, length); -+             ++  +            /* discard trailing fdATs for frames other than the first */  +            if (!have_chunk_after_DAT && png_ptr->num_frames_read > 1)  +                png_crc_finish(png_ptr, length - 4); @@ -856,7 +787,7 @@ diff -Nur libpng-1.2.44.orig/pngread.c libpng-1.2.44/pngread.c  +            {  +                png_ptr->idat_size = length - 4;  +                png_ptr->mode |= PNG_HAVE_IDAT; -+                 ++  +                break;  +            }  +            else @@ -875,18 +806,18 @@ diff -Nur libpng-1.2.44.orig/pngread.c libpng-1.2.44/pngread.c   /* Optional call to update the users info_ptr structure */   void PNGAPI   png_read_update_info(png_structp png_ptr, png_infop info_ptr) -@@ -599,6 +692,10 @@ +@@ -488,6 +580,10 @@   png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)   { -    PNG_CONST PNG_IDAT; +    PNG_IDAT;  +#ifdef PNG_READ_APNG_SUPPORTED -+   PNG_CONST PNG_fdAT; -+   PNG_CONST PNG_IEND; ++   PNG_fdAT; ++   PNG_IEND;  +#endif      PNG_CONST int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, -       0xff}; +        0xff};      PNG_CONST int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff}; -@@ -734,13 +831,39 @@ +@@ -642,13 +738,39 @@      {         if (!(png_ptr->zstream.avail_in))         { @@ -919,17 +850,17 @@ diff -Nur libpng-1.2.44.orig/pngread.c libpng-1.2.44/pngread.c  +                  bytes_to_skip = png_ptr->idat_size;  +                  continue;  +               } -+                ++  +               png_ensure_sequence_number(png_ptr, png_ptr->idat_size); -+                ++  +               png_ptr->idat_size -= 4;  +            }  +#endif            }            png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size;            png_ptr->zstream.next_in = png_ptr->zbuf; -@@ -758,6 +881,9 @@ -             png_error(png_ptr, "Extra compressed data"); +@@ -668,6 +790,9 @@ +             png_benign_error(png_ptr, "Extra compressed data");            png_ptr->mode |= PNG_AFTER_IDAT;            png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;  +#ifdef PNG_READ_APNG_SUPPORTED @@ -937,23 +868,23 @@ diff -Nur libpng-1.2.44.orig/pngread.c libpng-1.2.44/pngread.c  +#endif            break;         } -       if (ret != Z_OK) -@@ -1015,6 +1141,11 @@ +  +@@ -952,6 +1077,11 @@   #ifdef PNG_READ_zTXt_SUPPORTED -       PNG_CONST PNG_zTXt; +       PNG_zTXt;   #endif  +#ifdef PNG_READ_APNG_SUPPORTED -+      PNG_CONST PNG_acTL; -+      PNG_CONST PNG_fcTL; -+      PNG_CONST PNG_fdAT; ++      PNG_acTL; ++      PNG_fcTL; ++      PNG_fdAT;  +#endif - #endif /* PNG_USE_LOCAL_ARRAYS */         png_uint_32 length = png_read_chunk_header(png_ptr);         PNG_CONST png_bytep chunk_name = png_ptr->chunk_name; -@@ -1115,6 +1246,14 @@ -       else if (!png_memcmp(chunk_name, png_iTXt, 4)) +  +@@ -1073,6 +1203,15 @@            png_handle_iTXt(png_ptr, info_ptr, length);   #endif +   +#ifdef PNG_READ_APNG_SUPPORTED  +      else if (!png_memcmp(chunk_name, png_acTL, 4))  +         png_handle_acTL(png_ptr, info_ptr, length); @@ -962,13 +893,14 @@ diff -Nur libpng-1.2.44.orig/pngread.c libpng-1.2.44/pngread.c  +      else if (!png_memcmp(chunk_name, png_fdAT, 4))  +         png_handle_fdAT(png_ptr, info_ptr, length);  +#endif ++         else            png_handle_unknown(png_ptr, info_ptr, length);      } while (!(png_ptr->mode & PNG_HAVE_IEND)); -diff -Nur libpng-1.2.44.orig/pngrtran.c libpng-1.2.44/pngrtran.c ---- libpng-1.2.44.orig/pngrtran.c	2010-06-26 02:31:14.000000000 +0200 -+++ libpng-1.2.44/pngrtran.c	2010-07-08 21:21:34.149609181 +0200 -@@ -1352,7 +1352,7 @@ +diff -Nur libpng-1.5.1.orig/pngrtran.c libpng-1.5.1/pngrtran.c +--- libpng-1.5.1.orig/pngrtran.c	2011-02-03 05:58:17.000000000 +0100 ++++ libpng-1.5.1/pngrtran.c	2011-03-27 19:43:38.813371313 +0200 +@@ -1425,7 +1425,7 @@          * pixels.  This check added to libpng-1.2.19          */   #if (PNG_WARN_UNINITIALIZED_ROW==1) @@ -977,10 +909,10 @@ diff -Nur libpng-1.2.44.orig/pngrtran.c libpng-1.2.44/pngrtran.c   #else         png_warning(png_ptr, "Uninitialized row");   #endif -diff -Nur libpng-1.2.44.orig/pngrutil.c libpng-1.2.44/pngrutil.c ---- libpng-1.2.44.orig/pngrutil.c	2010-06-26 02:31:14.000000000 +0200 -+++ libpng-1.2.44/pngrutil.c	2010-07-08 21:21:34.045873588 +0200 -@@ -460,6 +460,11 @@ +diff -Nur libpng-1.5.1.orig/pngrutil.c libpng-1.5.1/pngrutil.c +--- libpng-1.5.1.orig/pngrutil.c	2011-02-03 05:58:17.000000000 +0100 ++++ libpng-1.5.1/pngrutil.c	2011-03-27 19:43:38.743371274 +0200 +@@ -569,6 +569,11 @@      filter_type = buf[11];      interlace_type = buf[12]; @@ -992,7 +924,7 @@ diff -Nur libpng-1.2.44.orig/pngrutil.c libpng-1.2.44/pngrutil.c      /* Set internal variables */      png_ptr->width = width;      png_ptr->height = height; -@@ -2348,6 +2353,172 @@ +@@ -2492,6 +2497,172 @@   }   #endif @@ -1004,7 +936,7 @@ diff -Nur libpng-1.2.44.orig/pngrutil.c libpng-1.2.44/pngrutil.c  +    png_uint_32 num_frames;  +    png_uint_32 num_plays;  +    png_uint_32 didSet; -+     ++  +    png_debug(1, "in png_handle_acTL");  +  +    if (!(png_ptr->mode & PNG_HAVE_IHDR)) @@ -1029,13 +961,13 @@ diff -Nur libpng-1.2.44.orig/pngrutil.c libpng-1.2.44/pngrutil.c  +        png_crc_finish(png_ptr, length);  +        return;  +    } -+     ++  +    png_crc_read(png_ptr, data, 8);  +    png_crc_finish(png_ptr, 0); -+     ++  +    num_frames = png_get_uint_31(png_ptr, data);  +    num_plays = png_get_uint_31(png_ptr, data + 4); -+     ++  +    /* the set function will do error checking on num_frames */  +    didSet = png_set_acTL(png_ptr, info_ptr, num_frames, num_plays);  +    if(didSet) @@ -1132,7 +1064,7 @@ diff -Nur libpng-1.2.44.orig/pngrutil.c libpng-1.2.44/pngrutil.c  +png_handle_fdAT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)  +{  +    png_ensure_sequence_number(png_ptr, length); -+     ++  +    /* This function is only called from png_read_end(), png_read_info(),   +    * and png_push_read_chunk() which means that:  +    * - the user doesn't want to read this frame @@ -1147,25 +1079,25 @@ diff -Nur libpng-1.2.44.orig/pngrutil.c libpng-1.2.44/pngrutil.c  +{  +    png_byte data[4];  +    png_uint_32 sequence_number; -+     ++  +    if (length < 4)  +        png_error(png_ptr, "invalid fcTL or fdAT chunk found"); -+     ++  +    png_crc_read(png_ptr, data, 4);  +    sequence_number = png_get_uint_31(png_ptr, data); -+     ++  +    if (sequence_number != png_ptr->next_seq_num)  +        png_error(png_ptr, "fcTL or fdAT chunk with out-of-order sequence "  +                           "number found"); -+     ++  +    png_ptr->next_seq_num++;  +}  +#endif /* PNG_READ_APNG_SUPPORTED */  +   /* This function is called when we haven't found a handler for a -    chunk.  If there isn't a problem with the chunk itself (ie bad -    chunk name, CRC, or a critical chunk), the chunk is silently ignored -@@ -3379,4 +3550,75 @@ +  * chunk.  If there isn't a problem with the chunk itself (ie bad +  * chunk name, CRC, or a critical chunk), the chunk is silently ignored +@@ -3613,4 +3784,73 @@      png_ptr->flags |= PNG_FLAG_ROW_INIT;   } @@ -1191,14 +1123,13 @@ diff -Nur libpng-1.2.44.orig/pngrutil.c libpng-1.2.44/pngrutil.c  +    png_ptr->height = info_ptr->next_frame_height;  +    png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth,png_ptr->width);  +    if (png_ptr->prev_row) -+       png_memset_check(png_ptr, png_ptr->prev_row, 0, png_ptr->rowbytes + 1); ++       png_memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1);  +}  +  +/* same as png_read_reset() but for the progressive reader */  +void /* PRIVATE */  +png_progressive_read_reset(png_structp png_ptr)  +{ -+#ifdef PNG_USE_LOCAL_ARRAYS  +    /* start of interlace block */  +    const int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};  + @@ -1210,8 +1141,7 @@ diff -Nur libpng-1.2.44.orig/pngrutil.c libpng-1.2.44/pngrutil.c  +  +    /* offset to next interlace block in the y direction */  +    const int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2}; -+#endif -+     ++  +    if (png_ptr->interlaced)  +    {  +        if (!(png_ptr->transformations & PNG_INTERLACE)) @@ -1241,11 +1171,11 @@ diff -Nur libpng-1.2.44.orig/pngrutil.c libpng-1.2.44/pngrutil.c  +}  +#endif /* PNG_READ_APNG_SUPPORTED */   #endif /* PNG_READ_SUPPORTED */ -diff -Nur libpng-1.2.44.orig/pngset.c libpng-1.2.44/pngset.c ---- libpng-1.2.44.orig/pngset.c	2010-06-26 02:31:14.000000000 +0200 -+++ libpng-1.2.44/pngset.c	2010-07-08 21:21:33.996027603 +0200 -@@ -266,6 +266,11 @@ -       info_ptr->rowbytes = (png_size_t)0; +diff -Nur libpng-1.5.1.orig/pngset.c libpng-1.5.1/pngset.c +--- libpng-1.5.1.orig/pngset.c	2011-02-03 05:58:17.000000000 +0100 ++++ libpng-1.5.1/pngset.c	2011-03-27 19:43:38.733370835 +0200 +@@ -211,6 +211,11 @@ +       info_ptr->rowbytes = 0;      else         info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width);  + @@ -1256,7 +1186,7 @@ diff -Nur libpng-1.2.44.orig/pngset.c libpng-1.2.44/pngset.c   }   #ifdef PNG_oFFs_SUPPORTED -@@ -960,6 +965,142 @@ +@@ -954,6 +959,142 @@   }   #endif /* PNG_sPLT_SUPPORTED */ @@ -1293,12 +1223,12 @@ diff -Nur libpng-1.2.44.orig/pngset.c libpng-1.2.44/pngset.c  +                    "> 2^31-1");  +        return (0);  +    } -+     ++  +    info_ptr->num_frames = num_frames;  +    info_ptr->num_plays = num_plays; -+     ++  +    info_ptr->valid |= PNG_INFO_acTL; -+     ++  +    return (1);  +}  + @@ -1319,10 +1249,10 @@ diff -Nur libpng-1.2.44.orig/pngset.c libpng-1.2.44/pngset.c  +                    "ignored");  +        return (0);  +    } -+     ++  +    png_ensure_fcTL_is_valid(png_ptr, width, height, x_offset, y_offset,   +                             delay_num, delay_den, dispose_op, blend_op); -+     ++  +    if (blend_op == PNG_BLEND_OP_OVER)  +    {  +        if (!(png_ptr->color_type & PNG_COLOR_MASK_ALPHA) && @@ -1342,13 +1272,13 @@ diff -Nur libpng-1.2.44.orig/pngset.c libpng-1.2.44/pngset.c  +    info_ptr->next_frame_delay_den = delay_den;  +    info_ptr->next_frame_dispose_op = dispose_op;  +    info_ptr->next_frame_blend_op = blend_op; -+     ++  +    info_ptr->valid |= PNG_INFO_fcTL; -+     ++  +    return (1);  +}  + -+void PNGAPI ++void /* PRIVATE */  +png_ensure_fcTL_is_valid(png_structp png_ptr,   +    png_uint_32 width, png_uint_32 height,  +    png_uint_32 x_offset, png_uint_32 y_offset, @@ -1383,15 +1313,15 @@ diff -Nur libpng-1.2.44.orig/pngset.c libpng-1.2.44/pngset.c  +                              png_byte is_hidden)  +{  +    png_debug(1, "in png_first_frame_is_hidden()"); -+     ++  +    if (png_ptr == NULL)  +        return 0; -+     ++  +    if(is_hidden)  +        png_ptr->apng_flags |= PNG_FIRST_FRAME_HIDDEN;  +    else  +        png_ptr->apng_flags &= ~PNG_FIRST_FRAME_HIDDEN; -+     ++  +    return 1;  +}  +#endif /* PNG_APNG_SUPPORTED */ @@ -1399,10 +1329,41 @@ diff -Nur libpng-1.2.44.orig/pngset.c libpng-1.2.44/pngset.c   #ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED   void PNGAPI   png_set_unknown_chunks(png_structp png_ptr, -diff -Nur libpng-1.2.44.orig/pngwrite.c libpng-1.2.44/pngwrite.c ---- libpng-1.2.44.orig/pngwrite.c	2010-06-26 02:31:14.000000000 +0200 -+++ libpng-1.2.44/pngwrite.c	2010-07-08 21:21:33.847089331 +0200 -@@ -57,6 +57,10 @@ +diff -Nur libpng-1.5.1.orig/pngstruct.h libpng-1.5.1/pngstruct.h +--- libpng-1.5.1.orig/pngstruct.h	2011-02-03 05:58:17.000000000 +0100 ++++ libpng-1.5.1/pngstruct.h	2011-03-27 19:43:38.603370828 +0200 +@@ -287,6 +287,27 @@ +    png_alloc_size_t user_chunk_malloc_max; + #endif +  ++#ifdef PNG_APNG_SUPPORTED ++   png_uint_32 apng_flags; ++   png_uint_32 next_seq_num;         /* next fcTL/fdAT chunk sequence number */ ++   png_uint_32 first_frame_width; ++   png_uint_32 first_frame_height; ++ ++#ifdef PNG_READ_APNG_SUPPORTED ++   png_uint_32 num_frames_read;      /* incremented after all image data of */ ++                                     /* a frame is read */ ++#ifdef PNG_PROGRESSIVE_READ_SUPPORTED ++   png_progressive_frame_ptr frame_info_fn; /* frame info read callback */ ++   png_progressive_frame_ptr frame_end_fn;  /* frame data read callback */ ++#endif ++#endif ++ ++#ifdef PNG_WRITE_APNG_SUPPORTED ++   png_uint_32 num_frames_to_write; ++   png_uint_32 num_frames_written; ++#endif ++#endif /* PNG_APNG_SUPPORTED */ ++ + /* New member added in libpng-1.0.25 and 1.2.17 */ + #ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED +    /* Storage for unknown chunk that the library doesn't recognize. */ +diff -Nur libpng-1.5.1.orig/pngwrite.c libpng-1.5.1/pngwrite.c +--- libpng-1.5.1.orig/pngwrite.c	2011-02-03 05:58:17.000000000 +0100 ++++ libpng-1.5.1/pngwrite.c	2011-03-27 19:43:38.643370780 +0200 +@@ -58,6 +58,10 @@      /* The rest of these check to see if the valid field has the appropriate       * flag set, and if it does, writes the chunk.       */ @@ -1412,9 +1373,9 @@ diff -Nur libpng-1.2.44.orig/pngwrite.c libpng-1.2.44/pngwrite.c  +#endif   #ifdef PNG_WRITE_gAMA_SUPPORTED      if (info_ptr->valid & PNG_INFO_gAMA) -    { -@@ -319,6 +323,10 @@ -       return; +       png_write_gAMA_fixed(png_ptr, info_ptr->gamma); +@@ -300,6 +304,10 @@ +       if (!(png_ptr->mode & PNG_HAVE_IDAT))         png_error(png_ptr, "No IDATs written into file");  +#ifdef PNG_WRITE_APNG_SUPPORTED @@ -1424,8 +1385,8 @@ diff -Nur libpng-1.2.44.orig/pngwrite.c libpng-1.2.44/pngwrite.c      /* See if user wants us to write information chunks */      if (info_ptr != NULL) -@@ -1589,4 +1597,39 @@ -    params = params; +@@ -1602,4 +1610,39 @@ +    PNG_UNUSED(params)   }   #endif  + @@ -1438,16 +1399,16 @@ diff -Nur libpng-1.2.44.orig/pngwrite.c libpng-1.2.44/pngwrite.c  +    png_byte blend_op)  +{  +    png_debug(1, "in png_write_frame_head"); -+     ++  +    /* there is a chance this has been set after png_write_info was called,  +    * so it would be set but not written. is there a way to be sure? */  +    if (!(info_ptr->valid & PNG_INFO_acTL))  +        png_error(png_ptr, "png_write_frame_head(): acTL not set"); -+     ++  +    png_write_reset(png_ptr); -+     ++  +    png_write_reinit(png_ptr, info_ptr, width, height); -+     ++  +    if ( !(png_ptr->num_frames_written == 0 &&   +           (png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN) ) )  +        png_write_fcTL(png_ptr, width, height, x_offset, y_offset,  @@ -1455,21 +1416,21 @@ diff -Nur libpng-1.2.44.orig/pngwrite.c libpng-1.2.44/pngwrite.c  +}  +  +void PNGAPI -+png_write_frame_tail(png_structp png_ptr, png_infop png_info) ++png_write_frame_tail(png_structp png_ptr, png_infop info_ptr)  +{  +    png_debug(1, "in png_write_frame_tail"); -+     ++  +    png_ptr->num_frames_written++;  +}  +#endif /* PNG_WRITE_APNG_SUPPORTED */  +   #endif /* PNG_WRITE_SUPPORTED */ -diff -Nur libpng-1.2.44.orig/pngwutil.c libpng-1.2.44/pngwutil.c ---- libpng-1.2.44.orig/pngwutil.c	2010-06-26 02:31:14.000000000 +0200 -+++ libpng-1.2.44/pngwutil.c	2010-07-08 21:21:34.095873630 +0200 -@@ -516,6 +516,11 @@ +diff -Nur libpng-1.5.1.orig/pngwutil.c libpng-1.5.1/pngwutil.c +--- libpng-1.5.1.orig/pngwutil.c	2011-02-03 05:58:17.000000000 +0100 ++++ libpng-1.5.1/pngwutil.c	2011-03-27 19:43:38.803370805 +0200 +@@ -596,6 +596,11 @@      /* Write the chunk */ -    png_write_chunk(png_ptr, (png_bytep)png_IHDR, buf, (png_size_t)13); +    png_write_chunk(png_ptr, png_IHDR, buf, (png_size_t)13);  +#ifdef PNG_WRITE_APNG_SUPPORTED  +   png_ptr->first_frame_width = width; @@ -1479,38 +1440,38 @@ diff -Nur libpng-1.2.44.orig/pngwutil.c libpng-1.2.44/pngwutil.c      /* Initialize zlib with PNG info */      png_ptr->zstream.zalloc = png_zalloc;      png_ptr->zstream.zfree = png_zfree; -@@ -641,6 +646,9 @@ +@@ -742,6 +747,9 @@ + png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length)   { - #ifdef PNG_USE_LOCAL_ARRAYS      PNG_IDAT;  +#ifdef PNG_WRITE_APNG_SUPPORTED  +   PNG_fdAT;  +#endif - #endif      png_debug(1, "in png_write_IDAT"); -@@ -686,7 +694,28 @@ -             "Invalid zlib compression method or flags in IDAT"); +  +@@ -791,7 +799,28 @@ +              "Invalid zlib compression method or flags in IDAT");      }  +#ifdef PNG_WRITE_APNG_SUPPORTED  +   if(png_ptr->num_frames_written == 0)  +#endif -    png_write_chunk(png_ptr, (png_bytep)png_IDAT, data, length); +    png_write_chunk(png_ptr, png_IDAT, data, length);  +#ifdef PNG_WRITE_APNG_SUPPORTED  +   else  +   {  +      png_byte buf[4]; -+       -+      png_write_chunk_start(png_ptr, (png_bytep)png_fdAT, 4 + length); -+       ++ ++      png_write_chunk_start(png_ptr, png_fdAT, 4 + length); ++  +      png_save_uint_32(buf, png_ptr->next_seq_num);  +      png_write_chunk_data(png_ptr, buf, 4); -+       ++  +      png_write_chunk_data(png_ptr, data, length); -+       ++  +      png_write_chunk_end(png_ptr); -+       ++  +      png_ptr->next_seq_num++;  +   }  +#endif @@ -1518,7 +1479,7 @@ diff -Nur libpng-1.2.44.orig/pngwutil.c libpng-1.2.44/pngwutil.c      png_ptr->mode |= PNG_HAVE_IDAT;   } -@@ -1754,6 +1783,70 @@ +@@ -1769,6 +1798,66 @@   }   #endif @@ -1527,22 +1488,20 @@ diff -Nur libpng-1.2.44.orig/pngwutil.c libpng-1.2.44/pngwutil.c  +png_write_acTL(png_structp png_ptr,  +   png_uint_32 num_frames, png_uint_32 num_plays)  +{ -+#ifdef PNG_USE_LOCAL_ARRAYS  +    PNG_acTL; -+#endif  +    png_byte data[16]; -+     ++  +    png_debug(1, "in png_write_acTL"); -+     ++  +    png_ptr->num_frames_to_write = num_frames; -+     ++  +    if (png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN)  +        num_frames--; -+     ++  +    png_save_uint_32(data, num_frames);  +    png_save_uint_32(data + 4, num_plays); -+     -+    png_write_chunk(png_ptr, (png_bytep)png_acTL, data, (png_size_t)8); ++ ++    png_write_chunk(png_ptr, png_acTL, data, (png_size_t)8);  +}  +  +void /* PRIVATE */ @@ -1551,13 +1510,11 @@ diff -Nur libpng-1.2.44.orig/pngwutil.c libpng-1.2.44/pngwutil.c  +    png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op,   +    png_byte blend_op)  +{ -+#ifdef PNG_USE_LOCAL_ARRAYS  +    PNG_fcTL; -+#endif  +    png_byte data[26]; -+     ++  +    png_debug(1, "in png_write_fcTL"); -+     ++  +    if (png_ptr->num_frames_written == 0 && (x_offset != 0 || y_offset != 0))  +        png_error(png_ptr, "x and/or y offset for the first frame aren't 0");  +    if (png_ptr->num_frames_written == 0 &&  @@ -1565,11 +1522,11 @@ diff -Nur libpng-1.2.44.orig/pngwutil.c libpng-1.2.44/pngwutil.c  +         height != png_ptr->first_frame_height))  +        png_error(png_ptr, "width and/or height in the first frame's fcTL "  +                           "don't match the ones in IHDR"); -+     ++  +    /* more error checking */  +    png_ensure_fcTL_is_valid(png_ptr, width, height, x_offset, y_offset,   +                             delay_num, delay_den, dispose_op, blend_op); -+     ++  +    png_save_uint_32(data, png_ptr->next_seq_num);  +    png_save_uint_32(data + 4, width);  +    png_save_uint_32(data + 8, height); @@ -1579,9 +1536,9 @@ diff -Nur libpng-1.2.44.orig/pngwutil.c libpng-1.2.44/pngwutil.c  +    png_save_uint_16(data + 22, delay_den);  +    data[24] = dispose_op;  +    data[25] = blend_op; -+     -+    png_write_chunk(png_ptr, (png_bytep)png_fcTL, data, (png_size_t)26); -+     ++ ++    png_write_chunk(png_ptr, png_fcTL, data, (png_size_t)26); ++  +    png_ptr->next_seq_num++;  +}  +#endif /* PNG_WRITE_APNG_SUPPORTED */ @@ -1589,18 +1546,18 @@ diff -Nur libpng-1.2.44.orig/pngwutil.c libpng-1.2.44/pngwutil.c   /* Initializes the row writing capability of libpng */   void /* PRIVATE */   png_write_start_row(png_structp png_ptr) -@@ -2159,8 +2252,8 @@ +@@ -2203,8 +2292,8 @@   #ifndef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED     if (png_ptr->row_number == 0 && filter_to_do == PNG_ALL_FILTERS)     { --      /* These will never be selected so we need not test them. */ --      filter_to_do &= ~(PNG_FILTER_UP | PNG_FILTER_PAETH); -+      /* These use previous row */ -+      filter_to_do &= ~(PNG_FILTER_UP | PNG_FILTER_AVG | PNG_FILTER_PAETH); +-     /* These will never be selected so we need not test them. */ +-     filter_to_do &= ~(PNG_FILTER_UP | PNG_FILTER_PAETH); ++     /* These use previous row */ ++     filter_to_do &= ~(PNG_FILTER_UP | PNG_FILTER_AVG | PNG_FILTER_PAETH);     } - #endif  + #endif -@@ -2829,4 +2922,39 @@ +@@ -2945,4 +3034,39 @@      }   #endif   } @@ -1627,12 +1584,12 @@ diff -Nur libpng-1.2.44.orig/pngwutil.c libpng-1.2.44/pngwutil.c  +        height > png_ptr->first_frame_height)  +        png_error(png_ptr, "width and/or height for a frame greater than"  +                           "the ones in IHDR"); -+     ++  +    png_set_IHDR(png_ptr, info_ptr, width, height,   +                 info_ptr->bit_depth, info_ptr->color_type,   +                 info_ptr->interlace_type, info_ptr->compression_type,  +                 info_ptr->filter_type); -+    ++  +    png_ptr->width = width;  +    png_ptr->height = height;  +    png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, width); | 
