PNG decoder conformance

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.

Legend

cellcounts asmeaning
✓passdecoded to the pixels of one of the reference's interpretations; a validator: accepted a conforming file
✓tpassone of several tRNS chunks used: an arguable choice; the letter also marks an A
✓cpassa chunk with a bad CRC used as stored: an arguable choice; the letter also marks an A
✓ppassone of several PLTE chunks used: an arguable choice; the letter also marks an A
✓kpassan unknown critical chunk ignored: an arguable choice; the letter also marks an A
Apassdecoded a file that has no reference pixels, which the lens allows to be rejected
Amust-violationdecoded a file the lens says to reject; a validator: accepted a file that does not conform
Rpassrejected a file the lens allows to be rejected; a validator: rejected a file that does not conform
Rshould-violationrejected a file a decoder should recover and display
Rmust-violationrejected a valid file; a validator: rejected a conforming file
≠must-violationdecoded to pixels no interpretation has
☠must-violationcrashed
⧗must-violationtimed out
∞must-violationran out of memory
Mmust-violationmemory error under valgrind memcheck, whatever the outcome
!must-violationreturned without error, but not an image: wrong size, missing rows or non-numeric samples
-not scoredthe wrapper itself failed; listed under problems

Implementations

implementationversionlineagediagnostics
reference-2refpng 2.0 (PNG reference decoder: every interpretation, own inflate)this projectWARN/ERR protocol
reference-3refpng 2.0 (PNG reference decoder: every interpretation, own inflate)this projectWARN/ERR protocol
pngcheckPNGcheck, version 4.0.0pngcheckstdout validation report and exit status
pngcheck-headbd33ad6 2025-12-15pngcheckstdout validation report and exit status
chunky_png
chunky_png-head
chunky_png 1.4.0 (ruby 3.4.10)
7a1faf6 2021-06-06
chunky_pngerrors only; no recoverable-warning channel
fast-png
fast-png-head
fast-png 8.0.0 (node v26.11.1)
31b93cf 2026-04-12
fast-pngerrors only; no recoverable-warning channel
ffmpegffmpeg version n9.0.2ffmpegstderr warnings and errors
ffmpeg-head179d083 2026-10-22ffmpegstderr warnings and errors
go-png
go-png-head
go image/png go1.27.3-X:nodwarf5
5391dd5 2026-10-22
goerrors only; no recoverable-warning channel
graphicsmagickGraphicsMagick 1.3.48 2026-07-23 Q16libpngstderr warnings and errors
graphicsmagick-headhg 18216:0ca2165aa07c 2026-10-21libpngstderr warnings and errors
imagemagickImageMagick 7.1.2-32 Q16-HDRI x86_64 68f8d115a:20260926libpngstderr warnings and errors
imagemagick-heada0ac982 2026-10-22libpngstderr warnings and errors
imagesharp
imagesharp-head
ImageSharp 3.1.12 (.NET 9.0.17)
d1367d4 2026-04-07
imagesharperrors only; no recoverable-warning channel
java-imageioJava ImageIO (Arch Linux 27)javawarning listener and exception causes
libpng
libpng16-head
libpng 1.6.59 (built against 1.6.59)
8c2a5fb 2026-10-21
libpngwarning and error callbacks
libpng18-head682e5fe 2026-10-21libpngwarning and error callbacks
libspng
libspng-head
libspng 0.7.4
46c81dc 2026-08-31
libspngerrors only; no recoverable-warning channel
lodepng
lodepng-head
lodepng 20261006
e584a84 2026-10-06
lodepngerrors only; no recoverable-warning channel
opencvOpenCV 5.0.0 (PNG: /usr/local/lib/libpng.so (ver 1.6.58))libpngnative stderr and errors
opencv-headce58bb1 2026-10-22libpngnative stderr and errors
pillowPillow 13.0.0pillowPython warnings and exceptions
pillow-headd4b99a3 2026-10-23pillowPython warnings and exceptions
pngjspngjs 7.0.0 (node v26.11.1)pngjserrors only; no recoverable-warning channel
pngjs-headc565210 2023-05-06pngjserrors only; no recoverable-warning channel
pngtopamNetpbm 10.86.51libpngstderr warnings and errors
pngtopam-headsvn advanced r5409, last changed r5388 2026-10-08libpngstderr warnings and errors
pypngpypng 0.20220715.0pypngPython warnings and exceptions
pypng-headf6899c4 2025-10-29pypngPython warnings and exceptions
rust-pngpng 0.18.1image-rserrors only; no recoverable-warning channel
rust-png-headb2f10c6 2026-09-23image-rserrors only; no recoverable-warning channel
stb_image
stb_image-head
stb_image v2.30
a7d4c21 2026-10-19
stberrors only; no recoverable-warning channel
upngupng-js 2.1.0 (node v26.11.1)upngerrors only; no recoverable-warning channel
upng-head88f504b 2023-07-22upngerrors only; no recoverable-warning channel
wuffs
wuffs-head
wuffs 0.4.0-alpha.12+4048.20261020
4be865d 2026-10-21
wuffserrors only; no recoverable-warning channel
zune-pngzune-png 0.5.2zuneerrors only; upstream warning macros are no-ops
zune-png-head33007f6 2026-10-22zuneerrors only; upstream warning macros are no-ops

Violations

referencevalidatorsdecoders
reference-2reference-3pngcheckpngcheck-headchunky_png · chunky_png-headfast-png · fast-png-headffmpegffmpeg-headgo-png · go-png-headgraphicsmagickgraphicsmagick-headimagemagickimagemagick-headimagesharp · imagesharp-headjava-imageiolibpng · libpng16-headlibpng18-headlibspng · libspng-headlodepng · lodepng-headopencvopencv-headpillowpillow-headpngjspngjs-headpngtopampngtopam-headpypngpypng-headrust-pngrust-png-headstb_image · stb_image-headupngupng-headwuffs · wuffs-headzune-pngzune-png-head
2nd editionvalid file rejected003325255244442624432442222442222031522
invalid file accepted0553541418252510111120157779661818131377888810374791717
wrong pixels000014361717514147799170069272724241111209148664111141484
crash, hang, out of memory or memory error00002300200010000030000000132200567100
no usable image returned00007170000000000000000000007700094000
recoverable file rejected0000162216161511111341536599252513131123201011111422192125
silent00535417217915115016390907474194192665418811259631711711781756161152155179178188205214170179179
strict5
3rd editionvalid file rejected003325255244442624432442222442222031522
invalid file accepted005354141820205111115102224111313131322883310324241212
wrong pixels0000143617175141477104170069272724241111209148664111141484
crash, hang, out of memory or memory error00002300200010000030000000132200567100
no usable image returned00007170000000000000000000007700094000
recoverable file rejected5000162716161566661341536599252518181128251011111422192125
silent00535417217915115016390907474194192665418811259631711711781756161152155179178188205214170179179
strict5

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.

By family

referencevalidatorsdecoders
familyreference-2reference-3pngcheckpngcheck-headchunky_png · chunky_png-headfast-png · fast-png-headffmpegffmpeg-headgo-png · go-png-headgraphicsmagickgraphicsmagick-headimagemagickimagemagick-headimagesharp · imagesharp-headjava-imageiolibpng · libpng16-headlibpng18-headlibspng · libspng-headlodepng · lodepng-headopencvopencv-headpillowpillow-headpngjspngjs-headpngtopampngtopam-headpypngpypng-headrust-pngrust-png-headstb_image · stb_image-headupngupng-headwuffs · wuffs-headzune-pngzune-png-head
2nd editionFilters✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓18/105✓✓✓✓
Interlacing✓✓✓✓✓60/208✓✓✓✓✓✓✓106/208✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓62/208113/208✓✓✓
Bit packing✓✓✓✓✓1/7✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓4/71/7✓✓✓
IDAT and zlib✓✓11/3011/303/304/302/302/30✓1/301/301/301/3011/301/301/301/301/304/301/301/301/301/308/308/301/301/305/305/302/302/305/302/307/305/304/306/30
DEFLATE✓✓3/223/222/221/222/222/222/222/222/222/222/222/222/222/222/222/22✓2/222/222/222/222/222/222/222/222/222/222/222/22✓2/224/224/22✓✓
IHDR✓✓1/241/247/2410/246/246/242/24✓✓✓✓4/242/241/241/24✓1/24✓✓5/245/247/247/241/241/246/246/24✓✓4/2424/2424/24✓5/245/24
PLTE✓5/185/185/188/183/189/189/188/181/181/181/181/187/188/186/186/187/188/186/186/188/188/182/182/186/186/182/182/186/187/186/189/189/186/188/187/18
tRNS✓✓1/561/5616/5647/5615/5615/5616/5613/5613/567/567/5613/5620/56✓✓7/5617/5626/5626/5626/5626/5615/5615/5617/5619/5615/5615/566/566/5614/5626/5623/567/5615/568/56
Chunks✓✓✓✓5/355/358/358/354/352/352/352/352/353/354/352/352/352/352/352/352/354/354/353/353/352/352/353/353/351/351/35✓9/359/351/351/351/35
Ancillary chunks✓✓29/14429/14413/14415/14415/14415/144✓1/1441/144✓✓8/1441/144✓2/144✓54/1449/1449/14419/14419/1442/1442/1443/1443/14420/14411/1447/1447/144✓10/14420/1447/14411/14418/144
iDOT✓✓✓1/8✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
APNG✓✓3/363/36✓✓6/366/36✓✓✓✓✓4/36✓✓2/36✓✓✓✓4/364/36✓✓✓✓✓✓2/362/36✓12/369/367/362/361/36
Dimensions✓✓3/53/51/52/5✓✓2/5✓✓✓1/5✓✓✓✓✓2/5✓✓✓✓✓✓✓✓3/53/5✓✓✓2/52/51/52/52/5
CgBI✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓1/1✓1/1✓✓✓
3rd editionFilters✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓18/105✓✓✓✓
Interlacing✓✓✓✓✓60/208✓✓✓✓✓✓✓106/208✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓62/208113/208✓✓✓
Bit packing✓✓✓✓✓1/7✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓4/71/7✓✓✓
IDAT and zlib✓✓11/3011/303/304/302/302/30✓1/301/301/301/3011/301/301/301/301/304/301/301/301/301/308/308/301/301/305/305/302/302/305/302/307/305/304/306/30
DEFLATE✓✓3/223/222/221/222/222/222/222/222/222/222/222/222/222/222/222/22✓2/222/222/222/222/222/222/222/222/222/222/222/22✓2/224/224/22✓✓
IHDR✓✓1/241/247/2410/246/246/242/24✓✓✓✓4/242/241/241/24✓1/24✓✓5/245/247/247/241/241/246/246/24✓✓4/2424/2424/24✓5/245/24
PLTE5/18✓5/185/188/188/184/184/183/186/186/186/186/187/183/181/181/182/183/181/181/183/183/187/187/181/181/187/187/181/182/186/184/184/181/183/182/18
tRNS✓✓1/561/5616/5647/5615/5615/5616/5613/5613/567/567/5613/5620/56✓✓7/5617/5626/5626/5626/5626/5615/5615/5617/5619/5615/5615/566/566/5614/5626/5623/567/5615/568/56
Chunks✓✓✓✓5/355/358/358/354/352/352/352/352/353/354/352/352/352/352/352/352/354/354/353/353/352/352/353/353/351/351/35✓9/359/351/351/351/35
Ancillary chunks✓✓29/14429/14413/14415/14415/14415/144✓1/1441/144✓✓8/1441/144✓2/144✓54/1449/1449/14419/14419/1442/1442/1443/1443/14420/14411/1447/1447/144✓10/14420/1447/14411/14418/144
iDOT✓✓✓1/8✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
APNG✓✓3/363/36✓✓6/366/36✓✓✓✓✓4/36✓✓2/36✓✓✓✓4/364/36✓✓✓✓✓✓2/362/36✓12/369/367/362/361/36
Dimensions✓✓3/53/51/52/5✓✓2/5✓✓✓1/5✓✓✓✓✓2/5✓✓✓✓✓✓✓✓3/53/5✓✓✓2/52/51/52/52/5
CgBI✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓1/1✓1/1✓✓✓

Results

referencevalidatorsdecoders
reference-2reference-3pngcheckpngcheck-headchunky_png · chunky_png-headfast-png · fast-png-headffmpegffmpeg-headgo-png · go-png-headgraphicsmagickgraphicsmagick-headimagemagickimagemagick-headimagesharp · imagesharp-headjava-imageiolibpng · libpng16-headlibpng18-headlibspng · libspng-headlodepng · lodepng-headopencvopencv-headpillowpillow-headpngjspngjs-headpngtopampngtopam-headpypngpypng-headrust-pngrust-png-headstb_image · stb_image-headupngupng-headwuffs · wuffs-headzune-pngzune-png-head
y_filter-none-g1png
IHDRIDATIEND

every scanline uses None: the plain g1 picture.

expected: display, conforms

spec: §9.2

expected43 match
94 of 195 pixels differ1: upng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_filter-sub-g1png
IHDRIDATIEND

every scanline uses Sub; the subtraction wraps in 7 bytes.

expected: display, conforms

spec: §9.2

expected43 match
94 of 195 pixels differ1: upng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_filter-up-g1png
IHDRIDATIEND

every scanline uses Up; the subtraction wraps in 3 bytes.

expected: display, conforms

spec: §9.2

expected43 match
94 of 195 pixels differ1: upng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_filter-average-g1png
IHDRIDATIEND

every scanline uses Average; a + b is odd in 13 bytes and exceeds 255 in 1.

expected: display, conforms

spec: §9.2, §9.3

expected43 match
94 of 195 pixels differ1: upng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_filter-paeth-g1png
IHDRIDATIEND

every scanline uses Paeth; the predictor is a in 10 bytes, b in 19, c in 1, and 0 ties go by comparison order.

expected: display, conforms

spec: §9.2, §9.4

expected43 match
94 of 195 pixels differ1: upng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_filter-mix-g1png
IHDRIDATIEND

each filter type on three scanlines, in a seeded random order.

expected: display, conforms

spec: §9.2, §9.3, §9.4

expected43 match
94 of 195 pixels differ1: upng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_tiny-1x1-g1png
IHDRIDATIEND

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

spec: Table 12, §15.3.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-none-g2png
IHDRIDATIEND

every scanline uses None: the plain g2 picture.

expected: display, conforms

spec: §9.2

expected43 match
118 of 195 pixels differ1: upng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_filter-sub-g2png
IHDRIDATIEND

every scanline uses Sub; the subtraction wraps in 19 bytes.

expected: display, conforms

spec: §9.2

expected43 match
118 of 195 pixels differ1: upng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_filter-up-g2png
IHDRIDATIEND

every scanline uses Up; the subtraction wraps in 7 bytes.

expected: display, conforms

spec: §9.2

expected43 match
118 of 195 pixels differ1: upng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_filter-average-g2png
IHDRIDATIEND

every scanline uses Average; a + b is odd in 27 bytes and exceeds 255 in 20.

expected: display, conforms

spec: §9.2, §9.3

expected43 match
118 of 195 pixels differ1: upng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_filter-paeth-g2png
IHDRIDATIEND

every scanline uses Paeth; the predictor is a in 19 bytes, b in 40, c in 1, and 0 ties go by comparison order.

expected: display, conforms

spec: §9.2, §9.4

expected43 match
118 of 195 pixels differ1: upng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_filter-mix-g2png
IHDRIDATIEND

each filter type on three scanlines, in a seeded random order.

expected: display, conforms

spec: §9.2, §9.3, §9.4

expected43 match
118 of 195 pixels differ1: upng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_tiny-1x1-g2png
IHDRIDATIEND

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

spec: Table 12, §15.3.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-none-g4png
IHDRIDATIEND

every scanline uses None: the plain g4 picture.

expected: display, conforms

spec: §9.2

expected43 match
122 of 195 pixels differ1: upng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_filter-sub-g4png
IHDRIDATIEND

every scanline uses Sub; the subtraction wraps in 21 bytes.

expected: display, conforms

spec: §9.2

expected43 match
122 of 195 pixels differ1: upng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_filter-up-g4png
IHDRIDATIEND

every scanline uses Up; the subtraction wraps in 15 bytes.

expected: display, conforms

spec: §9.2

expected43 match
122 of 195 pixels differ1: upng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_filter-average-g4png
IHDRIDATIEND

every scanline uses Average; a + b is odd in 66 bytes and exceeds 255 in 35.

expected: display, conforms

spec: §9.2, §9.3

expected43 match
122 of 195 pixels differ1: upng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_filter-paeth-g4png
IHDRIDATIEND

