commit a7cb3e1

hovercats  ·  2024-01-20 15:48:20 +0000 UTC
parent d188b31
tinyx: add rest of dependencies needed to build
117 files changed,  +2570, -9
+15, -0
 1@@ -0,0 +1,15 @@
 2+#!/bin/sh -e
 3+
 4+export DESTDIR="$1"
 5+
 6+muon setup \
 7+    -Dprefix=/ \
 8+    -Ddefault_library=static \
 9+    -Dbzip2=disabled \
10+    -Dzlib=disabled \
11+    -Dpng=disabled \
12+    -Dtests=disabled \
13+    build
14+
15+samu -C build
16+muon -C build install
+1, -0
1@@ -0,0 +1 @@
2+8dd2a91dad75886ad3fed8d096b37ccbc82ba12ec863ea97324c07ac184a6ac2a9
+14, -0
 1@@ -0,0 +1,14 @@
 2+expat
 3+libX11
 4+libXau
 5+libXdamage
 6+libXext
 7+libXfixes
 8+libXrender
 9+libXxf86vm
10+libdrm
11+libxcb
12+libxshmfence
13+muon   make
14+pixman
15+pkgconf make
+1, -0
1@@ -0,0 +1 @@
2+https://download-mirror.savannah.gnu.org/releases/freetype/freetype-2.13.2.tar.xz
+1, -0
1@@ -0,0 +1 @@
2+2.13.2 1
+35, -0
 1@@ -0,0 +1,35 @@
 2+#!/bin/sh -e
 3+
 4+export DESTDIR="$1"
 5+
 6+TMPDIR="$1/tmp"
 7+
 8+./configure \
 9+    --prefix=/ \
10+    --sysconfdir=/etc \
11+    --mandir=/share/man \
12+    --localstatedir=/var \
13+    --without-xmlto \
14+    --disable-specs \
15+    --disable-shared
16+
17+make
18+make install
19+
20+# Some X11 packages install to /share.
21+! [ -d "$1/share/pkgconfig" ] || {
22+    mkdir -p "$1/lib"
23+    mv -f "$1/share/pkgconfig" "$1/lib"
24+}
25+
26+# We need to keep this around.
27+! [ -d "$1/share/aclocal" ] || {
28+    mkdir -p "$TMPDIR"
29+    mv -f "$1/share/aclocal" "$TMPDIR"
30+}
31+
32+# Restore kept directories.
33+! [ -d "$TMPDIR" ] || {
34+    mv -f "$TMPDIR/"* "$1/share"
35+    rm -rf "$TMPDIR"
36+}
+1, -0
1@@ -0,0 +1 @@
2+275bfdb5cbf0e8135ec3b10030d6590a878d83aa7e410c52efe44edd2e7fd62ea5
+5, -0
1@@ -0,0 +1,5 @@
2+libXau
3+libxcb
4+pkgconf make
5+xorgproto
6+xtrans  make
+1, -0
1@@ -0,0 +1 @@
2+https://x.org/releases/individual/lib/libX11-1.8.7.tar.gz
+1, -0
1@@ -0,0 +1 @@
2+1.8.7 1
+35, -0
 1@@ -0,0 +1,35 @@
 2+#!/bin/sh -e
 3+
 4+export DESTDIR="$1"
 5+
 6+TMPDIR="$1/tmp"
 7+
 8+./configure \
 9+    --prefix=/ \
10+    --sysconfdir=/etc \
11+    --mandir=/share/man \
12+    --localstatedir=/var \
13+    --without-xmlto \
14+    --disable-specs \
15+    --disable-shared
16+
17+make
18+make install
19+
20+# Some X11 packages install to /share.
21+! [ -d "$1/share/pkgconfig" ] || {
22+    mkdir -p "$1/lib"
23+    mv -f "$1/share/pkgconfig" "$1/lib"
24+}
25+
26+# We need to keep this around.
27+! [ -d "$1/share/aclocal" ] || {
28+    mkdir -p "$TMPDIR"
29+    mv -f "$1/share/aclocal" "$TMPDIR"
30+}
31+
32+# Restore kept directories.
33+! [ -d "$TMPDIR" ] || {
34+    mv -f "$TMPDIR/"* "$1/share"
35+    rm -rf "$TMPDIR"
36+}
+1, -0
1@@ -0,0 +1 @@
2+9463cd1ea6d89ed82e94e7d464621d6559f91b48cd7e16827f1ade8de59489a2fb
+4, -0
1@@ -0,0 +1,4 @@
2+libX11
3+libXfixes
4+pkgconf   make
5+xorgproto make
+1, -0
1@@ -0,0 +1 @@
2+https://x.org/releases/individual/lib/libXdamage-1.1.6.tar.gz
+1, -0
1@@ -0,0 +1 @@
2+1.1.6 1
+35, -0
 1@@ -0,0 +1,35 @@
 2+#!/bin/sh -e
 3+
 4+export DESTDIR="$1"
 5+
 6+TMPDIR="$1/tmp"
 7+
 8+./configure \
 9+    --prefix=/ \
10+    --sysconfdir=/etc \
11+    --mandir=/share/man \
12+    --localstatedir=/var \
13+    --without-xmlto \
14+    --disable-specs \
15+    --disable-shared
16+
17+make
18+make install
19+
20+# Some X11 packages install to /share.
21+! [ -d "$1/share/pkgconfig" ] || {
22+    mkdir -p "$1/lib"
23+    mv -f "$1/share/pkgconfig" "$1/lib"
24+}
25+
26+# We need to keep this around.
27+! [ -d "$1/share/aclocal" ] || {
28+    mkdir -p "$TMPDIR"
29+    mv -f "$1/share/aclocal" "$TMPDIR"
30+}
31+
32+# Restore kept directories.
33+! [ -d "$TMPDIR" ] || {
34+    mv -f "$TMPDIR/"* "$1/share"
35+    rm -rf "$TMPDIR"
36+}
+1, -0
1@@ -0,0 +1 @@
2+e1e3e1e8b27d980bfe1d7dd099204ed18472dafc6f4bb066ddea273e1286288946
+3, -0
1@@ -0,0 +1,3 @@
2+libX11
3+pkgconf   make
4+xorgproto make
+1, -0
1@@ -0,0 +1 @@
2+https://x.org/releases/individual/lib/libXext-1.3.5.tar.gz
+1, -0
1@@ -0,0 +1 @@
2+1.3.5 1
+35, -0
 1@@ -0,0 +1,35 @@
 2+#!/bin/sh -e
 3+
 4+export DESTDIR="$1"
 5+
 6+TMPDIR="$1/tmp"
 7+
 8+./configure \
 9+    --prefix=/ \
10+    --sysconfdir=/etc \
11+    --mandir=/share/man \
12+    --localstatedir=/var \
13+    --without-xmlto \
14+    --disable-specs \
15+    --disable-shared
16+
17+make
18+make install
19+
20+# Some X11 packages install to /share.
21+! [ -d "$1/share/pkgconfig" ] || {
22+    mkdir -p "$1/lib"
23+    mv -f "$1/share/pkgconfig" "$1/lib"
24+}
25+
26+# We need to keep this around.
27+! [ -d "$1/share/aclocal" ] || {
28+    mkdir -p "$TMPDIR"
29+    mv -f "$1/share/aclocal" "$TMPDIR"
30+}
31+
32+# Restore kept directories.
33+! [ -d "$TMPDIR" ] || {
34+    mv -f "$TMPDIR/"* "$1/share"
35+    rm -rf "$TMPDIR"
36+}
+1, -0
1@@ -0,0 +1 @@
2+301a34d173d13e73f4e5712ecc5da6e3757bee7729fcd9b95515688bf6029ee03b
+2, -0
1@@ -0,0 +1,2 @@
2+libX11
3+pkgconf make
+1, -0
1@@ -0,0 +1 @@
2+https://x.org/releases/individual/lib/libXfixes-6.0.1.tar.gz
+1, -0
1@@ -0,0 +1 @@
2+6.0.1 1
+2, -2
1@@ -1,6 +1,6 @@
2-freetype-harfbuzz
3+freetype
4 libfontenc
5 pkgconf   make
6 xorgproto make
7 xtrans    make
8-#zlib	  make
9+zlib	  make
+35, -0
 1@@ -0,0 +1,35 @@
 2+#!/bin/sh -e
 3+
 4+export DESTDIR="$1"
 5+
 6+TMPDIR="$1/tmp"
 7+
 8+./configure \
 9+    --prefix=/ \
10+    --sysconfdir=/etc \
11+    --mandir=/share/man \
12+    --localstatedir=/var \
13+    --without-xmlto \
14+    --disable-specs \
15+    --disable-shared
16+
17+make
18+make install
19+
20+# Some X11 packages install to /share.
21+! [ -d "$1/share/pkgconfig" ] || {
22+    mkdir -p "$1/lib"
23+    mv -f "$1/share/pkgconfig" "$1/lib"
24+}
25+
26+# We need to keep this around.
27+! [ -d "$1/share/aclocal" ] || {
28+    mkdir -p "$TMPDIR"
29+    mv -f "$1/share/aclocal" "$TMPDIR"
30+}
31+
32+# Restore kept directories.
33+! [ -d "$TMPDIR" ] || {
34+    mv -f "$TMPDIR/"* "$1/share"
35+    rm -rf "$TMPDIR"
36+}
+1, -0
1@@ -0,0 +1 @@
2+d87d342ea4e8b621e8f51d8c709257ab7b03240d996951cd79eedfeb1aa2f23013
+5, -0
1@@ -0,0 +1,5 @@
2+libX11
3+libXext
4+libXfixes
5+pkgconf   make
6+xorgproto make
+1, -0
1@@ -0,0 +1 @@
2+https://x.org/releases/individual/lib/libXi-1.8.1.tar.gz
+1, -0
1@@ -0,0 +1 @@
2+1.8.1 1
+35, -0
 1@@ -0,0 +1,35 @@
 2+#!/bin/sh -e
 3+
 4+export DESTDIR="$1"
 5+
 6+TMPDIR="$1/tmp"
 7+
 8+./configure \
 9+    --prefix=/ \
10+    --sysconfdir=/etc \
11+    --mandir=/share/man \
12+    --localstatedir=/var \
13+    --without-xmlto \
14+    --disable-specs \
15+    --disable-shared
16+
17+make
18+make install
19+
20+# Some X11 packages install to /share.
21+! [ -d "$1/share/pkgconfig" ] || {
22+    mkdir -p "$1/lib"
23+    mv -f "$1/share/pkgconfig" "$1/lib"
24+}
25+
26+# We need to keep this around.
27+! [ -d "$1/share/aclocal" ] || {
28+    mkdir -p "$TMPDIR"
29+    mv -f "$1/share/aclocal" "$TMPDIR"
30+}
31+
32+# Restore kept directories.
33+! [ -d "$TMPDIR" ] || {
34+    mv -f "$TMPDIR/"* "$1/share"
35+    rm -rf "$TMPDIR"
36+}
+1, -0
1@@ -0,0 +1 @@
2+3291b244ae236c153b8e24889ddf2818c2153c9653fc8ff04e90b53039ecbf3562
+4, -0
1@@ -0,0 +1,4 @@
2+libXext
3+libXt
4+pkgconf          make
5+xorg-util-macros make
+1, -0
1@@ -0,0 +1 @@
2+https://x.org/releases/individual/lib/libXmu-1.1.4.tar.gz
+1, -0
1@@ -0,0 +1 @@
2+1.1.4 1
+35, -0
 1@@ -0,0 +1,35 @@
 2+#!/bin/sh -e
 3+
 4+export DESTDIR="$1"
 5+
 6+TMPDIR="$1/tmp"
 7+
 8+./configure \
 9+    --prefix=/ \
10+    --sysconfdir=/etc \
11+    --mandir=/share/man \
12+    --localstatedir=/var \
13+    --without-xmlto \
14+    --disable-specs \
15+    --disable-shared
16+
17+make
18+make install
19+
20+# Some X11 packages install to /share.
21+! [ -d "$1/share/pkgconfig" ] || {
22+    mkdir -p "$1/lib"
23+    mv -f "$1/share/pkgconfig" "$1/lib"
24+}
25+
26+# We need to keep this around.
27+! [ -d "$1/share/aclocal" ] || {
28+    mkdir -p "$TMPDIR"
29+    mv -f "$1/share/aclocal" "$TMPDIR"
30+}
31+
32+# Restore kept directories.
33+! [ -d "$TMPDIR" ] || {
34+    mv -f "$TMPDIR/"* "$1/share"
35+    rm -rf "$TMPDIR"
36+}
+1, -0
1@@ -0,0 +1 @@
2+a81b16b0e483cccff3204a691a47e9d5959988d8852a47979503db06aa5a5114d4
+4, -0
1@@ -0,0 +1,4 @@
2+libX11
3+libXext   make
4+pkgconf   make
5+xorgproto make
+1, -0
1@@ -0,0 +1 @@
2+https://x.org/releases/individual/lib/libXrender-0.9.11.tar.gz
+1, -0
1@@ -0,0 +1 @@
2+0.9.11 1
+35, -0
 1@@ -0,0 +1,35 @@
 2+#!/bin/sh -e
 3+
 4+export DESTDIR="$1"
 5+
 6+TMPDIR="$1/tmp"
 7+
 8+./configure \
 9+    --prefix=/ \
10+    --sysconfdir=/etc \
11+    --mandir=/share/man \
12+    --localstatedir=/var \
13+    --without-xmlto \
14+    --disable-specs \
15+    --disable-shared
16+
17+make
18+make install
19+
20+# Some X11 packages install to /share.
21+! [ -d "$1/share/pkgconfig" ] || {
22+    mkdir -p "$1/lib"
23+    mv -f "$1/share/pkgconfig" "$1/lib"
24+}
25+
26+# We need to keep this around.
27+! [ -d "$1/share/aclocal" ] || {
28+    mkdir -p "$TMPDIR"
29+    mv -f "$1/share/aclocal" "$TMPDIR"
30+}
31+
32+# Restore kept directories.
33+! [ -d "$TMPDIR" ] || {
34+    mv -f "$TMPDIR/"* "$1/share"
35+    rm -rf "$TMPDIR"
36+}
+1, -0
1@@ -0,0 +1 @@
2+3a37593d9b6cacb4b471f0c1180937eab6ab336023856a26a8ae221d6cd6acbb32
+6, -0
1@@ -0,0 +1,6 @@
2+libX11
3+libXau
4+libXext
5+libXi
6+libxcb
7+pkgconf make
+1, -0
1@@ -0,0 +1 @@
2+https://x.org/releases/individual/lib/libXtst-1.2.4.tar.gz
+1, -0
1@@ -0,0 +1 @@
2+1.2.4 1
+35, -0
 1@@ -0,0 +1,35 @@
 2+#!/bin/sh -e
 3+
 4+export DESTDIR="$1"
 5+
 6+TMPDIR="$1/tmp"
 7+
 8+./configure \
 9+    --prefix=/ \
