Commit graph

618 commits

Author SHA1 Message Date
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
aada06757b LibGfx/JBIG2: Add early out to composite_bitbuffer()
The halftone region decoding procedure can draw patterns completely
outside the page bitmap. I haven't seen this in practice yet (not
many files use pattern/halftone segments), but it seems like it's
possible in theory and seems like a good thing to check for.
2024-04-08 06:27:51 +02:00
Nico Weber
438be7e2ca LibGfx/JBIG2: Implement halftone_region_decoding_procedure() and Annex C
Annex C describes how to read a grayscale bitmap with n bits per pixel:
It's encoded as n bilevel bitmaps, where each bilevel bitmap stores one
bit of the grayscale value (using a en.wikipedia.org/wiki/Gray_code,
which is named after Frank Gray and doesn't normally have much to do
with grayscale images).

A halftone region stores a grayscale bitmap and a linear coordinate
system the grayscale bitmap is in.  The grayscale bitmap is overlaid
the halftone region using the coordinate system, and each sample in
the grayscale bitmap is used as an index into a pattern dictionary
and the bitmap at that index is drawn at the current location.
This allows for efficient compression of ordered dithering
(but not error-diffusion dithering).

This does not yet implement halftone region decoding for MMR bitmaps.

The halftone region decoding procedure is the only way to call the
generic region decoding procedure with a skip pattern. This does
include code to compute the skip pattern, but support for that
is not yet implemented in the generic region decoding procedure,
so it'll error out when encountered. (I haven't yet found a file
using this feature, not a way to create such a file yet.)
2024-04-08 06:27:51 +02:00
Nico Weber
9d2c115c1c LibGfx/JBIG2: Implement decode_immediate_halftone_region()
...and stub out halftone_region_decoding_procedure().
2024-04-08 06:27:51 +02:00
Nico Weber
ca5b06cc4f LibGfx/JBIG2: Implement pattern_dictionary_decoding_procedure()
A pattern dictionary stores n bitmaps with the same dimensions w x h.
They're stored in a single bitmap of width `n * w` that's then cut
into n stripes.
2024-04-08 06:27:51 +02:00
Nico Weber
d27722ee00 LibGfx/JBIG2: Implement decode_pattern_dictionary()
It calls pattern_dictionary_decoding_procedure(), which is stubbed out.

No real behavior change yet.
2024-04-08 06:27:51 +02:00
Nico Weber
825b4d4e94 LibGfx/JBIG2: Tweak decode_immediate_generic_region()
Set context only for non-MMR.

No behavior change.
2024-04-08 06:27:51 +02:00
Lucas CHOLLET
cb5f30ae98 LibGfx/TIFF: Prevent recursion when following IFD pointers
Fixes oss-fuzz 66587.
https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=66587&sort=-opened&q=proj%3Aserenity%20TIFF&can=1
2024-04-07 06:45:38 +02:00
Nico Weber
2d4964b945 LibGfx/JBIG2: Support custom adaptive template pixels in refinement
The implementation is very similar to #23831.

I created the test exactly like in #23713, except that I replaced the
last four lines in the ini file with:

```
-txt -Param -rATX1 10
-txt -Param -rATY1 -1
-txt -Param -rATX2 4
-txt -Param -rATY2 15
```
2024-04-05 21:32:18 +02:00
Nico Weber
154d0bb458 LibGfx/JBIG2: Extract check_valid_adaptive_template_pixel()
No behavior change.
2024-04-05 21:32:18 +02:00
Nico Weber
a0a14296f9 LibGfx/JBIG2: Implement support for custom adaptive template pixels
...in the generic region decoding procedure (not yet in the generic
refinement region procedure). Not yet for EXTTEMPLATE though.

I haven't seen these being used in the wild, but:
* I want to optimize this code some, and it's probably good if it
  is feature complete (and well-tested) before being optimized