every scanline uses Paeth; the predictor is a in 46 bytes, b in 57, c in 2, and 0 ties go by comparison order.

expected: display, conforms

spec: §9.2, §9.4

expected43 match
122 of 195 pixels differ1: upng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_filter-mix-g4png
IHDRIDATIEND

each filter type on three scanlines, in a seeded random order.

expected: display, conforms

spec: §9.2, §9.3, §9.4

expected43 match
122 of 195 pixels differ1: upng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_tiny-1x1-g4png
IHDRIDATIEND

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

spec: Table 12, §15.3.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-none-g8png
IHDRIDATIEND

every scanline uses None: the plain g8 picture.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-sub-g8png
IHDRIDATIEND

every scanline uses Sub; the subtraction wraps in 16 bytes.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-up-g8png
IHDRIDATIEND

every scanline uses Up; the subtraction wraps in 24 bytes.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-average-g8png
IHDRIDATIEND

every scanline uses Average; a + b is odd in 90 bytes and exceeds 255 in 79.

expected: display, conforms

spec: §9.2, §9.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-paeth-g8png
IHDRIDATIEND

every scanline uses Paeth; the predictor is a in 116 bytes, b in 73, c in 6, and 0 ties go by comparison order.

expected: display, conforms

spec: §9.2, §9.4

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-mix-g8png
IHDRIDATIEND

each filter type on three scanlines, in a seeded random order.

expected: display, conforms

spec: §9.2, §9.3, §9.4

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_tiny-1x1-g8png
IHDRIDATIEND

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

spec: Table 12, §15.3.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-none-g16png
IHDRIDATIEND

every scanline uses None: the plain g16 picture.

expected: display, conforms

spec: §9.2

expected40 match
matches the reference; 16→8 high byte4: upng, chunky_png, upng-head, chunky_png-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-sub-g16png
IHDRIDATIEND

every scanline uses Sub; the subtraction wraps in 37 bytes.

expected: display, conforms

spec: §9.2

expected40 match
matches the reference; 16→8 high byte4: upng, chunky_png, upng-head, chunky_png-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-up-g16png
IHDRIDATIEND

every scanline uses Up; the subtraction wraps in 120 bytes.

expected: display, conforms

spec: §9.2

expected40 match
matches the reference; 16→8 high byte4: upng, chunky_png, upng-head, chunky_png-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-average-g16png
IHDRIDATIEND

every scanline uses Average; a + b is odd in 232 bytes and exceeds 255 in 163.

expected: display, conforms

spec: §9.2, §9.3

expected40 match
matches the reference; 16→8 high byte4: upng, chunky_png, upng-head, chunky_png-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-paeth-g16png
IHDRIDATIEND

every scanline uses Paeth; the predictor is a in 236 bytes, b in 145, c in 9, and 1 ties go by comparison order.

expected: display, conforms

spec: §9.2, §9.4

expected40 match
matches the reference; 16→8 high byte4: upng, chunky_png, upng-head, chunky_png-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-mix-g16png
IHDRIDATIEND

each filter type on three scanlines, in a seeded random order.

expected: display, conforms

spec: §9.2, §9.3, §9.4

expected40 match
matches the reference; 16→8 high byte4: upng, chunky_png, upng-head, chunky_png-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_tiny-1x1-g16png
IHDRIDATIEND

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

spec: Table 12, §15.3.3

expected40 match
matches the reference; 16→8 high byte4: upng, chunky_png, upng-head, chunky_png-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-none-rgb8png
IHDRIDATIEND

every scanline uses None: the plain rgb8 picture.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-sub-rgb8png
IHDRIDATIEND

every scanline uses Sub; the subtraction wraps in 44 bytes.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-up-rgb8png
IHDRIDATIEND

every scanline uses Up; the subtraction wraps in 156 bytes.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-average-rgb8png
IHDRIDATIEND

every scanline uses Average; a + b is odd in 287 bytes and exceeds 255 in 153.

expected: display, conforms

spec: §9.2, §9.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-paeth-rgb8png
IHDRIDATIEND

every scanline uses Paeth; the predictor is a in 356 bytes, b in 217, c in 12, and 2 ties go by comparison order.

expected: display, conforms

spec: §9.2, §9.4

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-mix-rgb8png
IHDRIDATIEND

each filter type on three scanlines, in a seeded random order.

expected: display, conforms

spec: §9.2, §9.3, §9.4

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_tiny-1x1-rgb8png
IHDRIDATIEND

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

spec: Table 12, §15.3.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-none-rgb16png
IHDRIDATIEND

every scanline uses None: the plain rgb16 picture.

expected: display, conforms

spec: §9.2

expected38 match
matches the reference; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-sub-rgb16png
IHDRIDATIEND

every scanline uses Sub; the subtraction wraps in 165 bytes.

expected: display, conforms

spec: §9.2

expected38 match
matches the reference; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-up-rgb16png
IHDRIDATIEND

every scanline uses Up; the subtraction wraps in 322 bytes.

expected: display, conforms

spec: §9.2

expected38 match
matches the reference; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-average-rgb16png
IHDRIDATIEND

every scanline uses Average; a + b is odd in 609 bytes and exceeds 255 in 392.

expected: display, conforms

spec: §9.2, §9.3

expected38 match
matches the reference; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-paeth-rgb16png
IHDRIDATIEND

every scanline uses Paeth; the predictor is a in 722 bytes, b in 428, c in 20, and 6 ties go by comparison order.

expected: display, conforms

spec: §9.2, §9.4

expected38 match
matches the reference; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-mix-rgb16png
IHDRIDATIEND

each filter type on three scanlines, in a seeded random order.

expected: display, conforms

spec: §9.2, §9.3, §9.4

expected38 match
matches the reference; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_tiny-1x1-rgb16png
IHDRIDATIEND

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

spec: Table 12, §15.3.3

expected38 match
matches the reference; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-none-p1png
IHDRPLTEIDATIEND

every scanline uses None: the plain p1 picture.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-sub-p1png
IHDRPLTEIDATIEND

every scanline uses Sub; the subtraction wraps in 8 bytes.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-up-p1png
IHDRPLTEIDATIEND

every scanline uses Up; the subtraction wraps in 2 bytes.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-average-p1png
IHDRPLTEIDATIEND

every scanline uses Average; a + b is odd in 12 bytes and exceeds 255 in 5.

expected: display, conforms

spec: §9.2, §9.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-paeth-p1png
IHDRPLTEIDATIEND

every scanline uses Paeth; the predictor is a in 12 bytes, b in 17, c in 1, and 0 ties go by comparison order.

expected: display, conforms

spec: §9.2, §9.4

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-mix-p1png
IHDRPLTEIDATIEND

each filter type on three scanlines, in a seeded random order.

expected: display, conforms

spec: §9.2, §9.3, §9.4

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_tiny-1x1-p1png
IHDRPLTEIDATIEND

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

spec: Table 12, §15.3.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-none-p2png
IHDRPLTEIDATIEND

every scanline uses None: the plain p2 picture.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-sub-p2png
IHDRPLTEIDATIEND

every scanline uses Sub; the subtraction wraps in 10 bytes.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-up-p2png
IHDRPLTEIDATIEND

every scanline uses Up; the subtraction wraps in 13 bytes.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-average-p2png
IHDRPLTEIDATIEND

every scanline uses Average; a + b is odd in 31 bytes and exceeds 255 in 8.

expected: display, conforms

spec: §9.2, §9.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-paeth-p2png
IHDRPLTEIDATIEND

every scanline uses Paeth; the predictor is a in 35 bytes, b in 24, c in 1, and 0 ties go by comparison order.

expected: display, conforms

spec: §9.2, §9.4

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-mix-p2png
IHDRPLTEIDATIEND

each filter type on three scanlines, in a seeded random order.

expected: display, conforms

spec: §9.2, §9.3, §9.4

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_tiny-1x1-p2png
IHDRPLTEIDATIEND

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

spec: Table 12, §15.3.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-none-p4png
IHDRPLTEIDATIEND

every scanline uses None: the plain p4 picture.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-sub-p4png
IHDRPLTEIDATIEND

every scanline uses Sub; the subtraction wraps in 30 bytes.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-up-p4png
IHDRPLTEIDATIEND

every scanline uses Up; the subtraction wraps in 29 bytes.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-average-p4png
IHDRPLTEIDATIEND

every scanline uses Average; a + b is odd in 37 bytes and exceeds 255 in 52.

expected: display, conforms

spec: §9.2, §9.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-paeth-p4png
IHDRPLTEIDATIEND

every scanline uses Paeth; the predictor is a in 64 bytes, b in 41, c in 0, and 0 ties go by comparison order.

expected: display, conforms

spec: §9.2, §9.4

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-mix-p4png
IHDRPLTEIDATIEND

each filter type on three scanlines, in a seeded random order.

expected: display, conforms

spec: §9.2, §9.3, §9.4

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_tiny-1x1-p4png
IHDRPLTEIDATIEND

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

spec: Table 12, §15.3.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-none-p8png
IHDRPLTEIDATIEND

every scanline uses None: the plain p8 picture.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-sub-p8png
IHDRPLTEIDATIEND

every scanline uses Sub; the subtraction wraps in 16 bytes.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-up-p8png
IHDRPLTEIDATIEND

every scanline uses Up; the subtraction wraps in 3 bytes.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-average-p8png
IHDRPLTEIDATIEND

every scanline uses Average; a + b is odd in 126 bytes and exceeds 255 in 0.

expected: display, conforms

spec: §9.2, §9.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-paeth-p8png
IHDRPLTEIDATIEND

every scanline uses Paeth; the predictor is a in 130 bytes, b in 62, c in 3, and 3 ties go by comparison order.

expected: display, conforms

spec: §9.2, §9.4

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-mix-p8png
IHDRPLTEIDATIEND

each filter type on three scanlines, in a seeded random order.

expected: display, conforms

spec: §9.2, §9.3, §9.4

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_tiny-1x1-p8png
IHDRPLTEIDATIEND

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

spec: Table 12, §15.3.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-none-ga8png
IHDRIDATIEND

every scanline uses None: the plain ga8 picture.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-sub-ga8png
IHDRIDATIEND

every scanline uses Sub; the subtraction wraps in 76 bytes.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-up-ga8png
IHDRIDATIEND

every scanline uses Up; the subtraction wraps in 24 bytes.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-average-ga8png
IHDRIDATIEND

every scanline uses Average; a + b is odd in 128 bytes and exceeds 255 in 219.

expected: display, conforms

spec: §9.2, §9.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-paeth-ga8png
IHDRIDATIEND

every scanline uses Paeth; the predictor is a in 241 bytes, b in 143, c in 6, and 0 ties go by comparison order.

expected: display, conforms

spec: §9.2, §9.4

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-mix-ga8png
IHDRIDATIEND

each filter type on three scanlines, in a seeded random order.

expected: display, conforms

spec: §9.2, §9.3, §9.4

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_tiny-1x1-ga8png
IHDRIDATIEND

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

spec: Table 12, §15.3.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-none-ga16png
IHDRIDATIEND

every scanline uses None: the plain ga16 picture.

expected: display, conforms

spec: §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
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-sub-ga16png
IHDRIDATIEND

every scanline uses Sub; the subtraction wraps in 112 bytes.

expected: display, conforms

spec: §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
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-up-ga16png
IHDRIDATIEND

every scanline uses Up; the subtraction wraps in 120 bytes.

expected: display, conforms

spec: §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
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-average-ga16png
IHDRIDATIEND

every scanline uses Average; a + b is odd in 308 bytes and exceeds 255 in 429.

expected: display, conforms

spec: §9.2, §9.3

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_filter-paeth-ga16png
IHDRIDATIEND

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

spec: §9.2, §9.4

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_filter-mix-ga16png
IHDRIDATIEND

each filter type on three scanlines, in a seeded random order.

expected: display, conforms

spec: §9.2, §9.3, §9.4

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-ga16png
IHDRIDATIEND

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

spec: Table 12, §15.3.3

expected38 match
matches the reference; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-none-rgba8png
IHDRIDATIEND

every scanline uses None: the plain rgba8 picture.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-sub-rgba8png
IHDRIDATIEND

every scanline uses Sub; the subtraction wraps in 104 bytes.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-up-rgba8png
IHDRIDATIEND

every scanline uses Up; the subtraction wraps in 156 bytes.

expected: display, conforms

spec: §9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-average-rgba8png
IHDRIDATIEND

every scanline uses Average; a + b is odd in 325 bytes and exceeds 255 in 293.

expected: display, conforms

spec: §9.2, §9.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-paeth-rgba8png
IHDRIDATIEND

every scanline uses Paeth; the predictor is a in 481 bytes, b in 287, c in 12, and 2 ties go by comparison order.

expected: display, conforms

spec: §9.2, §9.4

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-mix-rgba8png
IHDRIDATIEND

each filter type on three scanlines, in a seeded random order.

expected: display, conforms

spec: §9.2, §9.3, §9.4

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_tiny-1x1-rgba8png
IHDRIDATIEND

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

spec: Table 12, §15.3.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-none-rgba16png
IHDRIDATIEND

every scanline uses None: the plain rgba16 picture.

expected: display, conforms

spec: §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
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-sub-rgba16png
IHDRIDATIEND

every scanline uses Sub; the subtraction wraps in 240 bytes.

expected: display, conforms

spec: §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
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-up-rgba16png
IHDRIDATIEND

every scanline uses Up; the subtraction wraps in 322 bytes.

expected: display, conforms

spec: §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
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_filter-average-rgba16png
IHDRIDATIEND

every scanline uses Average; a + b is odd in 685 bytes and exceeds 255 in 658.

expected: display, conforms

spec: §9.2, §9.3

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_filter-paeth-rgba16png
IHDRIDATIEND

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

spec: §9.2, §9.4

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_filter-mix-rgba16png
IHDRIDATIEND

each filter type on three scanlines, in a seeded random order.

expected: display, conforms

spec: §9.2, §9.3, §9.4

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-rgba16png
IHDRIDATIEND

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

spec: Table 12, §15.3.3

expected38 match
matches the reference; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-g1png
IHDRIDATIEND

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

expected40 match
89 of 195 pixels differ1: upng
12 of 195 pixels differ1: upng-head
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠≠✓✓✓
y_adam7-1x1-g1png
IHDRIDATIEND

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-g1png
IHDRIDATIEND

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-g1png
IHDRIDATIEND

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
IHDRIDATIEND

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
✓✓✓✓✓!✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-3x3-g1png
IHDRIDATIEND

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
✓✓✓✓✓!✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-4x4-g1png
IHDRIDATIEND

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✓✓✓✓✓✓✓≠✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠≠✓✓✓
y_adam7-5x5-g1png
IHDRIDATIEND

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

expected40 match
5 of 25 pixels differ1: upng-head
7 of 25 pixels differ1: upng
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠≠✓✓✓
y_adam7-1x9-g1png
IHDRIDATIEND

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
✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_adam7-9x1-g1png
IHDRIDATIEND

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

expected42 match
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-2x7-g1png
IHDRIDATIEND

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

expected42 match
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-7x2-g1png
IHDRIDATIEND

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

expected42 match
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-8x9-g1png
IHDRIDATIEND

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

expected40 match
27 of 72 pixels differ1: upng
16 of 72 pixels differ1: upng-head
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠≠✓✓✓
y_adam7-g2png
IHDRIDATIEND

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

expected40 match
118 of 195 pixels differ1: upng
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠R✓✓✓
y_adam7-1x1-g2png
IHDRIDATIEND

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-g2png
IHDRIDATIEND

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-g2png
IHDRIDATIEND

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-g2png
IHDRIDATIEND

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-g2png
IHDRIDATIEND

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-g2png
IHDRIDATIEND

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✓✓✓✓✓✓✓≠✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-5x5-g2png
IHDRIDATIEND

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

expected40 match
6 of 25 pixels differ1: upng-head
14 of 25 pixels differ1: upng
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠≠✓✓✓
y_adam7-1x9-g2png
IHDRIDATIEND

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
✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_adam7-9x1-g2png
IHDRIDATIEND

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

expected42 match
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-2x7-g2png
IHDRIDATIEND

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-g2png
IHDRIDATIEND

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✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠≠✓✓✓
y_adam7-8x9-g2png
IHDRIDATIEND

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

expected41 match
16 of 72 pixels differ1: upng-head
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-g4png
IHDRIDATIEND

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

expected40 match
1 of 195 pixels differ1: upng-head
122 of 195 pixels differ1: upng
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠≠✓✓✓
y_adam7-1x1-g4png
IHDRIDATIEND

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-g4png
IHDRIDATIEND

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-g4png
IHDRIDATIEND

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-g4png
IHDRIDATIEND

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-g4png
IHDRIDATIEND

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
IHDRIDATIEND

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
✓✓✓✓✓R✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-5x5-g4png
IHDRIDATIEND

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

