This project contains a suite of crafted PNG files built to test PNG readers against the specification and against each other. I hope it can help you answer the question, "Which PNG library should I use?", and "How reliable is my software, anyway?".
The results likely contain errors, or decisions which can be argued with. Regardless, I did take quite a bit of care to make this meaningful, more than you'll see from the typical vibeslop project.
The initial decisions here came from several rounds of Matt Pocock's grill-me Skill and at least four separate essays I wrote while trying to keep Claude Opus 5.5 on track, alongside several rounds of adversarial checking from GPT-6 Astra and from Claude Fable 5.1. I had to "push back" quite a lot to get past the AI's boneheaded decisions.
Further work mostly came from discussing things with Claude Fable 5.1, over several days and many sessions, and having him orchestrate Claude Opus 5.5 subagents for most implementation work.
My conclusion: Parsing PNGs is a Minefield. A modern JSON comparison is coming Soon™, don't worry :)
The rest of this document was written by AIs. Everything before this point was written by me, a flesh-and-blood human.
Every decoder below was run over the same 699 small PNG files from difftest-png, each one built to test one rule of the PNG specification or one behavior on which some decoder deviates. Run 2026-10-30T05:09:40+00:00 on Linux x86_64.
Each result is rated under each lens: pass, should (the specification says a decoder should do otherwise, e.g. recover a recoverable fault instead of rejecting the image) or must (a requirement is broken: wrong pixels, an invalid file accepted, a valid file rejected, a result that is not an image, a crash, a hang, a memory error). Warnings never count against a decoder. Running out of memory counts like a crash: a file should be rejected with an error, and a decoder that instead exhausts its host hands every program that opens untrusted images a denial of service. Pixels are compared as 16-bit RGBA with no color management; color under fully transparent pixels and the 8-bit reduction of 16-bit images are recorded as properties, not failures. Validators (pngcheck) are judged on a different question: whether each file conforms to the specification. Some files a decoder must still display do not conform, for example one with a chunk name the specification reserves.
Two editions of the specification matter: the second (ISO/IEC 15948:2003; PNG 1.0 and 1.1 count as the second) and the third (W3C, 2025). A lens is an edition's text plus the extensions: the W3C registered extensions, Apple's iDOT, and under the second edition the chunks the third edition added (APNG, cICP, mDCV, cLLI, eXIf). Every result is rated through both lenses separately; each table has a checkbox per edition, and shows the ticked ones. There is no single verdict: following one edition rather than the other is not a defect. The two ratings differ only where the texts contradict each other, which they do in one place: a palette index past the end of PLTE is an error in the second edition and renders opaque black in the third.
Not tested: animation frames after the default image, color management (gAMA, cHRM, iCCP, sRGB, cICP, sBIT), encoders, performance. Passing every test means the suite is incomplete, not that the decoder is perfect.
| cell | counts as | meaning |
|---|---|---|
| ✓ | pass | decoded to the pixels of one of the reference's interpretations; a validator: accepted a conforming file |
| ✓t | pass | one of several tRNS chunks used: an arguable choice; the letter also marks an A |
| ✓c | pass | a chunk with a bad CRC used as stored: an arguable choice; the letter also marks an A |
| ✓p | pass | one of several PLTE chunks used: an arguable choice; the letter also marks an A |
| ✓k | pass | an unknown critical chunk ignored: an arguable choice; the letter also marks an A |
| A | pass | decoded a file that has no reference pixels, which the lens allows to be rejected |
| A | must-violation | decoded a file the lens says to reject; a validator: accepted a file that does not conform |
| R | pass | rejected a file the lens allows to be rejected; a validator: rejected a file that does not conform |
| R | should-violation | rejected a file a decoder should recover and display |
| R | must-violation | rejected a valid file; a validator: rejected a conforming file |
| ≠ | must-violation | decoded to pixels no interpretation has |
| ☠ | must-violation | crashed |
| ⧗ | must-violation | timed out |
| ∞ | must-violation | ran out of memory |
| M | must-violation | memory error under valgrind memcheck, whatever the outcome |
| ! | must-violation | returned without error, but not an image: wrong size, missing rows or non-numeric samples |
| - | not scored | the wrapper itself failed; listed under problems |
| show | implementation | version | lineage | diagnostics |
|---|---|---|---|---|
| reference-2 | refpng 2.0 (PNG reference decoder: every interpretation, own inflate) | this project | WARN/ERR protocol | |
| reference-3 | refpng 2.0 (PNG reference decoder: every interpretation, own inflate) | this project | WARN/ERR protocol | |
| pngcheck | PNGcheck, version 4.0.0 | pngcheck | stdout validation report and exit status | |
| pngcheck-head | bd33ad6 2025-12-15 | pngcheck | stdout validation report and exit status | |
| chunky_png chunky_png-head | chunky_png 1.4.0 (ruby 3.4.10) 7a1faf6 2021-06-06 | chunky_png | errors only; no recoverable-warning channel | |
| fast-png fast-png-head | fast-png 8.0.0 (node v26.11.1) 31b93cf 2026-04-12 | fast-png | errors only; no recoverable-warning channel | |
| ffmpeg | ffmpeg version n9.0.2 | ffmpeg | stderr warnings and errors | |
| ffmpeg-head | 179d083 2026-10-22 | ffmpeg | stderr warnings and errors | |
| go-png go-png-head | go image/png go1.27.3-X:nodwarf5 5391dd5 2026-10-22 | go | errors only; no recoverable-warning channel | |
| graphicsmagick | GraphicsMagick 1.3.48 2026-07-23 Q16 | libpng | stderr warnings and errors | |
| graphicsmagick-head | hg 18216:0ca2165aa07c 2026-10-21 | libpng | stderr warnings and errors | |
| imagemagick | ImageMagick 7.1.2-32 Q16-HDRI x86_64 68f8d115a:20260926 | libpng | stderr warnings and errors | |
| imagemagick-head | a0ac982 2026-10-22 | libpng | stderr warnings and errors | |
| imagesharp imagesharp-head | ImageSharp 3.1.12 (.NET 9.0.17) d1367d4 2026-04-07 | imagesharp | errors only; no recoverable-warning channel | |
| java-imageio | Java ImageIO (Arch Linux 27) | java | warning listener and exception causes | |
| libpng libpng16-head | libpng 1.6.59 (built against 1.6.59) 8c2a5fb 2026-10-21 | libpng | warning and error callbacks | |
| libpng18-head | 682e5fe 2026-10-21 | libpng | warning and error callbacks | |
| libspng libspng-head | libspng 0.7.4 46c81dc 2026-08-31 | libspng | errors only; no recoverable-warning channel | |
| lodepng lodepng-head | lodepng 20261006 e584a84 2026-10-06 | lodepng | errors only; no recoverable-warning channel | |
| opencv | OpenCV 5.0.0 (PNG: /usr/local/lib/libpng.so (ver 1.6.58)) | libpng | native stderr and errors | |
| opencv-head | ce58bb1 2026-10-22 | libpng | native stderr and errors | |
| pillow | Pillow 13.0.0 | pillow | Python warnings and exceptions | |
| pillow-head | d4b99a3 2026-10-23 | pillow | Python warnings and exceptions | |
| pngjs | pngjs 7.0.0 (node v26.11.1) | pngjs | errors only; no recoverable-warning channel | |
| pngjs-head | c565210 2023-05-06 | pngjs | errors only; no recoverable-warning channel | |
| pngtopam | Netpbm 10.86.51 | libpng | stderr warnings and errors | |
| pngtopam-head | svn advanced r5409, last changed r5388 2026-10-08 | libpng | stderr warnings and errors | |
| pypng | pypng 0.20220715.0 | pypng | Python warnings and exceptions | |
| pypng-head | f6899c4 2025-10-29 | pypng | Python warnings and exceptions | |
| rust-png | png 0.18.1 | image-rs | errors only; no recoverable-warning channel | |
| rust-png-head | b2f10c6 2026-09-23 | image-rs | errors only; no recoverable-warning channel | |
| stb_image stb_image-head | stb_image v2.30 a7d4c21 2026-10-19 | stb | errors only; no recoverable-warning channel | |
| upng | upng-js 2.1.0 (node v26.11.1) | upng | errors only; no recoverable-warning channel | |
| upng-head | 88f504b 2023-07-22 | upng | errors only; no recoverable-warning channel | |
| wuffs wuffs-head | wuffs 0.4.0-alpha.12+4048.20261020 4be865d 2026-10-21 | wuffs | errors only; no recoverable-warning channel | |
| zune-png | zune-png 0.5.2 | zune | errors only; upstream warning macros are no-ops | |
| zune-png-head | 33007f6 2026-10-22 | zune | errors only; upstream warning macros are no-ops |
You can click any column header to make the table show only the rows where that implementation is above 0, and click it again to toggle this off. You can also click a row's name to sort the columns by it: fewest first, then most first, then back by name.
| reference | validators | decoders | ||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| reference-2 | reference-3 | pngcheck | pngcheck-head | chunky_png · chunky_png-head | fast-png · fast-png-head | ffmpeg | ffmpeg-head | go-png · go-png-head | graphicsmagick | graphicsmagick-head | imagemagick | imagemagick-head | imagesharp · imagesharp-head | java-imageio | libpng · libpng16-head | libpng18-head | libspng · libspng-head | lodepng · lodepng-head | opencv | opencv-head | pillow | pillow-head | pngjs | pngjs-head | pngtopam | pngtopam-head | pypng | pypng-head | rust-png | rust-png-head | stb_image · stb_image-head | upng | upng-head | wuffs · wuffs-head | zune-png | zune-png-head | ||
| 2nd edition | valid file rejected | 0 | 0 | 3 | 3 | 2 | 52 | 5 | 5 | 2 | 4 | 4 | 4 | 4 | 26 | 2 | 4 | 4 | 3 | 2 | 4 | 4 | 2 | 2 | 2 | 2 | 4 | 4 | 2 | 2 | 2 | 2 | 0 | 3 | 1 | 5 | 2 | 2 |
| invalid file accepted | 0 | 5 | 53 | 54 | 14 | 18 | 25 | 25 | 10 | 1 | 1 | 1 | 1 | 20 | 15 | 7 | 7 | 7 | 9 | 6 | 6 | 18 | 18 | 13 | 13 | 7 | 7 | 8 | 8 | 8 | 8 | 10 | 37 | 47 | 9 | 17 | 17 | |
| wrong pixels | 0 | 0 | 0 | 0 | 14 | 36 | 17 | 17 | 5 | 14 | 14 | 7 | 7 | 99 | 17 | 0 | 0 | 6 | 9 | 27 | 27 | 24 | 24 | 11 | 11 | 20 | 9 | 14 | 8 | 6 | 6 | 4 | 111 | 141 | 4 | 8 | 4 | |
| crash, hang, out of memory or memory error | 0 | 0 | 0 | 0 | 2 | 3 | 0 | 0 | 2 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 13 | 2 | 2 | 0 | 0 | 5 | 6 | 7 | 1 | 0 | 0 | |
| no usable image returned | 0 | 0 | 0 | 0 | 7 | 17 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 7 | 7 | 0 | 0 | 0 | 9 | 4 | 0 | 0 | 0 | |
| recoverable file rejected | 0 | 0 | 0 | 0 | 16 | 22 | 16 | 16 | 15 | 1 | 1 | 1 | 1 | 13 | 4 | 1 | 5 | 3 | 65 | 9 | 9 | 25 | 25 | 13 | 13 | 1 | 1 | 23 | 20 | 10 | 11 | 11 | 14 | 22 | 19 | 21 | 25 | |
| silent | 0 | 0 | 53 | 54 | 172 | 179 | 151 | 150 | 163 | 90 | 90 | 74 | 74 | 194 | 192 | 66 | 54 | 188 | 112 | 59 | 63 | 171 | 171 | 178 | 175 | 61 | 61 | 152 | 155 | 179 | 178 | 188 | 205 | 214 | 170 | 179 | 179 | |
| strict | 5 | |||||||||||||||||||||||||||||||||||||
| 3rd edition | valid file rejected | 0 | 0 | 3 | 3 | 2 | 52 | 5 | 5 | 2 | 4 | 4 | 4 | 4 | 26 | 2 | 4 | 4 | 3 | 2 | 4 | 4 | 2 | 2 | 2 | 2 | 4 | 4 | 2 | 2 | 2 | 2 | 0 | 3 | 1 | 5 | 2 | 2 |
| invalid file accepted | 0 | 0 | 53 | 54 | 14 | 18 | 20 | 20 | 5 | 1 | 1 | 1 | 1 | 15 | 10 | 2 | 2 | 2 | 4 | 1 | 1 | 13 | 13 | 13 | 13 | 2 | 2 | 8 | 8 | 3 | 3 | 10 | 32 | 42 | 4 | 12 | 12 | |
| wrong pixels | 0 | 0 | 0 | 0 | 14 | 36 | 17 | 17 | 5 | 14 | 14 | 7 | 7 | 104 | 17 | 0 | 0 | 6 | 9 | 27 | 27 | 24 | 24 | 11 | 11 | 20 | 9 | 14 | 8 | 6 | 6 | 4 | 111 | 141 | 4 | 8 | 4 | |
| crash, hang, out of memory or memory error | 0 | 0 | 0 | 0 | 2 | 3 | 0 | 0 | 2 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 13 | 2 | 2 | 0 | 0 | 5 | 6 | 7 | 1 | 0 | 0 | |
| no usable image returned | 0 | 0 | 0 | 0 | 7 | 17 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 7 | 7 | 0 | 0 | 0 | 9 | 4 | 0 | 0 | 0 | |
| recoverable file rejected | 5 | 0 | 0 | 0 | 16 | 27 | 16 | 16 | 15 | 6 | 6 | 6 | 6 | 13 | 4 | 1 | 5 | 3 | 65 | 9 | 9 | 25 | 25 | 18 | 18 | 1 | 1 | 28 | 25 | 10 | 11 | 11 | 14 | 22 | 19 | 21 | 25 | |
| silent | 0 | 0 | 53 | 54 | 172 | 179 | 151 | 150 | 163 | 90 | 90 | 74 | 74 | 194 | 192 | 66 | 54 | 188 | 112 | 59 | 63 | 171 | 171 | 178 | 175 | 61 | 61 | 152 | 155 | 179 | 178 | 188 | 205 | 214 | 170 | 179 | 179 | |
| strict | 5 | |||||||||||||||||||||||||||||||||||||
The first five rows are must-violations and the sixth should-violations. silent: the column accepted a file that does not conform and said nothing about it; a count, not a violation. strict: a validator rejected a file that conforms, over a name a strict reading of the naming rules may flag (iDOT's unregistered public name); recorded, not a violation.
chunky_png, pillow and upng return at most 8 bits per sample. All of them keep the high byte of a 16-bit sample and drop the low byte.
Every decoder preserves the color under fully transparent pixels, except chunky_png, pngjs and wuffs: they zero it under a tRNS color key.
You can click any column header to make the table show only the families that implementation fails in, or a family's name to make the results table show only that family.
| reference | validators | decoders | ||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| family | reference-2 | reference-3 | pngcheck | pngcheck-head | chunky_png · chunky_png-head | fast-png · fast-png-head | ffmpeg | ffmpeg-head | go-png · go-png-head | graphicsmagick | graphicsmagick-head | imagemagick | imagemagick-head | imagesharp · imagesharp-head | java-imageio | libpng · libpng16-head | libpng18-head | libspng · libspng-head | lodepng · lodepng-head | opencv | opencv-head | pillow | pillow-head | pngjs | pngjs-head | pngtopam | pngtopam-head | pypng | pypng-head | rust-png | rust-png-head | stb_image · stb_image-head | upng | upng-head | wuffs · wuffs-head | zune-png | zune-png-head | |
| 2nd edition | Filters | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 18/105 | ✓ | ✓ | ✓ | ✓ |
| Interlacing | ✓ | ✓ | ✓ | ✓ | ✓ | 60/208 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 106/208 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 62/208 | 113/208 | ✓ | ✓ | ✓ | |
| Bit packing | ✓ | ✓ | ✓ | ✓ | ✓ | 1/7 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 4/7 | 1/7 | ✓ | ✓ | ✓ | |
| IDAT and zlib | ✓ | ✓ | 11/30 | 11/30 | 3/30 | 4/30 | 2/30 | 2/30 | ✓ | 1/30 | 1/30 | 1/30 | 1/30 | 11/30 | 1/30 | 1/30 | 1/30 | 1/30 | 4/30 | 1/30 | 1/30 | 1/30 | 1/30 | 8/30 | 8/30 | 1/30 | 1/30 | 5/30 | 5/30 | 2/30 | 2/30 | 5/30 | 2/30 | 7/30 | 5/30 | 4/30 | 6/30 | |
| DEFLATE | ✓ | ✓ | 3/22 | 3/22 | 2/22 | 1/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | ✓ | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | ✓ | 2/22 | 4/22 | 4/22 | ✓ | ✓ | |
| IHDR | ✓ | ✓ | 1/24 | 1/24 | 7/24 | 10/24 | 6/24 | 6/24 | 2/24 | ✓ | ✓ | ✓ | ✓ | 4/24 | 2/24 | 1/24 | 1/24 | ✓ | 1/24 | ✓ | ✓ | 5/24 | 5/24 | 7/24 | 7/24 | 1/24 | 1/24 | 6/24 | 6/24 | ✓ | ✓ | 4/24 | 24/24 | 24/24 | ✓ | 5/24 | 5/24 | |
| PLTE | ✓ | 5/18 | 5/18 | 5/18 | 8/18 | 3/18 | 9/18 | 9/18 | 8/18 | 1/18 | 1/18 | 1/18 | 1/18 | 7/18 | 8/18 | 6/18 | 6/18 | 7/18 | 8/18 | 6/18 | 6/18 | 8/18 | 8/18 | 2/18 | 2/18 | 6/18 | 6/18 | 2/18 | 2/18 | 6/18 | 7/18 | 6/18 | 9/18 | 9/18 | 6/18 | 8/18 | 7/18 | |
| tRNS | ✓ | ✓ | 1/56 | 1/56 | 16/56 | 47/56 | 15/56 | 15/56 | 16/56 | 13/56 | 13/56 | 7/56 | 7/56 | 13/56 | 20/56 | ✓ | ✓ | 7/56 | 17/56 | 26/56 | 26/56 | 26/56 | 26/56 | 15/56 | 15/56 | 17/56 | 19/56 | 15/56 | 15/56 | 6/56 | 6/56 | 14/56 | 26/56 | 23/56 | 7/56 | 15/56 | 8/56 | |
| Chunks | ✓ | ✓ | ✓ | ✓ | 5/35 | 5/35 | 8/35 | 8/35 | 4/35 | 2/35 | 2/35 | 2/35 | 2/35 | 3/35 | 4/35 | 2/35 | 2/35 | 2/35 | 2/35 | 2/35 | 2/35 | 4/35 | 4/35 | 3/35 | 3/35 | 2/35 | 2/35 | 3/35 | 3/35 | 1/35 | 1/35 | ✓ | 9/35 | 9/35 | 1/35 | 1/35 | 1/35 | |
| Ancillary chunks | ✓ | ✓ | 29/144 | 29/144 | 13/144 | 15/144 | 15/144 | 15/144 | ✓ | 1/144 | 1/144 | ✓ | ✓ | 8/144 | 1/144 | ✓ | 2/144 | ✓ | 54/144 | 9/144 | 9/144 | 19/144 | 19/144 | 2/144 | 2/144 | 3/144 | 3/144 | 20/144 | 11/144 | 7/144 | 7/144 | ✓ | 10/144 | 20/144 | 7/144 | 11/144 | 18/144 | |
| iDOT | ✓ | ✓ | ✓ | 1/8 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| APNG | ✓ | ✓ | 3/36 | 3/36 | ✓ | ✓ | 6/36 | 6/36 | ✓ | ✓ | ✓ | ✓ | ✓ | 4/36 | ✓ | ✓ | 2/36 | ✓ | ✓ | ✓ | ✓ | 4/36 | 4/36 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 2/36 | 2/36 | ✓ | 12/36 | 9/36 | 7/36 | 2/36 | 1/36 | |
| Dimensions | ✓ | ✓ | 3/5 | 3/5 | 1/5 | 2/5 | ✓ | ✓ | 2/5 | ✓ | ✓ | ✓ | 1/5 | ✓ | ✓ | ✓ | ✓ | ✓ | 2/5 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 3/5 | 3/5 | ✓ | ✓ | ✓ | 2/5 | 2/5 | 1/5 | 2/5 | 2/5 | |
| CgBI | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 1/1 | ✓ | 1/1 | ✓ | ✓ | ✓ | |
| 3rd edition | Filters | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 18/105 | ✓ | ✓ | ✓ | ✓ |
| Interlacing | ✓ | ✓ | ✓ | ✓ | ✓ | 60/208 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 106/208 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 62/208 | 113/208 | ✓ | ✓ | ✓ | |
| Bit packing | ✓ | ✓ | ✓ | ✓ | ✓ | 1/7 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 4/7 | 1/7 | ✓ | ✓ | ✓ | |
| IDAT and zlib | ✓ | ✓ | 11/30 | 11/30 | 3/30 | 4/30 | 2/30 | 2/30 | ✓ | 1/30 | 1/30 | 1/30 | 1/30 | 11/30 | 1/30 | 1/30 | 1/30 | 1/30 | 4/30 | 1/30 | 1/30 | 1/30 | 1/30 | 8/30 | 8/30 | 1/30 | 1/30 | 5/30 | 5/30 | 2/30 | 2/30 | 5/30 | 2/30 | 7/30 | 5/30 | 4/30 | 6/30 | |
| DEFLATE | ✓ | ✓ | 3/22 | 3/22 | 2/22 | 1/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | ✓ | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | 2/22 | ✓ | 2/22 | 4/22 | 4/22 | ✓ | ✓ | |
| IHDR | ✓ | ✓ | 1/24 | 1/24 | 7/24 | 10/24 | 6/24 | 6/24 | 2/24 | ✓ | ✓ | ✓ | ✓ | 4/24 | 2/24 | 1/24 | 1/24 | ✓ | 1/24 | ✓ | ✓ | 5/24 | 5/24 | 7/24 | 7/24 | 1/24 | 1/24 | 6/24 | 6/24 | ✓ | ✓ | 4/24 | 24/24 | 24/24 | ✓ | 5/24 | 5/24 | |
| PLTE | 5/18 | ✓ | 5/18 | 5/18 | 8/18 | 8/18 | 4/18 | 4/18 | 3/18 | 6/18 | 6/18 | 6/18 | 6/18 | 7/18 | 3/18 | 1/18 | 1/18 | 2/18 | 3/18 | 1/18 | 1/18 | 3/18 | 3/18 | 7/18 | 7/18 | 1/18 | 1/18 | 7/18 | 7/18 | 1/18 | 2/18 | 6/18 | 4/18 | 4/18 | 1/18 | 3/18 | 2/18 | |
| tRNS | ✓ | ✓ | 1/56 | 1/56 | 16/56 | 47/56 | 15/56 | 15/56 | 16/56 | 13/56 | 13/56 | 7/56 | 7/56 | 13/56 | 20/56 | ✓ | ✓ | 7/56 | 17/56 | 26/56 | 26/56 | 26/56 | 26/56 | 15/56 | 15/56 | 17/56 | 19/56 | 15/56 | 15/56 | 6/56 | 6/56 | 14/56 | 26/56 | 23/56 | 7/56 | 15/56 | 8/56 | |
| Chunks | ✓ | ✓ | ✓ | ✓ | 5/35 | 5/35 | 8/35 | 8/35 | 4/35 | 2/35 | 2/35 | 2/35 | 2/35 | 3/35 | 4/35 | 2/35 | 2/35 | 2/35 | 2/35 | 2/35 | 2/35 | 4/35 | 4/35 | 3/35 | 3/35 | 2/35 | 2/35 | 3/35 | 3/35 | 1/35 | 1/35 | ✓ | 9/35 | 9/35 | 1/35 | 1/35 | 1/35 | |
| Ancillary chunks | ✓ | ✓ | 29/144 | 29/144 | 13/144 | 15/144 | 15/144 | 15/144 | ✓ | 1/144 | 1/144 | ✓ | ✓ | 8/144 | 1/144 | ✓ | 2/144 | ✓ | 54/144 | 9/144 | 9/144 | 19/144 | 19/144 | 2/144 | 2/144 | 3/144 | 3/144 | 20/144 | 11/144 | 7/144 | 7/144 | ✓ | 10/144 | 20/144 | 7/144 | 11/144 | 18/144 | |
| iDOT | ✓ | ✓ | ✓ | 1/8 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| APNG | ✓ | ✓ | 3/36 | 3/36 | ✓ | ✓ | 6/36 | 6/36 | ✓ | ✓ | ✓ | ✓ | ✓ | 4/36 | ✓ | ✓ | 2/36 | ✓ | ✓ | ✓ | ✓ | 4/36 | 4/36 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 2/36 | 2/36 | ✓ | 12/36 | 9/36 | 7/36 | 2/36 | 1/36 | |
| Dimensions | ✓ | ✓ | 3/5 | 3/5 | 1/5 | 2/5 | ✓ | ✓ | 2/5 | ✓ | ✓ | ✓ | 1/5 | ✓ | ✓ | ✓ | ✓ | ✓ | 2/5 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 3/5 | 3/5 | ✓ | ✓ | ✓ | 2/5 | 2/5 | 1/5 | 2/5 | 2/5 | |
| CgBI | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 1/1 | ✓ | 1/1 | ✓ | ✓ | ✓ | |
You can click any column header to make the table show only the tests that implementation fails. Click the same one again to toggle this filter off.
| reference | validators | decoders | |||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| reference-2 | reference-3 | pngcheck | pngcheck-head | chunky_png · chunky_png-head | fast-png · fast-png-head | ffmpeg | ffmpeg-head | go-png · go-png-head | graphicsmagick | graphicsmagick-head | imagemagick | imagemagick-head | imagesharp · imagesharp-head | java-imageio | libpng · libpng16-head | libpng18-head | libspng · libspng-head | lodepng · lodepng-head | opencv | opencv-head | pillow | pillow-head | pngjs | pngjs-head | pngtopam | pngtopam-head | pypng | pypng-head | rust-png | rust-png-head | stb_image · stb_image-head | upng | upng-head | wuffs · wuffs-head | zune-png | zune-png-head | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
y_tiny-1x1-g16png | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
y_filter-paeth-rgb16png | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
y_tiny-1x1-rgb16pngIHDRIDATIEND the picture's top-left pixel alone, Paeth filtered. Table 12 in §11.2.1 lists this combination, and decoders must support every one. expected: display, conforms expected38 match matches the reference; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
y_filter-average-ga16png | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_filter-paeth-ga16pngIHDRIDATIEND every scanline uses Paeth; the predictor is a in 528 bytes, b in 243, c in 9, and 1 ties go by comparison order. expected: display, conforms expected38 match matches the reference; color under alpha 0 preserved; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
y_tiny-1x1-ga16pngIHDRIDATIEND the picture's top-left pixel alone, Paeth filtered. Table 12 in §11.2.1 lists this combination, and decoders must support every one. expected: display, conforms expected38 match matches the reference; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
y_filter-average-rgba16png | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_filter-paeth-rgba16pngIHDRIDATIEND every scanline uses Paeth; the predictor is a in 1014 bytes, b in 526, c in 20, and 6 ties go by comparison order. expected: display, conforms expected38 match matches the reference; color under alpha 0 preserved; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
y_tiny-1x1-rgba16pngIHDRIDATIEND the picture's top-left pixel alone, Paeth filtered. Table 12 in §11.2.1 lists this combination, and decoders must support every one. expected: display, conforms expected38 match matches the reference; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-1x1-g1pngIHDRIDATIEND 1x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-1x2-g1pngIHDRIDATIEND 1x2, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-2x1-g1pngIHDRIDATIEND 2x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected42 match | ✓ | ✓ | ✓ | ✓ | ✓ | ! | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-2x2-g1png | ✓ | ✓ | ✓ | ✓ | ✓ | ! | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-3x3-g1png | ✓ | ✓ | ✓ | ✓ | ✓ | ! | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-4x4-g1pngIHDRIDATIEND 4x4, interlaced, random filter per scanline; passes 2, 3 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected38 match 6 of 16 pixels differ2: imagesharp, imagesharp-head 2 of 16 pixels differ1: upng-head 3 of 16 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-1x9-g1pngIHDRIDATIEND 1x9, interlaced, random filter per scanline; passes 2, 4, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected41 match 1 of 9 pixels differ3: imagesharp, upng, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | R | ✓ | ✓ | ✓ | |
y_adam7-1x1-g2pngIHDRIDATIEND 1x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-1x2-g2pngIHDRIDATIEND 1x2, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected41 match 2 of 2 pixels differ2: imagesharp, imagesharp-head 1 of 2 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ |
y_adam7-2x1-g2pngIHDRIDATIEND 2x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected42 match | ✓ | ✓ | ✓ | ✓ | ✓ | ! | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-2x2-g2pngIHDRIDATIEND 2x2, interlaced, random filter per scanline; passes 2, 3, 4, 5 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected39 match 3 of 4 pixels differ2: imagesharp, imagesharp-head 2 of 4 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ! | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ |
y_adam7-3x3-g2pngIHDRIDATIEND 3x3, interlaced, random filter per scanline; passes 2, 3 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected38 match 7 of 9 pixels differ2: imagesharp, imagesharp-head 2 of 9 pixels differ1: upng 4 of 9 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-4x4-g2pngIHDRIDATIEND 4x4, interlaced, random filter per scanline; passes 2, 3 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected39 match 13 of 16 pixels differ2: imagesharp, imagesharp-head 4 of 16 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-1x9-g2pngIHDRIDATIEND 1x9, interlaced, random filter per scanline; passes 2, 4, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected41 match 7 of 9 pixels differ2: imagesharp, imagesharp-head 7 of 9 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
y_adam7-2x7-g2pngIHDRIDATIEND 2x7, interlaced, random filter per scanline; passes 2, 4 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected38 match 3 of 14 pixels differ2: imagesharp, imagesharp-head 2 of 14 pixels differ1: upng-head 6 of 14 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-7x2-g2pngIHDRIDATIEND 7x2, interlaced, random filter per scanline; passes 3, 5 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 1 of 14 pixels differ1: upng 7 of 14 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-1x1-g4pngIHDRIDATIEND 1x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-1x2-g4pngIHDRIDATIEND 1x2, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected41 match 2 of 2 pixels differ2: imagesharp, imagesharp-head 1 of 2 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ |
y_adam7-2x1-g4pngIHDRIDATIEND 2x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected39 match 1 of 2 pixels differ3: imagesharp, imagesharp-head, upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ! | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
y_adam7-2x2-g4pngIHDRIDATIEND 2x2, interlaced, random filter per scanline; passes 2, 3, 4, 5 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 4 of 4 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ! | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-3x3-g4pngIHDRIDATIEND 3x3, interlaced, random filter per scanline; passes 2, 3 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected38 match 8 of 9 pixels differ2: imagesharp, imagesharp-head 3 of 9 pixels differ1: upng 1 of 9 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-4x4-g4png | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-1x9-g4pngIHDRIDATIEND 1x9, interlaced, random filter per scanline; passes 2, 4, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected41 match 8 of 9 pixels differ2: imagesharp, imagesharp-head 7 of 9 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-2x7-g4pngIHDRIDATIEND 2x7, interlaced, random filter per scanline; passes 2, 4 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected39 match 4 of 14 pixels differ2: imagesharp, imagesharp-head 2 of 14 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
y_adam7-7x2-g4pngIHDRIDATIEND 7x2, interlaced, random filter per scanline; passes 3, 5 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 1 of 14 pixels differ1: upng 3 of 14 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-1x1-g8pngIHDRIDATIEND 1x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-1x2-g8pngIHDRIDATIEND 1x2, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected42 match 2 of 2 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-2x1-g8pngIHDRIDATIEND 2x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected42 match 1 of 2 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-2x2-g8pngIHDRIDATIEND 2x2, interlaced, random filter per scanline; passes 2, 3, 4, 5 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected42 match 4 of 4 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-3x3-g8png | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-4x4-g8png | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-1x9-g8png | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-2x7-g8pngIHDRIDATIEND 2x7, interlaced, random filter per scanline; passes 2, 4 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected41 match 4 of 14 pixels differ2: imagesharp, imagesharp-head 3 of 14 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-g16png | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
y_adam7-1x1-g16pngIHDRIDATIEND 1x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match matches the reference; 16→8 high byte4: upng, chunky_png, upng-head, chunky_png-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-1x2-g16pngIHDRIDATIEND 1x2, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected38 match matches the reference; 16→8 high byte2: chunky_png, chunky_png-head 2 of 2 pixels differ2: upng, upng-head 2 of 2 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-2x1-g16pngIHDRIDATIEND 2x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected38 match matches the reference; 16→8 high byte2: chunky_png, chunky_png-head 1 of 2 pixels differ2: imagesharp, imagesharp-head 2 of 2 pixels differ2: upng, upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-2x2-g16pngIHDRIDATIEND 2x2, interlaced, random filter per scanline; passes 2, 3, 4, 5 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected38 match 4 of 4 pixels differ2: upng, upng-head 4 of 4 pixels differ2: imagesharp, imagesharp-head matches the reference; 16→8 high byte2: chunky_png, chunky_png-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-3x3-g16pngIHDRIDATIEND 3x3, interlaced, random filter per scanline; passes 2, 3 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected38 match matches the reference; 16→8 high byte4: upng, chunky_png, upng-head, chunky_png-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-4x4-g16pngIHDRIDATIEND 4x4, interlaced, random filter per scanline; passes 2, 3 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected38 match matches the reference; 16→8 high byte2: chunky_png, chunky_png-head 16 of 16 pixels differ1: upng-head 16 of 16 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
y_adam7-1x9-g16pngIHDRIDATIEND 1x9, interlaced, random filter per scanline; passes 2, 4, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected38 match matches the reference; 16→8 high byte2: chunky_png, chunky_png-head 9 of 9 pixels differ2: imagesharp, imagesharp-head 9 of 9 pixels differ1: upng 9 of 9 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-9x1-g16pngIHDRIDATIEND 9x1, interlaced, random filter per scanline; passes 3, 5, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match matches the reference; 16→8 high byte3: upng, chunky_png, chunky_png-head 9 of 9 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
y_adam7-2x7-g16pngIHDRIDATIEND 2x7, interlaced, random filter per scanline; passes 2, 4 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected38 match 14 of 14 pixels differ2: upng, upng-head 4 of 14 pixels differ2: imagesharp, imagesharp-head matches the reference; 16→8 high byte2: chunky_png, chunky_png-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-7x2-g16pngIHDRIDATIEND 7x2, interlaced, random filter per scanline; passes 3, 5 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match matches the reference; 16→8 high byte4: upng, chunky_png, upng-head, chunky_png-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-8x9-g16png | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-1x1-rgb8pngIHDRIDATIEND 1x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-1x2-rgb8pngIHDRIDATIEND 1x2, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 2 of 2 pixels differ2: imagesharp, imagesharp-head 1 of 2 pixels differ1: upng 1 of 2 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-2x1-rgb8pngIHDRIDATIEND 2x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 1 of 2 pixels differ2: imagesharp, imagesharp-head 1 of 2 pixels differ1: upng-head 1 of 2 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-2x2-rgb8pngIHDRIDATIEND 2x2, interlaced, random filter per scanline; passes 2, 3, 4, 5 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 4 of 4 pixels differ2: imagesharp, imagesharp-head 1 of 4 pixels differ1: upng 1 of 4 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-3x3-rgb8png | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-4x4-rgb8png | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-1x9-rgb8pngIHDRIDATIEND 1x9, interlaced, random filter per scanline; passes 2, 4, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 9 of 9 pixels differ2: imagesharp, imagesharp-head 5 of 9 pixels differ1: upng-head 5 of 9 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-2x7-rgb8pngIHDRIDATIEND 2x7, interlaced, random filter per scanline; passes 2, 4 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 4 of 14 pixels differ2: imagesharp, imagesharp-head 2 of 14 pixels differ1: upng-head 2 of 14 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-rgb16png | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-1x1-rgb16pngIHDRIDATIEND 1x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected38 match matches the reference; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-1x2-rgb16pngIHDRIDATIEND 1x2, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected36 match matches the reference; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head 2 of 2 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-2x1-rgb16pngIHDRIDATIEND 2x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected36 match matches the reference; 16→8 high byte5: pillow, chunky_png, upng-head, pillow-head, chunky_png-head 1 of 2 pixels differ2: imagesharp, imagesharp-head 2 of 2 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ |
y_adam7-2x2-rgb16pngIHDRIDATIEND 2x2, interlaced, random filter per scanline; passes 2, 3, 4, 5 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected36 match matches the reference; 16→8 high byte5: pillow, chunky_png, upng-head, pillow-head, chunky_png-head 4 of 4 pixels differ2: imagesharp, imagesharp-head 4 of 4 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ |
y_adam7-3x3-rgb16pngIHDRIDATIEND 3x3, interlaced, random filter per scanline; passes 2, 3 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected36 match matches the reference; 16→8 high byte5: pillow, chunky_png, upng-head, pillow-head, chunky_png-head 9 of 9 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ |
y_adam7-4x4-rgb16pngIHDRIDATIEND 4x4, interlaced, random filter per scanline; passes 2, 3 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected36 match matches the reference; 16→8 high byte4: pillow, chunky_png, pillow-head, chunky_png-head 16 of 16 pixels differ1: upng-head 16 of 16 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-5x5-rgb16pngIHDRIDATIEND 5x5, interlaced, random filter per scanline; no pass is empty. §8.1 says decoders are required to read interlaced images. expected: display, conforms spec: §13.10 expected38 match matches the reference; 16→8 high byte5: upng, pillow, chunky_png, pillow-head, chunky_png-head 24 of 25 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
y_adam7-1x9-rgb16pngIHDRIDATIEND 1x9, interlaced, random filter per scanline; passes 2, 4, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected36 match matches the reference; 16→8 high byte4: pillow, chunky_png, pillow-head, chunky_png-head 9 of 9 pixels differ2: imagesharp, imagesharp-head 9 of 9 pixels differ1: upng 9 of 9 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-9x1-rgb16pngIHDRIDATIEND 9x1, interlaced, random filter per scanline; passes 3, 5, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected38 match matches the reference; 16→8 high byte5: upng, pillow, chunky_png, pillow-head, chunky_png-head 9 of 9 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
y_adam7-2x7-rgb16pngIHDRIDATIEND 2x7, interlaced, random filter per scanline; passes 2, 4 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected36 match matches the reference; 16→8 high byte4: pillow, chunky_png, pillow-head, chunky_png-head 4 of 14 pixels differ2: imagesharp, imagesharp-head 14 of 14 pixels differ1: upng-head 14 of 14 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-7x2-rgb16pngIHDRIDATIEND 7x2, interlaced, random filter per scanline; passes 3, 5 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected38 match matches the reference; 16→8 high byte5: upng, pillow, chunky_png, pillow-head, chunky_png-head 14 of 14 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
y_adam7-8x9-rgb16pngIHDRIDATIEND 8x9, interlaced, random filter per scanline; no pass is empty. §8.1 says decoders are required to read interlaced images. expected: display, conforms spec: §13.10 expected38 match matches the reference; 16→8 high byte5: upng, pillow, chunky_png, pillow-head, chunky_png-head 71 of 72 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-1x1-p1pngIHDRPLTEIDATIEND 1x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-1x2-p1pngIHDRPLTEIDATIEND 1x2, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected42 match 1 of 2 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-2x1-p1pngIHDRPLTEIDATIEND 2x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 1 of 2 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ! | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-2x2-p1pngIHDRPLTEIDATIEND 2x2, interlaced, random filter per scanline; passes 2, 3, 4, 5 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 3 of 4 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ! | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-3x3-p1pngIHDRPLTEIDATIEND 3x3, interlaced, random filter per scanline; passes 2, 3 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 3 of 9 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ! | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-4x4-p1pngIHDRPLTEIDATIEND 4x4, interlaced, random filter per scanline; passes 2, 3 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected39 match 7 of 16 pixels differ2: imagesharp, imagesharp-head 2 of 16 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-1x9-p1pngIHDRPLTEIDATIEND 1x9, interlaced, random filter per scanline; passes 2, 4, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected42 match 9 of 9 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
y_adam7-2x7-p1pngIHDRPLTEIDATIEND 2x7, interlaced, random filter per scanline; passes 2, 4 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected39 match 2 of 14 pixels differ2: imagesharp, imagesharp-head 2 of 14 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-1x1-p2pngIHDRPLTEIDATIEND 1x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-1x2-p2pngIHDRPLTEIDATIEND 1x2, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected42 match 1 of 2 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-2x1-p2pngIHDRPLTEIDATIEND 2x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 1 of 2 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ! | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-2x2-p2pngIHDRPLTEIDATIEND 2x2, interlaced, random filter per scanline; passes 2, 3, 4, 5 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 3 of 4 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ! | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-3x3-p2pngIHDRPLTEIDATIEND 3x3, interlaced, random filter per scanline; passes 2, 3 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 3 of 9 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ! | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-4x4-p2pngIHDRPLTEIDATIEND 4x4, interlaced, random filter per scanline; passes 2, 3 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected39 match 8 of 16 pixels differ2: imagesharp, imagesharp-head 2 of 16 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-1x9-p2pngIHDRPLTEIDATIEND 1x9, interlaced, random filter per scanline; passes 2, 4, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected42 match 9 of 9 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
y_adam7-2x7-p2pngIHDRPLTEIDATIEND 2x7, interlaced, random filter per scanline; passes 2, 4 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected39 match 3 of 14 pixels differ2: imagesharp, imagesharp-head 2 of 14 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-1x1-p4pngIHDRPLTEIDATIEND 1x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-1x2-p4pngIHDRPLTEIDATIEND 1x2, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected42 match 2 of 2 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-2x1-p4pngIHDRPLTEIDATIEND 2x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected39 match 1 of 2 pixels differ2: imagesharp, imagesharp-head 1 of 2 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ! | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
y_adam7-2x2-p4pngIHDRPLTEIDATIEND 2x2, interlaced, random filter per scanline; passes 2, 3, 4, 5 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 4 of 4 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ! | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-3x3-p4pngIHDRPLTEIDATIEND 3x3, interlaced, random filter per scanline; passes 2, 3 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected39 match 8 of 9 pixels differ2: imagesharp, imagesharp-head 1 of 9 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
y_adam7-4x4-p4pngIHDRPLTEIDATIEND 4x4, interlaced, random filter per scanline; passes 2, 3 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 15 of 16 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-1x9-p4pngIHDRPLTEIDATIEND 1x9, interlaced, random filter per scanline; passes 2, 4, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected42 match 9 of 9 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-2x7-p4pngIHDRPLTEIDATIEND 2x7, interlaced, random filter per scanline; passes 2, 4 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected39 match 4 of 14 pixels differ2: imagesharp, imagesharp-head 2 of 14 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-1x1-p8pngIHDRPLTEIDATIEND 1x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-1x2-p8pngIHDRPLTEIDATIEND 1x2, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected42 match 2 of 2 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-2x1-p8pngIHDRPLTEIDATIEND 2x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected42 match 1 of 2 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-2x2-p8pngIHDRPLTEIDATIEND 2x2, interlaced, random filter per scanline; passes 2, 3, 4, 5 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected42 match 4 of 4 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-3x3-p8pngIHDRPLTEIDATIEND 3x3, interlaced, random filter per scanline; passes 2, 3 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected42 match 8 of 9 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-4x4-p8pngIHDRPLTEIDATIEND 4x4, interlaced, random filter per scanline; passes 2, 3 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected42 match 14 of 16 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-1x9-p8pngIHDRPLTEIDATIEND 1x9, interlaced, random filter per scanline; passes 2, 4, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected42 match 9 of 9 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
y_adam7-2x7-p8png | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-1x1-ga8pngIHDRIDATIEND 1x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-1x2-ga8pngIHDRIDATIEND 1x2, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 2 of 2 pixels differ2: imagesharp, imagesharp-head 1 of 2 pixels differ2: upng, upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-2x1-ga8pngIHDRIDATIEND 2x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected42 match 1 of 2 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-2x2-ga8pngIHDRIDATIEND 2x2, interlaced, random filter per scanline; passes 2, 3, 4, 5 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 1 of 4 pixels differ2: upng, upng-head 4 of 4 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-3x3-ga8pngIHDRIDATIEND 3x3, interlaced, random filter per scanline; passes 2, 3 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 1 of 9 pixels differ2: upng, upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-4x4-ga8png | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-1x9-ga8pngIHDRIDATIEND 1x9, interlaced, random filter per scanline; passes 2, 4, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 9 of 9 pixels differ2: imagesharp, imagesharp-head 3 of 9 pixels differ1: upng 4 of 9 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-2x7-ga8pngIHDRIDATIEND 2x7, interlaced, random filter per scanline; passes 2, 4 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 4 of 14 pixels differ2: imagesharp, imagesharp-head 3 of 14 pixels differ1: upng-head 1 of 14 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-ga16pngIHDRIDATIEND 13x15, interlaced, random filter per scanline; no pass is empty. §8.1 says decoders are required to read interlaced images. expected: display, conforms spec: §13.10 expected38 match matches the reference; color under alpha 0 preserved; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-1x1-ga16pngIHDRIDATIEND 1x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected38 match matches the reference; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-1x2-ga16pngIHDRIDATIEND 1x2, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected36 match matches the reference; 16→8 high byte5: pillow, chunky_png, upng-head, pillow-head, chunky_png-head 2 of 2 pixels differ2: imagesharp, imagesharp-head 2 of 2 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ |
y_adam7-2x1-ga16pngIHDRIDATIEND 2x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected36 match matches the reference; 16→8 high byte4: pillow, chunky_png, pillow-head, chunky_png-head 1 of 2 pixels differ2: imagesharp, imagesharp-head 2 of 2 pixels differ1: upng 2 of 2 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-2x2-ga16pngIHDRIDATIEND 2x2, interlaced, random filter per scanline; passes 2, 3, 4, 5 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected36 match matches the reference; 16→8 high byte5: pillow, chunky_png, upng-head, pillow-head, chunky_png-head 4 of 4 pixels differ2: imagesharp, imagesharp-head 4 of 4 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ |
y_adam7-3x3-ga16pngIHDRIDATIEND 3x3, interlaced, random filter per scanline; passes 2, 3 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected36 match matches the reference; 16→8 high byte4: pillow, chunky_png, pillow-head, chunky_png-head 9 of 9 pixels differ2: upng, upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-4x4-ga16pngIHDRIDATIEND 4x4, interlaced, random filter per scanline; passes 2, 3 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected36 match matches the reference; 16→8 high byte5: upng, pillow, chunky_png, pillow-head, chunky_png-head 16 of 16 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
y_adam7-5x5-ga16png | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-1x9-ga16pngIHDRIDATIEND 1x9, interlaced, random filter per scanline; passes 2, 4, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected36 match matches the reference; 16→8 high byte4: pillow, chunky_png, pillow-head, chunky_png-head 9 of 9 pixels differ2: imagesharp, imagesharp-head 9 of 9 pixels differ1: upng-head 9 of 9 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-9x1-ga16pngIHDRIDATIEND 9x1, interlaced, random filter per scanline; passes 3, 5, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected38 match matches the reference; 16→8 high byte5: upng, pillow, chunky_png, pillow-head, chunky_png-head 9 of 9 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
y_adam7-2x7-ga16pngIHDRIDATIEND 2x7, interlaced, random filter per scanline; passes 2, 4 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected36 match matches the reference; 16→8 high byte4: pillow, chunky_png, pillow-head, chunky_png-head 4 of 14 pixels differ2: imagesharp, imagesharp-head 14 of 14 pixels differ1: upng 14 of 14 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-7x2-ga16pngIHDRIDATIEND 7x2, interlaced, random filter per scanline; passes 3, 5 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected38 match matches the reference; 16→8 high byte5: upng, pillow, chunky_png, pillow-head, chunky_png-head 14 of 14 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
y_adam7-8x9-ga16pngIHDRIDATIEND 8x9, interlaced, random filter per scanline; no pass is empty. §8.1 says decoders are required to read interlaced images. expected: display, conforms spec: §13.10 expected38 match matches the reference; 16→8 high byte5: upng, pillow, chunky_png, pillow-head, chunky_png-head 71 of 72 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-1x1-rgba8pngIHDRIDATIEND 1x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-1x2-rgba8pngIHDRIDATIEND 1x2, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected41 match 2 of 2 pixels differ2: imagesharp, imagesharp-head 1 of 2 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ |
y_adam7-2x1-rgba8pngIHDRIDATIEND 2x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected42 match 1 of 2 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-2x2-rgba8pngIHDRIDATIEND 2x2, interlaced, random filter per scanline; passes 2, 3, 4, 5 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected41 match 4 of 4 pixels differ2: imagesharp, imagesharp-head 1 of 4 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ |
y_adam7-3x3-rgba8pngIHDRIDATIEND 3x3, interlaced, random filter per scanline; passes 2, 3 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected41 match 2 of 9 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
y_adam7-4x4-rgba8pngIHDRIDATIEND 4x4, interlaced, random filter per scanline; passes 2, 3 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 1 of 16 pixels differ2: upng, upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-1x9-rgba8pngIHDRIDATIEND 1x9, interlaced, random filter per scanline; passes 2, 4, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 9 of 9 pixels differ2: imagesharp, imagesharp-head 6 of 9 pixels differ1: upng-head 1 of 9 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-2x7-rgba8pngIHDRIDATIEND 2x7, interlaced, random filter per scanline; passes 2, 4 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected40 match 4 of 14 pixels differ2: imagesharp, imagesharp-head 1 of 14 pixels differ1: upng 6 of 14 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-rgba16pngIHDRIDATIEND 13x15, interlaced, random filter per scanline; no pass is empty. §8.1 says decoders are required to read interlaced images. expected: display, conforms spec: §13.10 expected38 match matches the reference; color under alpha 0 preserved; 16→8 high byte5: upng, pillow, chunky_png, pillow-head, chunky_png-head 192 of 195 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
y_adam7-1x1-rgba16pngIHDRIDATIEND 1x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected38 match matches the reference; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-1x2-rgba16pngIHDRIDATIEND 1x2, interlaced, random filter per scanline; passes 2, 3, 4, 5, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected36 match matches the reference; 16→8 high byte5: pillow, chunky_png, upng-head, pillow-head, chunky_png-head 2 of 2 pixels differ2: imagesharp, imagesharp-head 2 of 2 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ |
y_adam7-2x1-rgba16pngIHDRIDATIEND 2x1, interlaced, random filter per scanline; passes 2, 3, 4, 5, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected36 match matches the reference; 16→8 high byte4: pillow, chunky_png, pillow-head, chunky_png-head 1 of 2 pixels differ2: imagesharp, imagesharp-head 2 of 2 pixels differ1: upng-head 2 of 2 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-2x2-rgba16pngIHDRIDATIEND 2x2, interlaced, random filter per scanline; passes 2, 3, 4, 5 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected36 match matches the reference; 16→8 high byte4: pillow, chunky_png, pillow-head, chunky_png-head 4 of 4 pixels differ2: imagesharp, imagesharp-head 4 of 4 pixels differ1: upng-head 4 of 4 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-3x3-rgba16pngIHDRIDATIEND 3x3, interlaced, random filter per scanline; passes 2, 3 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected36 match matches the reference; 16→8 high byte5: pillow, chunky_png, upng-head, pillow-head, chunky_png-head 9 of 9 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ |
y_adam7-4x4-rgba16pngIHDRIDATIEND 4x4, interlaced, random filter per scanline; passes 2, 3 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected36 match matches the reference; 16→8 high byte5: pillow, chunky_png, upng-head, pillow-head, chunky_png-head 16 of 16 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ |
y_adam7-5x5-rgba16pngIHDRIDATIEND 5x5, interlaced, random filter per scanline; no pass is empty. §8.1 says decoders are required to read interlaced images. expected: display, conforms spec: §13.10 expected38 match matches the reference; 16→8 high byte5: upng, pillow, chunky_png, pillow-head, chunky_png-head 24 of 25 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
y_adam7-1x9-rgba16pngIHDRIDATIEND 1x9, interlaced, random filter per scanline; passes 2, 4, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected36 match matches the reference; 16→8 high byte4: pillow, chunky_png, pillow-head, chunky_png-head 9 of 9 pixels differ2: imagesharp, imagesharp-head 9 of 9 pixels differ1: upng 9 of 9 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-9x1-rgba16pngIHDRIDATIEND 9x1, interlaced, random filter per scanline; passes 3, 5, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected38 match matches the reference; 16→8 high byte5: upng, pillow, chunky_png, pillow-head, chunky_png-head 9 of 9 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
y_adam7-2x7-rgba16pngIHDRIDATIEND 2x7, interlaced, random filter per scanline; passes 2, 4 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected36 match matches the reference; 16→8 high byte4: pillow, chunky_png, pillow-head, chunky_png-head 4 of 14 pixels differ2: imagesharp, imagesharp-head 14 of 14 pixels differ1: upng-head 14 of 14 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_adam7-7x2-rgba16pngIHDRIDATIEND 7x2, interlaced, random filter per scanline; passes 3, 5 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected38 match matches the reference; 16→8 high byte5: upng, pillow, chunky_png, pillow-head, chunky_png-head 14 of 14 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
y_adam7-8x9-rgba16pngIHDRIDATIEND 8x9, interlaced, random filter per scanline; no pass is empty. §8.1 says decoders are required to read interlaced images. expected: display, conforms spec: §13.10 expected38 match matches the reference; 16→8 high byte5: upng, pillow, chunky_png, pillow-head, chunky_png-head 72 of 72 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
y_adam7-1x1-g8-nofilterpngIHDRIDATIEND 1x1, interlaced, filter None throughout; passes 2, 3, 4, 5, 6, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-1x2-g8-nofilterpngIHDRIDATIEND 1x2, interlaced, filter None throughout; passes 2, 3, 4, 5, 6 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected42 match 2 of 2 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-2x1-g8-nofilterpngIHDRIDATIEND 2x1, interlaced, filter None throughout; passes 2, 3, 4, 5, 7 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected42 match 1 of 2 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-2x2-g8-nofilterpngIHDRIDATIEND 2x2, interlaced, filter None throughout; passes 2, 3, 4, 5 are empty. §8.1 says decoders are required to read interlaced images. §9.1 says an empty pass has no filter type bytes. §9.1 says an empty pass has no filter type bytes. expected: display, conforms spec: §13.10 expected42 match 4 of 4 pixels differ2: imagesharp, imagesharp-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-3x3-g8-nofilterpng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-4x4-g8-nofilterpng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
y_adam7-1x9-g8-nofilterpng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_adam7-9x1-g8-nofilterpng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
y_adam7-2x7-g8-nofilterpng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
y_padbits-g1-adam7pngIHDRIDATIEND unused bits set to 1 in every reduced image (13 wide, so every pass pads), Paeth filter. §8.1 says decoders are required to read interlaced images. §7.2 says the padding bits at the end of a scanline are unspecified; a decoder can't depend on them. expected: display, conforms spec: §13.10 expected40 match 89 of 195 pixels differ1: upng 12 of 195 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
y_idat-split-every-byte-g16png | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_idat-split-every-byte-rgb16pngIHDRIDAT ×301IEND one byte per IDAT on a 16-bit image, 301 IDAT chunks. §10.2 says IDAT boundaries mean nothing; the chunks' data concatenate into one stream. expected: display, conforms spec: §13.8 expected36 match matches the reference; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| R | R | R | R | A | A | A | A | R | R | R | R | R | A | R | R | R | R | A | R | R | R | R | A | A | R | R | A | A | R | R | A | A | A | R | A | R | |
| R | R | R | R | A | A | A | A | R | R | R | R | R | A | R | R | R | R | A | R | R | R | R | A | A | R | R | A | A | R | R | A | A | A | R | A | R | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | |
| ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | |
| ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ! | ! | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | R | |
| ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | R | |
i_zlib-short-rowpngIHDRIDATIEND decompressed data one scanline short: unexpected end of image data. §13.1 says a decoder may treat an early end of the image data as fatal. The image is incomplete, so what a decoder shows for it isn't judged. expected: may-reject, does not conform no reference pixels8: ffmpeg, imagesharp, pillow, ffmpeg-head, zune-png-head, imagesharp-head, upng-head, pillow-head no reference pixels1: upng | R | R | A | A | R | R | A | A | R | R | R | R | R | A | R | R | R | R | R | R | R | A | A | R | R | R | R | ! | ! | R | R | R | A | A | R | R | A |
i_zlib-short-bytepngIHDRIDATIEND decompressed data one byte short. §13.1 says a decoder may treat an early end of the image data as fatal. The image is incomplete, so what a decoder shows for it isn't judged. expected: may-reject, does not conform no reference pixels6: fast-png, pngjs, upng, fast-png-head, pngjs-head, upng-head no reference pixels5: ffmpeg, imagesharp, ffmpeg-head, zune-png-head, imagesharp-head | R | R | A | A | ! | A | A | A | R | R | R | R | R | A | R | R | R | R | R | R | R | R | R | A | A | R | R | R | R | R | R | R | A | A | R | R | A |
i_zlib-emptypngIHDRIDATIEND a valid zlib stream that decompresses to nothing. §13.1 says a decoder may treat an early end of the image data as fatal. The image is incomplete, so what a decoder shows for it isn't judged. expected: may-reject, does not conform no reference pixels5: imagesharp, upng, zune-png-head, imagesharp-head, upng-head | R | R | R | R | R | R | R | R | R | R | R | R | R | A | R | R | R | R | R | R | R | R | R | R | R | R | R | ! | ! | R | R | R | A | A | R | R | A |
i_zlib-no-adlerpngIHDRIDATIEND deflate complete, Adler-32 absent. §10.1 says the stream ends with its Adler-32, but not what a decoder does when the stream stops early; a decoder may reject the file or keep the image. RFC 1950 §2.2 ends the stream with four Adler-32 bytes; a decoder may treat a cut checksum as fatal or keep the image. expected: may-reject, does not conform expected22 match | ✓ | ✓ | A | A | R | R | ✓ | ✓ | R | R | R | R | R | ✓ | ✓ | R | R | ✓ | R | R | R | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | R | ✓ | ✓ |
i_idat-second-truncatedpngIHDRIDATIDAT a complete IDAT, then the length and type of a second one and nothing more: the image is whole, the datastream is not. §13.1 says a datastream that ends mid-chunk is corrupt, and a decoder may treat that as fatal. expected: may-reject, does not conform expected8 match 193 of 195 pixels differ1: zune-png-head | ✓ | ✓ | R | R | R | R | R | R | R | R | R | R | R | R | ✓ | R | R | ✓ | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | ✓ | ✓ | R | ≠ |
n_zlib-bad-adler-idatpngIHDRIDATIEND Adler-32 wrong, in the IDAT that holds the data: a decoder that inflates the chunk it has in hand reaches it. RFC 1950 §2.3 says a decompressor must check the Adler-32 and report an error when it's wrong. expected: must-reject, does not conform spec: RFC 1950 §2.2 expected15 match | R | R | R | R | R | A | R | R | R | R | R | R | R | A | R | R | R | R | R | R | R | R | R | A | A | R | R | R | R | A | A | A | R | A | A | A | A |
n_zlib-bad-adler-extra-idatpngIHDRIDAT ×2IEND Adler-32 wrong, in an extra IDAT after the data: a decoder that has every row before it reads the chunk may never check it. RFC 1950 §2.3 says a decompressor must check the Adler-32 and report an error when it's wrong. expected: must-reject, does not conform spec: RFC 1950 §2.2 expectedevery row comes before the checksum, and a decoder that stops at the last row never checks it; libpng checks it and treats the mismatch as benign31 match | R | R | A | A | R | A | R | R | R | A | A | A | A | A | A | A | A | A | R | A | A | A | A | A | A | A | A | R | R | A | A | A | R | A | A | A | A |
i_zlib-no-final-blockpngIHDRIDATIEND all data in non-final blocks, then the stream stops (no BFINAL, no Adler-32). §10.1 says the stream ends with its Adler-32, but not what a decoder does when the stream stops early; a decoder may reject the file or keep the image. RFC 1951 §3.2.3 says blocks follow until a final one ends; input that stops first is an error a decoder may ignore once it has every row. expected: may-reject, does not conform spec: RFC 1950 §2.2, RFC 1951 §1.4 expected17 match | ✓ | ✓ | A | A | R | R | ✓ | ✓ | R | R | R | R | R | ✓ | ✓ | R | R | ✓ | R | R | R | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | R | R | R | R | R | R |
n_zlib-cinfo-8pngIHDRIDATIEND zlib header claims a 64 KiB window (CINFO 8); PNG allows at most 32768. §10.1 says the zlib header must specify method 8 and a window of at most 32768 bytes, so that's a fatal error. expected: must-reject, does not conform no reference pixels4: stb_image, stb_image-head, zune-png-head, upng-head | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | R | A | R | R | A |
y_zlib-cinfo-0pngIHDRIDATIEND zlib header claims a 256-byte window; the data uses no distance at all. RFC 1950 §2.2 says CINFO declares the window size; a smaller window is fine. expected: display, conforms expected42 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ |
n_zlib-fdictpngIHDRIDATIEND FDICT set with dictionary id 0x12345678; PNG forbids preset dictionaries; the data needs none (an id of 1 would be the Adler-32 of an empty dictionary and some inflaters accept it). §10.1 says the zlib header must not request a preset dictionary, so that's a fatal error. expected: must-reject, does not conform no reference pixels2: imagesharp, imagesharp-head | R | R | R | R | R | R | R | R | R | R | R | R | R | A | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R |
| R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | R | R | A | |
n_zlib-fcheck-badpngIHDRIDATIEND zlib header check bits wrong (0x789D), data intact. RFC 1950 §2.2 says the header bytes, read as a 16-bit integer, are a multiple of 31, so that's a fatal error. expected: must-reject, does not conform spec: RFC 1950 §2.3 no reference pixels4: imagesharp, zune-png-head, imagesharp-head, upng-head | R | R | R | R | R | R | R | R | R | R | R | R | R | A | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | R | R | A |
i_zlib-cinfo-0-long-distancepngIHDRIDATIEND rgb16; window declared 256 bytes (CINFO 0), and 67 bytes of the last scanline are matches 316 bytes back (the ground repeats). RFC 1950 §2.2 doesn't say what to do with a distance beyond the declared window; a decoder may reject it or not. expected: may-reject, does not conform expected27 match matches the reference; 16→8 high byte5: pillow, chunky_png, upng-head, pillow-head, chunky_png-head | ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | R | R | ✓ | ✓ | R | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ |
y_deflate-storedpngIHDRIDATIEND zlib level 0: stored blocks. expected: display, conforms spec: RFC 1951 §3.2.4 expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_deflate-fixedpngIHDRIDATIEND single fixed-Huffman block with distance-1 matches. expected: display, conforms spec: RFC 1951 §3.2.6 expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_deflate-huffman-onlypngIHDRIDATIEND zlib Z_HUFFMAN_ONLY: dynamic blocks without matches. expected: display, conforms spec: RFC 1951 §3.2.7 expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_deflate-rlepngIHDRIDATIEND zlib Z_RLE: distance-1 matches only. RFC 1951 §3.2.3 says a back-reference may overlap the bytes it produces. expected: display, conforms expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_deflate-zlib-fixedpngIHDRIDATIEND zlib Z_FIXED: fixed-Huffman blocks with real matches. expected: display, conforms spec: RFC 1951 §3.2.6 expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_deflate-sync-flush-per-rowpngIHDRIDATIEND Z_SYNC_FLUSH after every scanline: empty stored blocks between, matches may reach across. expected: display, conforms spec: RFC 1951 §3.2.3 expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_deflate-full-flush-per-rowpngIHDRIDATIEND Z_FULL_FLUSH after every scanline: no match reaches across a flush. expected: display, conforms spec: RFC 1951 §3.2.3 expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_deflate-stored-small-blockspngIHDRIDATIEND 7-byte stored blocks, then an empty final stored block. expected: display, conforms spec: RFC 1951 §3.2.3 expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_deflate-empty-blocks-firstpngIHDRIDATIEND 20 empty stored blocks before the data. expected: display, conforms spec: RFC 1951 §3.2.3 expected42 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ |
y_deflate-dynamic-literalspngIHDRIDATIEND hand-written dynamic block, literals only, two unused distance codes (what zlib emits). expected: display, conforms spec: RFC 1951 §3.2.7 expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_deflate-dynamic-no-distance-codespngIHDRIDATIEND HDIST=1 with that code length 0: no distance codes at all, which RFC 1951 allows. RFC 1951 §3.2.7 says one zero-length distance code means the block doesn't use distance codes at all. expected: display, conforms expected42 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ |
y_deflate-dynamic-one-distance-codepngIHDRIDATIEND a single distance code of length 1 (incomplete tree), which RFC 1951 allows; Up filter, so the repeated ground rows give 4 distance-1 matches. RFC 1951 §3.2.7 says a single distance code takes one bit, not zero. expected: display, conforms expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_deflate-dynamic-hdist-32-unusedpngIHDRIDATIEND HDIST=32: distance codes 30 and 31 given lengths but never used. RFC 1951 §3.2.7 allows 1 to 32 distance codes, and RFC 1951 §3.3 says a decompressor must accept the full range. zlib refuses 31 and 32. expected: display, conforms expected11 match | ✓ | ✓ | R | R | R | ✓ | R | R | R | R | R | R | R | R | R | R | R | R | ✓ | R | R | R | R | R | R | R | R | R | R | R | R | ✓ | R | ✓ | R | ✓ | ✓ |
y_deflate-dynamic-hdist-31-unusedpngIHDRIDATIEND HDIST=31: distance code 30 given a length (4, so the tree is complete) but never used. RFC 1951 §3.2.7 allows 1 to 32 distance codes, and RFC 1951 §3.3 says a decompressor must accept the full range. zlib refuses 31 and 32. expected: display, conforms expected11 match | ✓ | ✓ | R | R | R | ✓ | R | R | R | R | R | R | R | R | R | R | R | R | ✓ | R | R | R | R | R | R | R | R | R | R | R | R | ✓ | R | ✓ | R | ✓ | ✓ |
n_deflate-stored-bad-nlenpngIHDRIDATIEND stored block whose NLEN is not the complement of LEN. RFC 1951 §3.2.4 says NLEN is the one's complement of LEN, so that's a fatal error. expected: must-reject, does not conform no reference pixels3: fast-png, fast-png-head, upng-head | R | R | R | R | R | A | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | R | R | R |
n_deflate-distance-too-farpngIHDRIDATIEND a match reaching 5 bytes back after 1 byte of output. RFC 1951 §3.2.3 says a distance can't reach before the start of the output, so that's a fatal error. expected: must-reject, does not conform no reference pixels1: upng-head | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | R | R | R |
n_deflate-fixed-length-code-286-usedpngIHDRIDATIEND fixed-Huffman block using literal/length code 286, which has no meaning. RFC 1951 §3.2.6 says symbols 286 and 287 never occur in data, so that's a fatal error. expected: must-reject, does not conform no reference pixels1: upng-head | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | R | R | R |
n_deflate-fixed-distance-code-30-usedpngIHDRIDATIEND fixed-Huffman block using distance code 30, which has no meaning. RFC 1951 §3.2.5 says distance codes 30 and 31 never occur in data, so that's a fatal error. expected: must-reject, does not conform spec: RFC 1951 §3.2.6 no reference pixels1: upng-head | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | R | R | R |
y_deflate-zopflipngIHDRIDATIEND the rgba16 picture written by zopfli: dynamic blocks and real matches. expected: display, conforms spec: RFC 1951 §3.2.7 expected38 match matches the reference; color under alpha 0 preserved; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_deflate-libdeflatepngIHDRIDATIEND the rgba16 picture written by libdeflate: dynamic blocks and real matches. expected: display, conforms spec: RFC 1951 §3.2.7 expected38 match matches the reference; color under alpha 0 preserved; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_deflate-7-zippngIHDRIDATIEND the rgba16 picture written by 7-zip: dynamic blocks and real matches. expected: display, conforms spec: RFC 1951 §3.2.7 expected38 match matches the reference; color under alpha 0 preserved; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
i_deflate-empty-dynamic-blockpngIHDRIDATIEND the image data in a non-final stored block, then a final dynamic block that is empty: its literal/length code is the single one-bit code for 256, and it has no distance code. RFC 1951 §3.2.2 doesn't describe a one-code literal/length alphabet; a decoder may reject it or decode it, and zlib decodes it. RFC 1951 §3.2.7 says one zero-length distance code means the block doesn't use distance codes at all. expected: may-reject, does not conform spec: RFC 1951 §3.2.3 expected40 match | ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | R | ✓ | ✓ |
| R | R | R | R | A | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | A | R | R | R | |
n_ihdr-len-14png | R | R | R | R | A | R | R | R | R | R | R | R | R | A | R | R | R | R | R | R | R | A | A | A | A | R | R | R | R | R | R | R | A | A | R | R | R |
n_ihdr-compression-1pngIHDRIDATIEND compression method 1; data is ordinary zlib. §11.2.1 defines only compression method 0; a decoder must report any other as an error. expected: must-reject, does not conform spec: §13.2 no reference pixels7: imagesharp, pillow, chunky_png, imagesharp-head, upng-head, pillow-head, chunky_png-head no reference pixels1: upng | R | R | R | R | A | R | R | R | R | R | R | R | R | A | R | R | R | R | R | R | R | A | A | R | R | R | R | R | R | R | R | R | A | A | R | R | R |
| R | R | R | R | A | R | A | A | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | A | R | A | A | |
| R | R | R | R | R | R | A | A | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | A | R | R | R | |
| R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | ! | ! | R | R | R | |
| R | R | R | R | R | ! | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | ! | ! | R | R | R | ! | ! | R | R | R | |
| R | R | R | R | R | ∞ | R | R | R | R | R | R | R | R | R | R | R | R | ∞ | R | R | R | R | R | R | R | R | ∞ | ∞ | R | R | R | ⧗ | ∞ | R | R | R | |
| R | R | R | R | R | ! | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | ! | ! | R | R | R | ! | ! | R | R | R | |
n_ihdr-rgb-bd4pngIHDRIDATIEND color type 2 at bit depth 4 is not an allowed combination; the picture quantized to 4 bits. Table 12 in §11.2.1 lists the allowed color type and bit depth pairs; any other is an error. expected: must-reject, does not conform no reference pixels3: zune-png, pngjs, pngjs-head no reference pixels2: fast-png, fast-png-head no reference pixels2: upng, upng-head no reference pixels2: stb_image, stb_image-head no reference pixels2: ffmpeg, ffmpeg-head no reference pixels1: zune-png-head | R | R | R | R | R | A | A | A | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | A | R | R | R | R | R | R | A | A | A | R | A | A |
n_ihdr-rgb-bd1pngIHDRIDATIEND color type 2 at bit depth 1 is not an allowed combination; the picture quantized to 1 bits. Table 12 in §11.2.1 lists the allowed color type and bit depth pairs; any other is an error. expected: must-reject, does not conform no reference pixels3: zune-png, pngjs, pngjs-head no reference pixels2: fast-png, fast-png-head no reference pixels2: upng, upng-head no reference pixels2: stb_image, stb_image-head no reference pixels1: zune-png-head | R | R | R | R | R | A | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | A | R | R | R | R | R | R | A | A | A | R | A | A |
n_ihdr-ga-bd4pngIHDRIDATIEND color type 4 at bit depth 4 is not an allowed combination; the picture quantized to 4 bits. Table 12 in §11.2.1 lists the allowed color type and bit depth pairs; any other is an error. expected: must-reject, does not conform no reference pixels3: fast-png, zune-png-head, fast-png-head no reference pixels3: zune-png, pngjs, pngjs-head no reference pixels2: upng, upng-head no reference pixels2: stb_image, stb_image-head | R | R | R | R | R | A | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | A | R | R | R | R | R | R | A | A | A | R | A | A |
n_ihdr-rgba-bd2pngIHDRIDATIEND color type 6 at bit depth 2 is not an allowed combination; the picture quantized to 2 bits. Table 12 in §11.2.1 lists the allowed color type and bit depth pairs; any other is an error. expected: must-reject, does not conform no reference pixels3: zune-png, pngjs, pngjs-head no reference pixels2: stb_image, stb_image-head no reference pixels2: upng, upng-head no reference pixels2: ffmpeg, ffmpeg-head no reference pixels2: fast-png, fast-png-head no reference pixels1: zune-png-head | R | R | R | R | R | A | A | A | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | A | R | R | R | R | R | R | A | A | A | R | A | A |
| R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | A | R | R | R | |
| R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | A | R | R | R | |
n_ihdr-p-bd16pngIHDRPLTEIDATIEND color type 3 at bit depth 16 is not an allowed combination; the p8 indices as 16-bit samples. Table 12 in §11.2.1 lists the allowed color type and bit depth pairs; any other is an error. expected: must-reject, does not conform no reference pixels2: upng, upng-head no reference pixels2: pngjs, pngjs-head | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | A | R | R | R | R | R | R | R | A | A | R | R | R |
| R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | A | R | R | R | |
| R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | A | R | R | R | |
| R | R | A | A | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | A | R | R | R | |
| R | R | R | R | A | A | A | A | A | R | R | R | R | A | R | R | R | R | R | R | R | A | A | R | R | R | R | A | A | R | R | R | A | A | R | R | R | |
| R | R | R | R | A | A | A | A | A | R | R | R | R | A | R | A | A | R | R | R | R | A | A | R | R | A | A | A | A | R | R | R | A | A | R | R | R | |
| R | R | R | R | A | A | R | R | R | R | R | R | R | R | A | R | R | R | R | R | R | A | A | A | A | R | R | A | A | R | R | R | A | A | R | R | R | |
| R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | A | R | R | R | |
| R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | ! | ! | R | R | R | |
n_plte-len-not-mult3-palpngIHDRPLTEIDATIEND palette length 109 in an indexed image. §11.2.2 says PLTE holds 1 to 256 entries of 3 bytes each; §13.1 says a viewer can't recover from an invalid one in an indexed image. expected: must-reject, does not conform no reference pixels11: lodepng, java-imageio, imagesharp, pngjs, upng, pillow, lodepng-head, imagesharp-head, pngjs-head, upng-head, pillow-head no reference pixels2: ffmpeg, ffmpeg-head | R | R | R | R | R | R | A | A | R | R | R | R | R | A | A | R | R | R | A | R | R | A | A | A | A | R | R | R | R | R | R | R | A | A | R | R | R |
| ✓ | ✓ | R | R | ✓ | R | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | R | R | ✓ | ✓ | ✓ | R | R | |
n_plte-empty-palpngIHDRPLTEIDATIEND zero-length PLTE in an indexed image. §11.2.2 says PLTE holds 1 to 256 entries of 3 bytes each; §13.1 says a viewer can't recover from an invalid one in an indexed image. expected: must-reject, does not conform no reference pixels11: ffmpeg, wuffs, zune-png, java-imageio, upng, pillow, ffmpeg-head, wuffs-head, zune-png-head, upng-head, pillow-head | R | R | R | R | ! | R | A | A | R | R | R | R | R | R | A | R | R | R | R | R | R | A | A | R | R | R | R | R | R | R | R | R | A | A | A | A | A |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | R | R | R | R | R | ✓ | ✓ | R | R | R | R | R | R | ✓ | ✓ | ✓ | ✓ | R | R | R | R | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
i_plte-too-many-for-depthpngIHDRPLTEIDATIEND 1-bit indexed image with a 4-entry palette (p1's two entries, then black and white); only indices 0 and 1 are used. §11.2.2 says a palette has no more entries than the bit depth can index; a decoder may reject that or ignore the surplus. expected: may-reject, does not conform expected38 match | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
n_plte-257-entriespngIHDRPLTEIDATIEND 771-byte PLTE: 257 entries (p8's 36, then black). §11.2.2 says PLTE holds 1 to 256 entries of 3 bytes each; §13.1 says a viewer can't recover from an invalid one in an indexed image. expected: must-reject, does not conform no reference pixels11: java-imageio, imagesharp, fast-png, pngjs, upng, chunky_png, imagesharp-head, fast-png-head, pngjs-head, upng-head, chunky_png-head no reference pixels2: ffmpeg, ffmpeg-head | R | R | R | R | A | A | A | A | R | R | R | R | R | A | A | R | R | R | R | R | R | R | R | A | A | R | R | R | R | R | R | R | A | A | R | R | R |
| ✓ | ✓ | R | R | ✓ | R | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | |
n_plte-after-idat-palpngIHDRIDATPLTEIEND indexed image whose PLTE follows IDAT. §11.2.2 says an indexed image has a PLTE before IDAT, so that's a fatal error. expected: must-reject, does not conform no reference pixels9: lodepng, zune-png, fast-png, upng, chunky_png, lodepng-head, fast-png-head, upng-head, chunky_png-head no reference pixels2: ffmpeg, ffmpeg-head no reference pixels2: pillow, pillow-head | R | R | R | R | A | A | A | A | R | R | R | R | R | R | R | R | R | R | A | R | R | A | A | R | R | R | R | R | R | R | R | R | A | A | R | A | R |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | R | ✓ | ✓ | |
| ✓ | ✓ | R | R | R | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | R | R | R | R | ✓ | ✓ | R | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓c | ✓c | R | R | R | ✓c | ✓c | ✓c | R | ✓c | ✓c | R | R | R | ✓c | R | R | R | R | R | R | R | R | R | R | R | R | R | ✓c | R | R | ✓c | ✓c | ✓c | ✓c | ✓c | ✓c | |
r_plte-index-beyond-2bitpngIHDRPLTEIDATIEND p2 with its PLTE cut to three entries: 29 pixels use index 3. §13.1 requires a decoder to show a palette index past the end of PLTE as opaque black. expected: 2nd edition: must-reject, does not conform; 3rd edition: recover, does not conform spec: §11.2.2 expected27 match 29 of 195 pixels differ2: imagesharp, imagesharp-head 29 of 195 pixels differ2: stb_image, stb_image-head | RR | A✓ | A | A | ! | RR | A✓ | A✓ | A✓ | RR | RR | RR | RR | A≠ | A✓ | A✓ | A✓ | A✓ | A✓ | A✓ | A✓ | A✓ | A✓ | RR | RR | A✓ | A✓ | RR | RR | A✓ | A✓ | M | A✓ | A✓ | A✓ | A✓ | A✓ |
r_plte-index-beyond-2bit-trnspngIHDRPLTEtRNSIDATIEND p2 with its PLTE cut to three entries: 29 pixels use index 3; tRNS 80 ff, and the out-of-range pixels stay opaque. §13.1 requires a decoder to show a palette index past the end of PLTE as opaque black. expected: 2nd edition: must-reject, does not conform; 3rd edition: recover, does not conform spec: §11.2.2 expected27 match 29 of 195 pixels differ2: imagesharp, imagesharp-head 29 of 195 pixels differ2: stb_image, stb_image-head | RR | A✓ | A | A | ! | RR | A✓ | A✓ | A✓ | RR | RR | RR | RR | A≠ | A✓ | A✓ | A✓ | A✓ | A✓ | A✓ | A✓ | A✓ | A✓ | RR | RR | A✓ | A✓ | RR | RR | A✓ | A✓ | M | A✓ | A✓ | A✓ | A✓ | A✓ |
r_plte-index-beyond-1bitpngIHDRPLTEIDATIEND p1 with its PLTE cut to 1 of 2 entries: 101 pixels use an index past it. §13.1 requires a decoder to show a palette index past the end of PLTE as opaque black. expected: 2nd edition: must-reject, does not conform; 3rd edition: recover, does not conform spec: §11.2.2 expected29 match 101 of 195 pixels differ2: imagesharp, imagesharp-head | RR | A✓ | A | A | ! | RR | A✓ | A✓ | A✓ | RR | RR | RR | RR | A≠ | A✓ | A✓ | A✓ | A✓ | A✓ | A✓ | A✓ | A✓ | A✓ | RR | RR | A✓ | A✓ | RR | RR | A✓ | A✓ | M | A✓ | A✓ | A✓ | A✓ | A✓ |
r_plte-index-beyond-4bitpngIHDRPLTEIDATIEND p4 with its PLTE cut to 15 of 16 entries: 8 pixels use an index past it. §13.1 requires a decoder to show a palette index past the end of PLTE as opaque black. expected: 2nd edition: must-reject, does not conform; 3rd edition: recover, does not conform spec: §11.2.2 expected27 match 8 of 195 pixels differ2: stb_image, stb_image-head 8 of 195 pixels differ2: imagesharp, imagesharp-head | RR | A✓ | A | A | ! | RR | A✓ | A✓ | A✓ | RR | RR | RR | RR | A≠ | A✓ | A✓ | A✓ | A✓ | A✓ | A✓ | A✓ | A✓ | A✓ | RR | RR | A✓ | A✓ | RR | RR | A✓ | A✓ | M | A✓ | A✓ | A✓ | A✓ | A✓ |
r_plte-index-beyond-8bitpngIHDRPLTEIDATIEND p8 with its PLTE cut to 35 of 36 entries: 2 pixels use an index past it. §13.1 requires a decoder to show a palette index past the end of PLTE as opaque black. expected: 2nd edition: must-reject, does not conform; 3rd edition: recover, does not conform spec: §11.2.2 expected27 match 2 of 195 pixels differ2: imagesharp, imagesharp-head 2 of 195 pixels differ2: stb_image, stb_image-head | RR | A✓ | A | A | ! | RR | A✓ | A✓ | A✓ | RR | RR | RR | RR | A≠ | A✓ | A✓ | A✓ | A✓ | A✓ | A✓ | A✓ | A✓ | A✓ | RR | RR | A✓ | A✓ | RR | RR | A✓ | A✓ | M | A✓ | A✓ | A✓ | A✓ | A✓ |
| ✓ | ✓ | R | R | R | R | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | R | R | R | R | ✓ | ✓ | R | R | ✓ | ✓ | R | ✓ | ✓ | R | R | R | |
r_trns-len-3-graypngIHDRtRNSIDATIEND 3-byte tRNS on grayscale. §11.3.1.1 fixes the tRNS length per color type; a decoder should ignore one of the wrong length. expected: recover, does not conform spec: §13.2 expected18 match the first two bytes taken as the gray value, so 149 is transparent9: rust-png, imagesharp, upng, pillow, rust-png-head, zune-png-head, imagesharp-head, upng-head, pillow-head the first two bytes taken as the gray value, so 149 is transparent; color under alpha 0 zeroed4: pngjs, chunky_png, pngjs-head, chunky_png-head | ✓ | ✓ | R | R | ≠ | R | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | R | R | ≠ | ≠ | R | ≠ | ≠ | R | R | ≠ |
| ✓ | ✓ | R | R | R | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | R | R | R | R | ✓ | ✓ | R | R | ✓ | ✓ | R | ✓ | ✓ | R | R | R | |
r_trns-len-7-rgbpngIHDRtRNSIDATIEND 7-byte tRNS on truecolor. §11.3.1.1 fixes the tRNS length per color type; a decoder should ignore one of the wrong length. expected: recover, does not conform spec: §13.2 expected18 match the first six bytes taken as the color, so black is transparent13: rust-png, imagesharp, pngjs, upng, pillow, chunky_png, rust-png-head, zune-png-head, imagesharp-head, pngjs-head, upng-head, pillow-head, chunky_png-head | ✓ | ✓ | R | R | ≠ | R | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | R | R | ≠ | ≠ | R | ≠ | ≠ | R | R | ≠ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
r_trns-longer-than-pltepngIHDRPLTEtRNSIDATIEND 6 alpha values for a 4-entry palette. §11.3.1.1 fixes the tRNS length per color type; a decoder should ignore one of the wrong length. expected: recover, does not conform spec: §13.2 expected17 match the alpha values that have palette entries applied, the extra ones dropped15: ffmpeg, wuffs, zune-png, go-png, java-imageio, upng, pillow, chunky_png, ffmpeg-head, wuffs-head, zune-png-head, upng-head, pillow-head, chunky_png-head, go-png-head | ✓ | ✓ | R | R | ≠ | R | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | R | ≠ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ≠ | ≠ | R | R | ✓ | ✓ | R | R | ✓ | ✓ | R | ≠ | ≠ | ≠ | ≠ | ≠ |
| ✓ | ✓ | R | R | ✓ | R | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | R | ✓ | ✓ | ✓ | R | R | |
| ✓ | ✓ | R | R | ✓ | R | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | R | ✓ | ✓ | ✓ | R | R | |
r_trns-after-idat-graypngIHDRIDATtRNSIEND tRNS after IDAT on grayscale (value 149 is the commonest gray of the picture). Table 7 in §5.6 puts this chunk after PLTE and before IDAT; a decoder should ignore a misplaced one. expected: recover, does not conform spec: Table 7 expected29 match the misplaced tRNS applied7: lodepng, zune-png, upng, pillow, lodepng-head, upng-head, pillow-head the misplaced tRNS applied; color under alpha 0 zeroed4: pngjs, chunky_png, pngjs-head, chunky_png-head | ✓ | ✓ | R | R | ≠ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ≠ | ≠ | ✓ | ≠ | ✓ |
r_trns-after-idat-palpngIHDRPLTEIDATtRNSIEND tRNS after IDAT on an indexed image. Table 7 in §5.6 puts this chunk after PLTE and before IDAT; a decoder should ignore a misplaced one. expected: recover, does not conform spec: Table 7 expected26 match the misplaced tRNS applied14: lodepng, zune-png, java-imageio, fast-png, pngjs, upng, pillow, chunky_png, lodepng-head, fast-png-head, pngjs-head, upng-head, pillow-head, chunky_png-head | ✓ | ✓ | R | R | ≠ | ≠ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ≠ | ≠ | ✓ | ≠ | ✓ |
r_trns-before-plte-palpngIHDRtRNSPLTEIDATIEND tRNS before PLTE on an indexed image. Table 7 in §5.6 puts this chunk after PLTE and before IDAT; a decoder should ignore a misplaced one. expected: recover, does not conform spec: Table 7 expected19 match the misplaced tRNS applied10: imagesharp, upng, pillow, pypng, chunky_png, imagesharp-head, upng-head, pillow-head, pypng-head, chunky_png-head | ✓ | ✓ | R | R | ≠ | R | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ≠ | R | ✓ | ✓ | ✓ | R | ✓ | ✓ | ≠ | ≠ | R | R | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | R | ≠ | ≠ | R | R | R |
r_trns-before-plte-rgbpngIHDRtRNSPLTEIDATIEND tRNS naming the top-left pixel's color, then a suggested palette, on a truecolor image: tRNS is before PLTE. Table 7 in §5.6 puts this chunk after PLTE and before IDAT; a decoder should ignore a misplaced one. expected: recover, does not conform spec: Table 7 expected28 match matches the reference; color under alpha 0 zeroed6: wuffs, pngjs, chunky_png, wuffs-head, pngjs-head, chunky_png-head the misplaced tRNS ignored6: fast-png, pngtopam, graphicsmagick, graphicsmagick-head, fast-png-head, pngtopam-head | ✓ | ✓ | A | A | ✓ | ≠ | ✓ | ✓ | R | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | M | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
r_trns-dup-graypngIHDRtRNS ×2IDATIEND two tRNS chunks naming the picture's two commonest grays, 149 and 34; expected pixels: the first applied. Table 7 in §5.6 allows this chunk once; a decoder should ignore the second. expected: recover, does not conform expected15 match: reference-2, reference-3, libpng, rust-png, imagemagick, libspng, pngtopam, graphicsmagick, libpng16-head, libpng18-head, rust-png-head, imagemagick-head, graphicsmagick-head, libspng-head, pngtopam-head matches trns:last (arguable: one of several tRNS chunks used); color under alpha 0 preserved17: stb_image, ffmpeg, lodepng, zune-png, java-imageio, imagesharp, upng, pillow, pypng, stb_image-head, ffmpeg-head, lodepng-head, zune-png-head, imagesharp-head, upng-head, pillow-head, pypng-head neither tRNS applied4: fast-png, opencv, fast-png-head, opencv-head matches trns:last (arguable: one of several tRNS chunks used); color under alpha 0 zeroed4: pngjs, chunky_png, pngjs-head, chunky_png-head | ✓t | ✓t | R | R | ✓t | ≠ | ✓t | ✓t | R | ✓t | ✓t | ✓t | ✓t | ✓t | ✓t | ✓t | ✓t | ✓t | ✓t | ≠ | ≠ | ✓t | ✓t | ✓t | ✓t | ✓t | ✓t | ✓t | ✓t | ✓t | ✓t | ✓t | ✓t | ✓t | R | ✓t | ✓t |
y_trns-g4-highbitspngIHDRtRNSIDATIEND 4-bit gray, tRNS 0x00F6: masked to 0x6. §11.3.1.1 says a decoder masks a tRNS value to the bit depth before using it. expected: display, conforms expected7 match: reference-2, reference-3, libpng, zune-png, libpng16-head, libpng18-head, zune-png-head tRNS compared without masking: nothing matches, nothing is transparent34: stb_image, rust-png, ffmpeg, imagemagick, lodepng, libspng, go-png, java-imageio, imagesharp, fast-png, pngjs, pillow, pypng, opencv, chunky_png, pngtopam, graphicsmagick, stb_image-head, rust-png-head, ffmpeg-head, imagemagick-head, graphicsmagick-head, lodepng-head, libspng-head, imagesharp-head, fast-png-head, pngjs-head, upng-head, pillow-head, pypng-head, opencv-head, chunky_png-head, pngtopam-head, go-png-head matches the reference; color under alpha 0 zeroed2: wuffs, wuffs-head 129 of 195 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_trns-g4-highbytepngIHDRtRNSIDATIEND 4-bit gray, tRNS 0x0106: masked to 0x6. §11.3.1.1 says a decoder masks a tRNS value to the bit depth before using it. expected: display, conforms expected15 match: reference-2, reference-3, libpng, stb_image, rust-png, zune-png, go-png, imagesharp, libpng16-head, libpng18-head, stb_image-head, rust-png-head, zune-png-head, imagesharp-head, go-png-head tRNS compared without masking: nothing matches, nothing is transparent26: ffmpeg, imagemagick, lodepng, libspng, java-imageio, fast-png, pngjs, pillow, pypng, opencv, chunky_png, pngtopam, graphicsmagick, ffmpeg-head, imagemagick-head, graphicsmagick-head, lodepng-head, libspng-head, fast-png-head, pngjs-head, upng-head, pillow-head, pypng-head, opencv-head, chunky_png-head, pngtopam-head matches the reference; color under alpha 0 zeroed2: wuffs, wuffs-head 129 of 195 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ✓ | ≠ | ≠ | ≠ | ≠ | ✓ | ≠ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_trns-g8-highbytepngIHDRtRNSIDATIEND 8-bit gray, tRNS 0x0195: masked to 0x95. §11.3.1.1 says a decoder masks a tRNS value to the bit depth before using it. expected: display, conforms expected19 match: reference-2, reference-3, libpng, stb_image, rust-png, ffmpeg, zune-png, go-png, imagesharp, pillow, libpng16-head, libpng18-head, stb_image-head, rust-png-head, ffmpeg-head, zune-png-head, imagesharp-head, pillow-head, go-png-head tRNS compared without masking: nothing matches, nothing is transparent23: imagemagick, lodepng, libspng, java-imageio, fast-png, pngjs, upng, pypng, opencv, chunky_png, pngtopam, graphicsmagick, imagemagick-head, graphicsmagick-head, lodepng-head, libspng-head, fast-png-head, pngjs-head, upng-head, pypng-head, opencv-head, chunky_png-head, pngtopam-head matches the reference; color under alpha 0 zeroed2: wuffs, wuffs-head | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ✓ | ≠ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_trns-g1-value-2pngIHDRtRNSIDATIEND 1-bit gray, tRNS 0x0002: masked to 0, so black is transparent (not 'nonzero means white'). §11.3.1.1 says a decoder masks a tRNS value to the bit depth before using it. expected: display, conforms expected11 match: reference-2, reference-3, libpng, wuffs, zune-png, chunky_png, libpng16-head, libpng18-head, wuffs-head, zune-png-head, chunky_png-head tRNS compared without masking: nothing matches, nothing is transparent30: stb_image, rust-png, ffmpeg, imagemagick, lodepng, libspng, go-png, java-imageio, imagesharp, fast-png, pngjs, pypng, opencv, pngtopam, graphicsmagick, stb_image-head, rust-png-head, ffmpeg-head, imagemagick-head, graphicsmagick-head, lodepng-head, libspng-head, imagesharp-head, fast-png-head, pngjs-head, upng-head, pypng-head, opencv-head, pngtopam-head, go-png-head a nonzero tRNS value taken as white, so white is transparent2: pillow, pillow-head 174 of 195 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_trns-g1-value-3pngIHDRtRNSIDATIEND 1-bit gray, tRNS 0x0003: masked to 1, white transparent. §11.3.1.1 says a decoder masks a tRNS value to the bit depth before using it. expected: display, conforms expected9 match: reference-2, reference-3, libpng, zune-png, pillow, libpng16-head, libpng18-head, zune-png-head, pillow-head tRNS compared without masking: nothing matches, nothing is transparent30: stb_image, rust-png, ffmpeg, imagemagick, lodepng, libspng, go-png, java-imageio, imagesharp, fast-png, pngjs, pypng, opencv, pngtopam, graphicsmagick, stb_image-head, rust-png-head, ffmpeg-head, imagemagick-head, graphicsmagick-head, lodepng-head, libspng-head, imagesharp-head, fast-png-head, pngjs-head, upng-head, pypng-head, opencv-head, pngtopam-head, go-png-head matches the reference; color under alpha 0 zeroed2: wuffs, wuffs-head a tRNS value other than 1 taken as black, so black is transparent2: chunky_png, chunky_png-head 115 of 195 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_trns-g2-value-5pngIHDRtRNSIDATIEND 2-bit gray, tRNS 5: masked to 1. §11.3.1.1 says a decoder masks a tRNS value to the bit depth before using it. expected: display, conforms expected7 match: reference-2, reference-3, libpng, zune-png, libpng16-head, libpng18-head, zune-png-head tRNS compared without masking: nothing matches, nothing is transparent34: stb_image, rust-png, ffmpeg, imagemagick, lodepng, libspng, go-png, java-imageio, imagesharp, fast-png, pngjs, pillow, pypng, opencv, chunky_png, pngtopam, graphicsmagick, stb_image-head, rust-png-head, ffmpeg-head, imagemagick-head, graphicsmagick-head, lodepng-head, libspng-head, imagesharp-head, fast-png-head, pngjs-head, upng-head, pillow-head, pypng-head, opencv-head, chunky_png-head, pngtopam-head, go-png-head matches the reference; color under alpha 0 zeroed2: wuffs, wuffs-head 164 of 195 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_trns-rgb8-highbytepngIHDRtRNSIDATIEND 8-bit RGB, tRNS with a set high byte in each sample: masked, the top-left pixel's color transparent. §11.3.1.1 says a decoder masks a tRNS value to the bit depth before using it. expected: display, conforms expected23 match tRNS compared without masking: nothing matches, nothing is transparent19: imagemagick, lodepng, java-imageio, fast-png, pngjs, upng, pypng, chunky_png, pngtopam, graphicsmagick, imagemagick-head, graphicsmagick-head, lodepng-head, fast-png-head, pngjs-head, upng-head, pypng-head, chunky_png-head, pngtopam-head matches the reference; color under alpha 0 zeroed2: wuffs, wuffs-head | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ✓ | ≠ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_trns-rgb8-1x1pngIHDRtRNSIDATIEND 1x1 truecolor with a tRNS naming its only pixel. expected: display, conforms spec: §11.3.1.1 expected32 match matches the reference; color under alpha 0 zeroed6: wuffs, pngjs, chunky_png, wuffs-head, pngjs-head, chunky_png-head 1 of 1 pixels differ4: pngtopam, graphicsmagick, graphicsmagick-head, pngtopam-head | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | M | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_trns-rgb8-2x1pngIHDRtRNSIDATIEND 2x1 truecolor with a tRNS naming its pixels' color: fewer pixels than tRNS samples. expected: display, conforms spec: §11.3.1.1 expected32 match matches the reference; color under alpha 0 zeroed6: wuffs, pngjs, chunky_png, wuffs-head, pngjs-head, chunky_png-head 2 of 2 pixels differ4: pngtopam, graphicsmagick, graphicsmagick-head, pngtopam-head | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | M | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_trns-rgb16-1x1pngIHDRtRNSIDATIEND 1x1 16-bit truecolor with tRNS naming its pixel. expected: display, conforms spec: §11.3.1.1 expected27 match 1 of 1 pixels differ5: zune-png, imagesharp, pngtopam, imagesharp-head, pngtopam-head matches the reference; color under alpha 0 zeroed4: wuffs, pngjs, wuffs-head, pngjs-head matches the reference; color under alpha 0 zeroed; 16→8 high byte2: chunky_png, chunky_png-head matches the reference; color under alpha 0 preserved; 16→8 high byte2: upng, upng-head 1 of 1 pixels differ2: pillow, pillow-head | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ≠ | M | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | |
y_trns-g1-whitepngIHDRtRNSIDATIEND tRNS names white (1), a color of the picture: those pixels have alpha 0. expected: display, conforms spec: §11.3.1.1 expected30 match 77 of 195 pixels differ7: ffmpeg, java-imageio, fast-png, opencv, ffmpeg-head, fast-png-head, opencv-head matches the reference; color under alpha 0 zeroed6: wuffs, pngjs, chunky_png, wuffs-head, pngjs-head, chunky_png-head 94 of 195 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | |
y_trns-g2-whitepngIHDRtRNSIDATIEND tRNS names white (3), a color of the picture: those pixels have alpha 0. expected: display, conforms spec: §11.3.1.1 expected28 match 9 of 195 pixels differ9: ffmpeg, java-imageio, fast-png, pillow, opencv, ffmpeg-head, fast-png-head, pillow-head, opencv-head matches the reference; color under alpha 0 zeroed6: wuffs, pngjs, chunky_png, wuffs-head, pngjs-head, chunky_png-head 118 of 195 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ |
y_trns-g2-midpngIHDRtRNSIDATIEND tRNS names mid (1), a color of the picture: those pixels have alpha 0. expected: display, conforms spec: §11.3.1.1 expected28 match 103 of 195 pixels differ9: ffmpeg, java-imageio, fast-png, pillow, opencv, ffmpeg-head, fast-png-head, pillow-head, opencv-head matches the reference; color under alpha 0 zeroed6: wuffs, pngjs, chunky_png, wuffs-head, pngjs-head, chunky_png-head 118 of 195 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | |
y_trns-g4-whitepngIHDRtRNSIDATIEND tRNS names white (15), a color of the picture: those pixels have alpha 0. expected: display, conforms spec: §11.3.1.1 expected28 match 1 of 195 pixels differ9: ffmpeg, java-imageio, fast-png, pillow, opencv, ffmpeg-head, fast-png-head, pillow-head, opencv-head matches the reference; color under alpha 0 zeroed6: wuffs, pngjs, chunky_png, wuffs-head, pngjs-head, chunky_png-head 122 of 195 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ |
y_trns-g4-midpngIHDRtRNSIDATIEND tRNS names mid (6), a color of the picture: those pixels have alpha 0. expected: display, conforms spec: §11.3.1.1 expected28 match 26 of 195 pixels differ9: ffmpeg, java-imageio, fast-png, pillow, opencv, ffmpeg-head, fast-png-head, pillow-head, opencv-head matches the reference; color under alpha 0 zeroed6: wuffs, pngjs, chunky_png, wuffs-head, pngjs-head, chunky_png-head 122 of 195 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | |
y_trns-g8-whitepngIHDRtRNSIDATIEND tRNS names white (255), a color of the picture: those pixels have alpha 0. expected: display, conforms spec: §11.3.1.1 expected34 match matches the reference; color under alpha 0 zeroed6: wuffs, pngjs, chunky_png, wuffs-head, pngjs-head, chunky_png-head 1 of 195 pixels differ4: fast-png, opencv, fast-png-head, opencv-head | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_trns-g8-midpngIHDRtRNSIDATIEND tRNS names mid (149), a color of the picture: those pixels have alpha 0. expected: display, conforms spec: §11.3.1.1 expected34 match matches the reference; color under alpha 0 zeroed6: wuffs, pngjs, chunky_png, wuffs-head, pngjs-head, chunky_png-head 18 of 195 pixels differ4: fast-png, opencv, fast-png-head, opencv-head | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_trns-g16-blackpngIHDRtRNSIDATIEND tRNS names black (0), a color of the picture: those pixels have alpha 0. expected: display, conforms spec: §11.3.1.1 expected34 match 2 of 195 pixels differ6: fast-png, pillow, opencv, fast-png-head, pillow-head, opencv-head matches the reference; 16→8 high byte2: chunky_png, chunky_png-head 194 of 195 pixels differ2: upng, upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_trns-g16-whitepngIHDRtRNSIDATIEND tRNS names white (65535), a color of the picture: those pixels have alpha 0. expected: display, conforms spec: §11.3.1.1 expected30 match 1 of 195 pixels differ6: fast-png, pillow, opencv, fast-png-head, pillow-head, opencv-head matches the reference; color under alpha 0 zeroed4: wuffs, pngjs, wuffs-head, pngjs-head matches the reference; color under alpha 0 zeroed; 16→8 high byte2: chunky_png, chunky_png-head matches the reference; color under alpha 0 preserved; 16→8 high byte2: upng, upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_trns-g16-midpngIHDRtRNSIDATIEND tRNS names mid (8687), a color of the picture: those pixels have alpha 0. expected: display, conforms spec: §11.3.1.1 expected27 match 13 of 195 pixels differ9: zune-png, imagesharp, fast-png, pillow, opencv, imagesharp-head, fast-png-head, pillow-head, opencv-head matches the reference; color under alpha 0 zeroed4: wuffs, pngjs, wuffs-head, pngjs-head matches the reference; color under alpha 0 zeroed; 16→8 high byte2: chunky_png, chunky_png-head matches the reference; color under alpha 0 preserved; 16→8 high byte2: upng, upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | M | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
y_trns-rgb8-whitepngIHDRtRNSIDATIEND tRNS names white (255, 255, 255), a color of the picture: those pixels have alpha 0. expected: display, conforms spec: §11.3.1.1 expected32 match matches the reference; color under alpha 0 zeroed6: wuffs, pngjs, chunky_png, wuffs-head, pngjs-head, chunky_png-head 1 of 195 pixels differ6: fast-png, pngtopam, graphicsmagick, graphicsmagick-head, fast-png-head, pngtopam-head | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | M | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_trns-rgb8-midpngIHDRtRNSIDATIEND tRNS names mid (13, 31, 128), a color of the picture: those pixels have alpha 0. expected: display, conforms spec: §11.3.1.1 expected32 match matches the reference; color under alpha 0 zeroed6: wuffs, pngjs, chunky_png, wuffs-head, pngjs-head, chunky_png-head 13 of 195 pixels differ6: fast-png, pngtopam, graphicsmagick, graphicsmagick-head, fast-png-head, pngtopam-head | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | M | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_trns-rgb16-blackpngIHDRtRNSIDATIEND tRNS names black (0, 0, 0), a color of the picture: those pixels have alpha 0. expected: display, conforms spec: §11.3.1.1 expected36 match matches the reference; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head 2 of 195 pixels differ2: fast-png, fast-png-head | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | M | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_trns-rgb16-whitepngIHDRtRNSIDATIEND tRNS names white (65535, 65535, 65535), a color of the picture: those pixels have alpha 0. expected: display, conforms spec: §11.3.1.1 expected30 match matches the reference; color under alpha 0 preserved; 16→8 high byte4: upng, pillow, upng-head, pillow-head 1 of 195 pixels differ4: fast-png, pngtopam, fast-png-head, pngtopam-head matches the reference; color under alpha 0 zeroed4: wuffs, pngjs, wuffs-head, pngjs-head matches the reference; color under alpha 0 zeroed; 16→8 high byte2: chunky_png, chunky_png-head | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | M | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_trns-rgb16-midpngIHDRtRNSIDATIEND tRNS names mid (3277, 7864, 32768), a color of the picture: those pixels have alpha 0. expected: display, conforms spec: §11.3.1.1 expected27 match 13 of 195 pixels differ7: zune-png, imagesharp, fast-png, pngtopam, imagesharp-head, fast-png-head, pngtopam-head matches the reference; color under alpha 0 zeroed4: wuffs, pngjs, wuffs-head, pngjs-head matches the reference; color under alpha 0 zeroed; 16→8 high byte2: chunky_png, chunky_png-head matches the reference; color under alpha 0 preserved; 16→8 high byte2: upng, upng-head 192 of 195 pixels differ2: pillow, pillow-head | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ≠ | M | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ |
y_trns-g16-high-byte-onlypngIHDRtRNSIDATIEND tRNS (38144) equals no pixel but shares its high bytes with 18: a decoder comparing after reducing to 8 bits makes those transparent; nothing is. §15.3.3 says a decoder compares both bytes of a 16-bit tRNS value. expected: display, conforms spec: §11.3.1.1 expected40 match 192 of 195 pixels differ2: chunky_png, chunky_png-head matches the reference; 16→8 high byte2: upng, upng-head | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_trns-rgb16-high-byte-onlypngIHDRtRNSIDATIEND tRNS (3072, 7680, 32768) equals no pixel but shares its high bytes with 13: a decoder comparing after reducing to 8 bits makes those transparent; nothing is. §15.3.3 says a decoder compares both bytes of a 16-bit tRNS value. expected: display, conforms spec: §11.3.1.1 expected38 match 192 of 195 pixels differ2: chunky_png, chunky_png-head 194 of 195 pixels differ2: pillow, pillow-head matches the reference; 16→8 high byte2: upng, upng-head | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | R | R | ✓ | ✓ | R | R | R | R | R | ✓ | ✓ | R | R | ✓ | R | R | R | ✓ | ✓ | R | R | R | R | R | R | R | R | R | R | ✓ | ✓ | R | R | |
| ✓ | ✓ | R | R | R | R | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | R | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| R | R | R | R | Ak | Ak | Ak | Ak | Ak | R | R | R | R | Ak | Ak | R | R | R | R | R | R | Ak | Ak | R | R | R | R | Ak | Ak | R | R | R | Ak | Ak | R | R | R | |
| R | R | R | R | Ak | Ak | Ak | Ak | Ak | R | R | R | R | Ak | Ak | R | R | Ak | R | R | R | Ak | Ak | R | R | R | R | Ak | Ak | Ak | Ak | R | Ak | Ak | Ak | R | Ak | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
y_chunk-reserved-bit-ancillarypng | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | R | R | ✓ | ✓ | R | R | ✓ | R | R | R | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_chunk-reserved-bit-knownpngIHDRgAmaIDATIEND gAma: a known name with the reserved bit set is a different, unknown chunk. Table 6 in §5.4 says a chunk with the reserved bit set makes the file non-conforming; a decoder still treats the chunk as unknown and shows the image. expected: display, does not conform spec: Table 6 expected31 match | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | R | R | ✓ | ✓ | R | R | ✓ | R | R | R | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
n_chunk-reserved-bit-criticalpngIHDRTestIDATIEND reserved bit set on an unknown critical private chunk (Test): still an unknown critical chunk. §5.4 says a decoder that meets an unknown critical chunk must tell the user it can't safely interpret the image. Table 6 in §5.4 says a chunk with the reserved bit set makes the file non-conforming; a decoder still treats the chunk as unknown and shows the image. expected: must-reject, does not conform expected17 match | R | R | R | R | Ak | Ak | Ak | Ak | Ak | R | R | R | R | Ak | Ak | R | R | R | R | R | R | Ak | Ak | R | R | R | R | Ak | Ak | R | R | R | Ak | Ak | R | R | R |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | R | R | ✓ | ✓ | R | R | ✓ | R | R | R | ✓ | ✓ | ✓ | R | R | R | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | R | R | ✓ | ✓ | R | R | ✓ | R | R | R | R | R | ✓ | R | R | R | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | R | R | ✓ | ✓ | R | R | ✓ | R | R | R | R | R | ✓ | R | R | R | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| R | R | R | R | ∞ | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | ∞ | ∞ | R | R | R | |
| R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | ∞ | ∞ | R | R | R | |
| R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | |
| ✓ | ✓ | R | R | R | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | R | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | R | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | R | R | R | R | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
i_chunk-trns-crc-badpngIHDRtRNSIDATIEND bad CRC on a tRNS naming gray 149, a color of the picture: dropped, it stays opaque; used, it turns transparent. §13.1 says a CRC mismatch may be fatal; a decoder that carries on may drop the chunk or use it as stored. expected: may-reject, does not conform spec: §5.5 expected17 match matches crc:ignored (arguable: a chunk with a bad CRC used as stored); color under alpha 0 preserved14: stb_image, ffmpeg, zune-png, java-imageio, imagesharp, upng, graphicsmagick, stb_image-head, ffmpeg-head, graphicsmagick-head, zune-png-head, imagesharp-head, upng-head, pypng-head matches crc:ignored (arguable: a chunk with a bad CRC used as stored); color under alpha 0 zeroed2: wuffs, wuffs-head | ✓ | ✓ | R | R | R | ✓ | ✓c | ✓c | R | ✓c | ✓c | ✓ | ✓ | ✓c | ✓c | ✓ | ✓ | ✓ | R | ✓ | ✓ | R | R | R | R | ✓ | ✓ | R | ✓c | ✓ | ✓ | ✓c | ✓c | ✓c | ✓c | ✓c | ✓c |
| ✓c | ✓c | R | R | R | ✓c | ✓c | ✓c | R | ✓c | ✓c | R | R | R | ✓c | R | R | R | R | R | R | ✓c | ✓c | R | R | R | R | R | ✓c | R | R | ✓c | ✓c | ✓c | ✓c | ✓c | ✓c | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
n_filter-type-5-first-rowpngIHDRIDATIEND filter type 5 on the first scanline. §9.2 defines exactly five filter types; §13.1 calls any other value a syntax error, which is fatal in image data. expected: must-reject, does not conform no reference pixels2: ffmpeg, ffmpeg-head no reference pixels1: upng the invalid byte taken as filter None (0) or Up (2)1: upng-head | R | R | R | R | R | R | A | A | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | A | R | R | R |
n_filter-type-5-last-rowpngIHDRIDATIEND filter type 5 on the last scanline only. §9.2 defines exactly five filter types; §13.1 calls any other value a syntax error, which is fatal in image data. expected: must-reject, does not conform no reference pixels2: ffmpeg, ffmpeg-head the invalid byte taken as filter Paeth (4)1: upng-head no reference pixels1: upng | R | R | R | R | R | R | A | A | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | A | R | R | R |
n_filter-type-255pngIHDRIDATIEND filter type 255 on the first scanline. §9.2 defines exactly five filter types; §13.1 calls any other value a syntax error, which is fatal in image data. expected: must-reject, does not conform no reference pixels2: ffmpeg, ffmpeg-head no reference pixels1: upng the invalid byte taken as filter None (0) or Up (2)1: upng-head | R | R | R | R | R | R | A | A | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | A | R | R | R |
n_filter-type-8pngIHDRIDATIEND filter type 8 on the first scanline. §9.2 defines exactly five filter types; §13.1 calls any other value a syntax error, which is fatal in image data. expected: must-reject, does not conform no reference pixels2: ffmpeg, ffmpeg-head no reference pixels1: upng the invalid byte taken as filter None (0) or Up (2)1: upng-head | R | R | R | R | R | R | A | A | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | A | R | R | R |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | R | R | R | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | R | R | R | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | |
| ✓ | ✓ | R | R | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | |
| ✓ | ✓ | R | R | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | R | R | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
r_srgb-gama-mismatchpngIHDRsRGBgAMAIDATIEND sRGB with gAMA 100000, not the 45455 sRGB implies. §11.3.2.5 says a gAMA or cHRM next to sRGB carries only the values of Table 17; a decoder that uses sRGB ignores both anyway. expected: recover, does not conform spec: 2nd ed. §11.3.3.5 expected44 match | ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
r_srgb-chrm-mismatchpngIHDRsRGBcHRMIDATIEND sRGB with a cHRM whose last value is 6001, not the 6000 sRGB implies. §11.3.2.5 says a gAMA or cHRM next to sRGB carries only the values of Table 17; a decoder that uses sRGB ignores both anyway. expected: recover, does not conform spec: 2nd ed. §11.3.3.5 expected44 match | ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | A | A | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | A | A | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | |
| ✓ | ✓ | A | A | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | R | R | |
| ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ∞ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | A | A | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | |
| ✓ | ✓ | A | A | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | R | R | |
| ✓ | ✓ | A | A | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
r_sbit-rgb16-17pngIHDRsBITIDATIEND sBIT 17 on a 16-bit image. §11.3.2.4 says each sBIT depth is between 1 and the sample depth; a decoder should ignore the chunk otherwise. expected: recover, does not conform expected35 match matches the reference; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | R | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | R | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | |
| ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | A | A | ✓ | R | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | A | A | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | A | A | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | A | A | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
r_exif-len-0pngIHDReXIfIDATIEND zero-length eXIf. §11.3.4.5.2 says eXIf starts with a TIFF header and a decoder should check that; it should ignore the chunk otherwise. expected: recover, does not conform spec: §13.3, Extensions 1.5.0 §3.7.2 expected42 match | ✓ | ✓ | A | A | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
r_exif-garbagepngIHDReXIfIDATIEND eXIf whose payload is not a TIFF header. §11.3.4.5.2 says eXIf starts with a TIFF header and a decoder should check that; it should ignore the chunk otherwise. expected: recover, does not conform spec: §13.3, Extensions 1.5.0 §3.7.2 expected42 match | ✓ | ✓ | A | A | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
r_exif-tiff-header-onlypngIHDReXIfIDATIEND eXIf with a TIFF header and no IFD. §11.3.4.5 says eXIf holds an Exif profile in TIFF framing; a decoder should ignore one whose structure is broken. expected: recover, does not conform spec: Extensions 1.5.0 §3.7 expected42 match | ✓ | ✓ | A | A | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
r_exif-bad-ifd-offsetpngIHDReXIfIDATIEND eXIf whose first IFD offset points far outside the chunk. §11.3.4.5 says eXIf holds an Exif profile in TIFF framing; a decoder should ignore one whose structure is broken. expected: recover, does not conform spec: Extensions 1.5.0 §3.7 expected42 match | ✓ | ✓ | A | A | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | R | R | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | R | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ! | ≠ | R | R | R | |
| ✓ | ✓ | R | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | R | ✓ | ✓ | R | R | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ∞ | ∞ | R | R | R | |
r_fctl-dims-mismatchpngIHDRacTLfcTLIDATIEND fcTL for the IDAT frame declares 2x2 for a 13x15 image. §11.3.6.2 says the default image's fcTL has offset 0 and the IHDR's size; §13.1 says a decoder should fall back to the static image. expected: recover, does not conform expected30 match 191 of 195 pixels differ2: wuffs, wuffs-head 193 of 195 pixels differ1: upng-head | ✓ | ✓ | R | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ! | ≠ | ≠ | R | R |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | R | R | R | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | |
y_chunk-idotpngIHDRiDOTIDAT ×2IEND iDOT with segments of 8, 7 rows, each in its own IDAT after a full flush. expected: display, conforms; strict: idot#public-name expected44 match | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_chunk-idot-1pngIHDRiDOTIDATIEND iDOT with segments of 15 rows, each in its own IDAT after a full flush. expected: display, conforms; strict: idot#public-name expected44 match | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_chunk-idot-3pngIHDRiDOTIDAT ×3IEND iDOT with segments of 5, 5, 5 rows, each in its own IDAT after a full flush. expected: display, conforms; strict: idot#public-name expected44 match | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_chunk-idot-after-srgbpngIHDRsRGBiDOTIDAT ×2IEND sRGB, then iDOT: offsets count from iDOT, so they are unchanged. expected: display, conforms; strict: idot#public-name expected44 match | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_chunk-idot-before-srgbpngIHDRiDOTsRGBIDAT ×2IEND iDOT, then sRGB: the first offset is 53. expected: display, conforms; strict: idot#public-name expected44 match | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_chunk-idot-stalepngIHDRiDOTIDATIEND an optimizer merged the IDAT chunks and passed iDOT through unchanged: the second offset lands inside the merged IDAT's data. iDOT is only a decoding hint, so a decoder shows the same image as without it. expected: display, does not conform; strict: idot#public-name spec: DECISIONS.md, Apple iDOT expected44 match | ✓ | ✓ | R | A | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_chunk-idot-shortpngIHDRiDOTIDAT ×2IEND iDOT of six of its seven words: no second segment offset. iDOT is only a decoding hint, so a decoder shows the same image as without it. expected: display, does not conform; strict: idot#public-name spec: DECISIONS.md, Apple iDOT expected44 match | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_chunk-idot-emptypngIHDRiDOTIDAT ×2IEND zero-length iDOT. iDOT is only a decoding hint, so a decoder shows the same image as without it. expected: display, does not conform; strict: idot#public-name spec: DECISIONS.md, Apple iDOT expected44 match | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_apng-idat-is-framepng | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_apng-idat-not-framepngIHDRacTLIDATfcTLfdATIEND acTL(1, 0); no fcTL before IDAT, so the IDAT image is not part of the animation, whose one frame is the picture's top-left 6x7 at (3, 4); the expected pixels are the static image. §4.9.1 says without an fcTL before IDAT, the static image is not part of the animation. expected: display, conforms spec: §4.9.2 expected38 match 195 of 195 pixels differ3: wuffs, wuffs-head, upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ! | ≠ | ≠ | ✓ | ✓ |
y_apng-frames-8pngIHDRacTLfcTLIDATfcTLfdATfcTLfdATfcTLfdATfcTLfdATfcTLfdATfcTLfdATfcTLfdATIEND acTL(8, 0): the IDAT image, then 7 frames each showing the picture's top-left 4x4, at (9, 0), (0, 11), (9, 11), (4, 5), (2, 2), (7, 8), (5, 11); sequence numbers 0..14. §4.9.1 says an fcTL before IDAT makes the static image the first frame. expected: display, conforms spec: §4.9.2 expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
y_apng-rgba16pngIHDRacTLfcTLIDATfcTLfdATIEND as apng-idat-is-frame on rgba16. Table 12 in §11.2.1 lists this combination, and decoders must support every one. expected: display, conforms spec: Table 12, §15.3.3, §11.3.6.3, §4.9.2 expected38 match matches the reference; color under alpha 0 preserved; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
r_apng-sequence-first-not-zeropngIHDRacTLfcTLIDATfcTLfdATIEND as apng-idat-is-frame; the first fcTL has sequence number 1 (1, 2, 3). §4.9.2 says the sequence numbers run 0, 1, 2, … with no gaps, and a decoder treats anything else as an error; §13.1 says it should fall back to the static image. expected: recover, does not conform expected37 match | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | R | ✓ | ✓ |
r_apng-sequence-gappngIHDRacTLfcTLIDATfcTLfdATIEND as apng-idat-is-frame; the fdAT's sequence number skips 2 (0, 1, 3). §4.9.2 says the sequence numbers run 0, 1, 2, … with no gaps, and a decoder treats anything else as an error; §13.1 says it should fall back to the static image. expected: recover, does not conform expected44 match | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
r_apng-sequence-out-of-orderpngIHDRacTLfcTLIDATfcTLfdATIEND as apng-idat-is-frame; the fdAT's sequence number 1 is lower than its fcTL's 2 (0, 2, 1). §4.9.2 says the sequence numbers run 0, 1, 2, … with no gaps, and a decoder treats anything else as an error; §13.1 says it should fall back to the static image. expected: recover, does not conform expected44 match | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | |
r_apng-fctl-uint31pngIHDRacTLfcTLIDATfcTLIEND acTL(1, 0) and the IDAT frame's fcTL, then a further fcTL after IDAT whose x_offset is 2^31, past the PNG integer range (the delay fields are two bytes and cannot hold it): that fcTL is ignored, which leaves a valid one-frame animation. §7.1 limits four-byte integers to 2^31−1; a decoder should ignore an ancillary chunk that breaks that. expected: recover, does not conform expected38 match | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ |
r_apng-two-fctl-before-idatpng | ✓ | ✓ | R | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | R | ✓ | ✓ |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
r_apng-fdat-bad-adlerpngIHDRacTLfcTLIDATfcTLfdATIEND as apng-idat-is-frame, with frame 2's Adler-32 wrong: a decoder that inflates frames it never shows reaches it. §11.3.6.3 makes a frame's data a zlib stream like IDAT's; a decoder should show the static image when a frame's stream is invalid. expected: recover, does not conform spec: §10.1 expected43 match | ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ |
r_apng-fdat-emptypngIHDRacTLfcTLIDATfcTLfdAT ×2IEND as apng-idat-is-frame with a 3-byte fdAT before frame 2's fdAT: too short even for a sequence number. §11.3.6.3 says fdAT holds at least its 4-byte sequence number; §13.1 says a decoder should fall back to the static image. expected: recover, does not conform expected41 match | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | R | ✓ |
| ✓ | ✓ | R | R | R | R | ✓ | ✓ | R | R | R | R | R | R | ✓ | R | R | ✓ | R | R | R | ✓ | ✓ | R | R | R | R | R | R | ✓ | ✓ | R | R | ✓ | ✓ | R | ✓ | |
y_apng-idat-not-frame-3pngIHDRacTLIDATfcTLfdATfcTLfdATfcTLfdATIEND acTL(3, 0); no fcTL before IDAT; three frames after it, none at the origin. §4.9.1 says without an fcTL before IDAT, the static image is not part of the animation. expected: display, conforms spec: §4.9.2 expected38 match 195 of 195 pixels differ3: wuffs, wuffs-head, upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ! | ≠ | ≠ | ✓ | ✓ |
| ✓ | ✓ | R | R | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | R | ✓ | ✓ | |
r_apng-fctl-fctl-fdatpngIHDRacTLIDATfcTL ×2fdATIEND acTL(2, 0); after IDAT two fcTL in a row, then one fdAT: the first frame after IDAT has no data. §11.3.6.3 says every frame after the first has an fdAT; §13.1 says a decoder should fall back to the static image. expected: recover, does not conform expected38 match 195 of 195 pixels differ2: ffmpeg, ffmpeg-head 195 of 195 pixels differ1: upng-head | ✓ | ✓ | R | R | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ! | ≠ | R | ✓ | ✓ |
| ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
r_apng-fctl-region-before-idat-no-actlpngIHDRfcTLIDATIEND an fcTL before IDAT naming a 6x7 region at (3, 4), with no acTL: not an APNG, and not the default image's shape either. §4.9.1 says a file is an APNG only with an acTL before IDAT; without one, a decoder shows the static image. expected: recover, does not conform expected36 match | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | ✓ | ✓ | ✓ | ✓ | R | R |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
y_sbit-rgba16-888-8pngIHDRsBITIDATIEND rgba16 with sBIT 8 8 8 8: informational, the samples decode as stored. expected: display, conforms spec: §11.3.2.4 expected35 match matches the reference; color under alpha 0 preserved; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head 192 of 195 pixels differ3: pypng, pngtopam, pngtopam-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
y_bkgd-trns-g8pngIHDRtRNSbKGDIDATIEND g8 with bKGD 149, tRNS gray 149: the tRNS pixels have alpha 0, and a decoder that composites onto the background shows them opaque. expected: display, conforms expected34 match matches the reference; color under alpha 0 zeroed6: wuffs, pngjs, chunky_png, wuffs-head, pngjs-head, chunky_png-head 18 of 195 pixels differ4: fast-png, opencv, fast-png-head, opencv-head | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_bkgd-trns-rgb8pngIHDRtRNSbKGDIDATIEND rgb8 with bKGD (13, 31, 128), tRNS (13, 31, 128): the tRNS pixels have alpha 0, and a decoder that composites onto the background shows them opaque. expected: display, conforms expected32 match matches the reference; color under alpha 0 zeroed6: wuffs, pngjs, chunky_png, wuffs-head, pngjs-head, chunky_png-head 13 of 195 pixels differ6: fast-png, pngtopam, graphicsmagick, graphicsmagick-head, fast-png-head, pngtopam-head | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | M | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
r_iccp-gray-on-rgbpngIHDRiCCPIDATIEND iCCP holding a GRAY profile on rgb8; the profile is a 132-byte header with an empty tag table, so it maps nothing. §11.3.2.3 says the profile's color space matches the image, RGB for color and gray for grayscale; a decoder should ignore a mismatched one. expected: recover, does not conform expected44 match | ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
r_iccp-cmyk-on-rgbpngIHDRiCCPIDATIEND iCCP holding a CMYK profile on rgb8; the profile is a 132-byte header with an empty tag table, so it maps nothing. §11.3.2.3 says the profile's color space matches the image, RGB for color and gray for grayscale; a decoder should ignore a mismatched one. expected: recover, does not conform expected44 match | ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
r_iccp-rgb-on-graypngIHDRiCCPIDATIEND iCCP holding an RGB profile on g8; the profile is a 132-byte header with an empty tag table, so it maps nothing. §11.3.2.3 says the profile's color space matches the image, RGB for color and gray for grayscale; a decoder should ignore a mismatched one. expected: recover, does not conform expected44 match | ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | A | A | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
y_exif-validpngIHDReXIfIDATIEND eXIf: little-endian TIFF header and one IFD with Orientation 1. expected: display, conforms spec: §11.3.4.5, Extensions 1.5.0 §3.7 expected44 match | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_exif-orientation-6pngIHDReXIfIDATIEND eXIf with Orientation 6, rotate 90° clockwise to display; nothing in PNG says to apply it, so the expected pixels are unrotated, and a decoder that rotates counts as wrong. expected: display, conforms spec: §11.3.4.5, Extensions 1.5.0 §3.7 expected42 match 15x13 instead of 13x152: ffmpeg, ffmpeg-head | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
y_trns-adam7-g1-whitepngIHDRtRNSIDATIEND interlaced, random filter per scanline, tRNS names white (1): those pixels have alpha 0. §8.1 says decoders are required to read interlaced images. expected: display, conforms expected29 match matches the reference; color under alpha 0 zeroed6: wuffs, pngjs, chunky_png, wuffs-head, pngjs-head, chunky_png-head 77 of 195 pixels differ5: ffmpeg, java-imageio, opencv, ffmpeg-head, opencv-head 12 of 195 pixels differ1: upng-head 89 of 195 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | R | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_trns-adam7-g2-midpngIHDRtRNSIDATIEND interlaced, random filter per scanline, tRNS names mid (1): those pixels have alpha 0. §8.1 says decoders are required to read interlaced images. expected: display, conforms expected27 match 103 of 195 pixels differ7: ffmpeg, java-imageio, pillow, opencv, ffmpeg-head, pillow-head, opencv-head matches the reference; color under alpha 0 zeroed6: wuffs, pngjs, chunky_png, wuffs-head, pngjs-head, chunky_png-head 118 of 195 pixels differ1: upng 1 of 195 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | R | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ |
y_trns-adam7-g4-midpngIHDRtRNSIDATIEND interlaced, random filter per scanline, tRNS names mid (6): those pixels have alpha 0. §8.1 says decoders are required to read interlaced images. expected: display, conforms expected28 match 26 of 195 pixels differ7: ffmpeg, java-imageio, pillow, opencv, ffmpeg-head, pillow-head, opencv-head matches the reference; color under alpha 0 zeroed6: wuffs, pngjs, chunky_png, wuffs-head, pngjs-head, chunky_png-head 122 of 195 pixels differ1: upng | ✓ | ✓ | ✓ | ✓ | ✓ | R | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ |
y_trns-adam7-g8-midpngIHDRtRNSIDATIEND interlaced, random filter per scanline, tRNS names mid (149): those pixels have alpha 0. §8.1 says decoders are required to read interlaced images. expected: display, conforms expected33 match matches the reference; color under alpha 0 zeroed6: wuffs, pngjs, chunky_png, wuffs-head, pngjs-head, chunky_png-head 18 of 195 pixels differ4: fast-png, opencv, fast-png-head, opencv-head 4 of 195 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ |
y_trns-adam7-g16-midpngIHDRtRNSIDATIEND interlaced, random filter per scanline, tRNS names mid (8687): those pixels have alpha 0. §8.1 says decoders are required to read interlaced images. expected: display, conforms expected27 match 13 of 195 pixels differ9: zune-png, imagesharp, fast-png, pillow, opencv, imagesharp-head, fast-png-head, pillow-head, opencv-head matches the reference; color under alpha 0 zeroed4: wuffs, pngjs, wuffs-head, pngjs-head matches the reference; color under alpha 0 zeroed; 16→8 high byte2: chunky_png, chunky_png-head matches the reference; color under alpha 0 preserved; 16→8 high byte1: upng 193 of 195 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ≠ | ✓ |
y_trns-adam7-rgb8-midpngIHDRtRNSIDATIEND interlaced, random filter per scanline, tRNS names mid (13, 31, 128): those pixels have alpha 0. §8.1 says decoders are required to read interlaced images. expected: display, conforms expected32 match matches the reference; color under alpha 0 zeroed6: wuffs, pngjs, chunky_png, wuffs-head, pngjs-head, chunky_png-head 13 of 195 pixels differ6: fast-png, pngtopam, graphicsmagick, graphicsmagick-head, fast-png-head, pngtopam-head | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | M | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
y_trns-adam7-rgb16-midpngIHDRtRNSIDATIEND interlaced, random filter per scanline, tRNS names mid (3277, 7864, 32768): those pixels have alpha 0. §8.1 says decoders are required to read interlaced images. expected: display, conforms expected27 match 13 of 195 pixels differ7: zune-png, imagesharp, fast-png, pngtopam, imagesharp-head, fast-png-head, pngtopam-head matches the reference; color under alpha 0 zeroed4: wuffs, pngjs, wuffs-head, pngjs-head matches the reference; color under alpha 0 zeroed; 16→8 high byte2: chunky_png, chunky_png-head 192 of 195 pixels differ2: pillow, pillow-head matches the reference; color under alpha 0 preserved; 16→8 high byte1: upng 192 of 195 pixels differ1: upng-head | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ≠ | ✓ | ✓ | ≠ | M | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ≠ | ✓ | ≠ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
i_dims-huge-short-datapngIHDRPLTEIDATIEND IHDR 32769x65580 p8 (over 2 GiB of pixels), image data for the first two rows only (the picture's rows, then index 0). §13.1 says a decoder may treat an early end of the image data as fatal. The image is incomplete, so what a decoder shows for it isn't judged. expected: may-reject, does not conform | R | R | A | A | R | ∞ | R | R | ∞ | R | R | R | R | R | R | R | R | R | ∞ | R | R | R | R | R | R | R | R | ! | ! | R | R | R | ∞ | ∞ | ∞ | R | R |
i_dims-huge-short-data-adam7pngIHDRPLTEIDATIEND IHDR 1x2147483647 p8 interlaced, image data for one row of reduced image 1. §13.1 says a decoder may treat an early end of the image data as fatal. The image is incomplete, so what a decoder shows for it isn't judged. expected: may-reject, does not conform | R | R | A | A | ∞ | ∞ | R | R | ∞ | R | R | R | R | R | R | R | R | R | ∞ | R | R | R | R | R | R | R | R | ∞ | ∞ | R | R | R | ∞ | ∞ | R | R | R |
i_dims-tall-short-datapngIHDRIDATIEND IHDR 32x1000001 rgba8, not interlaced, image data for the first two rows only (the picture's, then transparent black): a decoder that walks every declared row takes a million steps for nothing. §13.1 says a decoder may treat an early end of the image data as fatal. The image is incomplete, so what a decoder shows for it isn't judged. expected: may-reject, does not conform 32×1000001no reference pixels8: imagesharp, pngjs, upng, pillow, imagesharp-head, pngjs-head, upng-head, pillow-head | R | R | A | A | R | R | R | R | R | R | R | R | ⧗ | A | R | R | R | R | R | R | R | A | A | A | A | R | R | ! | ! | R | R | R | A | A | R | R | R |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | R | |
n_chunk-cgbipngCgBIIHDRIDATIEND Apple CgBI as Xcode writes it: a CgBI chunk before IHDR, raw DEFLATE image data without zlib framing, samples in BGRA order, color premultiplied by alpha. §11.2.1 says IHDR comes first, so that's a fatal error. expected: must-reject, does not conform spec: §5.6 no reference pixels3: stb_image, stb_image-head, upng-head | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | A | R | A | R | R | R |
| R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | |
| R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | R | |
| ✓ | ✓ | R | R | R | ✓ | R | R | R | R | R | R | R | ✓ | ✓ | R | R | ✓ | R | R | R | ✓ | ✓ | R | R | R | R | R | R | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | R | ✓ | |
n_plte-missing-palpngIHDRIDATIEND p8 with no PLTE anywhere. §11.2.2 says an indexed image has a PLTE before IDAT, so that's a fatal error. expected: must-reject, does not conform no reference pixels2: fast-png, fast-png-head no reference pixels2: ffmpeg, ffmpeg-head no reference pixels2: pillow, pillow-head no reference pixels1: zune-png | R | R | R | R | R | A | A | A | R | R | R | R | R | R | R | R | R | R | R | R | R | A | A | R | R | R | R | R | R | R | R | R | R | R | R | A | R |