From 4a95e55fb3a9225ebc1134f14c09c8f1c1fa8953 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Fri, 22 Mar 2024 15:21:51 -0400 Subject: [PATCH] LibGfx/ISOBMFF: Add JPEG2000CaptureResolutionBox --- .../ImageFormats/ISOBMFF/JPEG2000Boxes.cpp | 22 ++++++++++++++++++- .../ImageFormats/ISOBMFF/JPEG2000Boxes.h | 12 ++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibGfx/ImageFormats/ISOBMFF/JPEG2000Boxes.cpp b/Userland/Libraries/LibGfx/ImageFormats/ISOBMFF/JPEG2000Boxes.cpp index 49bb2700fdb..5bd95032726 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/ISOBMFF/JPEG2000Boxes.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/ISOBMFF/JPEG2000Boxes.cpp @@ -91,8 +91,10 @@ void JPEG2000ColorSpecificationBox::dump(String const& prepend) const ErrorOr JPEG2000ResolutionBox::read_from_stream(BoxStream& stream) { - auto make_subbox = [](BoxType type, BoxStream&) -> ErrorOr>> { + auto make_subbox = [](BoxType type, BoxStream& stream) -> ErrorOr>> { switch (type) { + case BoxType::JPEG2000CaptureResolutionBox: + return TRY(JPEG2000CaptureResolutionBox::create_from_stream(stream)); default: return OptionalNone {}; } @@ -107,6 +109,24 @@ void JPEG2000ResolutionBox::dump(String const& prepend) const SuperBox::dump(prepend); } +ErrorOr JPEG2000CaptureResolutionBox::read_from_stream(BoxStream& stream) +{ + vertical_capture_grid_resolution_numerator = TRY(stream.read_value>()); + vertical_capture_grid_resolution_denominator = TRY(stream.read_value>()); + horizontal_capture_grid_resolution_numerator = TRY(stream.read_value>()); + horizontal_capture_grid_resolution_denominator = TRY(stream.read_value>()); + vertical_capture_grid_resolution_exponent = TRY(stream.read_value()); + horizontal_capture_grid_resolution_exponent = TRY(stream.read_value()); + return {}; +} + +void JPEG2000CaptureResolutionBox::dump(String const& prepend) const +{ + Box::dump(prepend); + outln("{}- vertical_capture_grid_resolution = {}/{} * 10^{}", prepend, vertical_capture_grid_resolution_numerator, vertical_capture_grid_resolution_denominator, vertical_capture_grid_resolution_exponent); + outln("{}- horizontal_capture_grid_resolution = {}/{} * 10^{}", prepend, horizontal_capture_grid_resolution_numerator, horizontal_capture_grid_resolution_denominator, horizontal_capture_grid_resolution_exponent); +} + ErrorOr JPEG2000SignatureBox::read_from_stream(BoxStream& stream) { signature = TRY(stream.read_value>()); diff --git a/Userland/Libraries/LibGfx/ImageFormats/ISOBMFF/JPEG2000Boxes.h b/Userland/Libraries/LibGfx/ImageFormats/ISOBMFF/JPEG2000Boxes.h index f42aa58f5ab..9b1a56de506 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/ISOBMFF/JPEG2000Boxes.h +++ b/Userland/Libraries/LibGfx/ImageFormats/ISOBMFF/JPEG2000Boxes.h @@ -43,6 +43,18 @@ struct JPEG2000ResolutionBox final : public SuperBox { BOX_SUBTYPE(JPEG2000ResolutionBox); }; +// I.5.3.7.1 Capture Resolution box +struct JPEG2000CaptureResolutionBox final : public Box { + BOX_SUBTYPE(JPEG2000CaptureResolutionBox); + + u16 vertical_capture_grid_resolution_numerator { 0 }; + u16 vertical_capture_grid_resolution_denominator { 0 }; + u16 horizontal_capture_grid_resolution_numerator { 0 }; + u16 horizontal_capture_grid_resolution_denominator { 0 }; + i8 vertical_capture_grid_resolution_exponent { 0 }; + i8 horizontal_capture_grid_resolution_exponent { 0 }; +}; + struct JPEG2000SignatureBox final : public Box { BOX_SUBTYPE(JPEG2000SignatureBox);