expected40 match
15 of 25 pixels differ1: upng
3 of 25 pixels differ1: upng-head
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠≠✓✓✓
y_adam7-1x9-g4png
IHDRIDATIEND

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
✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_adam7-9x1-g4png
IHDRIDATIEND

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

expected41 match
4 of 9 pixels differ1: upng-head
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-2x7-g4png
IHDRIDATIEND

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-g4png
IHDRIDATIEND

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✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠≠✓✓✓
y_adam7-8x9-g4png
IHDRIDATIEND

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

expected41 match
12 of 72 pixels differ1: upng-head
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-g8png
IHDRIDATIEND

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

expected43 match
7 of 195 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-1x1-g8png
IHDRIDATIEND

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-g8png
IHDRIDATIEND

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-g8png
IHDRIDATIEND

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-g8png
IHDRIDATIEND

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
IHDRIDATIEND

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
✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-4x4-g8png
IHDRIDATIEND

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
✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-5x5-g8png
IHDRIDATIEND

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

expected43 match
1 of 25 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-1x9-g8png
IHDRIDATIEND

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-9x1-g8png
IHDRIDATIEND

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

expected43 match
2 of 9 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-2x7-g8png
IHDRIDATIEND

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-7x2-g8png
IHDRIDATIEND

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

expected43 match
1 of 14 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-8x9-g8png
IHDRIDATIEND

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

expected43 match
1 of 72 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-g16png
IHDRIDATIEND

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

expected40 match
matches the reference; 16→8 high byte3: upng, chunky_png, chunky_png-head
192 of 195 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-1x1-g16png
IHDRIDATIEND

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-g16png
IHDRIDATIEND

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-g16png
IHDRIDATIEND

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-g16png
IHDRIDATIEND

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-g16png
IHDRIDATIEND

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-g16png
IHDRIDATIEND

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-5x5-g16png
IHDRIDATIEND

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

expected40 match
matches the reference; 16→8 high byte4: upng, chunky_png, upng-head, chunky_png-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-1x9-g16png
IHDRIDATIEND

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-g16png
IHDRIDATIEND

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-g16png
IHDRIDATIEND

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-g16png
IHDRIDATIEND

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
IHDRIDATIEND

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

expected40 match
matches the reference; 16→8 high byte3: upng, chunky_png, chunky_png-head
72 of 72 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-rgb8png
IHDRIDATIEND

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

expected43 match
6 of 195 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-1x1-rgb8png
IHDRIDATIEND

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-rgb8png
IHDRIDATIEND

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-rgb8png
IHDRIDATIEND

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-rgb8png
IHDRIDATIEND

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
IHDRIDATIEND

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
✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-4x4-rgb8png
IHDRIDATIEND

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
✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-5x5-rgb8png
IHDRIDATIEND

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

expected43 match
1 of 25 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-1x9-rgb8png
IHDRIDATIEND

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-9x1-rgb8png
IHDRIDATIEND

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

expected43 match
1 of 9 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-2x7-rgb8png
IHDRIDATIEND

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-7x2-rgb8png
IHDRIDATIEND

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

expected43 match
1 of 14 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-8x9-rgb8png
IHDRIDATIEND

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

expected43 match
22 of 72 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-rgb16png
IHDRIDATIEND

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; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-1x1-rgb16png
IHDRIDATIEND

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-rgb16png
IHDRIDATIEND

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-rgb16png
IHDRIDATIEND

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-rgb16png
IHDRIDATIEND

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-rgb16png
IHDRIDATIEND

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-rgb16png
IHDRIDATIEND

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-rgb16png
IHDRIDATIEND

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-rgb16png
IHDRIDATIEND

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-rgb16png
IHDRIDATIEND

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-rgb16png
IHDRIDATIEND

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-rgb16png
IHDRIDATIEND

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-rgb16png
IHDRIDATIEND

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-p1png
IHDRPLTEIDATIEND

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

expected40 match
6 of 195 pixels differ1: upng-head
49 of 195 pixels differ1: upng
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠≠✓✓✓
y_adam7-1x1-p1png
IHDRPLTEIDATIEND

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-p1png
IHDRPLTEIDATIEND

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-p1png
IHDRPLTEIDATIEND

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-p1png
IHDRPLTEIDATIEND

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-p1png
IHDRPLTEIDATIEND

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-p1png
IHDRPLTEIDATIEND

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✓✓✓✓✓✓✓≠✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-5x5-p1png
IHDRPLTEIDATIEND

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

expected40 match
6 of 25 pixels differ1: upng-head
5 of 25 pixels differ1: upng
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠≠✓✓✓
y_adam7-1x9-p1png
IHDRPLTEIDATIEND

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-9x1-p1png
IHDRPLTEIDATIEND

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

expected42 match
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-2x7-p1png
IHDRPLTEIDATIEND

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✓✓✓✓✓✓✓≠✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-7x2-p1png
IHDRPLTEIDATIEND

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

expected42 match
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-8x9-p1png
IHDRPLTEIDATIEND

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

expected40 match
29 of 72 pixels differ1: upng-head
29 of 72 pixels differ1: upng
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠≠✓✓✓
y_adam7-p2png
IHDRPLTEIDATIEND

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

expected41 match
1 of 195 pixels differ1: upng-head
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-1x1-p2png
IHDRPLTEIDATIEND

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-p2png
IHDRPLTEIDATIEND

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-p2png
IHDRPLTEIDATIEND

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-p2png
IHDRPLTEIDATIEND

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-p2png
IHDRPLTEIDATIEND

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-p2png
IHDRPLTEIDATIEND

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✓✓✓✓✓✓✓≠✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-5x5-p2png
IHDRPLTEIDATIEND

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

expected41 match
3 of 25 pixels differ1: upng-head
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-1x9-p2png
IHDRPLTEIDATIEND

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-9x1-p2png
IHDRPLTEIDATIEND

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

expected42 match
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-2x7-p2png
IHDRPLTEIDATIEND

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✓✓✓✓✓✓✓≠✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-7x2-p2png
IHDRPLTEIDATIEND

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

expected42 match
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-8x9-p2png
IHDRPLTEIDATIEND

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

expected41 match
16 of 72 pixels differ1: upng-head
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-p4png
IHDRPLTEIDATIEND

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

expected41 match
10 of 195 pixels differ1: upng-head
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-1x1-p4png
IHDRPLTEIDATIEND

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-p4png
IHDRPLTEIDATIEND

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-p4png
IHDRPLTEIDATIEND

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-p4png
IHDRPLTEIDATIEND

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-p4png
IHDRPLTEIDATIEND

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-p4png
IHDRPLTEIDATIEND

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✓✓✓✓✓✓✓≠✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-5x5-p4png
IHDRPLTEIDATIEND

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

expected41 match
3 of 25 pixels differ1: upng-head
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-1x9-p4png
IHDRPLTEIDATIEND

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-9x1-p4png
IHDRPLTEIDATIEND

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

expected41 match
4 of 9 pixels differ1: upng-head
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-2x7-p4png
IHDRPLTEIDATIEND

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-p4png
IHDRPLTEIDATIEND

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

expected41 match
5 of 14 pixels differ1: upng-head
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-8x9-p4png
IHDRPLTEIDATIEND

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

expected41 match
6 of 72 pixels differ1: upng-head
✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-p8png
IHDRPLTEIDATIEND

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

expected43 match
6 of 195 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-1x1-p8png
IHDRPLTEIDATIEND

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-p8png
IHDRPLTEIDATIEND

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-p8png
IHDRPLTEIDATIEND

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-p8png
IHDRPLTEIDATIEND

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-p8png
IHDRPLTEIDATIEND

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-p8png
IHDRPLTEIDATIEND

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-5x5-p8png
IHDRPLTEIDATIEND

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

expected43 match
2 of 25 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-1x9-p8png
IHDRPLTEIDATIEND

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-9x1-p8png
IHDRPLTEIDATIEND

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

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-2x7-p8png
IHDRPLTEIDATIEND

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

expected42 match
4 of 14 pixels differ2: imagesharp, imagesharp-head
✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-7x2-p8png
IHDRPLTEIDATIEND

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

expected43 match
1 of 14 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-8x9-p8png
IHDRPLTEIDATIEND

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

expected43 match
2 of 72 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-ga8png
IHDRIDATIEND

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

expected43 match
14 of 195 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-1x1-ga8png
IHDRIDATIEND

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-ga8png
IHDRIDATIEND

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-ga8png
IHDRIDATIEND

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-ga8png
IHDRIDATIEND

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-ga8png
IHDRIDATIEND

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
IHDRIDATIEND

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
✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-5x5-ga8png
IHDRIDATIEND

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

expected43 match
2 of 25 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-1x9-ga8png
IHDRIDATIEND

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-9x1-ga8png
IHDRIDATIEND

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

expected43 match
1 of 9 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-2x7-ga8png
IHDRIDATIEND

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-7x2-ga8png
IHDRIDATIEND

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

expected43 match
2 of 14 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-8x9-ga8png
IHDRIDATIEND

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

expected43 match
1 of 72 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-ga16png
IHDRIDATIEND

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-ga16png
IHDRIDATIEND

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-ga16png
IHDRIDATIEND

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-ga16png
IHDRIDATIEND

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-ga16png
IHDRIDATIEND

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-ga16png
IHDRIDATIEND

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-ga16png
IHDRIDATIEND

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
IHDRIDATIEND

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 byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-1x9-ga16png
IHDRIDATIEND

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-ga16png
IHDRIDATIEND

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-ga16png
IHDRIDATIEND

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-ga16png
IHDRIDATIEND

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-ga16png
IHDRIDATIEND

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-rgba8png
IHDRIDATIEND

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

expected43 match
36 of 195 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-1x1-rgba8png
IHDRIDATIEND

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-rgba8png
IHDRIDATIEND

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-rgba8png
IHDRIDATIEND

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-rgba8png
IHDRIDATIEND

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-rgba8png
IHDRIDATIEND

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-rgba8png
IHDRIDATIEND

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-5x5-rgba8png
IHDRIDATIEND

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

expected43 match
1 of 25 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-1x9-rgba8png
IHDRIDATIEND

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-9x1-rgba8png
IHDRIDATIEND

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

expected43 match
2 of 9 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-2x7-rgba8png
IHDRIDATIEND

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-7x2-rgba8png
IHDRIDATIEND

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

expected43 match
1 of 14 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-8x9-rgba8png
IHDRIDATIEND

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

expected43 match
1 of 72 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-rgba16png
IHDRIDATIEND

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-rgba16png
IHDRIDATIEND

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-rgba16png
IHDRIDATIEND

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-rgba16png
IHDRIDATIEND

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-rgba16png
IHDRIDATIEND

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-rgba16png
IHDRIDATIEND

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-rgba16png
IHDRIDATIEND

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-rgba16png
IHDRIDATIEND

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-rgba16png
IHDRIDATIEND

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-rgba16png
IHDRIDATIEND

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-rgba16png
IHDRIDATIEND

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-rgba16png
IHDRIDATIEND

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-rgba16png
IHDRIDATIEND

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-g8-nofilterpng
IHDRIDATIEND

13x15, interlaced, filter None throughout; no pass is empty. §8.1 says decoders are required to read interlaced images.

expected: display, conforms

spec: §13.10

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-1x1-g8-nofilterpng
IHDRIDATIEND

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-nofilterpng
IHDRIDATIEND

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-nofilterpng
IHDRIDATIEND

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-nofilterpng
IHDRIDATIEND

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
IHDRIDATIEND

3x3, interlaced, filter None throughout; 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
✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-4x4-g8-nofilterpng
IHDRIDATIEND

4x4, interlaced, filter None throughout; 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
✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-5x5-g8-nofilterpng
IHDRIDATIEND

5x5, interlaced, filter None throughout; no pass is empty. §8.1 says decoders are required to read interlaced images.

expected: display, conforms

spec: §13.10

expected43 match
1 of 25 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-1x9-g8-nofilterpng
IHDRIDATIEND

1x9, interlaced, filter None throughout; 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-9x1-g8-nofilterpng
IHDRIDATIEND

9x1, interlaced, filter None throughout; 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

expected43 match
2 of 9 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-2x7-g8-nofilterpng
IHDRIDATIEND

2x7, interlaced, filter None throughout; 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

expected42 match
4 of 14 pixels differ2: imagesharp, imagesharp-head
✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_adam7-7x2-g8-nofilterpng
IHDRIDATIEND

7x2, interlaced, filter None throughout; 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

expected43 match
1 of 14 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_adam7-8x9-g8-nofilterpng
IHDRIDATIEND

8x9, interlaced, filter None throughout; no pass is empty. §8.1 says decoders are required to read interlaced images.

expected: display, conforms

spec: §13.10

expected43 match
1 of 72 pixels differ1: upng-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓
y_padbits-g1png
IHDRIDATIEND

the 3 unused bits at the end of every scanline set to 1; Sub filter, so they feed the filter. §7.2 says the padding bits at the end of a scanline are unspecified; a decoder can't depend on them.

expected: display, conforms

expected43 match
100 of 195 pixels differ1: upng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_padbits-g2png
IHDRIDATIEND

the 6 unused bits at the end of every scanline set to 1; Sub filter, so they feed the filter. §7.2 says the padding bits at the end of a scanline are unspecified; a decoder can't depend on them.

expected: display, conforms

expected43 match
118 of 195 pixels differ1: upng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_padbits-g4png
IHDRIDATIEND

the 4 unused bits at the end of every scanline set to 1; Sub filter, so they feed the filter. §7.2 says the padding bits at the end of a scanline are unspecified; a decoder can't depend on them.

expected: display, conforms

expected43 match
122 of 195 pixels differ1: upng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_padbits-p1png
IHDRPLTEIDATIEND

the 3 unused bits at the end of every scanline set to 1; Sub filter, so they feed the filter. §7.2 says the padding bits at the end of a scanline are unspecified; a decoder can't depend on them.

expected: display, conforms

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_padbits-p2png
IHDRPLTEIDATIEND

the 6 unused bits at the end of every scanline set to 1; Sub filter, so they feed the filter. §7.2 says the padding bits at the end of a scanline are unspecified; a decoder can't depend on them.

expected: display, conforms

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_padbits-p4png
IHDRPLTEIDATIEND

the 4 unused bits at the end of every scanline set to 1; Sub filter, so they feed the filter. §7.2 says the padding bits at the end of a scanline are unspecified; a decoder can't depend on them.

expected: display, conforms

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_padbits-g1-adam7png
IHDRIDATIEND

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✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠≠✓✓✓
y_idat-empty-firstpng
IHDRIDAT ×2IEND

zero-length IDAT before the data. §10.2 says an IDAT may be empty.

expected: display, conforms

spec: §11.2.3

expected42 match
✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_idat-empty-lastpng
IHDRIDAT ×2IEND

zero-length IDAT after the data. §10.2 says an IDAT may be empty.

expected: display, conforms

spec: §11.2.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_idat-empty-middlepng
IHDRIDAT ×3IEND

zero-length IDAT between two halves. §10.2 says an IDAT may be empty.

expected: display, conforms

spec: §11.2.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_idat-split-every-bytepng
IHDRIDAT ×188IEND

one byte per IDAT, 188 IDAT chunks. §10.2 says IDAT boundaries mean nothing; the chunks' data concatenate into one stream.

expected: display, conforms

spec: §13.8

expected42 match
✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_idat-split-every-byte-g16png
IHDRIDAT ×158IEND

one byte per IDAT on a 16-bit image, 158 IDAT chunks. §10.2 says IDAT boundaries mean nothing; the chunks' data concatenate into one stream.

expected: display, conforms

spec: §13.8

expected38 match
matches the reference; 16→8 high byte4: upng, chunky_png, upng-head, chunky_png-head
✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_idat-split-every-byte-rgb16png
IHDRIDAT ×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✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_idat-split-in-zlib-headerpng
IHDRIDAT ×2IEND

IDAT boundary between the two zlib header bytes. §10.2 says IDAT boundaries can fall anywhere, even inside the zlib header.

expected: display, conforms

spec: §13.8

expected42 match
✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_idat-split-in-adlerpng
IHDRIDAT ×2IEND

IDAT boundary inside the Adler-32. §10.2 says IDAT boundaries can fall anywhere, even inside the Adler-32.

expected: display, conforms

spec: §13.8

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
n_idat-interrupted-by-textpng
IHDRIDATtEXtIDATIEND