10+    --sysconfdir=/etc \
11+    --mandir=/share/man \
12+    --localstatedir=/var \
13+    --without-xmlto \
14+    --disable-specs \
15+    --disable-shared
16+
17+make
18+make install
19+
20+# Some X11 packages install to /share.
21+! [ -d "$1/share/pkgconfig" ] || {
22+    mkdir -p "$1/lib"
23+    mv -f "$1/share/pkgconfig" "$1/lib"
24+}
25+
26+# We need to keep this around.
27+! [ -d "$1/share/aclocal" ] || {
28+    mkdir -p "$TMPDIR"
29+    mv -f "$1/share/aclocal" "$TMPDIR"
30+}
31+
32+# Restore kept directories.
33+! [ -d "$TMPDIR" ] || {
34+    mv -f "$TMPDIR/"* "$1/share"
35+    rm -rf "$TMPDIR"
36+}
+1, -0
1@@ -0,0 +1 @@
2+9b984ff6785a50e2d863c6ab74e1507a7a200b9b25077eb0fabcf0776c07efd23b
+4, -0
1@@ -0,0 +1,4 @@
2+libX11
3+libXext
4+pkgconf   make
5+xorgproto make
+1, -0
1@@ -0,0 +1 @@
2+https://x.org/releases/individual/lib/libXxf86vm-1.1.5.tar.gz
+1, -0
1@@ -0,0 +1 @@
2+1.1.5 1
+17, -0
 1@@ -0,0 +1,17 @@
 2+#!/bin/sh -e
 3+
 4+export DESTDIR="$1"
 5+
 6+muon setup \
 7+	-Dprefix=/ \
 8+	-Dintel=disabled \
 9+	-Dnouveau=disabled \
10+	-Damdgpu=disabled \
11+	-Dradeon=disabled \
12+	-Dvalgrind=disabled \
13+	-Ddefault_library=static \
14+	-Dman-pages=disabled \
15+	build
16+
17+samu -C build
18+muon -C build install
+1, -0
1@@ -0,0 +1 @@
2+0b1353717e4eaa3c1e232a6f16b7f0c96329dbd52760bfb1d401ef01fbc2fee9f1
+4, -0
1@@ -0,0 +1,4 @@
2+libpciaccess
3+#linux-headers make
4+muon         make
5+pkgconf       make
+1, -0
1@@ -0,0 +1 @@
2+https://dri.freedesktop.org/libdrm/libdrm-2.4.120.tar.xz
+1, -0
1@@ -0,0 +1 @@
2+2.4.120 1
+1, -1
1@@ -1,3 +1,3 @@
2 pkgconf   make
3 xorgproto make
4-#zlib	  make
5+zlib	  make
+13, -0
 1@@ -0,0 +1,13 @@
 2+#!/bin/sh -e
 3+
 4+patch -p1 < lfs64.patch
 5+
 6+export DESTDIR="$1"
 7+
 8+muon setup \
 9+    -Dprefix=/ \
