This page is somewhat incomplete and quite possibly incorrect – use with caution.
For all these tests, wait at least a second after all the images have downloaded, before checking that the rendered output is correct.
Test output conventions: A solid green 128×64 rectangle means success. Any red means failure. Anything else means you need to read the instructions. "Transparent" is indicated by a light yellow background.
Sections of the relevant specifications are sometimes quoted when they clarify the expected behaviour.
Please don't link directly to the images in this page, since they may get renamed and will break any such links.
You can download the script and the source data for this page.
There may be multiple IDAT chunks; if so, they shall appear consecutively with no other intervening chunks. The compressed datastream is then the concatenation of the contents of the data fields of all the IDAT chunks.
The compressed datastream is then the concatenation of the contents of the data fields of all the `fdAT` chunks within a frame.
# APNG_DISPOSE_OP_BACKGROUND in region.
This should be a solid blue rectangle containing a smaller transparent rectangle.
# Rounding of division.
This should flash blue for half a second, then yellow for one second, then repeat.
# 16-bit numerator/denominator.
This should flash blue for half a second, then yellow for one second, then repeat.
# Zero denominator.
If the denominator is 0, it is to be treated as if it were 100
This should flash blue for half a second, then yellow for one second, then repeat.
# Zero numerator.
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.
This should flash cyan for a short period of time (perhaps zero), then magenta for the same short period of time, then blue for half a second, then yellow for one second, then repeat.
# num_plays = 0
This should flash yellow for one second, then blue for one second, then repeat forever.
# num_plays = 2
When first loaded, this should flash yellow for one second, then blue for one second, then yellow for one second, then blue forever.
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.
(If some decoders accept broken images, it seems quite possible that people will create and distribute broken images, and then the error-handling would have to be reverse-engineered by other implementations; hence all these tests to ensure errors get detected properly.)
For the following images, the default image (solid green) or an error should be displayed.
# Missing fcTL.
Disabled for now, since it crashes Opera 9.5 alpha 1589 (bug 287173).
# num_frames too low.
This must equal the number of `fcTL` chunks. ... If this value does not equal the actual number of frames it should be treated as an error.
# num_frames too high by 1.
This must equal the number of `fcTL` chunks. ... If this value does not equal the actual number of frames it should be treated as an error.
# num_frames too high by 2.
This must equal the number of `fcTL` chunks. ... If this value does not equal the actual number of frames it should be treated as an error.
# num_frames outside valid range.
an "unsigned int" shall be a 32-bit unsigned integer in network byte order limited to the range 0 to (2^31)-1