tEXt between two IDATs. §11.2.3 says IDAT chunks are consecutive, so that's a fatal error.

expected: must-reject, does not conform

spec: §5.6

expected17 match
193 of 195 pixels differ2: imagesharp, imagesharp-head
RRRRAAAARRRRRARRRRARRRRAARRAARRAAARAR
n_idat-interrupted-by-unknownpng
IHDRIDATjuNkIDATIEND

unknown ancillary chunk between two IDATs. §11.2.3 says IDAT chunks are consecutive, so that's a fatal error.

expected: must-reject, does not conform

spec: §5.6

expected17 match
193 of 195 pixels differ2: imagesharp, imagesharp-head
RRRRAAAARRRRRARRRRARRRRAARRAARRAAARAR
r_idat-after-iendpng
IHDRIDATIENDIDAT

a complete image, then a second IDAT after IEND. §11.2.4 says IEND is the last chunk, therefore a decoder may ignore anything past it.

expected: recover, does not conform

spec: §15.3.1, §13.1, §13.3

expected42 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓
r_idat-second-streampng
IHDRIDAT ×2IEND

a second complete zlib stream in a further IDAT. §11.2.3 says a decoder should ignore unused bytes after the compressed data.

expected: recover, does not conform

expected42 match
✓✓AA✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓
r_idat-trailing-junkpng
IHDRIDATIEND

16 unused bytes after the zlib stream in the final IDAT. §11.2.3 says a decoder should ignore unused bytes after the compressed data.

expected: recover, does not conform

expected38 match
✓✓AA✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓RR✓✓✓✓✓✓✓✓✓R✓✓
r_idat-trailing-zerospng
IHDRIDATIEND

64 zero bytes after the zlib stream. §11.2.3 says a decoder should ignore unused bytes after the compressed data.

expected: recover, does not conform

expected38 match
✓✓AA✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓RR✓✓✓✓✓✓✓✓✓R✓✓
i_zlib-extra-rowpng
IHDRIDATIEND

decompressed data one scanline longer than the image. The spec doesn't address extra data after the last scanline; a decoder may reject it or ignore it.

expected: may-reject, does not conform

spec: §11.2.3, §13.1

expected33 match
✓✓AA✓✓✓✓R✓✓✓✓✓✓✓✓✓R✓✓✓✓RR✓✓!!✓✓✓✓✓R✓R
i_zlib-extra-bytepng
IHDRIDATIEND

decompressed data one byte longer than the image. The spec doesn't address extra data after the last scanline; a decoder may reject it or ignore it.

expected: may-reject, does not conform

spec: §11.2.3, §13.1

expected33 match
✓✓AA✓✓✓✓R✓✓✓✓✓✓✓✓✓R✓✓✓✓RR✓✓RR✓✓✓✓✓R✓R
i_zlib-short-rowpng
IHDRIDATIEND

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
RRAARRAARRRRRARRRRRRRAARRRR!!RRRAARRA
i_zlib-short-bytepng
IHDRIDATIEND

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
RRAA!AAARRRRRARRRRRRRRRAARRRRRRRAARRA
i_zlib-emptypng
IHDRIDATIEND

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
RRRRRRRRRRRRRARRRRRRRRRRRRR!!RRRAARRA
i_zlib-no-adlerpng
IHDRIDATIEND

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
✓✓AARR✓✓RRRRR✓✓RR✓RRR✓✓✓✓RR✓✓✓✓✓R✓R✓✓
i_idat-second-truncatedpng
IHDRIDATIDAT

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
✓✓RRRRRRRRRRRR✓RR✓RRRRRRRRRRRRRRR✓✓R≠
n_zlib-bad-adler-idatpng
IHDRIDATIEND

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
RRRRRARRRRRRRARRRRRRRRRAARRRRAAARAAAA
n_zlib-bad-adler-extra-idatpng
IHDRIDAT ×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
RRAARARRRAAAAAAAAARAAAAAAAARRAAARAAAA
i_zlib-no-final-blockpng
IHDRIDATIEND

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
✓✓AARR✓✓RRRRR✓✓RR✓RRR✓✓✓✓RR✓✓✓✓RRRRRR
n_zlib-cinfo-8png
IHDRIDATIEND

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
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRARARRA
y_zlib-cinfo-0png
IHDRIDATIEND

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-fdictpng
IHDRIDATIEND

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
RRRRRRRRRRRRRARRRRRRRRRRRRRRRRRRRRRRR
n_zlib-cm-7png
IHDRIDATIEND

zlib CM 7 instead of 8. §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 pixels2: zune-png-head, upng-head
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRARRA
n_zlib-fcheck-badpng
IHDRIDATIEND

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
RRRRRRRRRRRRRARRRRRRRRRRRRRRRRRRRARRA
i_zlib-cinfo-0-long-distancepng
IHDRIDATIEND

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
✓✓AA✓✓✓✓✓RRRR✓✓RR✓✓RR✓✓✓✓RR✓✓✓✓✓R✓✓✓✓
y_deflate-storedpng
IHDRIDATIEND

zlib level 0: stored blocks.

expected: display, conforms

spec: RFC 1951 §3.2.4

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_deflate-fixedpng
IHDRIDATIEND

single fixed-Huffman block with distance-1 matches.

expected: display, conforms

spec: RFC 1951 §3.2.6

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_deflate-huffman-onlypng
IHDRIDATIEND

zlib Z_HUFFMAN_ONLY: dynamic blocks without matches.

expected: display, conforms

spec: RFC 1951 §3.2.7

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_deflate-rlepng
IHDRIDATIEND

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-fixedpng
IHDRIDATIEND

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-rowpng
IHDRIDATIEND

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-rowpng
IHDRIDATIEND

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-blockspng
IHDRIDATIEND

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-firstpng
IHDRIDATIEND

20 empty stored blocks before the data.

expected: display, conforms

spec: RFC 1951 §3.2.3

expected42 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓
y_deflate-dynamic-literalspng
IHDRIDATIEND

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-codespng
IHDRIDATIEND

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-codepng
IHDRIDATIEND

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-unusedpng
IHDRIDATIEND

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
✓✓RRR✓RRRRRRRRRRRR✓RRRRRRRRRRRR✓R✓R✓✓
y_deflate-dynamic-hdist-31-unusedpng
IHDRIDATIEND

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
✓✓RRR✓RRRRRRRRRRRR✓RRRRRRRRRRRR✓R✓R✓✓
n_deflate-stored-bad-nlenpng
IHDRIDATIEND

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
RRRRRARRRRRRRRRRRRRRRRRRRRRRRRRRRARRR
n_deflate-distance-too-farpng
IHDRIDATIEND

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
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRARRR
n_deflate-fixed-length-code-286-usedpng
IHDRIDATIEND

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
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRARRR
n_deflate-fixed-distance-code-30-usedpng
IHDRIDATIEND

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
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRARRR
y_deflate-zopflipng
IHDRIDATIEND

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-libdeflatepng
IHDRIDATIEND

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-zippng
IHDRIDATIEND

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-blockpng
IHDRIDATIEND

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
✓✓AA✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓RR✓✓✓R✓✓
n_ihdr-len-12png
IHDRIDATIEND

IHDR one byte short. §11.2.1 says IHDR is 13 bytes; §13.2 says a decoder should treat a wrong length as an error.

expected: must-reject, does not conform

no reference pixels2: upng, upng-head
no reference pixels2: chunky_png, chunky_png-head
RRRRARRRRRRRRRRRRRRRRRRRRRRRRRRRAARRR
n_ihdr-len-14png
IHDRIDATIEND

IHDR one byte long. §11.2.1 says IHDR is 13 bytes; §13.2 says a decoder should treat a wrong length as an error.

expected: must-reject, does not conform

no reference pixels10: imagesharp, pngjs, upng, pillow, chunky_png, imagesharp-head, pngjs-head, upng-head, pillow-head, chunky_png-head
RRRRARRRRRRRRARRRRRRRAAAARRRRRRRAARRR
n_ihdr-compression-1png
IHDRIDATIEND

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
RRRRARRRRRRRRARRRRRRRAARRRRRRRRRAARRR
n_ihdr-filter-1png
IHDRIDATIEND

filter method 1; data uses filter method 0. §11.2.1 defines only filter method 0; any other is an error.

expected: must-reject, does not conform

spec: §15.3.3

no reference pixels8: ffmpeg, zune-png, upng, chunky_png, ffmpeg-head, zune-png-head, upng-head, chunky_png-head
RRRRARAARRRRRRRRRRRRRRRRRRRRRRRRAARAA
n_ihdr-interlace-2png
IHDRIDATIEND

interlace method 2; data is non-interlaced. §11.2.1 defines interlace methods 0 and 1; any other is an error.

expected: must-reject, does not conform

spec: §15.3.3

no reference pixels2: upng, upng-head
no reference pixels2: ffmpeg, ffmpeg-head
RRRRRRAARRRRRRRRRRRRRRRRRRRRRRRRAARRR
n_ihdr-width-0png
IHDRIDATIEND

width 0. §11.2.1 says zero is an invalid dimension, so that's a fatal error.

expected: must-reject, does not conform

RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR!!RRR
n_ihdr-height-0png
IHDRIDATIEND

height 0. §11.2.1 says zero is an invalid dimension, so that's a fatal error.

expected: must-reject, does not conform

RRRRR!RRRRRRRRRRRRRRRRRRRRR!!RRR!!RRR
n_ihdr-width-2-31png
IHDRIDATIEND

width 2^31, beyond the PNG integer range. §7.1 limits dimensions to 2^31−1, so that's a fatal error.

expected: must-reject, does not conform

spec: §11.2.1

RRRRR∞RRRRRRRRRRRR∞RRRRRRRR∞∞RRR⧗∞RRR
n_ihdr-both-0png
IHDRIDATIEND

0x0 image with an empty zlib stream. §11.2.1 says zero is an invalid dimension, so that's a fatal error.

expected: must-reject, does not conform

RRRRR!RRRRRRRRRRRRRRRRRRRRR!!RRR!!RRR
n_ihdr-rgb-bd4png
IHDRIDATIEND

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

spec: Table 12, §13

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
RRRRRAAARRRRRRRRRRRRRRRAARRRRRRAAARAA
n_ihdr-rgb-bd1png
IHDRIDATIEND

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

spec: Table 12, §13

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
RRRRRARRRRRRRRRRRRRRRRRAARRRRRRAAARAA
n_ihdr-ga-bd4png
IHDRIDATIEND

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

spec: Table 12, §13

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
RRRRRARRRRRRRRRRRRRRRRRAARRRRRRAAARAA
n_ihdr-rgba-bd2png
IHDRIDATIEND

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

spec: Table 12, §13

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
RRRRRAAARRRRRRRRRRRRRRRAARRRRRRAAARAA
n_ihdr-g-bd3png
IHDRIDATIEND

color type 0 at bit depth 3 is not an allowed combination; the picture's 8-bit samples, laid out as 8-bit. §11.2.1 lists the valid bit depths; any other is an error.

expected: must-reject, does not conform

spec: §15.3.3

no reference pixels2: upng, upng-head
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRAARRR
n_ihdr-g-bd0png
IHDRIDATIEND

color type 0 at bit depth 0 is not an allowed combination; the picture's 8-bit samples, laid out as 8-bit. §11.2.1 lists the valid bit depths; any other is an error.

expected: must-reject, does not conform

spec: §15.3.3

no reference pixels2: upng, upng-head
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRAARRR
n_ihdr-p-bd16png
IHDRPLTEIDATIEND

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

spec: Table 12, §13

no reference pixels2: upng, upng-head
no reference pixels2: pngjs, pngjs-head
RRRRRRRRRRRRRRRRRRRRRRRAARRRRRRRAARRR
n_ihdr-ct1png
IHDRIDATIEND

color type 1 is undefined; data is 8-bit grayscale. §11.2.1 lists the valid color types; any other is an error.

expected: must-reject, does not conform

spec: §15.3.3

no reference pixels2: upng, upng-head
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRAARRR
n_ihdr-ct5png
IHDRIDATIEND

color type 5 is undefined; data is 8-bit grayscale. §11.2.1 lists the valid color types; any other is an error.

expected: must-reject, does not conform

spec: §15.3.3

no reference pixels2: upng, upng-head
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRAARRR
n_ihdr-ct7png
IHDRIDATIEND

color type 7 is undefined; data is 8-bit grayscale. §11.2.1 lists the valid color types; any other is an error.

expected: must-reject, does not conform

spec: §15.3.3

no reference pixels2: upng, upng-head
RRAARRRRRRRRRRRRRRRRRRRRRRRRRRRRAARRR
n_ihdr-not-firstpng
tEXtIHDRIDATIEND

a tEXt chunk precedes IHDR. §11.2.1 says IHDR comes first, so that's a fatal error.

expected: must-reject, does not conform

spec: §5.6

expected16 match
RRRRAAAAARRRRARRRRRRRAARRRRAARRRAARRR
n_ihdr-not-first-unknownpng
prIvIHDRIDATIEND

an unknown ancillary private chunk precedes IHDR. §11.2.1 says IHDR comes first, so that's a fatal error.

expected: must-reject, does not conform

spec: §5.6

expected21 match
RRRRAAAAARRRRARAARRRRAARRAAAARRRAARRR
n_ihdr-duppng
IHDR ×2IDATIEND

two identical IHDR chunks. §11.2 allows one IHDR, so that's a fatal error.

expected: must-reject, does not conform

spec: §5.6

expected13 match
RRRRAARRRRRRRRARRRRRRAAAARRAARRRAARRR
n_ihdr-dup-differentpng
IHDR ×2IDATIEND

a second IHDR giving 2x2. §11.2 allows one IHDR, so that's a fatal error.

expected: must-reject, does not conform

spec: §5.6

expected1 match: java-imageio
2x2 instead of 13x151: upng-head
2x2 instead of 13x151: upng
RRRRRRRRRRRRRRARRRRRRRRRRRRRRRRRAARRR
n_ihdr-missingpng
IDATIEND

no IHDR at all. §11.2.1 says IHDR comes first, so that's a fatal error.

expected: must-reject, does not conform

spec: §5.6

RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR!!RRR
n_plte-len-not-mult3-palpng
IHDRPLTEIDATIEND

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
RRRRRRAARRRRRAARRRARRAAAARRRRRRRAARRR
r_plte-len-not-mult3-rgbpng
IHDRPLTEIDATIEND

palette length 109 in a truecolor image, a suggested palette. §13.1 says a viewer can ignore an invalid PLTE in a truecolor image.

expected: recover, does not conform

spec: §11.2.2

expected31 match
✓✓RR✓R✓✓R✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓RR✓RR✓✓✓RR
n_plte-empty-palpng
IHDRPLTEIDATIEND

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
RRRR!RAARRRRRRARRRRRRAARRRRRRRRRAAAAA
r_plte-empty-rgbpng
IHDRPLTEIDATIEND

zero-length PLTE in a truecolor image. §13.1 says a viewer can ignore an invalid PLTE in a truecolor image.

expected: recover, does not conform

spec: §11.2.2

expected23 match
✓✓RR✓✓✓✓RRRRR✓✓RRRRRR✓✓✓✓RRRRRR✓✓✓✓✓✓
i_plte-too-many-for-depthpng
IHDRPLTEIDATIEND

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
✓✓RR✓✓✓✓R✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓RR✓✓✓✓✓✓✓✓
n_plte-257-entriespng
IHDRPLTEIDATIEND

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
RRRRAAAARRRRRAARRRRRRRRAARRRRRRRAARRR
i_plte-in-graypng
IHDRPLTEIDATIEND

PLTE in a grayscale image. §11.2.2 says PLTE must not appear in a grayscale image; a decoder may reject it or ignore it.

expected: may-reject, does not conform

expected38 match
✓✓RR✓R✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓
i_plte-in-grayapng
IHDRPLTEIDATIEND

PLTE in a grayscale+alpha image. §11.2.2 says PLTE must not appear in a grayscale image; a decoder may reject it or ignore it.

expected: may-reject, does not conform

expected40 match
✓✓RR✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓
n_plte-after-idat-palpng
IHDRIDATPLTEIEND

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

spec: §11.2.1, §5.6

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
RRRRAAAARRRRRRRRRRARRAARRRRRRRRRAARAR
r_plte-after-idat-rgbpng
IHDRIDATPLTEIEND

truecolor image with a suggested palette after IDAT. §13.1 says a viewer can ignore an invalid PLTE in a truecolor image.

expected: recover, does not conform

spec: §11.2.2

expected42 match
✓✓RR✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
i_plte-dup-rgbpng
IHDRPLTE ×2IDATIEND

