RequireTruncatedTransparency called Decode and ignored the result, so any
result passed. Assert that Decode returns no image for the input cut in the
middle of its tRNS chunk, which is what the decoder returns today.
Checked with a mutant Decode that returns an image for this input: the test
aborts on the mutant, and the previous version of the test passes it.
RequireTruncatedTransparency compared the input buffer with a copy of
itself after calling Decode. Decode takes a read-only span, so that
comparison cannot fail and it tells the reader nothing. Remove it and
the copy it used. The decode call stays for now; the next commit makes
it an assertion.
A filter_type naming a subset of the PNG filters used only the first
filter of the mask, because stb's writer is either fully adaptive or
forced to one filter. Decoder::Png::Encode now takes the set of allowed
filter types, filters the rows and writes the chunks itself, and keeps
stb for deflate only. Output for the all-filters and single-filter
cases is unchanged.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
scePngEncQueryMemorySize, scePngEncCreate, scePngEncEncode and
scePngEncDelete encode R8G8B8A8 and B8G8R8A8 images with a pitch into
RGB or RGBA PNGs using the shared encoder in core/Decoder/Png.
Decoder::Png::Encode takes optional compression level and filter
options so the encode parameters are honoured.
Co-Authored-By: Claude <[email protected]>