Commit graph

23 commits

Author SHA1 Message Date
Nico Weber
f9fa41cadf LibGfx/JPEG2000: Use streams instead of manual offsets
No behavior change for valid images. More cryptic errors for invalid
images, but on the flipside quite a bit less code.
2024-04-10 10:51:04 -04:00
Nico Weber
2c9c996130 LibGfx/JPEG2000: Fix off-by-one in reading comment data 😬
For text, we always ended up with a leading \0 byte (on little-endian),
which prints as nothing. Since that's the only thing we do with this
data, no actual behavior change.
2024-04-10 10:51:04 -04:00
Nico Weber
b2d7c405cd LibGfx/JPEG2000: Remove needless "AK::" qualifiers 2024-04-10 10:51:04 -04:00
Nico Weber
f91d8472ee LibGfx/JPEG2000: Make unimplemented markers in tile-part header fatal 2024-04-09 15:52:00 -04:00
Nico Weber
dbe179f0d5 LibGfx/JPEG2000: Decode tile-part QCD and QCC marker segment data 2024-04-09 15:52:00 -04:00
Nico Weber
8ba7c23165 LibGfx/JPEG2000: Decode QCC marker segment data
I haven't seen any images that set this in the main header, but
Tests/LibGfx/test-inputs/jpeg2000/buggie-gray.jpf sets it in a tile-part
header.
2024-04-09 15:52:00 -04:00
Nico Weber
072457edd8 LibGfx/JPEG2000: Decode tile-part COM marker segment data
We don't do anything with this (except log the contents if
JPEG2000_DEBUG is 1).
2024-04-09 15:52:00 -04:00
Nico Weber
38be93c9a1 LibGfx/JPEG2000: Store some tile and tile part data on context 2024-04-09 15:52:00 -04:00
Nico Weber
0df01dea4a LibGfx/JPEG2000: Add two spec comments 2024-04-09 15:52:00 -04:00
Nico Weber
7b7ef7dcc7 LibGfx/JPEG2000: Allow COD, COC, QCD, QCC, RGN only in first tile-part
(The FIXME was incomplete, it didn't mention RGN also only being valid
in a tile's first tile-part header.)
2024-04-09 15:52:00 -04:00
Nico Weber
1df5c01bfb LibGfx/JPEG2000: Make unimplemented markers in main header fatal
We now implement decoding enough marker segments that we can do this.
2024-04-09 15:52:00 -04:00
Nico Weber
b9677be8a7 LibGfx/JPEG2000: Decode COM marker segment data
We don't do anything with this (except log the contents if
JPEG2000_DEBUG is 1).

The motivation is that we now decode all marker segments that are
used in all JPEG2000 files I've seen so far, allowing us to make
remaining unknown marker types fatal.
2024-04-09 15:52:00 -04:00
Nico Weber
e05791f5dd LibGfx/JPEG2000: Decode QCD marker segment data
We now decode all required main header marker segments :^)
2024-04-09 15:52:00 -04:00
Nico Weber
99c1c685fc LibGfx/JPEG2000: Decode COD marker segment data 2024-04-09 15:52:00 -04:00
Nico Weber
d8811a83c9 LibGfx/JPEG2000: Decode SIZ marker segment data 2024-04-09 15:52:00 -04:00
Nico Weber
259c3fc7d3 LibGfx/JPEG2000: Check tile_part_length ("Psot") validity 2024-04-09 15:52:00 -04:00
Nico Weber
1393719f10 LibGfx/JPEG2000: Fix typo in an error mesage 2024-04-09 10:19:21 +02:00
Nico Weber
6bad4ea275 LibGfx/JPEG2000: Add parsing loop for tile-part headers
We don't interpret most of the marker data yet.

(We do have to interpret the SOT header to be able to skip the
tile data.)
2024-04-09 10:19:21 +02:00
Nico Weber
9eae6b3a90 LibGfx/JPEG2000: Add parsing loop for main header
We don't interpret any of the marker data yet.
2024-04-09 10:19:21 +02:00
Nico Weber
6c9d3f8c46 LibGfx/JPEG2000: Add constants for markers 2024-04-09 10:19:21 +02:00
Nico Weber
ab7da32d25 LibGfx/JPEG2000: Support jpx extended 'colr' boxes
The T.800 spec says there should only be one 'colr' box, but the
extended jpx file format spec in T.801 annex M allows having multiple.

Method 2 is a basic ICC profile, while method 3 (jpx-only) allows full
ICC profiles. Support that.

For the test, I opened buggie.png in Photoshop, converted it to
grayscale, and saved it as a JPEG2000, with "JP2 Compatible" checked
and "Include Transparency" unchecked. I also unchecked "Include
Metadata", and "Lossless". I left "Fast Mode" checked and the quality
at the default 50.
2024-03-30 10:01:07 +01:00
Nico Weber
a92d887ee3 LibGfx/JPEG2000: Read file structure
This is enough for `file` to print the dimensions of .jp2 / .jpx files,
and for `icc` to print color profile information embedded in the
'colr' box.
2024-03-25 20:35:00 +01:00
Nico Weber
1ab28276f6 LibGfx: Add the start of a JPEG2000 loader
JPEG2000 is the last image format used in PDF filters that we
don't have a loader for. Let's change that.

This adds all the scaffolding, but no actual implementation yet.
2024-03-25 20:35:00 +01:00