two suggested palettes in a truecolor image. §11.2.2 allows one PLTE; a decoder may reject the file or carry on with one of them.

expected: may-reject, does not conform

expected38 match
✓✓RR✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓RR✓✓✓R✓✓
i_plte-crc-bad-rgbpng
IHDRPLTEIDATIEND

bad CRC on an unused suggested palette. §13.1 says a CRC mismatch may be fatal; a decoder that carries on uses the chunk as stored.

expected: may-reject, does not conform

spec: §5.5

expected27 match
✓✓RRR✓✓✓R✓✓✓✓R✓✓✓RR✓✓RRRR✓✓R✓RR✓✓✓✓✓✓
i_plte-crc-bad-palpng
IHDRPLTEIDATIEND

bad CRC on the palette of an indexed image. §13.1 says a CRC mismatch may be fatal; a decoder that carries on uses the chunk as stored.

expected: may-reject, does not conform

spec: §5.5

expected18 match
✓c✓cRRR✓c✓c✓cR✓c✓cRRR✓cRRRRRRRRRRRRR✓cRR✓c✓c✓c✓c✓c✓c
r_plte-index-beyond-2bitpng
IHDRPLTEIDATIEND

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
RRA✓AA!RRA✓A✓A✓RRRRRRRRA≠A✓A✓A✓A✓A✓A✓A✓A✓A✓RRRRA✓A✓RRRRA✓A✓MA✓A✓A✓A✓A✓
r_plte-index-beyond-2bit-trnspng
IHDRPLTEtRNSIDATIEND

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
RRA✓AA!RRA✓A✓A✓RRRRRRRRA≠A✓A✓A✓A✓A✓A✓A✓A✓A✓RRRRA✓A✓RRRRA✓A✓MA✓A✓A✓A✓A✓
r_plte-index-beyond-1bitpng
IHDRPLTEIDATIEND

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
RRA✓AA!RRA✓A✓A✓RRRRRRRRA≠A✓A✓A✓A✓A✓A✓A✓A✓A✓RRRRA✓A✓RRRRA✓A✓MA✓A✓A✓A✓A✓
r_plte-index-beyond-4bitpng
IHDRPLTEIDATIEND

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
RRA✓AA!RRA✓A✓A✓RRRRRRRRA≠A✓A✓A✓A✓A✓A✓A✓A✓A✓RRRRA✓A✓RRRRA✓A✓MA✓A✓A✓A✓A✓
r_plte-index-beyond-8bitpng
IHDRPLTEIDATIEND

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
RRA✓AA!RRA✓A✓A✓RRRRRRRRA≠A✓A✓A✓A✓A✓A✓A✓A✓A✓RRRRA✓A✓RRRRA✓A✓MA✓A✓A✓A✓A✓
r_trns-len-1-graypng
IHDRtRNSIDATIEND

1-byte tRNS on grayscale (should be 2). §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

expected24 match
✓✓RRRR✓✓R✓✓✓✓✓✓✓✓✓R✓✓RRRR✓✓RR✓✓R✓✓RRR
r_trns-len-3-graypng
IHDRtRNSIDATIEND

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
✓✓RR≠R✓✓R✓✓✓✓≠✓✓✓✓R✓✓≠≠≠≠✓✓RR≠≠R≠≠RR≠
r_trns-len-4-rgbpng
IHDRtRNSIDATIEND

4-byte tRNS on truecolor (should be 6). §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

expected26 match
✓✓RRR✓✓✓R✓✓✓✓✓✓✓✓✓R✓✓RRRR✓✓RR✓✓R✓✓RRR
r_trns-len-7-rgbpng
IHDRtRNSIDATIEND

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
✓✓RR≠R✓✓R✓✓✓✓≠✓✓✓✓R✓✓≠≠≠≠✓✓RR≠≠R≠≠RR≠
y_trns-len-0-palpng
IHDRPLTEtRNSIDATIEND

zero-length tRNS on an indexed image: every entry stays opaque. §11.3.1.1 says tRNS may cover fewer entries than the palette has; the rest are opaque.

expected: display, conforms

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_trns-longer-than-pltepng
IHDRPLTEtRNSIDATIEND

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
✓✓RR≠R≠≠≠✓✓✓✓R≠✓✓✓R✓✓≠≠RR✓✓RR✓✓R≠≠≠≠≠
r_trns-in-grayapng
IHDRtRNSIDATIEND

tRNS in a grayscale+alpha image. §11.3.1.1 says tRNS must not appear in an image with an alpha channel; a decoder should ignore it.

expected: recover, does not conform

expected31 match
✓✓RR✓R✓✓R✓✓✓✓✓R✓✓✓R✓✓✓✓✓✓✓✓RR✓✓R✓✓✓RR
r_trns-in-rgbapng
IHDRtRNSIDATIEND

tRNS in a truecolor+alpha image. §11.3.1.1 says tRNS must not appear in an image with an alpha channel; a decoder should ignore it.

expected: recover, does not conform

expected31 match
✓✓RR✓R✓✓R✓✓✓✓✓R✓✓✓R✓✓✓✓✓✓✓✓RR✓✓R✓✓✓RR
r_trns-after-idat-graypng
IHDRIDATtRNSIEND

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
✓✓RR≠✓✓✓R✓✓✓✓✓✓✓✓✓≠✓✓≠≠≠≠✓✓✓✓✓✓R≠≠✓≠✓
r_trns-after-idat-palpng
IHDRPLTEIDATtRNSIEND

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
✓✓RR≠≠✓✓R✓✓✓✓✓≠✓✓✓≠✓✓≠≠≠≠✓✓✓✓✓✓R≠≠✓≠✓
r_trns-before-plte-palpng
IHDRtRNSPLTEIDATIEND

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
✓✓RR≠R✓✓R✓✓✓✓≠R✓✓✓R✓✓≠≠RR✓✓≠≠✓✓R≠≠RRR
r_trns-before-plte-rgbpng
IHDRtRNSPLTEIDATIEND

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
✓✓AA✓≠✓✓R≠≠✓✓✓✓✓✓R✓✓✓✓✓✓✓≠M✓✓✓✓✓✓✓✓✓✓
r_trns-dup-graypng
IHDRtRNS ×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

spec: Table 7, §13.1

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✓tRR✓t≠✓t✓tR✓t✓t✓t✓t✓t✓t✓t✓t✓t✓t≠≠✓t✓t✓t✓t✓t✓t✓t✓t✓t✓t✓t✓t✓tR✓t✓t
y_trns-g4-highbitspng
IHDRtRNSIDATIEND

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-highbytepng
IHDRtRNSIDATIEND

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-highbytepng
IHDRtRNSIDATIEND

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-2png
IHDRtRNSIDATIEND

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-3png
IHDRtRNSIDATIEND

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-5png
IHDRtRNSIDATIEND

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-highbytepng
IHDRtRNSIDATIEND

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-1x1png
IHDRtRNSIDATIEND

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-2x1png
IHDRtRNSIDATIEND

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-1x1png
IHDRtRNSIDATIEND

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-blackpng
IHDRtRNSIDATIEND

tRNS names black (0), a color of the picture: those pixels have alpha 0.

expected: display, conforms

spec: §11.3.1.1

expected36 match
118 of 195 pixels differ7: ffmpeg, fast-png, opencv, ffmpeg-head, fast-png-head, upng-head, opencv-head
174 of 195 pixels differ1: upng
✓✓✓✓✓≠≠≠✓✓✓✓✓✓✓✓✓✓✓≠≠✓✓✓✓✓✓✓✓✓✓✓≠≠✓✓✓
y_trns-g1-whitepng
IHDRtRNSIDATIEND

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-blackpng
IHDRtRNSIDATIEND

tRNS names black (0), a color of the picture: those pixels have alpha 0.

expected: display, conforms

spec: §11.3.1.1

expected38 match
15 of 195 pixels differ5: fast-png, opencv, fast-png-head, upng-head, opencv-head
131 of 195 pixels differ1: upng
✓✓✓✓✓≠✓✓✓✓✓✓✓✓✓✓✓✓✓≠≠✓✓✓✓✓✓✓✓✓✓✓≠≠✓✓✓
y_trns-g2-whitepng
IHDRtRNSIDATIEND

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-midpng
IHDRtRNSIDATIEND

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-blackpng
IHDRtRNSIDATIEND

tRNS names black (0), a color of the picture: those pixels have alpha 0.

expected: display, conforms

spec: §11.3.1.1

expected38 match
2 of 195 pixels differ5: fast-png, opencv, fast-png-head, upng-head, opencv-head
122 of 195 pixels differ1: upng
✓✓✓✓✓≠✓✓✓✓✓✓✓✓✓✓✓✓✓≠≠✓✓✓✓✓✓✓✓✓✓✓≠≠✓✓✓
y_trns-g4-whitepng
IHDRtRNSIDATIEND

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-midpng
IHDRtRNSIDATIEND

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-blackpng
IHDRtRNSIDATIEND

tRNS names black (0), a color of the picture: those pixels have alpha 0.

expected: display, conforms

spec: §11.3.1.1

expected38 match
2 of 195 pixels differ6: fast-png, upng, opencv, fast-png-head, upng-head, opencv-head
✓✓✓✓✓≠✓✓✓✓✓✓✓✓✓✓✓✓✓≠≠✓✓✓✓✓✓✓✓✓✓✓≠≠✓✓✓
y_trns-g8-whitepng
IHDRtRNSIDATIEND

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-midpng
IHDRtRNSIDATIEND

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-blackpng
IHDRtRNSIDATIEND

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-whitepng
IHDRtRNSIDATIEND

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-midpng
IHDRtRNSIDATIEND

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
✓✓✓✓✓≠✓✓✓✓✓✓✓≠✓✓✓✓✓≠≠≠≠✓✓✓✓✓✓✓✓✓✓✓✓≠✓
y_trns-rgb8-blackpng
IHDRtRNSIDATIEND

tRNS names black (0, 0, 0), a color of the picture: those pixels have alpha 0.

expected: display, conforms

spec: §11.3.1.1

expected42 match
2 of 195 pixels differ2: fast-png, fast-png-head
✓✓✓✓✓≠✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓M✓✓✓✓✓✓✓✓✓✓
y_trns-rgb8-whitepng
IHDRtRNSIDATIEND

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-midpng
IHDRtRNSIDATIEND

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-blackpng
IHDRtRNSIDATIEND

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-whitepng
IHDRtRNSIDATIEND

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-midpng
IHDRtRNSIDATIEND

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-onlypng
IHDRtRNSIDATIEND

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-onlypng
IHDRtRNSIDATIEND

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
✓✓✓✓≠✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠≠✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_pal8-trns-entry0png
IHDRPLTEtRNSIDATIEND

p8, tRNS of one byte 0: only entry 0 transparent.

expected: display, conforms

spec: §11.3.1.1

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_pal1-trns-entry1png
IHDRPLTEtRNSIDATIEND

p1, tRNS ff 00: entry 1 transparent.

expected: display, conforms

spec: §11.3.1.1

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_pal2-trns-entry3png
IHDRPLTEtRNSIDATIEND

p2, tRNS ff ff ff 00: entry 3 transparent.

expected: display, conforms

spec: §11.3.1.1

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
i_iend-missingpng
IHDRIDAT

datastream ends after the last IDAT. §11.2 says a datastream ends with IEND; §13.1 lets a decoder treat the missing one as fatal, or not.

expected: may-reject, does not conform

expected14 match
✓✓RRRR✓✓RRRRR✓✓RR✓RRR✓✓RRRRRRRRRR✓✓RR
r_iend-len-4png
IHDRIDATIEND

IEND with four data bytes. §11.2.4 says IEND is the last chunk, therefore a decoder may ignore anything past it.

expected: recover, does not conform

spec: §15.3.1, §13.1, §13.3

expected38 match
✓✓RRRR✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_iend-duppng
IHDRIDATIENDIEND

two IEND chunks. §11.2.4 says IEND is the last chunk, therefore a decoder may ignore anything past it.

expected: recover, does not conform

spec: §15.3.1, §13.1, §13.3

expected42 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓
i_iend-crc-badpng
IHDRIDATIEND

IEND with a wrong CRC. §13.1 says a CRC mismatch may be fatal; a decoder that carries on uses the chunk as stored.

expected: may-reject, does not conform

spec: §5.5

expected35 match
✓✓RRR✓✓✓R✓✓✓✓✓✓✓✓✓R✓✓✓✓RR✓✓R✓✓✓✓✓✓✓✓✓
n_iend-before-idatpng
IHDRIENDIDAT

IEND before IDAT. §11.2 says that's a fatal error.

expected: must-reject, does not conform

no reference pixels1: java-imageio
RRRRRRRRRRRRRRARRRRRRRRRRRRRRRRRRRRRR
r_trailing-garbagepng
IHDRIDATIENDAGEG

56 bytes of non-chunk data after IEND. §11.2.4 says IEND is the last chunk, therefore a decoder may ignore anything past it.

expected: recover, does not conform

spec: §15.3.1, §13.1, §13.3

expected42 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓
r_trailing-partial-chunkpng
IHDRIDATIENDtEXt

a truncated chunk header after IEND. §11.2.4 says IEND is the last chunk, therefore a decoder may ignore anything past it.

expected: recover, does not conform

spec: §15.3.1, §13.1, §13.3

expected42 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓
n_chunk-unknown-critical-before-idatpng
IHDRCrITIDATIEND

unknown critical chunk CrIT before IDAT. §5.4 says a decoder that meets an unknown critical chunk must tell the user it can't safely interpret the image.

expected: must-reject, does not conform

spec: §13.1, §13.5

expected17 match
RRRRAkAkAkAkAkRRRRAkAkRRRRRRAkAkRRRRAkAkRRRAkAkRRR
n_chunk-unknown-critical-after-idatpng
IHDRIDATCrITIEND

unknown critical chunk CrIT after IDAT. §5.4 says a decoder that meets an unknown critical chunk must tell the user it can't safely interpret the image.

expected: must-reject, does not conform

spec: §13.1, §13.5

expected24 match
RRRRAkAkAkAkAkRRRRAkAkRRAkRRRAkAkRRRRAkAkAkAkRAkAkAkRAk
y_chunk-unknown-ancillary-publicpng
IHDRaBCDIDATIEND

unknown ancillary public chunk. §5.7.2 reserves public chunk names for the W3C, so the file doesn't conform; a decoder still treats the chunk as unknown and shows the image.

expected: display, does not conform

spec: §5.4, §15.3.1

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_chunk-unknown-ancillary-privatepng
IHDRprIvIDATIEND

unknown ancillary private chunk. §5.4 says an unknown ancillary chunk is never an error; a decoder just skips it.

expected: display, conforms

spec: §13.1

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_chunk-unknown-ancillary-after-idatpng
IHDRIDATprIvIEND

unknown ancillary private chunk between IDAT and IEND. §5.4 says an unknown ancillary chunk is never an error; a decoder just skips it.

expected: display, conforms

spec: §13.1

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_chunk-reserved-bit-ancillarypng
IHDRtestIDATIEND

reserved bit set on an unknown ancillary private chunk (test). 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
✓✓RR✓✓✓✓✓RRRR✓✓RR✓RRR✓✓✓✓RR✓✓✓✓✓✓✓✓✓✓
y_chunk-reserved-bit-knownpng
IHDRgAmaIDATIEND

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
✓✓RR✓✓✓✓✓RRRR✓✓RR✓RRR✓✓✓✓RR✓✓✓✓✓✓✓✓✓✓
n_chunk-reserved-bit-criticalpng
IHDRTestIDATIEND

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

spec: §13.1, §13.5, Table 6

expected17 match
RRRRAkAkAkAkAkRRRRAkAkRRRRRRAkAkRRRRAkAkRRRAkAkRRR
i_chunk-type-digitpng
IHDRt3XtIDATIEND

chunk type containing a digit. §5.3 restricts chunk type bytes to letters; §13.2 lets a decoder check that and reject the file, or skip the chunk.

expected: may-reject, does not conform

expected28 match
✓✓RR✓✓✓✓✓RRRR✓✓RR✓RRR✓✓✓RRRRR✓✓✓✓✓✓✓✓
i_chunk-type-nulpng
IHDRteX\x00IDATIEND

chunk type containing a NUL byte. §5.3 restricts chunk type bytes to letters; §13.2 lets a decoder check that and reject the file, or skip the chunk.

expected: may-reject, does not conform

expected26 match
✓✓RR✓✓✓✓✓RRRR✓✓RR✓RRRRR✓RRRRR✓✓✓✓✓✓✓✓
i_chunk-type-spacepng
IHDRteX IDATIEND

