<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html dir="ltr" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml" lang="en"><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="MediaWiki 1.13.4">
<meta name="keywords" content="APNG Specification">
<link rel="shortcut icon" href="https://wiki.mozilla.org/favicon.ico">
<link rel="search" type="application/opensearchdescription+xml" href="https://wiki.mozilla.org/opensearch_desc.php" title="MozillaWiki (en)">
<link rel="alternate" type="application/rss+xml" title="MozillaWiki RSS Feed" href="https://wiki.mozilla.org/index.php?title=Special:RecentChanges&amp;feed=rss">
<link rel="alternate" type="application/atom+xml" title="MozillaWiki Atom Feed" href="https://wiki.mozilla.org/index.php?title=Special:RecentChanges&amp;feed=atom">
<title>APNG Specification - MozillaWiki</title>
<style type="text/css" media="screen,projection">/*<![CDATA[*/ @import "/skins/cavendish/main.css"; /*]]>*/</style>
<link rel="stylesheet" type="text/css" media="print" href="APNG_Specification_elemei/commonPrint.css">
<script type="text/javascript">/*<![CDATA[*/
var skin = "cavendish";
var stylepath = "/skins";
var wgArticlePath = "/$1";
var wgScriptPath = "";
var wgScript = "/index.php";
var wgVariantArticlePath = false;
var wgActionPaths = [];
var wgServer = "https://wiki.mozilla.org";
var wgCanonicalNamespace = "";
var wgCanonicalSpecialPageName = false;
var wgNamespaceNumber = 0;
var wgPageName = "APNG_Specification";
var wgTitle = "APNG Specification";
var wgAction = "view";
var wgArticleId = "16916";
var wgIsArticle = true;
var wgUserName = null;
var wgUserGroups = null;
var wgUserLanguage = "en";
var wgContentLanguage = "en";
var wgBreakFrames = false;
var wgCurRevisionId = "104130";
var wgVersion = "1.13.4";
var wgEnableAPI = true;
var wgEnableWriteAPI = false;
var wgRestrictionEdit = [];
var wgRestrictionMove = [];
/*]]>*/</script>
<script type="text/javascript" src="APNG_Specification_elemei/index.php"></script> <script type="text/javascript" src="APNG_Specification_elemei/wikibits.js"></script>
<style type="text/css">/*<![CDATA[*/
@import "/index.php?title=MediaWiki:Common.css&usemsgcache=yes&action=raw&ctype=text/css&smaxage=18000";
@import "/index.php?title=MediaWiki:Cavendish.css&usemsgcache=yes&action=raw&ctype=text/css&smaxage=18000";
@import "/index.php?title=-&action=raw&gen=css&maxage=18000&useskin=cavendish";
/*]]>*/</style> </head><body class="ns-0">
<div id="internal"></div>
<div id="container">
<div id="mozilla-org"><a href="http://www.mozilla.org/">Visit Mozilla.org</a></div>
<div id="header">
<a name="top" id="contentTop"></a>
<h1><a href="https://wiki.mozilla.org/Main_Page" title="Main Page">APNG Specification</a></h1>
<ul>
<li class="selected"><a href="https://wiki.mozilla.org/APNG_Specification">Page</a></li><li><a href="https://wiki.mozilla.org/Talk:APNG_Specification">Discussion</a></li><li><a href="https://wiki.mozilla.org/index.php?title=APNG_Specification&amp;action=edit">View source</a></li><li><a href="https://wiki.mozilla.org/index.php?title=APNG_Specification&amp;action=history">History</a></li> </ul>
<form name="searchform" action="/Special:Search" id="search">
<div>
<label for="q">Search</label>
<input id="q" name="search" accesskey="f" type="text">
<input name="go" class="searchButton" id="searchGoButton" value="Go" type="submit">&nbsp;<input name="fulltext" class="searchButton" value="Search" type="submit">
</div>
</form>
</div>
<div id="mBody">
<div id="side">
<ul id="nav">
<li><span>Personal tools</span>
<ul>
<li id="pt-login"><a title="You are encouraged to log in, it is not mandatory however. [alt-shift-o]" accesskey="o" href="https://wiki.mozilla.org/index.php?title=Special:UserLogin&amp;returnto=APNG_Specification">Log in / create account</a></li> </ul>
</li>
<li><span>Navigation</span>
<ul>
<li id="n-mainpage-description"><a href="https://wiki.mozilla.org/Main_Page">Main Page</a></li>
<li title="About the project, what you can do, where to find things" id="n-portal"><a href="https://wiki.mozilla.org/MozillaWiki:Community_Portal">Community portal</a></li>
<li title="Find background information on current events" id="n-currentevents"><a href="http://www.mozillazine.org/">Mozilla News</a></li>
<li id="n-recentchanges"><a title="The list of recent changes in the wiki. [alt-shift-r]" accesskey="r" href="https://wiki.mozilla.org/Special:RecentChanges">Recent changes</a></li>
<li id="n-randompage"><a title="Load a random page [alt-shift-x]" accesskey="x" href="https://wiki.mozilla.org/Special:Random">Random page</a></li>
<li title="The place to find out." id="n-help"><a href="https://wiki.mozilla.org/Help:Contents">Help</a></li>
</ul>
</li>
<li><span>Toolbox</span>
<ul>
<li id="t-whatlinkshere"><a title="List of all wiki pages that link here [alt-shift-j]" accesskey="j" href="https://wiki.mozilla.org/Special:WhatLinksHere/APNG_Specification">What links here</a></li>
<li id="t-recentchangeslinked"><a title="Recent changes in pages linked from this page [alt-shift-k]" accesskey="k" href="https://wiki.mozilla.org/Special:RecentChangesLinked/APNG_Specification">Related changes</a></li>
<li id="t-upload"><a title="Upload images or media files [alt-shift-u]" accesskey="u" href="https://wiki.mozilla.org/Special:Upload">Upload file</a></li> <li id="t-specialpages"><a title="List of all special pages [alt-shift-q]" accesskey="q" href="https://wiki.mozilla.org/Special:SpecialPages">Special pages</a></li> </ul>
</li>
</ul>
</div><!-- end of SIDE div -->
<div id="mainContent">
<h1>APNG Specification</h1>
<h3 id="siteSub">From MozillaWiki</h3>
<div id="contentSub"></div>
<!-- start content -->
<p>APNG 1.0
</p><p>Authors:
</p>
<ul><li> Stuart Parmenter &lt;hide@address.com&gt;
</li><li> Vladimir Vukicevic &lt;hide@address.com&gt;
</li><li> Andrew Smith &lt;hide@address.com&gt;
</li></ul>
<table id="toc" class="toc" summary="Contents"><tbody><tr><td><div id="toctitle"><h2>Contents</h2> <span class="toctoggle">[<a href="javascript:toggleToc()" class="internal" id="togglelink">hide</a>]</span></div>
<ul>
<li class="toclevel-1"><a href="#Overview"><span class="tocnumber">1</span> <span class="toctext">Overview</span></a>
<ul>
<li class="toclevel-2"><a href="#Terminology"><span class="tocnumber">1.1</span> <span class="toctext">Terminology</span></a></li>
<li class="toclevel-2"><a href="#Error_Handling"><span class="tocnumber">1.2</span> <span class="toctext">Error Handling</span></a></li>
</ul>
</li>
<li class="toclevel-1"><a href="#Structure"><span class="tocnumber">2</span> <span class="toctext">Structure</span></a>
<ul>
<li class="toclevel-2"><a href="#Chunk_Sequence_Numbers"><span class="tocnumber">2.1</span> <span class="toctext">Chunk Sequence Numbers</span></a></li>
<li class="toclevel-2"><a href="#.60acTL.60:_The_Animation_Control_Chunk"><span class="tocnumber">2.2</span> <span class="toctext">`acTL`: The Animation Control Chunk</span></a></li>
<li class="toclevel-2"><a href="#.60fcTL.60:_The_Frame_Control_Chunk"><span class="tocnumber">2.3</span> <span class="toctext">`fcTL`: The Frame Control Chunk</span></a></li>
<li class="toclevel-2"><a href="#.60fdAT.60:_The_Frame_Data_Chunk"><span class="tocnumber">2.4</span> <span class="toctext">`fdAT`: The Frame Data Chunk</span></a></li>
</ul>
</li>
<li class="toclevel-1"><a href="#Revisions_to_this_Specification"><span class="tocnumber">3</span> <span class="toctext">Revisions to this Specification</span></a>
<ul>
<li class="toclevel-2"><a href="#From_0.1"><span class="tocnumber">3.1</span> <span class="toctext">From 0.1</span></a></li>
<li class="toclevel-2"><a href="#From_0.2"><span class="tocnumber">3.2</span> <span class="toctext">From 0.2</span></a></li>
<li class="toclevel-2"><a href="#From_0.3"><span class="tocnumber">3.3</span> <span class="toctext">From 0.3</span></a></li>
<li class="toclevel-2"><a href="#From_0.4"><span class="tocnumber">3.4</span> <span class="toctext">From 0.4</span></a></li>
<li class="toclevel-2"><a href="#From_0.5"><span class="tocnumber">3.5</span> <span class="toctext">From 0.5</span></a></li>
<li class="toclevel-2"><a href="#From_0.6"><span class="tocnumber">3.6</span> <span class="toctext">From 0.6</span></a></li>
<li class="toclevel-2"><a href="#From_0.7"><span class="tocnumber">3.7</span> <span class="toctext">From 0.7</span></a></li>
<li class="toclevel-2"><a href="#From_0.8"><span class="tocnumber">3.8</span> <span class="toctext">From 0.8</span></a></li>
<li class="toclevel-2"><a href="#From_0.9"><span class="tocnumber">3.9</span> <span class="toctext">From 0.9</span></a></li>
<li class="toclevel-2"><a href="#From_0.10"><span class="tocnumber">3.10</span> <span class="toctext">From 0.10</span></a></li>
</ul>
</li>
<li class="toclevel-1"><a href="#Test_Encoder_and_Sample_Images"><span class="tocnumber">4</span> <span class="toctext">Test Encoder and Sample Images</span></a></li>
<li class="toclevel-1"><a href="#A._References"><span class="tocnumber">5</span> <span class="toctext">A. References</span></a></li>
</ul>
</td></tr></tbody></table><script type="text/javascript"> if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script>
<a name="Overview"></a><h1><span class="mw-headline"> Overview </span> </h1>
<p>APNG is an extension of the <a href="http://www.w3.org/TR/PNG/" class="external text" title="http://www.w3.org/TR/PNG/" rel="nofollow">PNG</a>
format, adding support for animated images. It is intended to be a
replacement for simple animated images that have traditionally used the
<a href="http://www.w3.org/Graphics/GIF/spec-gif89a.txt" class="external text" title="http://www.w3.org/Graphics/GIF/spec-gif89a.txt" rel="nofollow">GIF</a>
format, while adding support for 24-bit images and 8-bit transparency.
APNG is a simpler alternative to MNG, providing a spec suitable for the
most common usage of animated images on the Internet.
</p><p>APNG is backwards-compatible with PNG; any PNG decoder should
be able to ignore the APNG-specific chunks and display a single image.
</p>
<a name="Terminology"></a><h2><span class="mw-headline"> Terminology </span> </h2>
<p>The "default image" is the image described by the standard `IDAT`
chunks, and is the image that is displayed by decoders that do not
support APNG.
</p><p>The "canvas" is the area on the output device on which the
frames are to be displayed. The contents of the canvas are not
necessarily available to the decoder. As per the PNG Specification, if
a `bKGD` chunk exists it may be used to fill the canvas if there is no
preferable background.
</p><p>The "output buffer" is a pixel array with dimensions specified
by the width and height parameters of the PNG `IHDR` chunk.
Conceptually, each frame is constructed in the output buffer before
being composited onto the canvas. The contents of the output buffer are
available to the decoder. The corners of the output buffer are mapped
to the corners of the canvas.
</p><p>"Fully transparent black" means red, green, blue and alpha components are all set to zero.
</p><p>For purposes of chunk descriptions, an "unsigned int" shall be a
32-bit unsigned integer in network byte order limited to the range 0 to
(2^31)-1; an "unsigned short" shall be a 16-bit unsigned integer in
network byte order with the range 0 to (2^16)-1; a "byte" shall be an
8-bit unsigned integer with the range 0 to (2^8)-1.
</p>
<a name="Error_Handling"></a><h2><span class="mw-headline"> Error Handling </span> </h2>
<p>APNG is designed to allow incremental display of frames before the
entire image has been read. This implies that some errors may not be
detected until partway through the animation. It is strongly
recommended that when any error is encountered decoders should discard
all subsequent frames, stop the animation, and revert to displaying the
default image. A decoder which detects an error before the animation
has started should display the default image. An error message may be
displayed to the user if appropriate.
</p>
<a name="Structure"></a><h1><span class="mw-headline"> Structure </span> </h1>
<p>An APNG stream is a normal PNG stream as defined in the <a href="http://www.w3.org/TR/PNG/" class="external text" title="http://www.w3.org/TR/PNG/" rel="nofollow">PNG Specification</a>, with three additional chunk types describing the animation and providing additional frame data.
</p><p>To be recognized as an APNG, an `acTL` chunk must appear in the
stream before any `IDAT` chunks. The `acTL` structure is described
below.
</p><p>Conceptually, at the beginning of each play the output buffer
must be completely initialized to a fully transparent black rectangle,
with width and height dimensions from the `IHDR` chunk.
</p><p>The default image may be included as the first frame of the
animation by the presence of a single `fcTL` chunk before `IDAT`.
Otherwise, the default image is not part of the animation.
</p><p>Subsequent frames are encoded in `fdAT` chunks, which have the
same structure as `IDAT` chunks, except preceded by a sequence number.
Information for each frame about placement and rendering is stored in
`fcTL` chunks. The full layout of `fdAT` and `fcTL` chunks is described
below.
</p><p>The boundaries of the entire animation are specified by the
width and height parameters of the PNG `IHDR` chunk, regardless of
whether the default image is part of the animation. The default image
should be appropriately padded with fully transparent pixels if extra
space will be needed for later frames.
</p><p>Each frame is identical for each play, therefore it is safe for applications to cache the frames.
</p>
<a name="Chunk_Sequence_Numbers"></a><h2><span class="mw-headline"> Chunk Sequence Numbers </span> </h2>
<p>The `fcTL` and `fdAT` chunks have a 4 byte sequence number. Both
chunk types share the sequence. The purpose of this number is to detect
(and optionally correct) sequence errors in an Animated PNG, since the
PNG specification does not impose ordering restrictions on ancillary
chunks.
</p><p>The first `fcTL` chunk must contain sequence number 0, and the
sequence numbers in the remaining `fcTL` and `fdAT` chunks must be in
order, with no gaps or duplicates.
</p><p>The tables below illustrates the use of sequence numbers for images with more than one frame and more than one `fdAT` chunk.
</p><p>If the default image is the first frame:
</p>
<pre> Sequence number Chunk
(none) `acTL`
0 `fcTL` first frame
(none) `IDAT` first frame / default image
1 `fcTL` second frame
2 first `fdAT` for second frame
3 second `fdAT` for second frame
....
</pre>
<p>If the default image is not part of the animation:
</p>
<pre> Sequence number Chunk
(none) `acTL`
(none) `IDAT` default image
0 `fcTL` first frame
1 first `fdAT` for first frame
2 second `fdAT` for first frame
....
</pre>
<p>Decoders must treat out-of-order APNG chunks as an error. APNG-aware
PNG editors should restore them to correct order using the sequence
numbers.
</p>
<a name=".60acTL.60:_The_Animation_Control_Chunk"></a><h2><span class="mw-headline"> `acTL`: The Animation Control Chunk </span> </h2>
<p>The `acTL` chunk is an ancillary chunk as defined in the PNG
Specification. It must appear before the first `IDAT` chunk within a
valid PNG stream.
</p><p>The `acTL` chunk contains:
</p>
<pre> byte
0 num_frames (unsigned int) Number of frames
4 num_plays (unsigned int) Number of times to loop this APNG. 0 indicates infinite looping.
</pre>
<p>`num_frames` indicates the total number of frames in the animation.
This must equal the number of `fcTL` chunks. 0 is not a valid value. 1
is a valid value for a single-frame APNG. If this value does not equal
the actual number of frames it should be treated as an error.
</p><p>`num_plays` indicates the number of times that this animation
should play; if it is 0, the animation should play indefinitely. If
nonzero, the animation should come to rest on the final frame at the
end of the last play.
</p>
<a name=".60fcTL.60:_The_Frame_Control_Chunk"></a><h2><span class="mw-headline"> `fcTL`: The Frame Control Chunk </span> </h2>
<p>The `fcTL` chunk is an ancillary chunk as defined in the PNG
Specification. It must appear before the `IDAT` or `fdAT` chunks of the
frame to which it applies, specifically:
</p>
<ul><li> For the default image, if a `fcTL` chunk is present it must
appear before the first `IDAT` chunk. Position relative to the `acTL`
chunk is not specified.
</li><li> For the first frame excluding the default image (which may
be either the first or second frame), the `fcTL` chunk must appear
after all `IDAT` chunks and before the `fdAT` chunks for the frame.
</li><li> For all subsequent frames, the `fcTL` chunk for frame N must
appear after the `fdAT` chunks from frame N-1 and before the `fdAT`
chunks for frame N.
</li><li> Other ancillary chunks are allowed to appear among the APNG chunks, including between `fdAT` chunks.
</li></ul>
<p>Exactly one `fcTL` chunk is required for each frame.
</p><p>Format:
</p>
<pre> byte
0 sequence_number (unsigned int) Sequence number of the animation chunk, starting from 0
4 width (unsigned int) Width of the following frame
8 height (unsigned int) Height of the following frame
12 x_offset (unsigned int) X position at which to render the following frame
16 y_offset (unsigned int) Y position at which to render the following frame
20 delay_num (unsigned short) Frame delay fraction numerator
22 delay_den (unsigned short) Frame delay fraction denominator
24 dispose_op (byte) Type of frame area disposal to be done after rendering this frame
25 blend_op (byte) Type of frame area rendering for this frame
</pre>
<p>The frame must be rendered within the region defined by `x_offset`,
`y_offset`, `width`, and `height`. The offsets must be non-negative,
the dimensions must be positive, and the region may not fall outside of
the default image.
</p><p>Constraints on frame regions:
</p>
<pre> `x_offset` &gt;= 0
`y_offset` &gt;= 0
`width` &gt; 0
`height` &gt; 0
`x_offset` + `width` &lt;= `IHDR` width
`y_offset` + `height` &lt;= `IHDR` height
</pre>
<p>The `delay_num` and `delay_den` parameters together specify a
fraction indicating the time to display the current frame, in seconds.
If the denominator is 0, it is to be treated as if it were 100 (that
is, `delay_num` then specifies 1/100ths of a second). If the the value
of the numerator is 0 the decoder should render the next frame as
quickly as possible, though viewers may impose a reasonable lower
bound.
</p><p>Frame timings should be independent of the time required for
decoding and display of each frame, so that animations will run at the
same rate regardless of the performance of the decoder implementation.
</p><p>`dispose_op` specifies how the output buffer should be changed at the end of the delay (before rendering the next frame).
</p><p>Valid values for `dispose_op` are:
</p>
<pre> value
0 APNG_DISPOSE_OP_NONE
1 APNG_DISPOSE_OP_BACKGROUND
2 APNG_DISPOSE_OP_PREVIOUS
</pre>
<ul><li> APNG_DISPOSE_OP_NONE: no disposal is done on this frame before
rendering the next; the contents of the output buffer are left as is.
</li><li> APNG_DISPOSE_OP_BACKGROUND: the frame's region of the output
buffer is to be cleared to fully transparent black before rendering the
next frame.
</li><li> APNG_DISPOSE_OP_PREVIOUS: the frame's region of the output
buffer is to be reverted to the previous contents before rendering the
next frame.
</li></ul>
<p>If the first `fcTL` chunk uses a `dispose_op` of APNG_DISPOSE_OP_PREVIOUS it should be treated as APNG_DISPOSE_OP_BACKGROUND.
</p><p>`blend_op` specifies whether the frame is to be alpha blended
into the current output buffer content, or whether it should completely
replace its region in the output buffer.
</p><p>Valid values for `blend_op` are:
</p>
<pre> value
0 APNG_BLEND_OP_SOURCE
1 APNG_BLEND_OP_OVER
</pre>
<p>If `blend_op` is APNG_BLEND_OP_SOURCE all color components of the
frame, including alpha, overwrite the current contents of the frame's
output buffer region. If `blend_op` is APNG_BLEND_OP_OVER the frame
should be composited onto the output buffer based on its alpha, using a
simple OVER operation as described in the "Alpha Channel Processing"
section of the PNG specification [PNG-1.2]. Note that the second
variation of the sample code is applicable.
</p><p>Note that for the first frame the two blend modes are
functionally equivalent due to the clearing of the output buffer at the
beginning of each play.
</p><p>The `fcTL` chunk corresponding to the default image, if it exists, has these restrictions:
</p>
<ul><li> The `x_offset` and `y_offset` fields must be 0.
</li><li> The `width` and `height` fields must equal the corresponding fields from the `IHDR` chunk.
</li></ul>
<p>As noted earlier, the output buffer must be completely initialized
to fully transparent black at the beginning of each play. This is to
ensure that each play of the animation will be identical. Decoders are
free to avoid an explicit clear step as long as the result is
guaranteed to be identical. For example, if the default image is
included in the animation, and uses a `blend_op` of
APNG_BLEND_OP_SOURCE, clearing is not necessary because the entire
output buffer will be overwritten.
</p>
<a name=".60fdAT.60:_The_Frame_Data_Chunk"></a><h2><span class="mw-headline"> `fdAT`: The Frame Data Chunk </span> </h2>
<p>The `fdAT` chunk has the same purpose as an `IDAT` chunk. It has the
same structure as an `IDAT` chunk, except preceded by a sequence
number.
</p><p>At least one `fdAT` chunk is required for each frame. The
compressed datastream is then the concatenation of the contents of the
data fields of all the `fdAT` chunks within a frame. When decompressed,
the datastream is the complete pixel data of a PNG image, including the
filter byte at the beginning of each scanline, similar to the
uncompressed data of all the `IDAT` chunks. It utilizes the same bit
depth, color type, compression method, filter method, interlace method,
and palette (if any) as the default image.
</p><p>Format:
</p>
<pre> byte
0 sequence_number (unsigned int) Sequence number of the animation chunk, starting from 0
4 frame_data X bytes Frame data for this frame
</pre>
<p>Each frame inherits every property specified by any critical or
ancillary chunks before the first `IDAT` in the file, except the width
and height, which come from the `fcTL` chunk.
</p><p>If the PNG `pHYs` chunk is present, the APNG images and their
`x_offset` and `y_offset` values must be scaled in the same way as the
main image. Conceptually, such scaling occurs while mapping the output
buffer onto the canvas.
</p>
<a name="Revisions_to_this_Specification"></a><h1><span class="mw-headline"> Revisions to this Specification </span> </h1>
<a name="From_0.1"></a><h2><span class="mw-headline"> From 0.1 </span> </h2>
<ul><li> Renamed chunks to `anIm` and `frAm` to comply with chunk naming conventions in the PNG spec.
</li></ul>
<ul><li> Added a more detailed explanation of APNG structure in Section 2.
</li></ul>
<ul><li> Added information for png interaction with other chunks in section 3.2.
</li></ul>
<ul><li> Changed `frAm` chunk offsets and delay into signed integers.
</li></ul>
<a name="From_0.2"></a><h2><span class="mw-headline"> From 0.2 </span> </h2>
<ul><li> Changed `frAm` chunk to `afRa` to avoid conflict with MNG `FRAM` chunk.
</li></ul>
<ul><li> Changed format: instead of sequences of IHDR..IDAT..IEND, frames other than frame 0 are stored in `afRa` chunks.
</li></ul>
<ul><li> Added `start_frame` to `anIm` to indicate which frame the animation should start on.
</li></ul>
<ul><li> Removed `num_frames` from `anIm` chunk
</li></ul>
<a name="From_0.3"></a><h2><span class="mw-headline"> From 0.3 </span> </h2>
<ul><li> Added `aCTL`, `fdAT`, `fcTL` chunk descriptions as per the latest png-list discussion
</li></ul>
<ul><li> Added section 4, "Interactions with other PNG chunks"; described global and local palettes and transparency
</li></ul>
<ul><li> Changed `oFFs` chunk section to refer to more general chunks
</li></ul>
<ul><li> Updated `aDAT` description to indicate that all frames must
either be in a single chunk, or that the first chunk must have empty
data.
</li></ul>
<ul><li> Added notice that each frame's region (x,y,width,height) must lie completely within the parent PNG canvas
</li></ul>
<ul><li> Fixed dispose_op description (after, not before)
</li></ul>
<ul><li> Changed dispose_op to render_op; added disposal description; added BLEND flag
</li></ul>
<ul><li> Changed delay_time to a delay numerator and denominator, for specifying delays that don't into integer numbers of milliseconds.
</li></ul>
<ul><li> Added note to clarify that palette animation is not supported.
</li></ul>
<ul><li> Removed start_frame from aCTL; require fcTL for frame 0; added SKIP_FRAME fCTL flag.
</li></ul>
<a name="From_0.4"></a><h2><span class="mw-headline"> From 0.4 </span> </h2>
<ul><li> Reintroduced num_frames into aCTL
</li></ul>
<ul><li> Moved sequence_number from aDAT into fCTL
</li></ul>
<ul><li> Changed contents of aDAT to fCTL+IDATs+fEND
</li></ul>
<ul><li> Added clarifications on what's allowed and what isn't
</li></ul>
<ul><li> Renamed aCTL to acTL, fCTL to fcTL, aDAT to fdAT and fEND to feND to comply with the PNG spec chunk naming requirements
</li></ul>
<a name="From_0.5"></a><h2><span class="mw-headline"> From 0.5 </span> </h2>
<ul><li> Added the IHDR and PLTE CRCs to the acTl chunk
</li></ul>
<ul><li> The acTL fcTL and adAT are now copy safe, renamed them to acTl, fcTl and adAt
</li></ul>
<a name="From_0.6"></a><h2><span class="mw-headline"> From 0.6 </span> </h2>
<ul><li> The fdAt chunk is no longer a container for other chunks, but rather a replacement for an IDAT chunk
</li></ul>
<ul><li> Removed the feND chunk
</li></ul>
<ul><li> Added a sequence number field to fdAt
</li></ul>
<ul><li> Reintroduced the width and height fields in fcTl
</li></ul>
<a name="From_0.7"></a><h2><span class="mw-headline"> From 0.7 </span> </h2>
<ul><li> Removed 'hidden' flag, instead only the first frame can be hidden and it is signaled with a missing fcTl
</li></ul>
<ul><li> IDAT, fcTl and fdAt are no longer required to have no other chunks in between them
</li></ul>
<a name="From_0.8"></a><h2><span class="mw-headline"> From 0.8 </span> </h2>
<ul><li> Removed CRCs for IHDR and PLTE from acTl
</li></ul>
<ul><li> The acTL fcTL and adAT are now not copy safe, renamed them to acTL, fcTL and adAT
</li></ul>
<a name="From_0.9"></a><h2><span class="mw-headline"> From 0.9 </span> </h2>
<ul><li> Split render_op into dispose_op and blend_op
</li></ul>
<a name="From_0.10"></a><h2><span class="mw-headline"> From 0.10 </span> </h2>
<ul><li> No changes
</li></ul>
<a name="Test_Encoder_and_Sample_Images"></a><h1><span class="mw-headline"> Test Encoder and Sample Images </span> </h1>
<ul><li>Sample images are available from the APNG implementation page at <a href="http://littlesvr.ca/apng/" class="external free" title="http://littlesvr.ca/apng/" rel="nofollow">http://littlesvr.ca/apng/</a>
</li><li>An encoder (open source) is available in Mozilla versions newer than alpha 4.
</li><li>An application (open source) using the Mozilla encoder to assemble APNGs available here: <a href="http://littlesvr.ca/apng/apngedit.html" class="external free" title="http://littlesvr.ca/apng/apngedit.html" rel="nofollow">http://littlesvr.ca/apng/apngedit.html</a>
</li></ul>
<a name="A._References"></a><h1><span class="mw-headline"> A. References </span> </h1>
<ul><li><a href="http://www.w3.org/TR/PNG/" class="external free" title="http://www.w3.org/TR/PNG/" rel="nofollow">http://www.w3.org/TR/PNG/</a> "Portable Network Graphics (PNG) Specification (Second Edition)"
</li><li><a href="http://pmt.sourceforge.net/specs/png-1.2-pdg.html" class="external free" title="http://pmt.sourceforge.net/specs/png-1.2-pdg.html" rel="nofollow">http://pmt.sourceforge.net/specs/png-1.2-pdg.html</a> "Extensions to the PNG Specification, Version 1.2.0"
</li><li><a href="http://www.w3.org/Graphics/GIF/spec-gif89a.txt" class="external free" title="http://www.w3.org/Graphics/GIF/spec-gif89a.txt" rel="nofollow">http://www.w3.org/Graphics/GIF/spec-gif89a.txt</a> "Graphics Interchange Format 89a"
</li><li><a href="http://www.animatedpng.com/" class="external free" title="http://www.animatedpng.com" rel="nofollow">http://www.animatedpng.com</a> "APNG Project - official Site"
</li></ul>
<!--
NewPP limit report
Preprocessor node count: 22/1000000
Post-expand include size: 0/2097152 bytes
Template argument size: 0/2097152 bytes
Expensive parser function count: 0/100
-->
<!-- Saved in parser cache with key wiki_mozorg10:pcache:idhash:16916-0!1!0!!en!2!edit=0 and timestamp 20090227194319 -->
<div class="printfooter">
Retrieved from "<a href="https://wiki.mozilla.org/APNG_Specification">https://wiki.mozilla.org/APNG_Specification</a>"</div>
<!-- end content -->
</div><!-- end of MAINCONTENT div -->
</div><!-- end of MBODY div -->
<div id="footer">
<span id="f-lastmod"> This page was last modified on 14 August 2008, at 10:13.</span> <span id="f-viewcount">This page has been accessed 55,462 times. </span> <ul id="f-list">
<li id="f-about"><a href="https://wiki.mozilla.org/MozillaWiki:About" title="MozillaWiki:About">About MozillaWiki</a></li> <li id="f-disclaimer"><a href="https://wiki.mozilla.org/MozillaWiki:General_disclaimer" title="MozillaWiki:General disclaimer">Disclaimers</a></li> </ul>
<div id="f-poweredbyico"><a href="http://www.mediawiki.org/"><img src="APNG_Specification_elemei/poweredby_mediawiki_88x31.png" alt="Powered by MediaWiki"></a></div> </div><!-- end of the FOOTER div -->
</div><!-- end of the CONTAINER div -->
<!-- Served in 0.201 secs. -->
<!-- Cached 20090227194319 -->
</body></html>