10+    -Ddefault_library=static \
11+    build
12+
13+samu -C build
14+muon -C build install
+2, -0
1@@ -0,0 +1,2 @@
2+812c8d6a7d65ca8f963d86acb49efe9bee19cfd6546a3324a6eb1184416136a87a
3+68d545ace6b4ecb7e0d6929c54d9e0d395882f9ddf25914bd6f3c544a54858e9b3
+3, -0
1@@ -0,0 +1,3 @@
2+muon make
3+#samurai make
4+zlib
+22, -0
 1@@ -0,0 +1,22 @@
 2+diff --git a/src/linux_sysfs.c b/src/linux_sysfs.c
 3+index d62f48c..20c800e 100644
 4+--- a/src/linux_sysfs.c
 5++++ b/src/linux_sysfs.c
 6+@@ -462,7 +462,7 @@ pci_device_linux_sysfs_read( struct pci_device * dev, void * data,
 7+ 
 8+ 
 9+     while ( temp_size > 0 ) {
10+-	const ssize_t bytes = pread64( fd, data_bytes, temp_size, offset );
11++	const ssize_t bytes = pread( fd, data_bytes, temp_size, offset );
12+ 
13+ 	/* If zero bytes were read, then we assume it's the end of the
14+ 	 * config file.
15+@@ -522,7 +522,7 @@ pci_device_linux_sysfs_write( struct pci_device * dev, const void * data,
16+ 
17+ 
18+     while ( temp_size > 0 ) {
19+-	const ssize_t bytes = pwrite64( fd, data_bytes, temp_size, offset );
20++	const ssize_t bytes = pwrite( fd, data_bytes, temp_size, offset );
21+ 
22+ 	/* If zero bytes were written, then we assume it's the end of the
23+ 	 * config file.
+2, -0
1@@ -0,0 +1,2 @@
2+https://x.org/releases/individual/lib/libpciaccess-0.17.tar.xz
3+patches/lfs64.patch
+1, -0
1@@ -0,0 +1 @@
2+0.17 1
+11, -0
 1@@ -0,0 +1,11 @@
 2+#!/bin/sh -e
 3+
 4+patch -p1 < apng.patch
 5+
 6+./configure \
 7+    --prefix=/ \
 8+    --disable-shared \
 9+    --enable-static
10+
11+make
12+make DESTDIR="$1" install
+2, -0
1@@ -0,0 +1,2 @@
2+99d2b2684b045a128210230a8b5437066b68d162f38923a27a925d37ce101bd4ba
3+863a91028e401842ec2b61710246b0bd7515d5e5ea24547c25c7874b754c6ae1d7
+1, -0
1@@ -0,0 +1 @@
2+zlib
+1741, -0
   1@@ -0,0 +1,1741 @@
   2+diff --git a/png.h b/png.h
   3+index cfc4841..da4608a 100644
   4+--- a/png.h
   5++++ b/png.h
   6+@@ -330,6 +330,10 @@
   7+ #   include "pnglibconf.h"
   8+ #endif
   9+ 
  10++#define PNG_APNG_SUPPORTED
  11++#define PNG_READ_APNG_SUPPORTED
  12++#define PNG_WRITE_APNG_SUPPORTED
  13++
  14+ #ifndef PNG_VERSION_INFO_ONLY
  15+ /* Machine specific configuration. */
  16+ #  include "pngconf.h"
  17+@@ -425,6 +429,17 @@ extern "C" {
  18+  * See pngconf.h for base types that vary by machine/system
  19+  */
  20+ 
  21++#ifdef PNG_APNG_SUPPORTED
  22++/* dispose_op flags from inside fcTL */
  23++#define PNG_DISPOSE_OP_NONE        0x00U
  24++#define PNG_DISPOSE_OP_BACKGROUND  0x01U
  25++#define PNG_DISPOSE_OP_PREVIOUS    0x02U
  26++
  27++/* blend_op flags from inside fcTL */
  28++#define PNG_BLEND_OP_SOURCE        0x00U
  29++#define PNG_BLEND_OP_OVER          0x01U
  30++#endif /* PNG_APNG_SUPPORTED */
  31++
  32+ /* This triggers a compiler error in png.c, if png.c and png.h
  33+  * do not agree upon the version number.
  34+  */
  35+@@ -746,6 +761,10 @@ typedef png_unknown_chunk * * png_unknown_chunkpp;
  36+ #define PNG_INFO_sCAL 0x4000U  /* ESR, 1.0.6 */
  37+ #define PNG_INFO_IDAT 0x8000U  /* ESR, 1.0.6 */
  38+ #define PNG_INFO_eXIf 0x10000U /* GR-P, 1.6.31 */
  39++#ifdef PNG_APNG_SUPPORTED
  40++#define PNG_INFO_acTL 0x20000U
  41++#define PNG_INFO_fcTL 0x40000U
  42++#endif
  43+ 
  44+ /* This is used for the transformation routines, as some of them
  45+  * change these values for the row.  It also should enable using
  46+@@ -783,6 +802,10 @@ typedef PNG_CALLBACK(void, *png_write_status_ptr, (png_structp, png_uint_32,
  47+ #ifdef PNG_PROGRESSIVE_READ_SUPPORTED
  48+ typedef PNG_CALLBACK(void, *png_progressive_info_ptr, (png_structp, png_infop));
  49+ typedef PNG_CALLBACK(void, *png_progressive_end_ptr, (png_structp, png_infop));
  50++#ifdef PNG_APNG_SUPPORTED
  51++typedef PNG_CALLBACK(void, *png_progressive_frame_ptr, (png_structp,
  52++    png_uint_32));
  53++#endif
  54+ 
  55+ /* The following callback receives png_uint_32 row_number, int pass for the
  56+  * png_bytep data of the row.  When transforming an interlaced image the
  57+@@ -3226,6 +3249,74 @@ PNG_EXPORT(244, int, png_set_option, (png_structrp png_ptr, int option,
  58+ /*******************************************************************************
  59+  *  END OF HARDWARE AND SOFTWARE OPTIONS
  60+  ******************************************************************************/
  61++#ifdef PNG_APNG_SUPPORTED
  62++PNG_EXPORT(250, png_uint_32, png_get_acTL, (png_structp png_ptr,
  63++   png_infop info_ptr, png_uint_32 *num_frames, png_uint_32 *num_plays));
  64++
  65++PNG_EXPORT(251, png_uint_32, png_set_acTL, (png_structp png_ptr,
  66++   png_infop info_ptr, png_uint_32 num_frames, png_uint_32 num_plays));
  67++
  68++PNG_EXPORT(252, png_uint_32, png_get_num_frames, (png_structp png_ptr,
  69++   png_infop info_ptr));
  70++
  71++PNG_EXPORT(253, png_uint_32, png_get_num_plays, (png_structp png_ptr,
  72++   png_infop info_ptr));
  73++
  74++PNG_EXPORT(254, png_uint_32, png_get_next_frame_fcTL,
  75++   (png_structp png_ptr, png_infop info_ptr, png_uint_32 *width,
  76++   png_uint_32 *height, png_uint_32 *x_offset, png_uint_32 *y_offset,
  77++   png_uint_16 *delay_num, png_uint_16 *delay_den, png_byte *dispose_op,
  78++   png_byte *blend_op));
  79++
  80++PNG_EXPORT(255, png_uint_32, png_set_next_frame_fcTL,
  81++   (png_structp png_ptr, png_infop info_ptr, png_uint_32 width,
  82++   png_uint_32 height, png_uint_32 x_offset, png_uint_32 y_offset,
  83++   png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op,
  84++   png_byte blend_op));
  85++
  86++PNG_EXPORT(256, png_uint_32, png_get_next_frame_width,
  87++   (png_structp png_ptr, png_infop info_ptr));
  88++PNG_EXPORT(257, png_uint_32, png_get_next_frame_height,
  89++   (png_structp png_ptr, png_infop info_ptr));
  90++PNG_EXPORT(258, png_uint_32, png_get_next_frame_x_offset,
  91++   (png_structp png_ptr, png_infop info_ptr));
  92++PNG_EXPORT(259, png_uint_32, png_get_next_frame_y_offset,
  93++   (png_structp png_ptr, png_infop info_ptr));
  94++PNG_EXPORT(260, png_uint_16, png_get_next_frame_delay_num,
  95++   (png_structp png_ptr, png_infop info_ptr));
  96++PNG_EXPORT(261, png_uint_16, png_get_next_frame_delay_den,
  97++   (png_structp png_ptr, png_infop info_ptr));
  98++PNG_EXPORT(262, png_byte, png_get_next_frame_dispose_op,
  99++   (png_structp png_ptr, png_infop info_ptr));
 100++PNG_EXPORT(263, png_byte, png_get_next_frame_blend_op,
 101++   (png_structp png_ptr, png_infop info_ptr));
 102++PNG_EXPORT(264, png_byte, png_get_first_frame_is_hidden,
 103++   (png_structp png_ptr, png_infop info_ptr));
 104++PNG_EXPORT(265, png_uint_32, png_set_first_frame_is_hidden,
 105++   (png_structp png_ptr, png_infop info_ptr, png_byte is_hidden));
 106++
 107++#ifdef PNG_READ_APNG_SUPPORTED
 108++PNG_EXPORT(266, void, png_read_frame_head, (png_structp png_ptr,
 109++   png_infop info_ptr));
 110++#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
 111++PNG_EXPORT(267, void, png_set_progressive_frame_fn, (png_structp png_ptr,
 112++   png_progressive_frame_ptr frame_info_fn,
 113++   png_progressive_frame_ptr frame_end_fn));
 114++#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
 115++#endif /* PNG_READ_APNG_SUPPORTED */
 116++
 117++#ifdef PNG_WRITE_APNG_SUPPORTED
 118++PNG_EXPORT(268, void, png_write_frame_head, (png_structp png_ptr,
 119++   png_infop info_ptr, png_bytepp row_pointers,
 120++   png_uint_32 width, png_uint_32 height,
 121++   png_uint_32 x_offset, png_uint_32 y_offset,
 122++   png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op,
 123++   png_byte blend_op));
 124++
 125++PNG_EXPORT(269, void, png_write_frame_tail, (png_structp png_ptr,
 126++   png_infop info_ptr));
 127++#endif /* PNG_WRITE_APNG_SUPPORTED */
 128++#endif /* PNG_APNG_SUPPORTED */
 129+ 
 130+ /* Maintainer: Put new public prototypes here ^, in libpng.3, in project
 131+  * defs, and in scripts/symbols.def.
 132+@@ -3235,7 +3326,11 @@ PNG_EXPORT(244, int, png_set_option, (png_structrp png_ptr, int option,
 133+  * one to use is one more than this.)
 134+  */
 135+ #ifdef PNG_EXPORT_LAST_ORDINAL
 136++#ifdef PNG_APNG_SUPPORTED
 137++  PNG_EXPORT_LAST_ORDINAL(269);
 138++#else
 139+   PNG_EXPORT_LAST_ORDINAL(249);
 140++#endif /* PNG_APNG_SUPPORTED */
 141+ #endif
 142+ 
 143+ #ifdef __cplusplus
 144+diff --git a/pngget.c b/pngget.c
 145+index 1490a03..df6f8f7 100644
 146+--- a/pngget.c
 147++++ b/pngget.c
 148+@@ -1257,4 +1257,166 @@ png_get_palette_max(png_const_structp png_ptr, png_const_infop info_ptr)
 149+ #  endif
 150+ #endif
 151+ 
 152++#ifdef PNG_APNG_SUPPORTED
 153++png_uint_32 PNGAPI
 154++png_get_acTL(png_structp png_ptr, png_infop info_ptr,
 155++             png_uint_32 *num_frames, png_uint_32 *num_plays)
 156++{
 157++    png_debug1(1, "in %s retrieval function", "acTL");
 158++
 159++    if (png_ptr != NULL && info_ptr != NULL &&
 160++        (info_ptr->valid & PNG_INFO_acTL) &&
 161++        num_frames != NULL && num_plays != NULL)
 162++    {
 163++        *num_frames = info_ptr->num_frames;
 164++        *num_plays = info_ptr->num_plays;
 165++        return (1);
 166++    }
 167++
 168++    return (0);
 169++}
 170++
 171++png_uint_32 PNGAPI
 172++png_get_num_frames(png_structp png_ptr, png_infop info_ptr)
 173++{
 174++    png_debug(1, "in png_get_num_frames()");
 175++
 176++    if (png_ptr != NULL && info_ptr != NULL)
 177++        return (info_ptr->num_frames);
 178++    return (0);
 179++}
 180++
 181++png_uint_32 PNGAPI
 182++png_get_num_plays(png_structp png_ptr, png_infop info_ptr)
 183++{
 184++    png_debug(1, "in png_get_num_plays()");
 185++
 186++    if (png_ptr != NULL && info_ptr != NULL)
 187++        return (info_ptr->num_plays);
 188++    return (0);
 189++}
 190++
 191++png_uint_32 PNGAPI
 192++png_get_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr,
 193++             png_uint_32 *width, png_uint_32 *height,
 194++             png_uint_32 *x_offset, png_uint_32 *y_offset,
 195++             png_uint_16 *delay_num, png_uint_16 *delay_den,
 196++             png_byte *dispose_op, png_byte *blend_op)
 197++{
 198++    png_debug1(1, "in %s retrieval function", "fcTL");
 199++
 200++    if (png_ptr != NULL && info_ptr != NULL &&
 201++        (info_ptr->valid & PNG_INFO_fcTL) &&
 202++        width != NULL && height != NULL &&
 203++        x_offset != NULL && y_offset != NULL &&
 204++        delay_num != NULL && delay_den != NULL &&
 205++        dispose_op != NULL && blend_op != NULL)
 206++    {
 207++        *width = info_ptr->next_frame_width;
 208++        *height = info_ptr->next_frame_height;
 209++        *x_offset = info_ptr->next_frame_x_offset;
 210++        *y_offset = info_ptr->next_frame_y_offset;
 211++        *delay_num = info_ptr->next_frame_delay_num;
 212++        *delay_den = info_ptr->next_frame_delay_den;
 213++        *dispose_op = info_ptr->next_frame_dispose_op;
 214++        *blend_op = info_ptr->next_frame_blend_op;
 215++        return (1);
 216++    }
 217++
 218++    return (0);
 219++}
 220++
 221++png_uint_32 PNGAPI
 222++png_get_next_frame_width(png_structp png_ptr, png_infop info_ptr)
 223++{
 224++    png_debug(1, "in png_get_next_frame_width()");
 225++
 226++    if (png_ptr != NULL && info_ptr != NULL)
 227++        return (info_ptr->next_frame_width);
 228++    return (0);
 229++}
 230++
 231++png_uint_32 PNGAPI
 232++png_get_next_frame_height(png_structp png_ptr, png_infop info_ptr)
 233++{
 234++    png_debug(1, "in png_get_next_frame_height()");
 235++
 236++    if (png_ptr != NULL && info_ptr != NULL)
 237++        return (info_ptr->next_frame_height);
 238++    return (0);
 239++}
 240++
 241++png_uint_32 PNGAPI
 242++png_get_next_frame_x_offset(png_structp png_ptr, png_infop info_ptr)
 243++{
 244++    png_debug(1, "in png_get_next_frame_x_offset()");
 245++
 246++    if (png_ptr != NULL && info_ptr != NULL)
 247++        return (info_ptr->next_frame_x_offset);
 248++    return (0);
 249++}
 250++
 251++png_uint_32 PNGAPI
 252++png_get_next_frame_y_offset(png_structp png_ptr, png_infop info_ptr)
 253++{
 254++    png_debug(1, "in png_get_next_frame_y_offset()");
 255++
 256++    if (png_ptr != NULL && info_ptr != NULL)
 257++        return (info_ptr->next_frame_y_offset);
 258++    return (0);
 259++}
 260++
 261++png_uint_16 PNGAPI
 262++png_get_next_frame_delay_num(png_structp png_ptr, png_infop info_ptr)
 263++{
 264++    png_debug(1, "in png_get_next_frame_delay_num()");
 265++
 266++    if (png_ptr != NULL && info_ptr != NULL)
 267++        return (info_ptr->next_frame_delay_num);
 268++    return (0);
 269++}
 270++
 271++png_uint_16 PNGAPI
 272++png_get_next_frame_delay_den(png_structp png_ptr, png_infop info_ptr)
 273++{
 274++    png_debug(1, "in png_get_next_frame_delay_den()");
 275++
 276++    if (png_ptr != NULL && info_ptr != NULL)
 277++        return (info_ptr->next_frame_delay_den);
 278++    return (0);
 279++}
 280++
 281++png_byte PNGAPI
 282++png_get_next_frame_dispose_op(png_structp png_ptr, png_infop info_ptr)
 283++{
 284++    png_debug(1, "in png_get_next_frame_dispose_op()");
 285++
 286++    if (png_ptr != NULL && info_ptr != NULL)
 287++        return (info_ptr->next_frame_dispose_op);
 288++    return (0);
 289++}
 290++
 291++png_byte PNGAPI
 292++png_get_next_frame_blend_op(png_structp png_ptr, png_infop info_ptr)
 293++{
 294++    png_debug(1, "in png_get_next_frame_blend_op()");
 295++
 296++    if (png_ptr != NULL && info_ptr != NULL)
 297++        return (info_ptr->next_frame_blend_op);
 298++    return (0);
 299++}
 300++
 301++png_byte PNGAPI
 302++png_get_first_frame_is_hidden(png_structp png_ptr, png_infop info_ptr)
 303++{
 304++    png_debug(1, "in png_first_frame_is_hidden()");
 305++
 306++    if (png_ptr != NULL)
 307++       return (png_byte)(png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN);
 308++
 309++    PNG_UNUSED(info_ptr)
 310++
 311++    return 0;
 312++}
 313++#endif /* PNG_APNG_SUPPORTED */
 314+ #endif /* READ || WRITE */
 315+diff --git a/pnginfo.h b/pnginfo.h
 316+index 1f98ded..ac7b269 100644
 317+--- a/pnginfo.h
 318++++ b/pnginfo.h
 319+@@ -263,5 +263,18 @@ defined(PNG_READ_BACKGROUND_SUPPORTED)
 320+    png_bytepp row_pointers;        /* the image bits */
 321+ #endif
 322+ 
 323++#ifdef PNG_APNG_SUPPORTED
 324++   png_uint_32 num_frames; /* including default image */
 325++   png_uint_32 num_plays;
 326++   png_uint_32 next_frame_width;
 327++   png_uint_32 next_frame_height;
 328++   png_uint_32 next_frame_x_offset;
 329++   png_uint_32 next_frame_y_offset;
 330++   png_uint_16 next_frame_delay_num;
 331++   png_uint_16 next_frame_delay_den;
 332++   png_byte next_frame_dispose_op;
 333++   png_byte next_frame_blend_op;
 334++#endif
 335++
 336+ };
 337+ #endif /* PNGINFO_H */
 338+diff --git a/pngpread.c b/pngpread.c
 339+index e283627..2eaeca0 100644
 340+--- a/pngpread.c
 341++++ b/pngpread.c
 342+@@ -195,6 +195,106 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr)
 343+ 
 344+    chunk_name = png_ptr->chunk_name;
 345+ 
 346++#ifdef PNG_READ_APNG_SUPPORTED
 347++   if (png_ptr->num_frames_read > 0 &&
 348++       png_ptr->num_frames_read < info_ptr->num_frames)
 349++   {
 350++      if (chunk_name == png_IDAT)
 351++      {
 352++         /* Discard trailing IDATs for the first frame */
 353++         if (png_ptr->mode & PNG_HAVE_fcTL || png_ptr->num_frames_read > 1)
 354++            png_error(png_ptr, "out of place IDAT");
 355++
 356++         if (png_ptr->push_length + 4 > png_ptr->buffer_size)
 357++         {
 358++            png_push_save_buffer(png_ptr);
 359++            return;
 360++         }
 361++
 362++         png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
 363++         return;
 364++      }
 365++      else if (chunk_name == png_fdAT)
 366++      {
 367++         if (png_ptr->buffer_size < 4)
 368++         {
 369++            png_push_save_buffer(png_ptr);
 370++            return;
 371++         }
 372++
 373++         png_ensure_sequence_number(png_ptr, 4);
 374++
 375++         if (!(png_ptr->mode & PNG_HAVE_fcTL))
 376++         {
 377++            /* Discard trailing fdATs for frames other than the first */
 378++            if (png_ptr->num_frames_read < 2)
 379++               png_error(png_ptr, "out of place fdAT");
 380++
 381++            if (png_ptr->push_length + 4 > png_ptr->buffer_size)
 382++            {
 383++               png_push_save_buffer(png_ptr);
 384++               return;
 385++            }
 386++
 387++            png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
 388++            return;
 389++         }
 390++
 391++         else
 392++         {
 393++            /* frame data follows */
 394++            png_ptr->idat_size = png_ptr->push_length - 4;
 395++            png_ptr->mode |= PNG_HAVE_IDAT;
 396++            png_ptr->process_mode = PNG_READ_IDAT_MODE;
 397++
 398++            return;
 399++         }
 400++      }
 401++
 402++      else if (chunk_name == png_fcTL)
 403++      {
 404++         if (png_ptr->push_length + 4 > png_ptr->buffer_size)
 405++         {
 406++            png_push_save_buffer(png_ptr);
 407++            return;
 408++         }
 409++
 410++         png_read_reset(png_ptr);
 411++         png_ptr->mode &= ~PNG_HAVE_fcTL;
 412++
 413++         png_handle_fcTL(png_ptr, info_ptr, png_ptr->push_length);
 414++
 415++         if (!(png_ptr->mode & PNG_HAVE_fcTL))
 416++            png_error(png_ptr, "missing required fcTL chunk");
 417++
 418++         png_read_reinit(png_ptr, info_ptr);
 419++         png_progressive_read_reset(png_ptr);
 420++
 421++         if (png_ptr->frame_info_fn != NULL)
 422++            (*(png_ptr->frame_info_fn))(png_ptr, png_ptr->num_frames_read);
 423++
 424++         png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
 425++
 426++         return;
 427++      }
 428++
 429++      else
 430++      {
 431++         if (png_ptr->push_length + 4 > png_ptr->buffer_size)
 432++         {
 433++            png_push_save_buffer(png_ptr);
 434++            return;
 435++         }
 436++         png_warning(png_ptr, "Skipped (ignored) a chunk "
 437++                              "between APNG chunks");
 438++         png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
 439++         return;
 440++      }
 441++
 442++      return;
 443++   }
 444++#endif /* PNG_READ_APNG_SUPPORTED */
 445++
 446+    if (chunk_name == png_IDAT)
 447+    {
 448+       if ((png_ptr->mode & PNG_AFTER_IDAT) != 0)
 449+@@ -261,6 +361,9 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr)
 450+ 
 451+    else if (chunk_name == png_IDAT)
 452+    {
 453++#ifdef PNG_READ_APNG_SUPPORTED
 454++      png_have_info(png_ptr, info_ptr);
 455++#endif
 456+       png_ptr->idat_size = png_ptr->push_length;
 457+       png_ptr->process_mode = PNG_READ_IDAT_MODE;
 458+       png_push_have_info(png_ptr, info_ptr);
 459+@@ -406,6 +509,30 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr)
 460+       png_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length);
 461+    }
 462+ #endif
 463++#ifdef PNG_READ_APNG_SUPPORTED
 464++   else if (chunk_name == png_acTL)
 465++   {
 466++      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
 467++      {
 468++         png_push_save_buffer(png_ptr);
 469++         return;
 470++      }
 471++
 472++      png_handle_acTL(png_ptr, info_ptr, png_ptr->push_length);
 473++   }
 474++
 475++   else if (chunk_name == png_fcTL)
 476++   {
 477++      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
 478++      {
 479++         png_push_save_buffer(png_ptr);
 480++         return;
 481++      }
 482++
 483++      png_handle_fcTL(png_ptr, info_ptr, png_ptr->push_length);
 484++   }
 485++
 486++#endif /* PNG_READ_APNG_SUPPORTED */
 487+ 
 488+    else
 489+    {
 490+@@ -539,7 +666,11 @@ png_push_read_IDAT(png_structrp png_ptr)
 491+       png_byte chunk_tag[4];
 492+ 
 493+       /* TODO: this code can be commoned up with the same code in push_read */
 494++#ifdef PNG_READ_APNG_SUPPORTED
 495++      PNG_PUSH_SAVE_BUFFER_IF_LT(12)
 496++#else
 497+       PNG_PUSH_SAVE_BUFFER_IF_LT(8)
 498++#endif
 499+       png_push_fill_buffer(png_ptr, chunk_length, 4);
 500+       png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length);
 501+       png_reset_crc(png_ptr);
 502+@@ -547,17 +678,64 @@ png_push_read_IDAT(png_structrp png_ptr)
 503+       png_ptr->chunk_name = PNG_CHUNK_FROM_STRING(chunk_tag);
 504+       png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
 505+ 
 506++#ifdef PNG_READ_APNG_SUPPORTED
 507++      if (png_ptr->chunk_name != png_fdAT && png_ptr->num_frames_read > 0)
 508++      {
 509++          if (png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED)
 510++          {
 511++              png_ptr->process_mode = PNG_READ_CHUNK_MODE;
 512++              if (png_ptr->frame_end_fn != NULL)
 513++                 (*(png_ptr->frame_end_fn))(png_ptr, png_ptr->num_frames_read);
 514++              png_ptr->num_frames_read++;
 515++              return;
 516++          }
 517++          else
 518++          {
 519++              if (png_ptr->chunk_name == png_IEND)
 520++                  png_error(png_ptr, "Not enough image data");
 521++              if (png_ptr->push_length + 4 > png_ptr->buffer_size)
 522++              {
 523++                 png_push_save_buffer(png_ptr);
 524++                 return;
 525++              }
 526++              png_warning(png_ptr, "Skipping (ignoring) a chunk between "
 527++                                   "APNG chunks");
 528++              png_crc_finish(png_ptr, png_ptr->push_length);
 529++              png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
 530++              return;
 531++          }
 532++      }
 533++      else
 534++#endif
 535++#ifdef PNG_READ_APNG_SUPPORTED
 536++      if (png_ptr->chunk_name != png_IDAT && png_ptr->num_frames_read == 0)
 537++#else
 538+       if (png_ptr->chunk_name != png_IDAT)
 539++#endif
 540+       {
 541+          png_ptr->process_mode = PNG_READ_CHUNK_MODE;
 542+ 
 543+          if ((png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED) == 0)
 544+             png_error(png_ptr, "Not enough compressed data");
 545+ 
 546++#ifdef PNG_READ_APNG_SUPPORTED
 547++         if (png_ptr->frame_end_fn != NULL)
 548++            (*(png_ptr->frame_end_fn))(png_ptr, png_ptr->num_frames_read);
 549++         png_ptr->num_frames_read++;
 550++#endif
 551++
 552+          return;
 553+       }
 554+ 
 555+       png_ptr->idat_size = png_ptr->push_length;
 556++
 557++#ifdef PNG_READ_APNG_SUPPORTED
 558++      if (png_ptr->num_frames_read > 0)
 559++      {
 560++         png_ensure_sequence_number(png_ptr, 4);
 561++         png_ptr->idat_size -= 4;
 562++      }
 563++#endif
 564+    }
 565+ 
 566+    if (png_ptr->idat_size != 0 && png_ptr->save_buffer_size != 0)
 567+@@ -631,6 +809,15 @@ png_process_IDAT_data(png_structrp png_ptr, png_bytep buffer,
 568+    if (!(buffer_length > 0) || buffer == NULL)
 569+       png_error(png_ptr, "No IDAT data (internal error)");
 570+ 
 571++#ifdef PNG_READ_APNG_SUPPORTED
 572++   /* If the app is not APNG-aware, decode only the first frame */
 573++   if (!(png_ptr->apng_flags & PNG_APNG_APP) && png_ptr->num_frames_read > 0)
 574++   {
 575++     png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED;
 576++     return;
 577++   }
 578++#endif
 579++
 580+    /* This routine must process all the data it has been given
 581+     * before returning, calling the row callback as required to
 582+     * handle the uncompressed results.
 583+@@ -1085,6 +1272,18 @@ png_set_progressive_read_fn(png_structrp png_ptr, png_voidp progressive_ptr,
 584+    png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer);
 585+ }
 586+ 
 587++#ifdef PNG_READ_APNG_SUPPORTED
 588++void PNGAPI
 589++png_set_progressive_frame_fn(png_structp png_ptr,
 590++   png_progressive_frame_ptr frame_info_fn,
 591++   png_progressive_frame_ptr frame_end_fn)
 592++{
 593++   png_ptr->frame_info_fn = frame_info_fn;
 594++   png_ptr->frame_end_fn = frame_end_fn;
 595++   png_ptr->apng_flags |= PNG_APNG_APP;
 596++}
 597++#endif
 598++
 599+ png_voidp PNGAPI
 600+ png_get_progressive_ptr(png_const_structrp png_ptr)
 601+ {
 602+diff --git a/pngpriv.h b/pngpriv.h
 603+index 7c19373..0757ecc 100644
 604+--- a/pngpriv.h
 605++++ b/pngpriv.h
 606+@@ -628,6 +628,10 @@
 607+ #define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000U /* Have another chunk after IDAT */
 608+ #define PNG_WROTE_eXIf            0x4000U
 609+ #define PNG_IS_READ_STRUCT        0x8000U /* Else is a write struct */
 610++#ifdef PNG_APNG_SUPPORTED
 611++#define PNG_HAVE_acTL            0x10000U
 612++#define PNG_HAVE_fcTL            0x20000U
 613++#endif
 614+ 
 615+ /* Flags for the transformations the PNG library does on the image data */
 616+ #define PNG_BGR                 0x0001U
 617+@@ -864,6 +868,16 @@
 618+ #define png_tRNS PNG_U32(116,  82,  78,  83)
 619+ #define png_zTXt PNG_U32(122,  84,  88, 116)
 620+ 
 621++#ifdef PNG_APNG_SUPPORTED
 622++#define png_acTL PNG_U32( 97,  99,  84,  76)
 623++#define png_fcTL PNG_U32(102,  99,  84,  76)
 624++#define png_fdAT PNG_U32(102, 100,  65,  84)
 625++
 626++/* For png_struct.apng_flags: */
 627++#define PNG_FIRST_FRAME_HIDDEN       0x0001U
 628++#define PNG_APNG_APP                 0x0002U
 629++#endif
 630++
 631+ /* The following will work on (signed char*) strings, whereas the get_uint_32
 632+  * macro will fail on top-bit-set values because of the sign extension.
 633+  */
 634+@@ -1635,6 +1649,47 @@ PNG_INTERNAL_FUNCTION(void,png_colorspace_sync,(png_const_structrp png_ptr,
 635+     */
 636+ #endif
 637+ 
 638++#ifdef PNG_APNG_SUPPORTED
 639++PNG_INTERNAL_FUNCTION(void,png_ensure_fcTL_is_valid,(png_structp png_ptr,
 640++   png_uint_32 width, png_uint_32 height,
 641++   png_uint_32 x_offset, png_uint_32 y_offset,
 642++   png_uint_16 delay_num, png_uint_16 delay_den,
 643++   png_byte dispose_op, png_byte blend_op), PNG_EMPTY);
 644++
 645++#ifdef PNG_READ_APNG_SUPPORTED
 646++PNG_INTERNAL_FUNCTION(void,png_handle_acTL,(png_structp png_ptr, png_infop info_ptr,
 647++   png_uint_32 length),PNG_EMPTY);
 648++PNG_INTERNAL_FUNCTION(void,png_handle_fcTL,(png_structp png_ptr, png_infop info_ptr,
 649++   png_uint_32 length),PNG_EMPTY);
 650++PNG_INTERNAL_FUNCTION(void,png_handle_fdAT,(png_structp png_ptr, png_infop info_ptr,
 651++   png_uint_32 length),PNG_EMPTY);
 652++PNG_INTERNAL_FUNCTION(void,png_have_info,(png_structp png_ptr, png_infop info_ptr),PNG_EMPTY);
 653++PNG_INTERNAL_FUNCTION(void,png_ensure_sequence_number,(png_structp png_ptr,
 654++   png_uint_32 length),PNG_EMPTY);
 655++PNG_INTERNAL_FUNCTION(void,png_read_reset,(png_structp png_ptr),PNG_EMPTY);
 656++PNG_INTERNAL_FUNCTION(void,png_read_reinit,(png_structp png_ptr,
 657++   png_infop info_ptr),PNG_EMPTY);
 658++#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
 659++PNG_INTERNAL_FUNCTION(void,png_progressive_read_reset,(png_structp png_ptr),PNG_EMPTY);
 660++#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
 661++#endif /* PNG_READ_APNG_SUPPORTED */
 662++
 663++#ifdef PNG_WRITE_APNG_SUPPORTED
 664++PNG_INTERNAL_FUNCTION(void,png_write_acTL,(png_structp png_ptr,
 665++   png_uint_32 num_frames, png_uint_32 num_plays),PNG_EMPTY);
 666++PNG_INTERNAL_FUNCTION(void,png_write_fcTL,(png_structp png_ptr,
 667++   png_uint_32 width, png_uint_32 height,
 668++   png_uint_32 x_offset, png_uint_32 y_offset,
 669++   png_uint_16 delay_num, png_uint_16 delay_den,
 670++   png_byte dispose_op, png_byte blend_op),PNG_EMPTY);
 671++PNG_INTERNAL_FUNCTION(void,png_write_fdAT,(png_structp png_ptr,
 672++   png_const_bytep data, png_size_t length),PNG_EMPTY);
 673++PNG_INTERNAL_FUNCTION(void,png_write_reset,(png_structp png_ptr),PNG_EMPTY);
 674++PNG_INTERNAL_FUNCTION(void,png_write_reinit,(png_structp png_ptr,
 675++   png_infop info_ptr, png_uint_32 width, png_uint_32 height),PNG_EMPTY);
 676++#endif /* PNG_WRITE_APNG_SUPPORTED */
 677++#endif /* PNG_APNG_SUPPORTED */
 678++
 679+ /* Added at libpng version 1.4.0 */
 680+ #ifdef PNG_COLORSPACE_SUPPORTED
 681+ /* These internal functions are for maintaining the colorspace structure within
 682+diff --git a/pngread.c b/pngread.c
 683+index 96996ce..a6e35a9 100644
 684+--- a/pngread.c
 685++++ b/pngread.c
 686+@@ -161,6 +161,9 @@ png_read_info(png_structrp png_ptr, png_inforp info_ptr)
 687+ 
 688+       else if (chunk_name == png_IDAT)
 689+       {
 690++#ifdef PNG_READ_APNG_SUPPORTED
 691++         png_have_info(png_ptr, info_ptr);
 692++#endif
 693+          png_ptr->idat_size = length;
 694+          break;
 695+       }
 696+@@ -255,6 +258,17 @@ png_read_info(png_structrp png_ptr, png_inforp info_ptr)
 697+          png_handle_iTXt(png_ptr, info_ptr, length);
 698+ #endif
 699+ 
 700++#ifdef PNG_READ_APNG_SUPPORTED
 701++      else if (chunk_name == png_acTL)
 702++         png_handle_acTL(png_ptr, info_ptr, length);
 703++
 704++      else if (chunk_name == png_fcTL)
 705++         png_handle_fcTL(png_ptr, info_ptr, length);
 706++
 707++      else if (chunk_name == png_fdAT)
 708++         png_handle_fdAT(png_ptr, info_ptr, length);
 709++#endif
 710++
 711+       else
 712+          png_handle_unknown(png_ptr, info_ptr, length,
 713+              PNG_HANDLE_CHUNK_AS_DEFAULT);
 714+@@ -262,6 +276,72 @@ png_read_info(png_structrp png_ptr, png_inforp info_ptr)
 715+ }
 716+ #endif /* SEQUENTIAL_READ */
 717+ 
 718++#ifdef PNG_READ_APNG_SUPPORTED
 719++void PNGAPI
 720++png_read_frame_head(png_structp png_ptr, png_infop info_ptr)
 721++{
 722++    png_byte have_chunk_after_DAT; /* after IDAT or after fdAT */
 723++
 724++    png_debug(0, "Reading frame head");
 725++
 726++    if (!(png_ptr->mode & PNG_HAVE_acTL))
 727++        png_error(png_ptr, "attempt to png_read_frame_head() but "
 728++                           "no acTL present");
 729++
 730++    /* do nothing for the main IDAT */
 731++    if (png_ptr->num_frames_read == 0)
 732++        return;
 733++
 734++    png_read_reset(png_ptr);
 735++    png_ptr->flags &= ~PNG_FLAG_ROW_INIT;
 736++    png_ptr->mode &= ~PNG_HAVE_fcTL;
 737++
 738++    have_chunk_after_DAT = 0;
 739++    for (;;)
 740++    {
 741++        png_uint_32 length = png_read_chunk_header(png_ptr);
 742++
 743++        if (png_ptr->chunk_name == png_IDAT)
 744++        {
 745++            /* discard trailing IDATs for the first frame */
 746++            if (have_chunk_after_DAT || png_ptr->num_frames_read > 1)
 747++                png_error(png_ptr, "png_read_frame_head(): out of place IDAT");
 748++            png_crc_finish(png_ptr, length);
 749++        }
 750++
 751++        else if (png_ptr->chunk_name == png_fcTL)
 752++        {
 753++            png_handle_fcTL(png_ptr, info_ptr, length);
 754++            have_chunk_after_DAT = 1;
 755++        }
 756++
 757++        else if (png_ptr->chunk_name == png_fdAT)
 758++        {
 759++            png_ensure_sequence_number(png_ptr, length);
 760++
 761++            /* discard trailing fdATs for frames other than the first */
 762++            if (!have_chunk_after_DAT && png_ptr->num_frames_read > 1)
 763++                png_crc_finish(png_ptr, length - 4);
 764++            else if(png_ptr->mode & PNG_HAVE_fcTL)
 765++            {
 766++                png_ptr->idat_size = length - 4;
 767++                png_ptr->mode |= PNG_HAVE_IDAT;
 768++
 769++                break;
 770++            }
 771++            else
 772++                png_error(png_ptr, "png_read_frame_head(): out of place fdAT");
 773++        }
 774++        else
 775++        {
 776++            png_warning(png_ptr, "Skipped (ignored) a chunk "
 777++                                 "between APNG chunks");
 778++            png_crc_finish(png_ptr, length);
 779++        }
 780++    }
 781++}
 782++#endif /* PNG_READ_APNG_SUPPORTED */
 783++
 784+ /* Optional call to update the users info_ptr structure */
 785+ void PNGAPI
 786+ png_read_update_info(png_structrp png_ptr, png_inforp info_ptr)
 787+diff --git a/pngrutil.c b/pngrutil.c
 788+index 068ab19..d0748ff 100644
 789+--- a/pngrutil.c
 790++++ b/pngrutil.c
 791+@@ -864,6 +864,11 @@ png_handle_IHDR(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
 792+    filter_type = buf[11];
 793+    interlace_type = buf[12];
 794+ 
 795++#ifdef PNG_READ_APNG_SUPPORTED
 796++   png_ptr->first_frame_width = width;
 797++   png_ptr->first_frame_height = height;
 798++#endif
 799++
 800+    /* Set internal variables */
 801+    png_ptr->width = width;
 802+    png_ptr->height = height;
 803+@@ -2858,6 +2863,179 @@ png_handle_iTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
 804+ }
 805+ #endif
 806+ 
 807++#ifdef PNG_READ_APNG_SUPPORTED
 808++void /* PRIVATE */
 809++png_handle_acTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
 810++{
 811++    png_byte data[8];
 812++    png_uint_32 num_frames;
 813++    png_uint_32 num_plays;
 814++    png_uint_32 didSet;
 815++
 816++    png_debug(1, "in png_handle_acTL");
 817++
 818++    if (!(png_ptr->mode & PNG_HAVE_IHDR))
 819++    {
 820++        png_error(png_ptr, "Missing IHDR before acTL");
 821++    }
 822++    else if (png_ptr->mode & PNG_HAVE_IDAT)
 823++    {
 824++        png_warning(png_ptr, "Invalid acTL after IDAT skipped");
 825++        png_crc_finish(png_ptr, length);
 826++        return;
 827++    }
 828++    else if (png_ptr->mode & PNG_HAVE_acTL)
 829++    {
 830++        png_warning(png_ptr, "Duplicate acTL skipped");
 831++        png_crc_finish(png_ptr, length);
 832++        return;
 833++    }
 834++    else if (length != 8)
 835++    {
 836++        png_warning(png_ptr, "acTL with invalid length skipped");
 837++        png_crc_finish(png_ptr, length);
 838++        return;
 839++    }
 840++
 841++    png_crc_read(png_ptr, data, 8);
 842++    png_crc_finish(png_ptr, 0);
 843++
 844++    num_frames = png_get_uint_31(png_ptr, data);
 845++    num_plays = png_get_uint_31(png_ptr, data + 4);
 846++
 847++    /* the set function will do error checking on num_frames */
 848++    didSet = png_set_acTL(png_ptr, info_ptr, num_frames, num_plays);
 849++    if(didSet)
 850++        png_ptr->mode |= PNG_HAVE_acTL;
 851++}
 852++
 853++void /* PRIVATE */
 854++png_handle_fcTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
 855++{
 856++    png_byte data[22];
 857++    png_uint_32 width;
 858++    png_uint_32 height;
 859++    png_uint_32 x_offset;
 860++    png_uint_32 y_offset;
 861++    png_uint_16 delay_num;
 862++    png_uint_16 delay_den;
 863++    png_byte dispose_op;
 864++    png_byte blend_op;
 865++
 866++    png_debug(1, "in png_handle_fcTL");
 867++
 868++    png_ensure_sequence_number(png_ptr, length);
 869++
 870++    if (!(png_ptr->mode & PNG_HAVE_IHDR))
 871++    {
 872++        png_error(png_ptr, "Missing IHDR before fcTL");
 873++    }
 874++    else if (png_ptr->mode & PNG_HAVE_IDAT)
 875++    {
 876++        /* for any frames other then the first this message may be misleading,
 877++        * but correct. PNG_HAVE_IDAT is unset before the frame head is read
 878++        * i can't think of a better message */
 879++        png_warning(png_ptr, "Invalid fcTL after IDAT skipped");
 880++        png_crc_finish(png_ptr, length-4);
 881++        return;
 882++    }
 883++    else if (png_ptr->mode & PNG_HAVE_fcTL)
 884++    {
 885++        png_warning(png_ptr, "Duplicate fcTL within one frame skipped");
 886++        png_crc_finish(png_ptr, length-4);
 887++        return;
 888++    }
 889++    else if (length != 26)
 890++    {
 891++        png_warning(png_ptr, "fcTL with invalid length skipped");
 892++        png_crc_finish(png_ptr, length-4);
 893++        return;
 894++    }
 895++
 896++    png_crc_read(png_ptr, data, 22);
 897++    png_crc_finish(png_ptr, 0);
 898++
 899++    width = png_get_uint_31(png_ptr, data);
 900++    height = png_get_uint_31(png_ptr, data + 4);
 901++    x_offset = png_get_uint_31(png_ptr, data + 8);
 902++    y_offset = png_get_uint_31(png_ptr, data + 12);
 903++    delay_num = png_get_uint_16(data + 16);
 904++    delay_den = png_get_uint_16(data + 18);
 905++    dispose_op = data[20];
 906++    blend_op = data[21];
 907++
 908++    if (png_ptr->num_frames_read == 0 && (x_offset != 0 || y_offset != 0))
 909++    {
 910++        png_warning(png_ptr, "fcTL for the first frame must have zero offset");
 911++        return;
 912++    }
 913++
 914++    if (info_ptr != NULL)
 915++    {
 916++        if (png_ptr->num_frames_read == 0 &&
 917++            (width != info_ptr->width || height != info_ptr->height))
 918++        {
 919++            png_warning(png_ptr, "size in first frame's fcTL must match "
 920++                               "the size in IHDR");
 921++            return;
 922++        }
 923++
 924++        /* The set function will do more error checking */
 925++        png_set_next_frame_fcTL(png_ptr, info_ptr, width, height,
 926++                                x_offset, y_offset, delay_num, delay_den,
 927++                                dispose_op, blend_op);
 928++
 929++        png_read_reinit(png_ptr, info_ptr);
 930++
 931++        png_ptr->mode |= PNG_HAVE_fcTL;
 932++    }
 933++}
 934++
 935++void /* PRIVATE */
 936++png_have_info(png_structp png_ptr, png_infop info_ptr)
 937++{
 938++    if((info_ptr->valid & PNG_INFO_acTL) && !(info_ptr->valid & PNG_INFO_fcTL))
 939++    {
 940++        png_ptr->apng_flags |= PNG_FIRST_FRAME_HIDDEN;
 941++        info_ptr->num_frames++;
 942++    }
 943++}
 944++
 945++void /* PRIVATE */
 946++png_handle_fdAT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
 947++{
 948++    png_ensure_sequence_number(png_ptr, length);
 949++
 950++    /* This function is only called from png_read_end(), png_read_info(),
 951++    * and png_push_read_chunk() which means that:
 952++    * - the user doesn't want to read this frame
 953++    * - or this is an out-of-place fdAT
 954++    * in either case it is safe to ignore the chunk with a warning */
 955++    png_warning(png_ptr, "ignoring fdAT chunk");
 956++    png_crc_finish(png_ptr, length - 4);
 957++    PNG_UNUSED(info_ptr)
 958++}
 959++
 960++void /* PRIVATE */
 961++png_ensure_sequence_number(png_structp png_ptr, png_uint_32 length)
 962++{
 963++    png_byte data[4];
 964++    png_uint_32 sequence_number;
 965++
 966++    if (length < 4)
 967++        png_error(png_ptr, "invalid fcTL or fdAT chunk found");
 968++
 969++    png_crc_read(png_ptr, data, 4);
 970++    sequence_number = png_get_uint_31(png_ptr, data);
 971++
 972++    if (sequence_number != png_ptr->next_seq_num)
 973++        png_error(png_ptr, "fcTL or fdAT chunk with out-of-order sequence "
 974++                           "number found");
 975++
 976++    png_ptr->next_seq_num++;
 977++}
 978++#endif /* PNG_READ_APNG_SUPPORTED */
 979++
 980+ #ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
 981+ /* Utility function for png_handle_unknown; set up png_ptr::unknown_chunk */
 982+ static int
 983+@@ -4166,7 +4344,38 @@ png_read_IDAT_data(png_structrp png_ptr, png_bytep output,
 984+       {
 985+          uInt avail_in;
 986+          png_bytep buffer;
 987++#ifdef PNG_READ_APNG_SUPPORTED
 988++         png_uint_32 bytes_to_skip = 0;
 989++
 990++         while (png_ptr->idat_size == 0 || bytes_to_skip != 0)
 991++         {
 992++            png_crc_finish(png_ptr, bytes_to_skip);
 993++            bytes_to_skip = 0;
 994++
 995++            png_ptr->idat_size = png_read_chunk_header(png_ptr);
 996++            if (png_ptr->num_frames_read == 0)
 997++            {
 998++               if (png_ptr->chunk_name != png_IDAT)
 999++                  png_error(png_ptr, "Not enough image data");
1000++            }
1001++            else
1002++            {
1003++               if (png_ptr->chunk_name == png_IEND)
1004++                  png_error(png_ptr, "Not enough image data");
1005++               if (png_ptr->chunk_name != png_fdAT)
1006++               {
1007++                  png_warning(png_ptr, "Skipped (ignored) a chunk "
1008++                                       "between APNG chunks");
1009++                  bytes_to_skip = png_ptr->idat_size;
1010++                  continue;
1011++               }
1012++
1013++               png_ensure_sequence_number(png_ptr, png_ptr->idat_size);
1014+ 
1015++               png_ptr->idat_size -= 4;
1016++            }
1017++         }
1018++#else
1019+          while (png_ptr->idat_size == 0)
1020+          {
1021+             png_crc_finish(png_ptr, 0);
1022+@@ -4178,7 +4387,7 @@ png_read_IDAT_data(png_structrp png_ptr, png_bytep output,
1023+             if (png_ptr->chunk_name != png_IDAT)
1024+                png_error(png_ptr, "Not enough image data");
1025+          }
1026+-
1027++#endif /* PNG_READ_APNG_SUPPORTED */
1028+          avail_in = png_ptr->IDAT_read_size;
1029+ 
1030+          if (avail_in > png_ptr->idat_size)
1031+@@ -4241,6 +4450,9 @@ png_read_IDAT_data(png_structrp png_ptr, png_bytep output,
1032+ 
1033+          png_ptr->mode |= PNG_AFTER_IDAT;
1034+          png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED;
1035++#ifdef PNG_READ_APNG_SUPPORTED
1036++         png_ptr->num_frames_read++;
1037++#endif
1038+ 
1039+          if (png_ptr->zstream.avail_in > 0 || png_ptr->idat_size > 0)
1040+             png_chunk_benign_error(png_ptr, "Extra compressed data");
1041+@@ -4678,4 +4890,80 @@ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
1042+ 
1043+    png_ptr->flags |= PNG_FLAG_ROW_INIT;
1044+ }
1045++
1046++#ifdef PNG_READ_APNG_SUPPORTED
1047++/* This function is to be called after the main IDAT set has been read and
1048++ * before a new IDAT is read. It resets some parts of png_ptr
1049++ * to make them usable by the read functions again */
1050++void /* PRIVATE */
1051++png_read_reset(png_structp png_ptr)
1052++{
1053++    png_ptr->mode &= ~PNG_HAVE_IDAT;
1054++    png_ptr->mode &= ~PNG_AFTER_IDAT;
1055++    png_ptr->row_number = 0;
1056++    png_ptr->pass = 0;
1057++}
1058++
1059++void /* PRIVATE */
1060++png_read_reinit(png_structp png_ptr, png_infop info_ptr)
1061++{
1062++    png_ptr->width = info_ptr->next_frame_width;
1063++    png_ptr->height = info_ptr->next_frame_height;
1064++    png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth,png_ptr->width);
1065++    png_ptr->info_rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth,
1066++        png_ptr->width);
1067++    if (png_ptr->prev_row)
1068++        memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1);
1069++}
1070++
1071++#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
1072++/* same as png_read_reset() but for the progressive reader */
1073++void /* PRIVATE */
1074++png_progressive_read_reset(png_structp png_ptr)
1075++{
1076++#ifdef PNG_READ_INTERLACING_SUPPORTED
1077++   /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
1078++
1079++   /* Start of interlace block */
1080++    const int png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
1081++
1082++    /* Offset to next interlace block */
1083++    const int png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
1084++
1085++    /* Start of interlace block in the y direction */
1086++    const int png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
1087++
1088++    /* Offset to next interlace block in the y direction */
1089++    const int png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
1090++
1091++    if (png_ptr->interlaced)
1092++    {
1093++        if (!(png_ptr->transformations & PNG_INTERLACE))
1094++            png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 -
1095++                                png_pass_ystart[0]) / png_pass_yinc[0];
1096++        else
1097++            png_ptr->num_rows = png_ptr->height;
1098++
1099++        png_ptr->iwidth = (png_ptr->width +
1100++                           png_pass_inc[png_ptr->pass] - 1 -
1101++                           png_pass_start[png_ptr->pass]) /
1102++                           png_pass_inc[png_ptr->pass];
1103++    }
1104++    else
1105++#endif /* PNG_READ_INTERLACING_SUPPORTED */
1106++    {
1107++        png_ptr->num_rows = png_ptr->height;
1108++        png_ptr->iwidth = png_ptr->width;
1109++    }
1110++    png_ptr->flags &= ~PNG_FLAG_ZSTREAM_ENDED;
1111++    if (inflateReset(&(png_ptr->zstream)) != Z_OK)
1112++        png_error(png_ptr, "inflateReset failed");
1113++    png_ptr->zstream.avail_in = 0;
1114++    png_ptr->zstream.next_in = 0;
1115++    png_ptr->zstream.next_out = png_ptr->row_buf;
1116++    png_ptr->zstream.avail_out = (uInt)PNG_ROWBYTES(png_ptr->pixel_depth,
1117++        png_ptr->iwidth) + 1;
1118++}
1119++#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
1120++#endif /* PNG_READ_APNG_SUPPORTED */
1121+ #endif /* READ */
1122+diff --git a/pngset.c b/pngset.c
1123+index 3fc31fe..0bea6bc 100644
1124+--- a/pngset.c
1125++++ b/pngset.c
1126+@@ -280,6 +280,11 @@ png_set_IHDR(png_const_structrp png_ptr, png_inforp info_ptr,
1127+    info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth);
1128+ 
1129+    info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width);
1130++
1131++#ifdef PNG_APNG_SUPPORTED
1132++   /* for non-animated png. this may be overwritten from an acTL chunk later */
1133++   info_ptr->num_frames = 1;
1134++#endif
1135+ }
1136+ 
1137+ #ifdef PNG_oFFs_SUPPORTED
1138+@@ -1149,6 +1154,147 @@ png_set_sPLT(png_const_structrp png_ptr,
1139+ }
1140+ #endif /* sPLT */
1141+ 
1142++#ifdef PNG_APNG_SUPPORTED
1143++png_uint_32 PNGAPI
1144++png_set_acTL(png_structp png_ptr, png_infop info_ptr,
1145++    png_uint_32 num_frames, png_uint_32 num_plays)
1146++{
1147++    png_debug1(1, "in %s storage function", "acTL");
1148++
1149++    if (png_ptr == NULL || info_ptr == NULL)
1150++    {
1151++        png_warning(png_ptr,
1152++                    "Call to png_set_acTL() with NULL png_ptr "
1153++                    "or info_ptr ignored");
1154++        return (0);
1155++    }
1156++    if (num_frames == 0)
1157++    {
1158++        png_warning(png_ptr,
1159++                    "Ignoring attempt to set acTL with num_frames zero");
1160++        return (0);
1161++    }
1162++    if (num_frames > PNG_UINT_31_MAX)
1163++    {
1164++        png_warning(png_ptr,
1165++                    "Ignoring attempt to set acTL with num_frames > 2^31-1");
1166++        return (0);
1167++    }
1168++    if (num_plays > PNG_UINT_31_MAX)
1169++    {
1170++        png_warning(png_ptr,
1171++                    "Ignoring attempt to set acTL with num_plays "
1172++                    "> 2^31-1");
1173++        return (0);
1174++    }
1175++
1176++    info_ptr->num_frames = num_frames;
1177++    info_ptr->num_plays = num_plays;
1178++
1179++    info_ptr->valid |= PNG_INFO_acTL;
1180++
1181++    return (1);
1182++}
1183++
1184++/* delay_num and delay_den can hold any 16-bit values including zero */
1185++png_uint_32 PNGAPI
1186++png_set_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr,
1187++    png_uint_32 width, png_uint_32 height,
1188++    png_uint_32 x_offset, png_uint_32 y_offset,
1189++    png_uint_16 delay_num, png_uint_16 delay_den,
1190++    png_byte dispose_op, png_byte blend_op)
1191++{
1192++    png_debug1(1, "in %s storage function", "fcTL");
1193++
1194++    if (png_ptr == NULL || info_ptr == NULL)
1195++    {
1196++        png_warning(png_ptr,
1197++                    "Call to png_set_fcTL() with NULL png_ptr or info_ptr "
1198++                    "ignored");
1199++        return (0);
1200++    }
1201++
1202++    png_ensure_fcTL_is_valid(png_ptr, width, height, x_offset, y_offset,
1203++                             delay_num, delay_den, dispose_op, blend_op);
1204++
1205++    if (blend_op == PNG_BLEND_OP_OVER)
1206++    {
1207++        if (!(png_ptr->color_type & PNG_COLOR_MASK_ALPHA) &&
1208++            !(png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)))
1209++        {
1210++          png_warning(png_ptr, "PNG_BLEND_OP_OVER is meaningless "
1211++                               "and wasteful for opaque images, ignored");
1212++          blend_op = PNG_BLEND_OP_SOURCE;
1213++        }
1214++    }
1215++
1216++    info_ptr->next_frame_width = width;
1217++    info_ptr->next_frame_height = height;
1218++    info_ptr->next_frame_x_offset = x_offset;
1219++    info_ptr->next_frame_y_offset = y_offset;
1220++    info_ptr->next_frame_delay_num = delay_num;
1221++    info_ptr->next_frame_delay_den = delay_den;
1222++    info_ptr->next_frame_dispose_op = dispose_op;
1223++    info_ptr->next_frame_blend_op = blend_op;
1224++
1225++    info_ptr->valid |= PNG_INFO_fcTL;
1226++
1227++    return (1);
1228++}
1229++
1230++void /* PRIVATE */
1231++png_ensure_fcTL_is_valid(png_structp png_ptr,
1232++    png_uint_32 width, png_uint_32 height,
1233++    png_uint_32 x_offset, png_uint_32 y_offset,
1234++    png_uint_16 delay_num, png_uint_16 delay_den,
1235++    png_byte dispose_op, png_byte blend_op)
1236++{
1237++    if (width == 0 || width > PNG_UINT_31_MAX)
1238++        png_error(png_ptr, "invalid width in fcTL (> 2^31-1)");
1239++    if (height == 0 || height > PNG_UINT_31_MAX)
1240++        png_error(png_ptr, "invalid height in fcTL (> 2^31-1)");
1241++    if (x_offset > PNG_UINT_31_MAX)
1242++        png_error(png_ptr, "invalid x_offset in fcTL (> 2^31-1)");
1243++    if (y_offset > PNG_UINT_31_MAX)
1244++        png_error(png_ptr, "invalid y_offset in fcTL (> 2^31-1)");
1245++    if (width + x_offset > png_ptr->first_frame_width ||
1246++        height + y_offset > png_ptr->first_frame_height)
1247++        png_error(png_ptr, "dimensions of a frame are greater than"
1248++                           "the ones in IHDR");
1249++
1250++    if (dispose_op != PNG_DISPOSE_OP_NONE &&
1251++        dispose_op != PNG_DISPOSE_OP_BACKGROUND &&
1252++        dispose_op != PNG_DISPOSE_OP_PREVIOUS)
1253++        png_error(png_ptr, "invalid dispose_op in fcTL");
1254++
1255++    if (blend_op != PNG_BLEND_OP_SOURCE &&
1256++        blend_op != PNG_BLEND_OP_OVER)
1257++        png_error(png_ptr, "invalid blend_op in fcTL");
1258++
1259++    PNG_UNUSED(delay_num)
1260++    PNG_UNUSED(delay_den)
1261++}
1262++
1263++png_uint_32 PNGAPI
1264++png_set_first_frame_is_hidden(png_structp png_ptr, png_infop info_ptr,
1265++                              png_byte is_hidden)
1266++{
1267++    png_debug(1, "in png_first_frame_is_hidden()");
1268++
1269++    if (png_ptr == NULL)
1270++        return 0;
1271++
1272++    if (is_hidden)
1273++        png_ptr->apng_flags |= PNG_FIRST_FRAME_HIDDEN;
1274++    else
1275++        png_ptr->apng_flags &= ~PNG_FIRST_FRAME_HIDDEN;
1276++
1277++    PNG_UNUSED(info_ptr)
1278++
1279++    return 1;
1280++}
1281++#endif /* PNG_APNG_SUPPORTED */
1282++
1283+ #ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
1284+ static png_byte
1285+ check_location(png_const_structrp png_ptr, int location)
1286+diff --git a/pngstruct.h b/pngstruct.h
1287+index e591d94..1583dfc 100644
1288+--- a/pngstruct.h
1289++++ b/pngstruct.h
1290+@@ -399,6 +399,27 @@ struct png_struct_def
1291+    png_byte filter_type;
1292+ #endif
1293+ 
1294++#ifdef PNG_APNG_SUPPORTED
1295++   png_uint_32 apng_flags;
1296++   png_uint_32 next_seq_num;         /* next fcTL/fdAT chunk sequence number */
1297++   png_uint_32 first_frame_width;
1298++   png_uint_32 first_frame_height;
1299++
1300++#ifdef PNG_READ_APNG_SUPPORTED
1301++   png_uint_32 num_frames_read;      /* incremented after all image data of */
1302++                                     /* a frame is read */
1303++#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
1304++   png_progressive_frame_ptr frame_info_fn; /* frame info read callback */
1305++   png_progressive_frame_ptr frame_end_fn;  /* frame data read callback */
1306++#endif
1307++#endif
1308++
1309++#ifdef PNG_WRITE_APNG_SUPPORTED
1310++   png_uint_32 num_frames_to_write;
1311++   png_uint_32 num_frames_written;
1312++#endif
1313++#endif /* PNG_APNG_SUPPORTED */
1314++
1315+ /* New members added in libpng-1.2.0 */
1316+ 
1317+ /* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */
1318+diff --git a/pngtest.c b/pngtest.c
1319+index 37b42bb..6b0e676 100644
1320+--- a/pngtest.c
1321++++ b/pngtest.c
1322+@@ -875,6 +875,10 @@ test_one_file(const char *inname, const char *outname)
1323+    volatile int num_passes;
1324+    int pass;
1325+    int bit_depth, color_type;
1326++#ifdef PNG_APNG_SUPPORTED
1327++   png_uint_32 num_frames;
1328++   png_uint_32 num_plays;
1329++#endif
1330+ 
1331+    row_buf = NULL;
1332+    error_parameters.file_name = inname;
1333+@@ -1383,6 +1387,22 @@ test_one_file(const char *inname, const char *outname)
1334+       }
1335+    }
1336+ #endif
1337++
1338++#ifdef PNG_APNG_SUPPORTED
1339++   if (png_get_valid(read_ptr, read_info_ptr, PNG_INFO_acTL))
1340++   {
1341++      if (png_get_acTL(read_ptr, read_info_ptr, &num_frames, &num_plays))
1342++      {
1343++         png_byte is_hidden;
1344++         pngtest_debug2("Handling acTL chunks (frames %ld, plays %ld)",
1345++                    num_frames, num_plays);
1346++         png_set_acTL(write_ptr, write_info_ptr, num_frames, num_plays);
1347++         is_hidden = png_get_first_frame_is_hidden(read_ptr, read_info_ptr);
1348++         png_set_first_frame_is_hidden(write_ptr, write_info_ptr, is_hidden);
1349++      }
1350++   }
1351++#endif
1352++
1353+ #ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
1354+    {
1355+       png_unknown_chunkp unknowns;
1356+@@ -1462,6 +1482,110 @@ test_one_file(const char *inname, const char *outname)
1357+    t_stop = (float)clock();
1358+    t_misc += (t_stop - t_start);
1359+    t_start = t_stop;
1360++#endif
1361++#ifdef PNG_APNG_SUPPORTED
1362++   if (png_get_valid(read_ptr, read_info_ptr, PNG_INFO_acTL))
1363++   {
1364++      png_uint_32 frame;
1365++      for (frame = 0; frame < num_frames; frame++)
1366++      {
1367++         png_uint_32 frame_width;
1368++         png_uint_32 frame_height;
1369++         png_uint_32 x_offset;
1370++         png_uint_32 y_offset;
1371++         png_uint_16 delay_num;
1372++         png_uint_16 delay_den;
1373++         png_byte dispose_op;
1374++         png_byte blend_op;
1375++         png_read_frame_head(read_ptr, read_info_ptr);
1376++         if (png_get_valid(read_ptr, read_info_ptr, PNG_INFO_fcTL))
1377++         {
1378++            png_get_next_frame_fcTL(read_ptr, read_info_ptr,
1379++                                    &frame_width, &frame_height,
1380++                                    &x_offset, &y_offset,
1381++                                    &delay_num, &delay_den,
1382++                                    &dispose_op, &blend_op);
1383++         }
1384++         else
1385++         {
1386++            frame_width = width;
1387++            frame_height = height;
1388++            x_offset = 0;
1389++            y_offset = 0;
1390++            delay_num = 1;
1391++            delay_den = 1;
1392++            dispose_op = PNG_DISPOSE_OP_NONE;
1393++            blend_op = PNG_BLEND_OP_SOURCE;
1394++         }
1395++#ifdef PNG_WRITE_APNG_SUPPORTED
1396++         png_write_frame_head(write_ptr, write_info_ptr, (png_bytepp)&row_buf,
1397++                              frame_width, frame_height,
1398++                              x_offset, y_offset,
1399++                              delay_num, delay_den,
1400++                              dispose_op, blend_op);
1401++#endif
1402++         for (pass = 0; pass < num_passes; pass++)
1403++         {
1404++#           ifdef calc_pass_height
1405++               png_uint_32 pass_height;
1406++
1407++               if (num_passes == 7) /* interlaced */
1408++               {
1409++                  if (PNG_PASS_COLS(frame_width, pass) > 0)
1410++                     pass_height = PNG_PASS_ROWS(frame_height, pass);
1411++
1412++                  else
1413++                     pass_height = 0;
1414++               }
1415++
1416++               else /* not interlaced */
1417++                  pass_height = frame_height;
1418++#           else
1419++#              define pass_height frame_height
1420++#           endif
1421++
1422++            pngtest_debug1("Writing row data for pass %d", pass);
1423++            for (y = 0; y < pass_height; y++)
1424++            {
1425++#ifndef SINGLE_ROWBUF_ALLOC
1426++               pngtest_debug2("Allocating row buffer (pass %d, y = %u)...", pass, y);
1427++
1428++               row_buf = (png_bytep)png_malloc(read_ptr,
1429++                  png_get_rowbytes(read_ptr, read_info_ptr));
1430++
1431++               pngtest_debug2("\t0x%08lx (%lu bytes)", (unsigned long)row_buf,
1432++                  (unsigned long)png_get_rowbytes(read_ptr, read_info_ptr));
1433++
1434++#endif /* !SINGLE_ROWBUF_ALLOC */
1435++               png_read_rows(read_ptr, (png_bytepp)&row_buf, NULL, 1);
1436++
1437++#ifdef PNG_WRITE_SUPPORTED
1438++#ifdef PNGTEST_TIMING
1439++               t_stop = (float)clock();
1440++               t_decode += (t_stop - t_start);
1441++               t_start = t_stop;
1442++#endif
1443++               png_write_rows(write_ptr, (png_bytepp)&row_buf, 1);
1444++#ifdef PNGTEST_TIMING
1445++               t_stop = (float)clock();
1446++               t_encode += (t_stop - t_start);
1447++               t_start = t_stop;
1448++#endif
1449++#endif /* PNG_WRITE_SUPPORTED */
1450++
1451++#ifndef SINGLE_ROWBUF_ALLOC
1452++               pngtest_debug2("Freeing row buffer (pass %d, y = %u)", pass, y);
1453++               png_free(read_ptr, row_buf);
1454++               row_buf = NULL;
1455++#endif /* !SINGLE_ROWBUF_ALLOC */
1456++            }
1457++         }
1458++#ifdef PNG_WRITE_APNG_SUPPORTED
1459++         png_write_frame_tail(write_ptr, write_info_ptr);
1460++#endif
1461++      }
1462++   }
1463++   else
1464+ #endif
1465+    for (pass = 0; pass < num_passes; pass++)
1466+    {
1467+diff --git a/pngwrite.c b/pngwrite.c
1468+index 32f4bfb..6d2e021 100644
1469+--- a/pngwrite.c
1470++++ b/pngwrite.c
1471+@@ -128,6 +128,10 @@ png_write_info_before_PLTE(png_structrp png_ptr, png_const_inforp info_ptr)
1472+        * the application continues writing the PNG.  So check the 'invalid'
1473+        * flag here too.
1474+        */
1475++#ifdef PNG_WRITE_APNG_SUPPORTED
1476++      if (info_ptr->valid & PNG_INFO_acTL)
1477++         png_write_acTL(png_ptr, info_ptr->num_frames, info_ptr->num_plays);
1478++#endif
1479+ #ifdef PNG_GAMMA_SUPPORTED
1480+ #  ifdef PNG_WRITE_gAMA_SUPPORTED
1481+       if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
1482+@@ -373,6 +377,11 @@ png_write_end(png_structrp png_ptr, png_inforp info_ptr)
1483+       png_benign_error(png_ptr, "Wrote palette index exceeding num_palette");
1484+ #endif
1485+ 
1486++#ifdef PNG_WRITE_APNG_SUPPORTED
1487++   if (png_ptr->num_frames_written != png_ptr->num_frames_to_write)
1488++      png_error(png_ptr, "Not enough frames written");
1489++#endif
1490++
1491+    /* See if user wants us to write information chunks */
1492+    if (info_ptr != NULL)
1493+    {
1494+@@ -1475,6 +1484,43 @@ png_write_png(png_structrp png_ptr, png_inforp info_ptr,
1495+ }
1496+ #endif
1497+ 
1498++#ifdef PNG_WRITE_APNG_SUPPORTED
1499++void PNGAPI
1500++png_write_frame_head(png_structp png_ptr, png_infop info_ptr,
1501++    png_bytepp row_pointers, png_uint_32 width, png_uint_32 height,
1502++    png_uint_32 x_offset, png_uint_32 y_offset,
1503++    png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op,
1504++    png_byte blend_op)
1505++{
1506++    png_debug(1, "in png_write_frame_head");
1507++
1508++    /* there is a chance this has been set after png_write_info was called,
1509++    * so it would be set but not written. is there a way to be sure? */
1510++    if (!(info_ptr->valid & PNG_INFO_acTL))
1511++        png_error(png_ptr, "png_write_frame_head(): acTL not set");
1512++
1513++    png_write_reset(png_ptr);
1514++
1515++    png_write_reinit(png_ptr, info_ptr, width, height);
1516++
1517++    if ( !(png_ptr->num_frames_written == 0 &&
1518++           (png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN) ) )
1519++        png_write_fcTL(png_ptr, width, height, x_offset, y_offset,
1520++                       delay_num, delay_den, dispose_op, blend_op);
1521++
1522++    PNG_UNUSED(row_pointers)
1523++}
1524++
1525++void PNGAPI
1526++png_write_frame_tail(png_structp png_ptr, png_infop info_ptr)
1527++{
1528++    png_debug(1, "in png_write_frame_tail");
1529++
1530++    png_ptr->num_frames_written++;
1531++
1532++    PNG_UNUSED(info_ptr)
1533++}
1534++#endif /* PNG_WRITE_APNG_SUPPORTED */
1535+ 
1536+ #ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED
1537+ /* Initialize the write structure - general purpose utility. */
1538+diff --git a/pngwutil.c b/pngwutil.c
1539+index 01f0607..8b374e2 100644
1540+--- a/pngwutil.c
1541++++ b/pngwutil.c
1542+@@ -821,6 +821,11 @@ png_write_IHDR(png_structrp png_ptr, png_uint_32 width, png_uint_32 height,
1543+    /* Write the chunk */
1544+    png_write_complete_chunk(png_ptr, png_IHDR, buf, 13);
1545+ 
1546++#ifdef PNG_WRITE_APNG_SUPPORTED
1547++   png_ptr->first_frame_width = width;
1548++   png_ptr->first_frame_height = height;
1549++#endif
1550++
1551+    if ((png_ptr->do_filter) == PNG_NO_FILTERS)
1552+    {
1553+       if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE ||
1554+@@ -1002,8 +1007,17 @@ png_compress_IDAT(png_structrp png_ptr, png_const_bytep input,
1555+                optimize_cmf(data, png_image_size(png_ptr));
1556+ #endif
1557+ 
1558+-         if (size > 0)
1559+-            png_write_complete_chunk(png_ptr, png_IDAT, data, size);
1560++            if (size > 0)
1561++#ifdef PNG_WRITE_APNG_SUPPORTED
1562++            {
1563++               if (png_ptr->num_frames_written == 0)
1564++#endif
1565++               png_write_complete_chunk(png_ptr, png_IDAT, data, size);
1566++#ifdef PNG_WRITE_APNG_SUPPORTED
1567++               else
1568++                  png_write_fdAT(png_ptr, data, size);
1569++            }
1570++#endif /* PNG_WRITE_APNG_SUPPORTED */
1571+          png_ptr->mode |= PNG_HAVE_IDAT;
1572+ 
1573+          png_ptr->zstream.next_out = data;
1574+@@ -1050,7 +1064,17 @@ png_compress_IDAT(png_structrp png_ptr, png_const_bytep input,
1575+ #endif
1576+ 
1577+          if (size > 0)
1578++#ifdef PNG_WRITE_APNG_SUPPORTED
1579++         {
1580++            if (png_ptr->num_frames_written == 0)
1581++#endif
1582+             png_write_complete_chunk(png_ptr, png_IDAT, data, size);
1583++#ifdef PNG_WRITE_APNG_SUPPORTED
1584++            else
1585++               png_write_fdAT(png_ptr, data, size);
1586++         }
1587++#endif /* PNG_WRITE_APNG_SUPPORTED */
1588++
1589+          png_ptr->zstream.avail_out = 0;
1590+          png_ptr->zstream.next_out = NULL;
1591+          png_ptr->mode |= PNG_HAVE_IDAT | PNG_AFTER_IDAT;
1592+@@ -1885,6 +1909,82 @@ png_write_tIME(png_structrp png_ptr, png_const_timep mod_time)
1593+ }
1594+ #endif
1595+ 
1596++#ifdef PNG_WRITE_APNG_SUPPORTED
1597++void /* PRIVATE */
1598++png_write_acTL(png_structp png_ptr,
1599++    png_uint_32 num_frames, png_uint_32 num_plays)
1600++{
1601++    png_byte buf[8];
1602++
1603++    png_debug(1, "in png_write_acTL");
1604++
1605++    png_ptr->num_frames_to_write = num_frames;
1606++
1607++    if (png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN)
1608++        num_frames--;
1609++
1610++    png_save_uint_32(buf, num_frames);
1611++    png_save_uint_32(buf + 4, num_plays);
1612++
1613++    png_write_complete_chunk(png_ptr, png_acTL, buf, (png_size_t)8);
1614++}
1615++
1616++void /* PRIVATE */
1617++png_write_fcTL(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
1618++    png_uint_32 x_offset, png_uint_32 y_offset,
1619++    png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op,
1620++    png_byte blend_op)
1621++{
1622++    png_byte buf[26];
1623++
1624++    png_debug(1, "in png_write_fcTL");
1625++
1626++    if (png_ptr->num_frames_written == 0 && (x_offset != 0 || y_offset != 0))
1627++        png_error(png_ptr, "x and/or y offset for the first frame aren't 0");
1628++    if (png_ptr->num_frames_written == 0 &&
1629++        (width != png_ptr->first_frame_width ||
1630++         height != png_ptr->first_frame_height))
1631++        png_error(png_ptr, "width and/or height in the first frame's fcTL "
1632++                           "don't match the ones in IHDR");
1633++
1634++    /* more error checking */
1635++    png_ensure_fcTL_is_valid(png_ptr, width, height, x_offset, y_offset,
1636++                             delay_num, delay_den, dispose_op, blend_op);
1637++
1638++    png_save_uint_32(buf, png_ptr->next_seq_num);
1639++    png_save_uint_32(buf + 4, width);
1640++    png_save_uint_32(buf + 8, height);
1641++    png_save_uint_32(buf + 12, x_offset);
1642++    png_save_uint_32(buf + 16, y_offset);
1643++    png_save_uint_16(buf + 20, delay_num);
1644++    png_save_uint_16(buf + 22, delay_den);
1645++    buf[24] = dispose_op;
1646++    buf[25] = blend_op;
1647++
1648++    png_write_complete_chunk(png_ptr, png_fcTL, buf, (png_size_t)26);
1649++
1650++    png_ptr->next_seq_num++;
1651++}
1652++
1653++void /* PRIVATE */
1654++png_write_fdAT(png_structp png_ptr,
1655++    png_const_bytep data, png_size_t length)
1656++{
1657++    png_byte buf[4];
1658++
1659++    png_write_chunk_header(png_ptr, png_fdAT, (png_uint_32)(4 + length));
1660++
1661++    png_save_uint_32(buf, png_ptr->next_seq_num);
1662++    png_write_chunk_data(png_ptr, buf, 4);
1663++
1664++    png_write_chunk_data(png_ptr, data, length);
1665++
1666++    png_write_chunk_end(png_ptr);
1667++
1668++    png_ptr->next_seq_num++;
1669++}
1670++#endif /* PNG_WRITE_APNG_SUPPORTED */
1671++
1672+ /* Initializes the row writing capability of libpng */
1673+ void /* PRIVATE */
1674+ png_write_start_row(png_structrp png_ptr)
1675+@@ -2778,4 +2878,39 @@ png_write_filtered_row(png_structrp png_ptr, png_bytep filtered_row,
1676+    }
1677+ #endif /* WRITE_FLUSH */
1678+ }
1679++
1680++#ifdef PNG_WRITE_APNG_SUPPORTED
1681++void /* PRIVATE */
1682++png_write_reset(png_structp png_ptr)
1683++{
1684++    png_ptr->row_number = 0;
1685++    png_ptr->pass = 0;
1686++    png_ptr->mode &= ~PNG_HAVE_IDAT;
1687++}
1688++
1689++void /* PRIVATE */
1690++png_write_reinit(png_structp png_ptr, png_infop info_ptr,
1691++                 png_uint_32 width, png_uint_32 height)
1692++{
1693++    if (png_ptr->num_frames_written == 0 &&
1694++        (width != png_ptr->first_frame_width ||
1695++         height != png_ptr->first_frame_height))
1696++        png_error(png_ptr, "width and/or height in the first frame's fcTL "
1697++                           "don't match the ones in IHDR");
1698++    if (width > png_ptr->first_frame_width ||
1699++        height > png_ptr->first_frame_height)
1700++        png_error(png_ptr, "width and/or height for a frame greater than"
1701++                           "the ones in IHDR");
1702++
1703++    png_set_IHDR(png_ptr, info_ptr, width, height,
1704++                 info_ptr->bit_depth, info_ptr->color_type,
1705++                 info_ptr->interlace_type, info_ptr->compression_type,
1706++                 info_ptr->filter_type);
1707++
1708++    png_ptr->width = width;
1709++    png_ptr->height = height;
1710++    png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, width);
1711++    png_ptr->usr_width = png_ptr->width;
1712++}
1713++#endif /* PNG_WRITE_APNG_SUPPORTED */
1714+ #endif /* WRITE */
1715+diff --git a/scripts/symbols.def b/scripts/symbols.def
1716+index 82494bb..2d08674 100644
1717+--- a/scripts/symbols.def
1718++++ b/scripts/symbols.def
1719+@@ -253,3 +253,23 @@ EXPORTS
1720+  png_set_eXIf @247
1721+  png_get_eXIf_1 @248
1722+  png_set_eXIf_1 @249
1723++ png_get_acTL @250
1724++ png_set_acTL @251
1725++ png_get_num_frames @252
1726++ png_get_num_plays @253
1727++ png_get_next_frame_fcTL @254
1728++ png_set_next_frame_fcTL @255
1729++ png_get_next_frame_width @256
1730++ png_get_next_frame_height @257
1731++ png_get_next_frame_x_offset @258
1732++ png_get_next_frame_y_offset @259
1733++ png_get_next_frame_delay_num @260
1734++ png_get_next_frame_delay_den @261
1735++ png_get_next_frame_dispose_op @262
1736++ png_get_next_frame_blend_op @263
1737++ png_get_first_frame_is_hidden @264
1738++ png_set_first_frame_is_hidden @265
1739++ png_read_frame_head @266
1740++ png_set_progressive_frame_fn @267
1741++ png_write_frame_head @268
1742++ png_write_frame_tail @269
+2, -0
1@@ -0,0 +1,2 @@
2+https://github.com/glennrp/libpng/archive/v1.6.40.tar.gz
3+patches/apng.patch
+1, -0
1@@ -0,0 +1 @@
2+1.6.40 1
+33, -0
 1@@ -0,0 +1,33 @@
 2+#!/bin/sh -e
 3+
 4+export DESTDIR="$1"
 5+
 6+TMPDIR="$1/tmp"
 7+
 8+./configure \
 9+    --prefix=/ \
10+    --sysconfdir=/etc \
11+    --mandir=/share/man \
12+    --localstatedir=/var \
13+    ac_cv_lib_Xdmcp_XdmcpWrap=no
14+
15+make
16+make install
17+
18+# Some X11 packages install to /share.
19+! [ -d "$1/share/pkgconfig" ] || {
20+    mkdir -p "$1/lib"
21+    mv -f "$1/share/pkgconfig" "$1/lib"
22+}
23+
24+# We need to keep this around.
25+! [ -d "$1/share/aclocal" ] || {
26+    mkdir -p "$TMPDIR"
27+    mv -f "$1/share/aclocal" "$TMPDIR"
28+}
29+
30+# Restore kept directories.
31+! [ -d "$TMPDIR" ] || {
32+    mv -f "$TMPDIR/"* "$1/share"
33+    rm -rf "$TMPDIR"
34+}
+1, -0
1@@ -0,0 +1 @@
2+fb4aae5de85adb0de8f1e7e5b9489d1108676350f2c4c2372ffc6ee55d7203e531
+5, -0
1@@ -0,0 +1,5 @@
2+libXau
3+pkgconf make
4+python  make
5+xcb-proto
6+xorg-util-macros
+1, -0
1@@ -0,0 +1 @@
2+https://x.org/releases/individual/lib/libxcb-1.16.tar.gz
+1, -0
1@@ -0,0 +1 @@
2+1.16 1
+9, -0
 1@@ -0,0 +1,9 @@
 2+#!/bin/sh -e
 3+
 4+./configure \
 5+    --prefix=/ \
 6+    --with-shared-memory-dir=/dev/shm \
 7+    --disable-shared
 8+
 9+make
10+make DESTDIR="$1" install
+1, -0
1@@ -0,0 +1 @@
2+1db5f7002e58f0260d96fe40a6d694d3f08fb383840ac24f1d724cc979bfff60c1
+2, -0
1@@ -0,0 +1,2 @@
2+pkgconf   make
3+xorgproto make
+1, -0
1@@ -0,0 +1 @@
2+https://x.org/releases/individual/lib/libxshmfence-1.3.2.tar.gz
+1, -0
1@@ -0,0 +1 @@
2+1.3.2 1
+24, -0
 1@@ -0,0 +1,24 @@
 2+#!/bin/sh -e
 3+
 4+export DESTDIR="$1"
 5+
 6+# Set -Ddefault_library=both by default.
 7+sed "s/\(value: \)'static'/\1'both'/" src/script/per_project_options.meson > _
 8+mv -f _ src/script/per_project_options.meson
 9+
10+command -v muon > /dev/null || {
11+      ./bootstrap.sh build
12+    export PATH=$PWD/build:$PATH
13+    
14+}
15+
16+muon setup \
17+      -Dprefix=/ \
18+      -Ddocs=disabled \
19+      -Dlibcurl=disabled \
20+      -Dlibpkgconf=disabled \
21+      -Dstatic=true \
22+      build
23+
24+samu -C build
25+muon  -C build install
+2, -0
1@@ -0,0 +1,2 @@
2+pkgconf make
3+#samurai make
+1, -0
1@@ -0,0 +1 @@
2+https://git.sr.ht/~lattis/muon/archive/1aeda599b10ac911f66f41e15076e90465767f60.tar.gz
+1, -0
1@@ -0,0 +1 @@
2+0.2.0 1
+12, -0
 1@@ -0,0 +1,12 @@
 2+#!/bin/sh -e
 3+
 4+export DESTDIR="$1"
 5+
 6+muon setup \
 7+    -Dprefix=/usr \
 8+    -Dgtk=disabled \
 9+    -Ddefault_library=static \
10+    output
11+
12+samu -C output
13+muon -C output install
+1, -0
1@@ -0,0 +1 @@
2+95d879c36c63344e3803e580a4a087c30bb76b3cc23eff801d9e7f2f2e7793b6ec
+1, -0
1@@ -0,0 +1 @@
2+muon make
+1, -0
1@@ -0,0 +1 @@
2+https://x.org/releases/individual/lib/pixman-0.43.0.tar.xz
+1, -0
1@@ -0,0 +1 @@
2+0.43.0 1
+3, -2
 1@@ -17,11 +17,12 @@ export LDFLAGS="$LDFLAGS -fno-semantic-interposition"
 2 
 3 ./configure \
 4     --prefix=/ \
 5-    --enable-static \
 6-    --with-system-expat \
 7+    --libdir=/lib \
 8+    --enable-shared \
 9     --with-system-ffi \
10     --with-ensurepip=yes \
11     --without-pymalloc \
12+    --disable-ipv6 \
13     --with-builtin-hashlib-hashes="sha3,blake2,sha1,sha512,sha256,md5" \
14     --with-ssl-default-suites="TLSv1.3:TLSv1.2+AEAD+ECDHE:TLSv1.2+AEAD+DHE" \
15     ax_cv_c_float_words_bigendian=no
+1, -1
1@@ -1,5 +1,5 @@
2 47bb72ced6c29652399875b77b953ccda570f9d51ed966a27c680cd4428b9e7da1
3-585bc906f88516c85c6a7cda6fe52d4d5cb355bb79ff16bbad6dc19103d2097224
4+9360e2b3668ebb095f4898f0e8c567b1a5c34f43e36dc6a020f6ca418019de328c
5 0af9d6cc044d43fbe3f98a316802e4a4cd6d35d3606a4c5b6d5c135da6342d316d
6 396477ecc3d3244653804674429e0013d6bc631fec52d2ef33d0d4546b681715df
7 c4b318c0f2cbcdc0da0c1ee452b78266ec10a9e0ed4a36d630a81d73853e31cb3c
+2, -2
1@@ -1,6 +1,6 @@
2 #bzip2
3-expat
4 libffi
5 libressl
6+pkgconf make
7 sqlite
8-#zlib
9+zlib
+1, -1
1@@ -1 +1 @@
2-#zlib make
3+zlib make
+17, -0
 1@@ -0,0 +1,17 @@
 2+#!/bin/sh -e
 3+
 4+# fix sx for tinyx
 5+sed -e 's/-keeptty//' \
 6+	-e 's/exec Xorg/exec Xfbdev/' \
 7+	sx > _
 8+mv -f _ sx
 9+
10+mkdir -p \
11+	"$1/bin" \
12+	"$1/share/man/man1"
13+
14+chmod 755 sx
15+chmod 655 sx.1
16+
17+cp -f sx "$1/bin"
18+cp -f sx.1 "$1/share/man/man1"
+1, -0
1@@ -0,0 +1 @@
2+4251001d92bd5201226d98931e5ae38fcec9c3585ab0fe77f9077f2f777795607c
+1, -0
1@@ -0,0 +1 @@
2+xauth
+1, -0
1@@ -0,0 +1 @@
2+https://github.com/Earnestly/sx/archive/f5408bd939f9b51479d85041b4da8b7bbcbaee64.tar.gz
+1, -0
1@@ -0,0 +1 @@
2+f5408bd939f9b51479d85041b4da8b7bbcbaee64 1
+23, -0
 1@@ -0,0 +1,23 @@
 2+#!/bin/sh -e
 3+
 4+export LDFLAGS="$LDFLAGS -static-pie"
 5+export XSERVERCFLAGS_CFLAGS="-fPIE"
 6+export XSERVERLIBS_LIBS="/lib/*.a -lz -lfreetype -lpng16"
 7+
 8+./configure \
 9+  --prefix=/ \
10+  --with-fontdir=/share/fonts \
11+  --disable-xdmcp \
12+  --disable-xdm-auth-1
13+
14+make
15+make DESTDIR="$1" install
16+
17+chmod u+s "$1/bin/Xfbdev"
18+
19+# not compatible
20+rm -rf    "$1/bin/Xvesa"
21+
22+#install minimum requirement for bitmap fonts
23+mkdir -p "$1/share/fonts/misc"
24+cp ./*.pcf.gz fonts.alias fonts.dir "$1/share/fonts/misc"
+2, -0
1@@ -0,0 +1,2 @@
2+6126c1285a84968a0a4c9caafdae653e51108a89d9f74d82a52bb24b90f3ba1ebe
3+78fb9658f2ce79b689d57ae9dc3f9a19e4d0cb859a8d5b404f660eaa2b36a68eac
+9, -0
 1@@ -0,0 +1,9 @@
 2+freetype make
 3+libXdmcp make make
 4+libXfont make
 5+libXtst make
 6+libfontenc make
 7+libpng make
 8+#linux-headers make
 9+xtrans make
10+zlib make
+2, -0
1@@ -0,0 +1,2 @@
2+https://github.com/hovercats/tinyx/releases/download/pre-gen-eed4902840732f170a7020cedb381017de99f2e6/tinyx-eed4902840732f170a7020cedb381017de99f2e6.tar.gz
3+https://github.com/kyx0r/repo-main/releases/download/tinyxfont_1.0/tinyxfont.tar.gz
+1, -0
1@@ -0,0 +1 @@
2+eed4902840732f170a7020cedb381017de99f2e6 1
+33, -0
 1@@ -0,0 +1,33 @@
 2+#!/bin/sh -e
 3+
 4+export DESTDIR="$1"
 5+
 6+TMPDIR="$1/tmp"
 7+
 8+./configure \
 9+    --prefix=/ \
10+    --sysconfdir=/etc \
11+    --mandir=/share/man \
12+    --localstatedir=/var \
13+    XAUTH_CFLAGS="-static"
14+
15+make LIBS="/lib/*.a /lib/libXau.a /lib/libxcb.a"
16+make install
17+
18+# Some X11 packages install to /share.
19+! [ -d "$1/share/pkgconfig" ] || {
20+    mkdir -p "$1/lib"
21+    mv -f "$1/share/pkgconfig" "$1/lib"
22+}
23+
24+# We need to keep this around.
25+! [ -d "$1/share/aclocal" ] || {
26+    mkdir -p "$TMPDIR"
27+    mv -f "$1/share/aclocal" "$TMPDIR"
28+}
29+
30+# Restore kept directories.
31+! [ -d "$TMPDIR" ] || {
32+    mv -f "$TMPDIR/"* "$1/share"
33+    rm -rf "$TMPDIR"
34+}
+1, -0
1@@ -0,0 +1 @@
2+b51783551114f17f42d5e463de28640f4b728a419ded64637e052266d31a9d692a
+3, -0
1@@ -0,0 +1,3 @@
2+libXmu make
3+pkgconf make
4+xorg-util-macros make
+1, -0
1@@ -0,0 +1 @@
2+https://x.org/releases/individual/app/xauth-1.1.2.tar.gz
+1, -0
1@@ -0,0 +1 @@
2+1.1.2 1
+34, -0
 1@@ -0,0 +1,34 @@
 2+#!/bin/sh -e
 3+
 4+export DESTDIR="$1"
 5+
 6+TMPDIR="$1/tmp"
 7+
 8+./configure \
 9+    --prefix=/ \
10+    --sysconfdir=/etc \
11+    --mandir=/share/man \
12+    --localstatedir=/var \
13+    --without-xmlto \
14+    --disable-specs
15+
16+make
17+make install
18+
19+# Some X11 packages install to /share.
20+! [ -d "$1/share/pkgconfig" ] || {
21+    mkdir -p "$1/lib"
22+    mv -f "$1/share/pkgconfig" "$1/lib"
23+}
24+
25+# We need to keep this around.
26+! [ -d "$1/share/aclocal" ] || {
27+    mkdir -p "$TMPDIR"
28+    mv -f "$1/share/aclocal" "$TMPDIR"
29+}
30+
31+# Restore kept directories.
32+! [ -d "$TMPDIR" ] || {
33+    mv -f "$TMPDIR/"* "$1/share"
34+    rm -rf "$TMPDIR"
35+}
+1, -0
1@@ -0,0 +1 @@
2+f22b439d6cf084c67cea4ea21fa4613c160729c46972fef6bf059e53cac2a12a7e
+1, -0
1@@ -0,0 +1 @@
2+python make
+1, -0
1@@ -0,0 +1 @@
2+https://x.org/releases/individual/proto/xcb-proto-1.16.0.tar.gz
+1, -0
1@@ -0,0 +1 @@
2+1.16.0 1
+11, -0
 1@@ -0,0 +1,11 @@
 2+#!/bin/sh -e
 3+
 4+patch -p1 < configure-Pass-LDFLAGS-to-link-tests.patch
 5+
 6+export CFLAGS="$CFLAGS -fPIC"
 7+
 8+./configure \
 9+    --prefix=/
10+
11+make
12+make DESTDIR="$1" install
+2, -0
1@@ -0,0 +1,2 @@
2+ec1abc6f672a7a6ee6f49ba544cc9529f73121b478310473be44fee22a140ebfdf
3+d53a4aa6d75429e307204cd56e1f12b930d19af59a4e70363cf2f57551a8097845
 1@@ -0,0 +1,74 @@
 2+From 37c9730ba474d274f4cc6a974943eef95087b9f6 Mon Sep 17 00:00:00 2001
 3+From: Khem Raj <raj.khem@gmail.com>
 4+Date: Tue, 8 Mar 2022 22:38:47 -0800
 5+Subject: [PATCH] configure: Pass LDFLAGS to link tests
 6+
 7+LDFLAGS can contain critical flags without which linking wont succeed
 8+therefore ensure that all configure tests involving link time checks are
 9+using LDFLAGS on compiler commandline along with CFLAGS to ensure the
10+tests perform correctly. Without this some tests may fail resulting in
11+wrong confgure result, ending in miscompiling the package
12+
13+Signed-off-by: Khem Raj <raj.khem@gmail.com>
14+---
15+ configure | 12 ++++++------
16+ 1 file changed, 6 insertions(+), 6 deletions(-)
17+
18+diff --git a/configure b/configure
19+index e974d1fd7..69dfa3f69 100755
20+--- a/configure
21++++ b/configure
22+@@ -410,7 +410,7 @@ if test $shared -eq 1; then
23+   echo Checking for shared library support... | tee -a configure.log
24+   # we must test in two steps (cc then ld), required at least on SunOS 4.x
25+   if try $CC -w -c $SFLAGS $test.c &&
26+-     try $LDSHARED $SFLAGS -o $test$shared_ext $test.o; then
27++     try $LDSHARED $SFLAGS $LDFLAGS -o $test$shared_ext $test.o; then
28+     echo Building shared library $SHAREDLIBV with $CC. | tee -a configure.log
29+   elif test -z "$old_cc" -a -z "$old_cflags"; then
30+     echo No shared library support. | tee -a configure.log
31+@@ -492,7 +492,7 @@ int main(void) {
32+ }
33+ EOF
34+   fi
35+-  if try $CC $CFLAGS -o $test $test.c; then
36++  if try $CC $CFLAGS $LDFLAGS -o $test $test.c; then
37+     sizet=`./$test`
38+     echo "Checking for a pointer-size integer type..." $sizet"." | tee -a configure.log
39+   else
40+@@ -530,7 +530,7 @@ int main(void) {
41+   return 0;
42+ }
43+ EOF
44+-  if try $CC $CFLAGS -o $test $test.c; then
45++  if try $CC $CFLAGS $LDFLAGS -o $test $test.c; then
46+     echo "Checking for fseeko... Yes." | tee -a configure.log
47+   else
48+     CFLAGS="${CFLAGS} -DNO_FSEEKO"
49+@@ -547,7 +547,7 @@ cat > $test.c <<EOF
50+ #include <errno.h>
51+ int main() { return strlen(strerror(errno)); }
52+ EOF
53+-if try $CC $CFLAGS -o $test $test.c; then
54++if try $CC $CFLAGS $LDFLAGS -o $test $test.c; then
55+   echo "Checking for strerror... Yes." | tee -a configure.log
56+ else
57+   CFLAGS="${CFLAGS} -DNO_STRERROR"
58+@@ -654,7 +654,7 @@ int main()
59+   return (mytest("Hello%d\n", 1));
60+ }
61+ EOF
62+-  if try $CC $CFLAGS -o $test $test.c; then
63++  if try $CC $CFLAGS $LDFLAGS -o $test $test.c; then
64+     echo "Checking for vsnprintf() in stdio.h... Yes." | tee -a configure.log
65+ 
66+     echo >> configure.log
67+@@ -744,7 +744,7 @@ int main()
68+ }
69+ EOF
70+ 
71+-  if try $CC $CFLAGS -o $test $test.c; then
72++  if try $CC $CFLAGS $LDFLAGS -o $test $test.c; then
73+     echo "Checking for snprintf() in stdio.h... Yes." | tee -a configure.log
74+ 
75+     echo >> configure.log
+2, -0
1@@ -0,0 +1,2 @@
2+https://zlib.net/fossils/zlib-1.3.tar.gz
3+patches/configure-Pass-LDFLAGS-to-link-tests.patch
+1, -0
1@@ -0,0 +1 @@
2+1.3 1