chunk type containing a space. §5.3 restricts chunk type bytes to letters; §13.2 lets a decoder check that and reject the file, or skip the chunk.

expected: may-reject, does not conform

expected26 match
✓✓RR✓✓✓✓✓RRRR✓✓RR✓RRRRR✓RRRRR✓✓✓✓✓✓✓✓
n_chunk-len-2-31png
IHDRtEXt

ancillary chunk declaring length 2^31. §5.3 says a chunk length never exceeds 2^31−1, so that's a fatal error.

expected: must-reject, does not conform

RRRR∞RRRRRRRRRRRRRRRRRRRRRRRRRRR∞∞RRR
n_chunk-len-huge-beyond-filepng
IHDRtEXt

ancillary chunk declaring 2^30 - 1 bytes in a file of a few hundred: a decoder that allocates the declared length first needs a gigabyte. §11.2 says that's a fatal error.

expected: must-reject, does not conform

RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR∞∞RRR
n_chunk-len-beyond-filepng
IHDRtEXt

ancillary chunk declaring more bytes than the file has. §11.2 says that's a fatal error.

expected: must-reject, does not conform

RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
i_chunk-ancillary-crc-badpng
IHDRtEXtIDATIEND

bad CRC on a tEXt chunk. §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

expected35 match
✓✓RRR✓✓✓R✓✓✓✓✓✓✓✓✓R✓✓RR✓✓✓✓R✓✓✓✓✓✓✓✓✓
i_chunk-unknown-ancillary-crc-badpng
IHDRprIvIDATIEND

bad CRC on an unknown ancillary private chunk. §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

expected37 match
✓✓RRR✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓RR✓✓✓✓R✓✓✓✓✓✓✓✓✓
i_chunk-gama-crc-badpng
IHDRgAMAIDATIEND

bad CRC on gAMA. §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

expected33 match
✓✓RRR✓✓✓R✓✓✓✓✓✓✓✓✓R✓✓RRRR✓✓R✓✓✓✓✓✓✓✓✓
i_chunk-trns-crc-badpng
IHDRtRNSIDATIEND

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
✓✓RRR✓✓c✓cR✓c✓c✓✓✓c✓c✓✓✓R✓✓RRRR✓✓R✓c✓✓✓c✓c✓c✓c✓c✓c
i_chunk-idat-crc-bad-firstpng
IHDRIDATIDATIEND

bad CRC on the first of two IDATs, data intact. §13.1 says a CRC mismatch may be fatal; a decoder that carries on uses the chunk as stored.

expected: may-reject, does not conform

spec: §5.5

expected20 match
✓c✓cRRR✓c✓c✓cR✓c✓cRRR✓cRRRRRR✓c✓cRRRRR✓cRR✓c✓c✓c✓c✓c✓c
y_chunk-many-ancillarypng
IHDRtEXt ×2000IDATIEND

2000 tEXt chunks before IDAT.

expected: display, conforms

spec: §11.3.3.2

expected42 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
n_filter-type-5-first-rowpng
IHDRIDATIEND

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
RRRRRRAARRRRRRRRRRRRRRRRRRRRRRRRAARRR
n_filter-type-5-last-rowpng
IHDRIDATIEND

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
RRRRRRAARRRRRRRRRRRRRRRRRRRRRRRRAARRR
n_filter-type-255png
IHDRIDATIEND

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
RRRRRRAARRRRRRRRRRRRRRRRRRRRRRRRAARRR
n_filter-type-8png
IHDRIDATIEND

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
RRRRRRAARRRRRRRRRRRRRRRRRRRRRRRRAARRR
r_gama-len-2png
IHDRgAMAIDATIEND

gAMA with 2 bytes. §13.2 says a decoder can handle a wrong length on an ancillary chunk by ignoring the chunk.

expected: recover, does not conform

expected34 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓RRRR✓✓RR✓✓✓✓✓✓RR
r_gama-len-0png
IHDRgAMAIDATIEND

gAMA with 0 bytes. §13.2 says a decoder can handle a wrong length on an ancillary chunk by ignoring the chunk.

expected: recover, does not conform

expected34 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓RRRR✓✓RR✓✓✓✓✓✓RR
r_bkgd-len-0png
IHDRbKGDIDATIEND

bKGD with 0 bytes. §13.2 says a decoder can handle a wrong length on an ancillary chunk by ignoring the chunk.

expected: recover, does not conform

expected38 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓RRR✓✓✓✓✓✓RR✓✓✓✓✓✓✓✓
r_chrm-len-0png
IHDRcHRMIDATIEND

cHRM with 0 bytes. §13.2 says a decoder can handle a wrong length on an ancillary chunk by ignoring the chunk.

expected: recover, does not conform

expected39 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓R
r_phys-len-0png
IHDRpHYsIDATIEND

pHYs with 0 bytes. §13.2 says a decoder can handle a wrong length on an ancillary chunk by ignoring the chunk.

expected: recover, does not conform

expected33 match
✓✓RR✓R✓✓✓✓✓✓✓R✓✓✓✓R✓✓RR✓✓✓✓RR✓✓✓✓✓✓✓R
r_sbit-len-0png
IHDRsBITIDATIEND

sBIT with 0 bytes. §13.2 says a decoder can handle a wrong length on an ancillary chunk by ignoring the chunk.

expected: recover, does not conform

expected39 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓RR✓✓✓✓✓✓✓R
r_srgb-len-0png
IHDRsRGBIDATIEND

sRGB with 0 bytes. §13.2 says a decoder can handle a wrong length on an ancillary chunk by ignoring the chunk.

expected: recover, does not conform

expected40 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_time-len-0png
IHDRtIMEIDATIEND

tIME with 0 bytes. §13.2 says a decoder can handle a wrong length on an ancillary chunk by ignoring the chunk.

expected: recover, does not conform

expected42 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_cicp-len-0png
IHDRcICPIDATIEND

cICP with 0 bytes. §13.2 says a decoder can handle a wrong length on an ancillary chunk by ignoring the chunk.

expected: recover, does not conform

expected39 match
✓✓RR✓✓RR✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓R
r_mdcv-len-0png
IHDRcICPmDCVIDATIEND

mDCV with 0 bytes, with the cICP it must accompany. §13.2 says a decoder can handle a wrong length on an ancillary chunk by ignoring the chunk.

expected: recover, does not conform

expected42 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_clli-len-0png
IHDRcLLIIDATIEND

cLLI with 0 bytes. §13.2 says a decoder can handle a wrong length on an ancillary chunk by ignoring the chunk.

expected: recover, does not conform

expected41 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓R
r_iccp-len-0png
IHDRiCCPIDATIEND

iCCP with 0 bytes. §11.3.2.3 lays out iCCP as name, null, method, profile; a decoder should ignore one that doesn't fit.

expected: recover, does not conform

expected37 match
✓✓RR✓R✓✓✓✓✓✓✓✓✓✓✓✓R✓✓RR✓✓✓✓✓✓✓✓✓✓R✓✓✓
r_itxt-len-0png
IHDRiTXtIDATIEND

iTXt with 0 bytes. §11.3.3.4 lays out iTXt with three null separators; a decoder should ignore one that doesn't fit.

expected: recover, does not conform

expected40 match
✓✓RRR✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_ztxt-len-0png
IHDRzTXtIDATIEND

zTXt with 0 bytes. §11.3.3.3 lays out zTXt as keyword, null, method, compressed text; a decoder should ignore one that doesn't fit.

expected: recover, does not conform

expected39 match
✓✓RRR✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓
r_splt-len-0png
IHDRsPLTIDATIEND

sPLT with 0 bytes. §11.3.4.4 lays out sPLT as name, null, depth, entries; a decoder should ignore one that doesn't fit.

expected: recover, does not conform

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_hist-len-0png
IHDRPLTEhISTIDATIEND

hIST with 0 bytes. §11.3.4.2 says hIST has one entry per palette entry; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_actl-len-0png
IHDRacTLIDATIEND

acTL with 0 bytes. §11.3.6.1 says acTL is 8 bytes; a decoder should ignore it otherwise and show the static image.

expected: recover, does not conform

spec: §13.2

expected33 match
✓✓RR✓✓✓✓✓✓✓✓✓R✓✓✓✓✓RRRR✓✓✓✓✓✓✓✓✓RRRR✓
r_gama-len-5png
IHDRgAMAIDATIEND

gAMA with 5 bytes. §13.2 says a decoder can handle a wrong length on an ancillary chunk by ignoring the chunk.

expected: recover, does not conform

expected38 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓RR✓✓✓✓✓✓RR
r_gama-value-0png
IHDRgAMAIDATIEND

gAMA 0 (a meaningless value). §13.13 says a gAMA of zero is meaningless and a decoder should ignore it.

expected: recover, does not conform

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_gama-value-hugepng
IHDRgAMAIDATIEND

gAMA 4294967295 (gamma 42949.67). §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

expected44 match
✓✓AA✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_gama-after-pltepng
IHDRPLTEgAMAIDATIEND

gAMA after PLTE. Table 7 in §5.6 puts this chunk before PLTE and IDAT; §13.2 says a decoder should ignore a misplaced one.

expected: recover, does not conform

spec: Table 7

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_gama-after-idatpng
IHDRIDATgAMAIEND

gAMA after IDAT. Table 7 in §5.6 puts this chunk before PLTE and IDAT; §13.2 says a decoder should ignore a misplaced one.

expected: recover, does not conform

spec: Table 7

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_gama-duppng
IHDRgAMA ×2IDATIEND

two gAMA chunks. Table 7 in §5.6 allows this chunk once; a decoder should ignore the second.

expected: recover, does not conform

spec: Table 7, §13.1

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_srgb-len-2png
IHDRsRGBIDATIEND

sRGB with 2 bytes. §13.2 says a decoder can handle a wrong length on an ancillary chunk by ignoring the chunk.

expected: recover, does not conform

expected42 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_srgb-intent-4png
IHDRsRGBIDATIEND

sRGB rendering intent 4 (defined: 0-3). §11.3.2.5 allows rendering intents 0 to 3; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_srgb-after-idatpng
IHDRIDATsRGBIEND

sRGB after IDAT. Table 7 in §5.6 puts this chunk before PLTE and IDAT; §13.2 says a decoder should ignore a misplaced one.

expected: recover, does not conform

spec: Table 7

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_srgb-and-iccppng
IHDRsRGBiCCPIDATIEND

sRGB and iCCP both present. §5.6 says iCCP and sRGB should not both be present.

expected: recover, does not conform

spec: Table 7

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_srgb-gama-mismatchpng
IHDRsRGBgAMAIDATIEND

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
✓✓AA✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_srgb-chrm-mismatchpng
IHDRsRGBcHRMIDATIEND

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
✓✓AA✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_chrm-len-30png
IHDRcHRMIDATIEND

cHRM with 30 bytes. §13.2 says a decoder can handle a wrong length on an ancillary chunk by ignoring the chunk.

expected: recover, does not conform

expected39 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓R
y_chrm-all-zeropng
IHDRcHRMIDATIEND

cHRM with every value 0 (degenerate).

expected: display, conforms

spec: §11.3.2.1

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_chrm-after-pltepng
IHDRPLTEcHRMIDATIEND

cHRM after PLTE. Table 7 in §5.6 puts this chunk before PLTE and IDAT; §13.2 says a decoder should ignore a misplaced one.

expected: recover, does not conform

spec: Table 7

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_phys-len-8png
IHDRpHYsIDATIEND

pHYs with 8 bytes. §13.2 says a decoder can handle a wrong length on an ancillary chunk by ignoring the chunk.

expected: recover, does not conform

expected33 match
✓✓RR✓R✓✓✓✓✓✓✓R✓✓✓✓R✓✓RR✓✓✓✓RR✓✓✓✓✓✓✓R
r_phys-unit-2png
IHDRpHYsIDATIEND

pHYs unit specifier 2 (defined: 0, 1). §11.3.4.3 defines units 0 and 1; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_phys-zeropng
IHDRpHYsIDATIEND

pHYs 0 pixels per metre.

expected: display, conforms

spec: §11.3.4.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_phys-after-idatpng
IHDRIDATpHYsIEND

pHYs after IDAT. Table 7 in §5.6 puts this chunk before IDAT; a decoder should ignore a misplaced one.

expected: recover, does not conform

spec: Table 7

expected42 match
✓✓RR✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_time-len-6png
IHDRtIMEIDATIEND

tIME with 6 bytes. §13.2 says a decoder can handle a wrong length on an ancillary chunk by ignoring the chunk.

expected: recover, does not conform

expected42 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_time-month-13png
IHDRtIMEIDATIEND

tIME month 13. §11.3.5.1 gives each tIME field a range; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_time-day-0png
IHDRtIMEIDATIEND

tIME day 0. §11.3.5.1 gives each tIME field a range; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_time-second-60png
IHDRtIMEIDATIEND

tIME second 60 (allowed for leap seconds).

expected: display, conforms

spec: §11.3.5.1

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_time-year-0png
IHDRtIMEIDATIEND

tIME year 0.

expected: display, conforms

spec: §11.3.5.1

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_time-duppng
IHDRtIME ×2IDATIEND

two tIME chunks. Table 7 in §5.6 allows this chunk once; a decoder should ignore the second.

expected: recover, does not conform

spec: Table 7, §13.1

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_text-no-nullpng
IHDRtEXtIDATIEND

tEXt without a null separator. §11.3.3.2 says a null byte separates keyword and text; a decoder should ignore a chunk without one.

expected: recover, does not conform

expected42 match
✓✓AA✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_text-empty-keywordpng
IHDRtEXtIDATIEND

tEXt with an empty keyword. §11.3.3.1 says a keyword is 1 to 79 bytes; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

spec: §11.3.2.3, §11.3.4.4

expected40 match
✓✓RR✓R✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_text-keyword-80png
IHDRtEXtIDATIEND

tEXt keyword of 80 characters (limit 79). §11.3.3.1 says a keyword is 1 to 79 bytes; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

spec: §11.3.2.3, §11.3.4.4

expected40 match
✓✓RR✓R✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_text-len-0png
IHDRtEXtIDATIEND

zero-length tEXt. §11.3.3.2 says a null byte separates keyword and text; a decoder should ignore a chunk without one.

expected: recover, does not conform

expected40 match
✓✓RR✓R✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_text-keyword-spacespng
IHDRtEXtIDATIEND

tEXt keyword with leading and trailing spaces. §11.3.3.1 forbids leading, trailing and consecutive spaces in a keyword; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

spec: §11.3.2.3, §11.3.4.4

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_text-control-charpng
IHDRtEXtIDATIEND

tEXt whose text holds ESC, a C0 control. §11.3.3.1 restricts text to printable Latin-1 plus line feed; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

expected44 match
✓✓AA✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_text-second-nullpng
IHDRtEXtIDATIEND

tEXt whose text holds a second NUL. §11.3.3.2 says neither keyword nor text may contain a null; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_text-non-latin1png
IHDRtEXtIDATIEND

tEXt with bytes that are not Latin-1 text. §11.3.3.1 restricts text to printable Latin-1 plus line feed; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

expected44 match
✓✓AA✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_ztxt-method-1png
IHDRzTXtIDATIEND

zTXt compression method 1. §11.3.3.3 defines only compression method 0; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

expected38 match
✓✓RRR✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_ztxt-bad-zlibpng
IHDRzTXtIDATIEND

zTXt whose zlib stream is garbage. §11.3.3.3 says the text is a zlib stream; a decoder should ignore a chunk whose stream is broken.

expected: recover, does not conform

spec: §10.3

expected39 match
✓✓AAR✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓
r_ztxt-bad-adlerpng
IHDRzTXtIDATIEND

zTXt with a wrong Adler-32. §11.3.3.3 says the text is a zlib stream; a decoder should ignore a chunk whose stream is broken.

expected: recover, does not conform

spec: §10.3

expected40 match
✓✓AAR✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_ztxt-no-nullpng
IHDRzTXtIDATIEND

zTXt without a null separator. §11.3.3.3 lays out zTXt as keyword, null, method, compressed text; a decoder should ignore one that doesn't fit.

expected: recover, does not conform

expected39 match
✓✓RRR✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓
r_ztxt-len-1png
IHDRzTXtIDATIEND

zTXt of one byte. §11.3.3.1 says a keyword is 1 to 79 bytes; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

spec: §11.3.2.3, §11.3.4.4

expected37 match
✓✓RRR✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓RR
r_ztxt-bombpng
IHDRzTXtIDATIEND

zTXt that inflates to 64 MiB of zeros (so its text holds NULs). §11.3.3.3 says the decompressed text follows tEXt's rules, so no nulls; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

spec: §11.3.3.2