* Other PDF engines implement support for this
* The Pattern/Halftone feature (which we don't yet implement either,
  but which I'd like to implement because see previous two bullets)
  calls the generic region decoding procedure with custom adaptive
  template pixels
2024-04-04 11:44:50 -04:00
Nico Weber
7b5852bf91 LibGfx/JBIG2: Fix rendering of transposed text
The current code was incorrect for non-TopRight reference corners.
Fixes rendering of ghostpdl/tests/jbig2/042_19.jb2.
2024-04-03 11:40:25 -04:00
Nico Weber
b31e3fe573 LibGfx/JBIG2: Add some debug logging for text segments 2024-04-03 11:40:25 -04:00
Nico Weber
b130e36330 LibGfx/JBIG2: Add spaces to some spec comments 2024-04-03 11:40:25 -04:00
Nico Weber
b04569c1da LibGfx/JBIG2: Implement support for transposed text regions
Only the coordinates get transposed -- the bitmaps apparently don't.
And all the prose amounts to "if the transposed bit is set, swap
instance s and t coordinates before painting", as far as I can tell.

Makes pages 3/4 and 7/8 in 0001346.pdf render. (But here the feature
isn't used to render transposed text -- it just has stripes that keep s
roughy constant, which would normally produce vertical runs but here
produces regular horizontal runs. It's not clear to me why this feature
is used for these pages!)
2024-04-01 14:41:17 +02:00
Nico Weber
ca6ebedf58 LibGfx/JBIG2: Simplify non-transposed text region coordinate math
If the origin is on the right, we need to subtract width - 1 from s,
if it's on top bottom, we need to subtract height - 1 from t.

No behavior change.
2024-04-01 14:41:17 +02:00
Nico Weber
43752a1ff8 LibGfx/JBIG2: Remove a now-unneeded void cast
We've been reading `segment_page_association_size_is_32_bits` a bit
further down for a while now.

No behavior change.
2024-04-01 08:27:10 +01: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
578f301017 LibGfx/ISOBMFF: Print box type if a box fails to consume all its data 2024-03-30 10:01:07 +01:00
Nico Weber
5a43fc83bd LibGfx/JBIG2Loader: Add a short comment with spec history
I found this interesting, and it also explains e.g. why some
of the step numbers in 6.4 Text Region Decoding Procedure are off --
they added step 3) for COLEXTFLAG and forgot to update step references
to later steps.
2024-03-27 11:55:09 -04:00
Nico Weber
2e6626ae3b LibGfx/JBIG2: Tweak spec comment quote characters 2024-03-26 17:21:47 -04:00
Nico Weber
6842299959 LibGfx/JBIG2: Fix a comment typo 2024-03-26 17:21:47 -04:00
Nico Weber
6ff446fd30 LibGfx/JBIG2: Fix a comment typo 2024-03-26 17:21:47 -04:00
Nico Weber
a2a5fc76aa LibGfx/JBIG2: Don't assert on unexpected OOB values in the bitstream
This should only happen on either invalid inputs or if our code has
a bug (gasp!). Printing an error instead of asserting seems nicer.
2024-03-26 17:21:47 -04:00
Nico Weber
b3c423e4ca LibGfx/ISOBMFF: Implement JPEG2000DefaultDisplayResolutionBox
Found e.g. in http://opf-labs.org/format-corpus/jp2k-formats/balloon.jpf
2024-03-26 17:19:03 -04:00
Nico Weber
a9ef2fac01 LibGfx/ISOBMFF: Introduce JPEG2000ResolutionSubboxBase
No behavior change.
2024-03-26 17:19:03 -04:00
Nico Weber
a971625c49 LibGfx/ISOBMFF: Implement UserExtensionBox
.jpf (JPEG2000) files written by Photoshop contain a whole bunch of
these boxes.

fileformats.archiveteam.org/wiki/Boxes/atoms_format lists a few
UUID types. Of those 3, these are in Photoshop-written .jpf files:

* 0537cdab-9d0c-4431-a72a-fa561f2a113e Exif
* 2c4c0100-8504-40b9-a03e-562148d6dfeb Photoshop Image Resource
* be7acfcb-97a9-42e8-9c71-999491e3afac XMP
2024-03-26 17:19:03 -04: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
Nico Weber
1e95c08db5 LibGfx/ISOBMFF: Add JPEG2000ChannelDefinitionBox 2024-03-25 20:35:00 +01:00
Nico Weber
f080836127 LibGfx/ISOBMFF: Add JPEG2000URLBox 2024-03-25 20:35:00 +01:00
Nico Weber
c58996f4fc LibGfx/ISOBMFF: Add JPEG2000ContiguousCodestreamBox 2024-03-25 20:35:00 +01:00
Nico Weber
f372a9b346 LibGfx/ISOBMFF: Add JPEG2000UUIDListBox 2024-03-25 20:35:00 +01:00
Nico Weber
4a95e55fb3 LibGfx/ISOBMFF: Add JPEG2000CaptureResolutionBox 2024-03-25 20:35:00 +01:00
Nico Weber
b386d5bb14 LibGfx/ISOBMFF: Add JPEG2000ResolutionBox 2024-03-25 20:35:00 +01:00
Nico Weber
7d137dc480 LibGfx/ISOBMFF: Add JPEG2000UUIDInfoBox 2024-03-25 20:35:00 +01:00
Nico Weber
214ff799ce LibGfx/ISOBMFF: Add JPEG2000ColorSpecificationBox 2024-03-25 20:35:00 +01:00
Nico Weber
59bd378db8 LibGfx/ISOBMFF: Add JPEG2000ImageHeaderBox 2024-03-25 20:35:00 +01:00
Nico Weber
78deac3dca LibGfx/ISOBMFF: Give Reader::read_entire_file() a factory callback
This will allow creating different child boxes in different containers.
2024-03-25 20:35:00 +01:00
Nico Weber
b7a120c47e LibGfx/ISOBMFF: Remove Box::read_from_stream()
This doesn't have to be a virtual method: it's called from
various create_from_stream() methods that have a static type
that's created. There's no point in the virtual call here,
and it makes it harder to add additional parameters to
read_from_stream() in some subclasses.
2024-03-25 20:35:00 +01:00
Nico Weber
c84487ed2d LibGfx/ISOBMFF: Give JPEG2000HeaderBox its own type
...and make SuperBox a pure superclass that's not usable by itself.
2024-03-25 20:35:00 +01:00
Nico Weber
65bd090815 LibGfx/ISOBMFF: Start creating JPEG2000 box types
`isobmff` can now dump the id in a JPEG2000SignatureBox.
Creates JPEG2000Boxes.{h,cpp} to house JPEG2000 box types.
2024-03-25 20:35:00 +01:00
Nico Weber
a073b2d047 LibGfx/ISOBMFF: Read JPEG2000HeaderBox 2024-03-25 20:35:00 +01:00