expected39 match
✓✓AA✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓RR✓✓✓✓✓✓✓✓✓✓∞✓✓✓
r_itxt-flag-2png
IHDRiTXtIDATIEND

iTXt compression flag 2. §11.3.3.4 says the compression flag is 0 or 1; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

expected39 match
✓✓RRR✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓
r_itxt-method-1png
IHDRiTXtIDATIEND

iTXt compressed with method 1. §11.3.3.4 defines only compression method 0 for compressed text; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

expected40 match
✓✓RRR✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_itxt-bad-zlibpng
IHDRiTXtIDATIEND

iTXt compressed flag set, garbage stream. §11.3.3.4 says compressed text is a zlib stream; a decoder should ignore a chunk whose stream is broken.

expected: recover, does not conform

spec: §10.3

expected39 match
✓✓AAR✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓
r_itxt-bad-adlerpng
IHDRiTXtIDATIEND

iTXt compressed, with a wrong Adler-32. §11.3.3.4 says compressed text is a zlib stream; a decoder should ignore a chunk whose stream is broken.

expected: recover, does not conform

spec: §10.3

expected40 match
✓✓AAR✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_itxt-truncatedpng
IHDRiTXtIDATIEND

iTXt ending after the keyword. §11.3.3.4 lays out iTXt with three null separators; a decoder should ignore one that doesn't fit.

expected: recover, does not conform

expected35 match
✓✓RRR✓✓✓✓✓✓✓✓R✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓RR
r_itxt-bad-utf8png
IHDRiTXtIDATIEND

iTXt whose text is not UTF-8. §11.3.3.4 says the translated keyword and text are UTF-8; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

expected42 match
✓✓AAR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_itxt-language-numericpng
IHDRiTXtIDATIEND

iTXt with language tag 123, which is not a language tag. §11.3.3.4 says the language tag is a BCP 47 tag; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

expected44 match
✓✓AA✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_sbit-len-wrongpng
IHDRsBITIDATIEND

sBIT with 3 bytes on grayscale (should be 1). §13.2 says a decoder can handle a wrong length on an ancillary chunk by ignoring the chunk.

expected: recover, does not conform

expected40 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓RR✓✓✓✓✓✓✓✓
r_sbit-value-0png
IHDRsBITIDATIEND

sBIT 0. §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

expected41 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓
r_sbit-value-9png
IHDRsBITIDATIEND

sBIT 9 on an 8-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

expected41 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓
r_sbit-after-pltepng
IHDRPLTEsBITIDATIEND

sBIT after PLTE. Table 7 in §5.6 puts this chunk before PLTE and IDAT; §13.2 says a decoder should ignore a misplaced one.

expected: recover, does not conform

spec: Table 7

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_sbit-rgb16-17png
IHDRsBITIDATIEND

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
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓
r_bkgd-len-wrong-graypng
IHDRbKGDIDATIEND

bKGD of 1 byte on grayscale (should be 2). §13.2 says a decoder can handle a wrong length on an ancillary chunk by ignoring the chunk.

expected: recover, does not conform

expected40 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓RR✓✓✓✓✓✓✓✓
r_bkgd-len-wrong-rgbpng
IHDRbKGDIDATIEND

bKGD of 2 bytes on truecolor (should be 6). §13.2 says a decoder can handle a wrong length on an ancillary chunk by ignoring the chunk.

expected: recover, does not conform

expected40 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓RR✓✓✓✓✓✓✓✓
r_bkgd-pal-index-beyondpng
IHDRPLTEbKGDIDATIEND

bKGD index 36 for a 36-entry palette. §11.3.4.1 says the bKGD value of an indexed image is a palette index; a decoder should ignore one past the palette.

expected: recover, does not conform

expected42 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_bkgd-before-pltepng
IHDRbKGDPLTEIDATIEND

bKGD 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

expected40 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓RR✓✓✓✓✓✓
r_bkgd-after-idatpng
IHDRIDATbKGDIEND

bKGD after IDAT. 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

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_bkgd-gray-highbytepng
IHDRbKGDIDATIEND

bKGD 0x0180 on 8-bit grayscale. §11.3.4.1 says a decoder masks a bKGD value to the bit depth before using it.

expected: display, conforms

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_bkgd-len-4png
IHDRbKGDIDATIEND

bKGD of 4 bytes on grayscale (no color type uses 4). §13.2 says a decoder can handle a wrong length on an ancillary chunk by ignoring the chunk.

expected: recover, does not conform

expected38 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓RRR✓✓✓✓✓✓RR✓✓✓✓✓✓✓✓
r_hist-len-wrongpng
IHDRPLTEhISTIDATIEND

hIST with 2 entries for a 36-entry palette. §11.3.4.2 says hIST has one entry per palette entry; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_hist-before-pltepng
IHDRhISTPLTEIDATIEND

hIST 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

expected41 match
✓✓RR✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓RR✓✓✓
r_hist-without-pltepng
IHDRhISTIDATIEND

hIST in an image with no palette. §11.3.4.2 says hIST has one entry per palette entry; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

expected42 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓RR✓✓✓
r_splt-depth-7png
IHDRsPLTIDATIEND

sPLT sample depth 7 (defined: 8, 16). §11.3.4.4 says the sPLT sample depth is 8 or 16; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_splt-len-wrongpng
IHDRsPLTIDATIEND

sPLT whose entries are not a whole number of 6-byte records. §11.3.4.4 says sPLT entries are 6 or 10 bytes each; a decoder should ignore a chunk whose length doesn't divide.

expected: recover, does not conform

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_splt-no-nullpng
IHDRsPLTIDATIEND

sPLT without a null separator. §11.3.4.4 lays out sPLT as name, null, depth, entries; a decoder should ignore one that doesn't fit.

expected: recover, does not conform

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_splt-dup-namepng
IHDRsPLT ×2IDATIEND

two sPLT chunks with the same name. §11.3.4.4 says each sPLT has a different name; a decoder should ignore the later duplicate.

expected: recover, does not conform

expected44 match
✓✓AA✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_splt-after-idatpng
IHDRIDATsPLTIEND

sPLT after IDAT. Table 7 in §5.6 puts this chunk before IDAT; a decoder should ignore a misplaced one.

expected: recover, does not conform

spec: Table 7

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_iccp-method-1png
IHDRiCCPIDATIEND

iCCP compression method 1. §11.3.2.3 defines only compression method 0; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

expected36 match
✓✓RR✓RRR✓✓✓✓✓✓✓✓✓✓R✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_iccp-name-emptypng
IHDRiCCPIDATIEND

iCCP with an empty profile name. §11.3.3.1 says a keyword is 1 to 79 bytes; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

spec: §11.3.2.3, §11.3.4.4

expected40 match
✓✓RR✓R✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_iccp-name-80png
IHDRiCCPIDATIEND

iCCP profile name of 80 characters. §11.3.3.1 says a keyword is 1 to 79 bytes; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

spec: §11.3.2.3, §11.3.4.4

expected38 match
✓✓RR✓RRR✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_iccp-no-nullpng
IHDRiCCPIDATIEND

iCCP without a null separator. §11.3.2.3 lays out iCCP as name, null, method, profile; a decoder should ignore one that doesn't fit.

expected: recover, does not conform

expected37 match
✓✓RR✓R✓✓✓✓✓✓✓✓✓✓✓✓R✓✓RR✓✓✓✓✓✓✓✓✓✓R✓✓✓
r_iccp-profile-emptypng
IHDRiCCPIDATIEND

iCCP whose profile decompresses to 0 bytes. §11.3.2.3 says the decompressed data is an ICC profile; a decoder should ignore one that isn't.

expected: recover, does not conform

expected42 match
✓✓AA✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_iccp-profile-garbagepng
IHDRiCCPIDATIEND

iCCP whose profile is not an ICC profile. §11.3.2.3 says the decompressed data is an ICC profile; a decoder should ignore one that isn't.

expected: recover, does not conform

expected44 match
✓✓AA✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_iccp-bad-zlib-headerpng
IHDRiCCPIDATIEND

iCCP whose zlib header is invalid. §11.3.2.3 says the profile is a zlib stream; a decoder should ignore a chunk whose stream is broken.

expected: recover, does not conform

spec: §10.3

expected38 match
✓✓AA✓RRR✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_iccp-bad-adlerpng
IHDRiCCPIDATIEND

iCCP with a wrong Adler-32. §11.3.2.3 says the profile is a zlib stream; a decoder should ignore a chunk whose stream is broken.

expected: recover, does not conform

spec: §10.3

expected40 match
✓✓AA✓✓RR✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_iccp-truncated-zlibpng
IHDRiCCPIDATIEND

iCCP whose zlib stream stops halfway. §11.3.2.3 says the profile is a zlib stream; a decoder should ignore a chunk whose stream is broken.

expected: recover, does not conform

spec: §10.3

expected40 match
✓✓AA✓R✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_iccp-after-pltepng
IHDRPLTEiCCPIDATIEND

iCCP after PLTE. Table 7 in §5.6 puts this chunk before PLTE and IDAT; §13.2 says a decoder should ignore a misplaced one.

expected: recover, does not conform

spec: Table 7

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_iccp-duppng
IHDRiCCP ×2IDATIEND

two iCCP chunks. Table 7 in §5.6 allows this chunk once; a decoder should ignore the second.

expected: recover, does not conform

spec: Table 7, §13.1

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_iccp-bombpng
IHDRiCCPIDATIEND

iCCP that inflates to 64 MiB. §11.3.2.3 says the decompressed data is an ICC profile; a decoder should ignore one that isn't.

expected: recover, does not conform

expected38 match
✓✓AA✓✓RR✓✓✓✓✓✓✓✓✓✓R✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_exif-len-0png
IHDReXIfIDATIEND

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
✓✓AA✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_exif-garbagepng
IHDReXIfIDATIEND

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
✓✓AA✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_exif-tiff-header-onlypng
IHDReXIfIDATIEND

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
✓✓AA✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_exif-bad-ifd-offsetpng
IHDReXIfIDATIEND

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
✓✓AA✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_exif-after-idatpng
IHDRIDATeXIfIEND

eXIf after IDAT (table 7: before IDAT). Table 7 in §5.6 puts this chunk before IDAT; a decoder should ignore a misplaced one.

expected: recover, does not conform

spec: Table 7

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_cicp-len-3png
IHDRcICPIDATIEND

cICP with 3 bytes. §13.2 says a decoder can handle a wrong length on an ancillary chunk by ignoring the chunk.

expected: recover, does not conform

expected41 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓R
r_cicp-primaries-200png
IHDRcICPIDATIEND

cICP color primaries 200, a code point H.273 reserves. §11.3.2.6 takes the color primaries from H.273, which reserves this value; §13.2 says a decoder can ignore the chunk.

expected: recover, does not conform

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_cicp-transfer-200png
IHDRcICPIDATIEND

cICP transfer characteristics 200, a code point H.273 reserves. §11.3.2.6 takes the transfer function from H.273, which reserves this value; §13.2 says a decoder can ignore the chunk.

expected: recover, does not conform

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_cicp-matrix-1png
IHDRcICPIDATIEND

cICP matrix coefficients 1 (PNG requires 0). §11.3.2.6 says the matrix coefficients are 0, since PNG is RGB only; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

expected42 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓RR✓✓✓✓✓✓
r_cicp-range-2png
IHDRcICPIDATIEND

cICP video full range flag 2. §11.3.2.6 says the full-range flag is 0 or 1; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

expected42 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓RR✓✓✓✓✓✓
r_cicp-after-pltepng
IHDRPLTEcICPIDATIEND

cICP after PLTE. Table 7 in §5.6 puts this chunk before PLTE and IDAT; §13.2 says a decoder should ignore a misplaced one.

expected: recover, does not conform

spec: Table 7

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_mdcv-len-wrongpng
IHDRcICPmDCVIDATIEND

mDCV with 20 bytes (should be 24), with the cICP it must accompany. §13.2 says a decoder can handle a wrong length on an ancillary chunk by ignoring the chunk.

expected: recover, does not conform

expected42 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_clli-len-wrongpng
IHDRcLLIIDATIEND

cLLI with 6 bytes (should be 8). §13.2 says a decoder can handle a wrong length on an ancillary chunk by ignoring the chunk.

expected: recover, does not conform

expected41 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓R
r_actl-len-7png
IHDRacTLIDATIEND

acTL with 7 bytes and no frame control chunks: a still image with a broken animation header. §11.3.6.1 says acTL is 8 bytes; a decoder should ignore it otherwise and show the static image.

expected: recover, does not conform

spec: §13.2

expected33 match
✓✓RR✓✓✓✓✓✓✓✓✓R✓✓✓✓✓RRRR✓✓✓✓✓✓✓✓✓RRRR✓
r_actl-frames-0png
IHDRacTLIDATIEND

acTL declaring 0 frames and no fcTL: the default image is all there is. §11.3.6.1 says 0 is not a valid frame count; §13.1 says a decoder should fall back to the static image.

expected: recover, does not conform

expected38 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓RR✓✓✓✓✓✓✓✓✓✓✓RRR✓✓
r_actl-after-idatpng
IHDRIDATacTLIEND

acTL after IDAT, no fcTL. §11.3.6.1 says acTL comes before IDAT; a decoder should ignore a late one and show the static image.

expected: recover, does not conform

spec: §5.6

expected42 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓RR✓✓✓
r_fctl-len-25png
IHDRacTLfcTLIDATIEND

fcTL of 25 bytes before IDAT. §11.3.6.2 says fcTL is 26 bytes; a decoder should ignore it otherwise and show the static image.

expected: recover, does not conform

spec: §13.2

expected28 match
195 of 195 pixels differ1: upng-head
✓✓RR✓✓RR✓✓✓✓✓R✓✓✓✓✓RRRR✓✓✓✓✓✓RR✓!≠RRR
r_fctl-len-0png
IHDRacTLfcTLIDATIEND

fcTL of 0 bytes before IDAT. §11.3.6.2 says fcTL is 26 bytes; a decoder should ignore it otherwise and show the static image.

expected: recover, does not conform

spec: §13.2

expected27 match
✓✓RR✓✓RR✓✓✓✓✓R✓✓R✓✓RRRR✓✓✓✓✓✓RR✓∞∞RRR
r_fctl-dims-mismatchpng
IHDRacTLfcTLIDATIEND

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
✓✓RR✓✓RR✓✓✓✓✓R✓✓✓✓✓✓✓RR✓✓✓✓✓✓RR✓!≠≠RR
r_fctl-dispose-3png
IHDRacTLfcTLIDATIEND

fcTL for the IDAT frame with dispose_op 3, which is undefined. §11.3.6.2 defines dispose_op 0, 1 and 2; §13.1 says a decoder should fall back to the static image.

expected: recover, does not conform

expected35 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓R✓✓RR✓✓✓✓✓✓✓✓RR✓✓✓RRR
r_fdat-without-fctlpng
IHDRIDATacTLfdATIEND

acTL after IDAT, fdAT with no fcTL. §11.3.6.1 says acTL comes before IDAT; a decoder should ignore a late one and show the static image.

expected: recover, does not conform

spec: §5.6

expected40 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓RR✓✓✓✓✓✓✓✓✓RR✓✓✓
y_chunk-idotpng
IHDRiDOTIDAT ×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-1png
IHDRiDOTIDATIEND

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-3png
IHDRiDOTIDAT ×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-srgbpng
IHDRsRGBiDOTIDAT ×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-srgbpng
IHDRiDOTsRGBIDAT ×2IEND

iDOT, then sRGB: the first offset is 53.

expected: display, conforms; strict: idot#public-name

expected44 match
✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_chunk-idot-stalepng
IHDRiDOTIDATIEND

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
✓✓RA✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_chunk-idot-shortpng
IHDRiDOTIDAT ×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
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_chunk-idot-emptypng
IHDRiDOTIDAT ×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
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_apng-idat-is-framepng
IHDRacTLfcTLIDATfcTLfdATIEND

acTL(2, 0); fcTL 13x15 before IDAT, so the IDAT image is frame 1; frame 2 is the picture's top-left 6x7 at (3, 4). §4.9.1 says an fcTL before IDAT makes the static image the first frame.

expected: display, conforms

spec: §11.3.6.3, §4.9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_apng-idat-not-framepng
IHDRacTLIDATfcTLfdATIEND

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
✓✓✓✓✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓!≠≠✓✓
y_apng-frames-8png
IHDRacTLfcTLIDATfcTLfdATfcTLfdATfcTLfdATfcTLfdATfcTLfdATfcTLfdATfcTLfdATIEND

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
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_apng-frame-bottom-rightpng
IHDRacTLfcTLIDATfcTLfdATIEND

frame 2 is the picture's top-left 5x5 at (8, 10): its region touches the right and bottom edges.

expected: display, conforms

spec: §11.3.6.2, §4.9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_apng-dispose-backgroundpng
IHDRacTLfcTLIDATfcTLfdATIEND

as apng-idat-is-frame, with dispose_op 1 (background) on the IDAT frame.

expected: display, conforms

spec: §11.3.6.2, §4.9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_apng-dispose-previouspng
IHDRacTLfcTLIDATfcTLfdATIEND

as apng-idat-is-frame, with dispose_op 2 (previous) on the IDAT frame, the first frame (treated as background).

expected: display, conforms

spec: §11.3.6.2, §4.9.2

expected43 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓
y_apng-blend-overpng
IHDRacTLfcTLIDATfcTLfdATIEND

as apng-idat-is-frame, with blend_op 1 (over) on frame 2.

expected: display, conforms

spec: §11.3.6.2, §4.9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_apng-delay-zeropng
IHDRacTLfcTLIDATfcTLfdATIEND

as apng-idat-is-frame, with delay_num 0 on both frames.

expected: display, conforms

spec: §11.3.6.2, §4.9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_apng-delay-den-zeropng
IHDRacTLfcTLIDATfcTLfdATIEND

as apng-idat-is-frame, with delay_den 0 on both frames (it means 100).

expected: display, conforms

spec: §11.3.6.2, §4.9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_apng-num-plays-3png
IHDRacTLfcTLIDATfcTLfdATIEND

as apng-idat-is-frame, with acTL(2, 3): three plays.

expected: display, conforms

spec: §11.3.6.2, §4.9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_apng-fdat-splitpng
IHDRacTLfcTLIDATfcTLfdAT ×3IEND

as apng-idat-is-frame, with frame 2's zlib stream in three fdAT chunks, sequence numbers 2, 3, 4.

expected: display, conforms

spec: §11.3.6.2, §4.9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_apng-p8-trnspng
IHDRPLTEacTLtRNSfcTLIDATfcTLfdATIEND

as apng-idat-is-frame on p8 with tRNS 00: entry 0 transparent in every frame.

expected: display, conforms

spec: §11.3.1.1, §11.3.6.3, §4.9.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_apng-g1png
IHDRacTLfcTLIDATfcTLfdATIEND

as apng-idat-is-frame on g1. 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

expected41 match
94 of 195 pixels differ1: upng
✓✓✓✓✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓
y_apng-rgb8png
IHDRacTLfcTLIDATfcTLfdATIEND

as apng-idat-is-frame on rgb8. 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

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_apng-rgba16png
IHDRacTLfcTLIDATfcTLfdATIEND

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-zeropng
IHDRacTLfcTLIDATfcTLfdATIEND

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
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓RR✓✓✓✓✓✓RR✓✓✓R✓✓
r_apng-sequence-gappng
IHDRacTLfcTLIDATfcTLfdATIEND

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
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_apng-sequence-out-of-orderpng
IHDRacTLfcTLIDATfcTLfdATIEND

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
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_apng-num-frames-morepng
IHDRacTLfcTLIDATfcTLfdATIEND

acTL says 3 frames, there are two fcTL. §11.3.6.1 says the frame count matches the fcTL chunks; §13.1 says a decoder should fall back to the static image.

expected: recover, does not conform

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_apng-num-frames-fewerpng
IHDRacTLfcTLIDATfcTLfdATIEND

acTL says 1 frame, there are two fcTL. §11.3.6.1 says the frame count matches the fcTL chunks; §13.1 says a decoder should fall back to the static image.

expected: recover, does not conform

expected44 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_apng-fctl-without-actlpng
IHDRIDATfcTLfdATIEND

fcTL and fdAT after IDAT with no acTL: not an APNG, the IDAT image is all there is. §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

expected42 match
✓✓AA✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓RR✓✓✓
r_apng-fctl-without-fdatpng
IHDRacTLfcTLIDATfcTLIEND

acTL(2, 0) and a second fcTL after IDAT with no fdAT: frame 2 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

expected42 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓RR✓✓✓
r_apng-actl-duppng
IHDRacTL ×2fcTLIDATfcTLfdATIEND

as apng-idat-is-frame with its acTL twice. Table 7 in §5.6 allows this chunk once; a decoder should ignore the second.

expected: recover, does not conform

spec: Table 7, §13.1

expected42 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓
r_apng-fctl-uint31png
IHDRacTLfcTLIDATfcTLIEND

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
✓✓RR✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓RR✓✓✓✓✓✓✓✓✓RR✓✓✓
r_apng-two-fctl-before-idatpng
IHDRacTLfcTL ×2IDATIEND

acTL(2, 0) and two fcTL for the full image before IDAT: only one may precede IDAT. Table 7 in §5.6 allows one fcTL before IDAT; §13.1 says a decoder should fall back to the static image.

expected: recover, does not conform

spec: Table 7

expected38 match
✓✓RR✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓RRR✓✓
r_apng-frame-outsidepng
IHDRacTLfcTLIDATfcTLfdATIEND

frame 2 is 6x7 at (9, 10): past the right and bottom edges. §11.3.6.2 says a frame fits inside the image; §13.1 says a decoder should fall back to the static image.

expected: recover, does not conform

expected42 match
✓✓RR✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_apng-frame-zero-sizepng
IHDRacTLfcTLIDATfcTLfdATIEND

frame 2's fcTL has width 0, its fdAT an empty zlib stream. §11.3.6.2 says a frame's width and height are nonzero; §13.1 says a decoder should fall back to the static image.

expected: recover, does not conform

expected42 match
✓✓RR✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_apng-fdat-bad-adlerpng
IHDRacTLfcTLIDATfcTLfdATIEND

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
✓✓AA✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓
r_apng-fdat-emptypng
IHDRacTLfcTLIDATfcTLfdAT ×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
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓RR✓R✓
i_apng-truncated-fdatpng
IHDRacTLfcTLIDATfcTLfdAT

as apng-idat-is-frame, cut off in the middle of frame 2's fdAT: no IEND. §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

expected15 match
✓✓RRRR✓✓RRRRRR✓RR✓RRR✓✓RRRRRR✓✓RR✓✓R✓
y_apng-idat-not-frame-3png
IHDRacTLIDATfcTLfdATfcTLfdATfcTLfdATIEND

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
✓✓✓✓✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓!≠≠✓✓
r_apng-fdat-no-fctlpng
IHDRacTLIDATfdATIEND

acTL(1, 0), IDAT, then an fdAT with no fcTL anywhere: the frame count is off too. §11.3.6.3 says every frame has exactly one fcTL; §13.1 says a decoder should fall back to the static image.

expected: recover, does not conform

spec: §11.3.6.2

expected36 match
✓✓RR✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓✓RR✓✓✓✓✓✓✓✓✓RRR✓✓
r_apng-fctl-fctl-fdatpng
IHDRacTLIDATfcTL ×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
✓✓RR✓✓≠≠✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓!≠R✓✓
r_apng-actl-uint31png
IHDRacTLfcTLIDATfcTLfdATIEND

acTL num_frames 2^31 + 1: out of range, so the acTL is ignored and the fcTL chunks have none. §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

expected43 match
✓✓RR✓✓✓✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_apng-fctl-before-idat-no-actlpng
IHDRfcTLIDATIEND

an fcTL for the IDAT image, before IDAT, with no acTL. §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

expected44 match
✓✓AA✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_apng-fctl-region-before-idat-no-actlpng
IHDRfcTLIDATIEND

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
✓✓RR✓✓✓✓✓✓✓✓✓R✓✓✓✓✓✓✓RR✓✓✓✓✓✓RR✓✓✓✓RR
y_sbit-g8-4png
IHDRsBITIDATIEND

g8 with sBIT 4: informational, the samples decode as stored.

expected: display, conforms

spec: §11.3.2.4

expected43 match
157 of 195 pixels differ1: pypng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓✓✓✓✓✓
y_sbit-rgb16-565png
IHDRsBITIDATIEND

rgb16 with sBIT 5 6 5: informational, the samples decode as stored.

expected: display, conforms

spec: §11.3.2.4

expected37 match
matches the reference; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head
192 of 195 pixels differ1: pypng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓✓✓✓✓✓
y_sbit-rgb8-555png
IHDRsBITIDATIEND

rgb8 with sBIT 5 5 5: informational, the samples decode as stored.

expected: display, conforms

spec: §11.3.2.4

expected43 match
192 of 195 pixels differ1: pypng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓✓✓✓✓✓
y_sbit-p8-444png
IHDRsBITPLTEIDATIEND

p8 with sBIT 4 4 4: informational, the samples decode as stored.

expected: display, conforms

spec: §11.3.2.4

expected43 match
192 of 195 pixels differ1: pypng
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠✓✓✓✓✓✓✓✓✓
y_sbit-ga8-4-4png
IHDRsBITIDATIEND

ga8 with sBIT 4 4: informational, the samples decode as stored.

expected: display, conforms

spec: §11.3.2.4

expected41 match
166 of 195 pixels differ3: pypng, pngtopam, pngtopam-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓≠≠≠✓✓✓✓✓✓✓✓✓
y_sbit-rgba16-888-8png
IHDRsBITIDATIEND

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-g8png
IHDRbKGDIDATIEND

g8 with bKGD the picture's commonest gray, 149: a decoder must not composite onto it.

expected: display, conforms

spec: §11.3.4.1

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_bkgd-g16png
IHDRbKGDIDATIEND

g16 with bKGD the picture's commonest gray, 8687: a decoder must not composite onto it.

expected: display, conforms

spec: §11.3.4.1

expected40 match
matches the reference; 16→8 high byte4: upng, chunky_png, upng-head, chunky_png-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_bkgd-rgb8png
IHDRbKGDIDATIEND

rgb8 with bKGD the top-left pixel's color (13, 31, 128): a decoder must not composite onto it.

expected: display, conforms

spec: §11.3.4.1

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_bkgd-rgb16png
IHDRbKGDIDATIEND

rgb16 with bKGD the top-left pixel's color (3277, 7864, 32768): a decoder must not composite onto it.

expected: display, conforms

spec: §11.3.4.1

expected38 match
matches the reference; 16→8 high byte6: upng, pillow, chunky_png, upng-head, pillow-head, chunky_png-head
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_bkgd-p8png
IHDRPLTEbKGDIDATIEND

p8 with bKGD palette index 0: a decoder must not composite onto it.

expected: display, conforms

spec: §11.3.4.1

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_bkgd-ga8png
IHDRbKGDIDATIEND

ga8 with bKGD gray 34, the commonest gray: a decoder must not composite onto it.

expected: display, conforms

spec: §11.3.4.1

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_bkgd-rgba8png
IHDRbKGDIDATIEND

rgba8 with bKGD the top-left pixel's color (13, 31, 128): a decoder must not composite onto it.

expected: display, conforms

spec: §11.3.4.1

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_bkgd-trns-g8png
IHDRtRNSbKGDIDATIEND

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

spec: §11.3.4.1, §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_bkgd-trns-rgb8png
IHDRtRNSbKGDIDATIEND

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

spec: §11.3.4.1, §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_bkgd-trns-p8png
IHDRPLTEtRNSbKGDIDATIEND

p8 with bKGD index 0, tRNS 00: the tRNS pixels have alpha 0, and a decoder that composites onto the background shows them opaque.

expected: display, conforms

spec: §11.3.4.1, §11.3.1.1

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_iccp-rgbpng
IHDRiCCPIDATIEND

iCCP holding an RGB profile on rgb8; the profile is a 132-byte header with an empty tag table, so it maps nothing.

expected: display, conforms

spec: §11.3.2.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_iccp-gray-on-graypng
IHDRiCCPIDATIEND

iCCP holding a GRAY profile on g8; the profile is a 132-byte header with an empty tag table, so it maps nothing.

expected: display, conforms

spec: §11.3.2.3

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_iccp-gray-on-rgbpng
IHDRiCCPIDATIEND

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
✓✓AA✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_iccp-cmyk-on-rgbpng
IHDRiCCPIDATIEND

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
✓✓AA✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_iccp-rgb-on-graypng
IHDRiCCPIDATIEND

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
✓✓AA✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_text-largepng
IHDRtEXtIDATIEND

one tEXt holding 1 MiB of 'a'.

expected: display, conforms

spec: §11.3.3.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_itxt-largepng
IHDRiTXtIDATIEND

one uncompressed iTXt holding 1 MiB of 'a'.

expected: display, conforms

spec: §11.3.3.4

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
r_itxt-null-in-textpng
IHDRiTXtIDATIEND

iTXt whose text holds a NUL. §11.3.3.4 says neither the translated keyword nor the text may contain a null; a decoder should ignore the chunk otherwise.

expected: recover, does not conform

expected44 match
✓✓AA✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_exif-validpng
IHDReXIfIDATIEND

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-6png
IHDReXIfIDATIEND

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_hist-validpng
IHDRPLTEhISTIDATIEND

p8 with a hIST giving each palette entry its pixel count (all nonzero).

expected: display, conforms

spec: §11.3.4.2

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_mdcv-clli-validpng
IHDRcICPmDCVcLLIIDATIEND

cICP 9 16 0 1 (BT.2020, PQ, full range), mDCV with BT.2020 primaries, D65, 1000 and 0.0001 cd/m2, and cLLI 1000 and 400 cd/m2; the samples decode as stored.

expected: display, conforms

spec: §11.3.2.7, §11.3.2.8

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
y_trns-adam7-g1-whitepng
IHDRtRNSIDATIEND

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

spec: §11.3.1.1, §13.10

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-midpng
IHDRtRNSIDATIEND

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

spec: §11.3.1.1, §13.10

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-midpng
IHDRtRNSIDATIEND

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

spec: §11.3.1.1, §13.10

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-midpng
IHDRtRNSIDATIEND

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

spec: §11.3.1.1, §13.10

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-midpng
IHDRtRNSIDATIEND

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

spec: §11.3.1.1, §13.10

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-midpng
IHDRtRNSIDATIEND

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

spec: §11.3.1.1, §13.10

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-midpng
IHDRtRNSIDATIEND

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

spec: §11.3.1.1, §13.10

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✓✓✓✓✓✓≠✓≠✓
y_trns-adam7-p8-entry0png
IHDRPLTEtRNSIDATIEND

interlaced p8, random filter per scanline, tRNS of one byte 0: entry 0 transparent. §8.1 says decoders are required to read interlaced images.

expected: display, conforms

spec: §11.3.1.1, §13.10

expected44 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓
i_dims-huge-short-datapng
IHDRPLTEIDATIEND

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

RRAAR∞RR∞RRRRRRRRR∞RRRRRRRR!!RRR∞∞∞RR
i_dims-huge-short-data-adam7png
IHDRPLTEIDATIEND

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

RRAA∞∞RR∞RRRRRRRRR∞RRRRRRRR∞∞RRR∞∞RRR
i_dims-tall-short-datapng
IHDRIDATIEND

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
RRAARRRRRRRR⧗ARRRRRRRAAAARR!!RRRAARRR
y_dims-wide-32768png
IHDRIDATIEND

32768x1 rgba8: the picture's top row (sky, the fade at its right) repeated across; one zlib stream. Table 12 in §11.2.1 lists this combination, and decoders must support every one.

expected: display, conforms

spec: Table 12, §15.3.3

32768×1expected42 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓RR
y_dims-tall-32768png
IHDRIDATIEND

1x32768 rgba8: the picture's left column repeated down; one zlib stream. Table 12 in §11.2.1 lists this combination, and decoders must support every one.

expected: display, conforms

spec: Table 12, §15.3.3

1×32768expected42 match
✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓RR
n_chunk-cgbipng
CgBIIHDRIDATIEND

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
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRARARRR
n_signature-wrongpng
signatureIHDRIDATIEND

first signature byte 0x88 instead of 0x89. §5.2 says a decoder should check all eight signature bytes, so that's a fatal error.

expected: must-reject, does not conform

spec: §13.1

RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
n_signature-shortpng
signature

the first 4 signature bytes and nothing else. §5.2 says a decoder should check all eight signature bytes, so that's a fatal error.

expected: must-reject, does not conform

spec: §13.1

RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
i_iend-truncatedpng
IHDRIDATIEND

the datastream ends after IEND's type, before its CRC. §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

expected20 match
✓✓RRR✓RRRRRRR✓✓RR✓RRR✓✓RRRRRR✓✓✓✓✓✓R✓
n_plte-missing-palpng
IHDRIDATIEND

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

spec: §11.2.1, §5.6

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
RRRRRAAARRRRRRRRRRRRRAARRRRRRRRRRRRAR