/src/serenity/Userland/Libraries/LibGfx/ImageFormats/JPEGXLCommon.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (c) 2024, Lucas Chollet <lucas.chollet@serenityos.org> |
3 | | * |
4 | | * SPDX-License-Identifier: BSD-2-Clause |
5 | | */ |
6 | | |
7 | | #pragma once |
8 | | |
9 | | #include <AK/BitStream.h> |
10 | | #include <AK/FixedArray.h> |
11 | | #include <AK/String.h> |
12 | | |
13 | | namespace Gfx { |
14 | | /// 4.2 - Functions |
15 | | ALWAYS_INLINE i32 unpack_signed(u32 u) |
16 | 0 | { |
17 | 0 | if (u % 2 == 0) |
18 | 0 | return static_cast<i32>(u / 2); |
19 | 0 | return -static_cast<i32>((u + 1) / 2); |
20 | 0 | } |
21 | | /// |
22 | | |
23 | | /// B.2 - Field types |
24 | | // This is defined as a macro in order to get lazy-evaluated parameter |
25 | | // Note that the lambda will capture your context by reference. |
26 | | #define U32(d0, d1, d2, d3) \ |
27 | 0 | ({ \ |
28 | 0 | u8 const selector = TRY(stream.read_bits(2)); \ |
29 | 0 | auto value = [&, selector]() -> ErrorOr<u32> { \ |
30 | 0 | if (selector == 0) \ |
31 | 0 | return (d0); \ |
32 | 0 | if (selector == 1) \ |
33 | 0 | return (d1); \ |
34 | 0 | if (selector == 2) \ |
35 | 0 | return (d2); \ |
36 | 0 | if (selector == 3) \ |
37 | 0 | return (d3); \ |
38 | 0 | VERIFY_NOT_REACHED(); \ |
39 | 0 | }(); \ Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_size_header(AK::LittleEndianInputBitStream&)::$_0::operator()() const Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_size_header(AK::LittleEndianInputBitStream&)::$_1::operator()() const Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_bit_depth(AK::LittleEndianInputBitStream&)::$_0::operator()() const Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_bit_depth(AK::LittleEndianInputBitStream&)::$_1::operator()() const Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_metadata_header(AK::LittleEndianInputBitStream&)::$_0::operator()() const Unexecuted instantiation: _ZZN3Gfx9read_enumITkN2AK8Concepts4EnumENS_16ExtraChannelInfo16ExtraChannelTypeEEENS1_7ErrorOrIT_NS1_5ErrorEEERNS1_26LittleEndianInputBitStreamEENKUlvE_clEv Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_extra_channel_info(AK::LittleEndianInputBitStream&)::$_0::operator()() const Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_string(AK::LittleEndianInputBitStream&)::$_0::operator()() const Unexecuted instantiation: _ZZN3Gfx9read_enumITkN2AK8Concepts4EnumENS_14ColourEncoding11ColourSpaceEEENS1_7ErrorOrIT_NS1_5ErrorEEERNS1_26LittleEndianInputBitStreamEENKUlvE_clEv Unexecuted instantiation: _ZZN3Gfx9read_enumITkN2AK8Concepts4EnumENS_14ColourEncoding10WhitePointEEENS1_7ErrorOrIT_NS1_5ErrorEEERNS1_26LittleEndianInputBitStreamEENKUlvE_clEv Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_custom_xy(AK::LittleEndianInputBitStream&)::$_0::operator()() const::{lambda()#1}::operator()() const Unexecuted instantiation: _ZZN3Gfx9read_enumITkN2AK8Concepts4EnumENS_14ColourEncoding9PrimariesEEENS1_7ErrorOrIT_NS1_5ErrorEEERNS1_26LittleEndianInputBitStreamEENKUlvE_clEv Unexecuted instantiation: _ZZN3Gfx9read_enumITkN2AK8Concepts4EnumENS_14ColourEncoding16TransferFunctionEEENS1_7ErrorOrIT_NS1_5ErrorEEERNS1_26LittleEndianInputBitStreamEENKUlvE_clEv Unexecuted instantiation: _ZZN3Gfx9read_enumITkN2AK8Concepts4EnumENS_14ColourEncoding15RenderingIntentEEENS1_7ErrorOrIT_NS1_5ErrorEEERNS1_26LittleEndianInputBitStreamEENKUlvE_clEv Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_frame_header(AK::LittleEndianInputBitStream&, Gfx::SizeHeader, Gfx::ImageMetadata const&)::$_0::operator()() const Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_frame_header(AK::LittleEndianInputBitStream&, Gfx::SizeHeader, Gfx::ImageMetadata const&)::$_1::operator()() const Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_passes(AK::LittleEndianInputBitStream&)::$_0::operator()() const Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_frame_header(AK::LittleEndianInputBitStream&, Gfx::SizeHeader, Gfx::ImageMetadata const&)::$_2::operator()() const::{lambda()#1}::operator()() const Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_blending_info(AK::LittleEndianInputBitStream&, Gfx::ImageMetadata const&, bool)::$_0::operator()() const Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_blending_info(AK::LittleEndianInputBitStream&, Gfx::ImageMetadata const&, bool)::$_1::operator()() const Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_toc(AK::LittleEndianInputBitStream&, Gfx::FrameHeader const&, unsigned long, unsigned long)::$_0::operator()() const Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_modular_bitstream(AK::LittleEndianInputBitStream&, Gfx::ModularOptions&&)::$_0::operator()() const Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_transform_info(AK::LittleEndianInputBitStream&)::$_0::operator()() const Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_transform_info(AK::LittleEndianInputBitStream&)::$_1::operator()() const Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_transform_info(AK::LittleEndianInputBitStream&)::$_2::operator()() const Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_transform_info(AK::LittleEndianInputBitStream&)::$_3::operator()() const Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_transform_info(AK::LittleEndianInputBitStream&)::$_4::operator()() const Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_transform_info(AK::LittleEndianInputBitStream&)::$_5::operator()() const Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_squeeze_params(AK::LittleEndianInputBitStream&)::$_0::operator()() const Unexecuted instantiation: JPEGXLLoader.cpp:Gfx::read_squeeze_params(AK::LittleEndianInputBitStream&)::$_1::operator()() const Unexecuted instantiation: JPEGXLEntropyDecoder.cpp:Gfx::(anonymous namespace)::read_lz77(AK::LittleEndianInputBitStream&)::$_0::operator()() const Unexecuted instantiation: JPEGXLEntropyDecoder.cpp:Gfx::(anonymous namespace)::read_lz77(AK::LittleEndianInputBitStream&)::$_1::operator()() const |
40 | 0 | TRY(value); \ |
41 | 0 | }) |
42 | | |
43 | | ALWAYS_INLINE ErrorOr<u64> U64(LittleEndianInputBitStream& stream) |
44 | 0 | { |
45 | 0 | u8 const selector = TRY(stream.read_bits(2)); |
46 | 0 | if (selector == 0) |
47 | 0 | return 0; |
48 | 0 | if (selector == 1) |
49 | 0 | return 1 + TRY(stream.read_bits(4)); |
50 | 0 | if (selector == 2) |
51 | 0 | return 17 + TRY(stream.read_bits(8)); |
52 | | |
53 | 0 | VERIFY(selector == 3); |
54 | | |
55 | 0 | u64 value = TRY(stream.read_bits(12)); |
56 | 0 | u8 shift = 12; |
57 | 0 | while (TRY(stream.read_bits(1)) == 1) { |
58 | 0 | if (shift == 60) { |
59 | 0 | value += TRY(stream.read_bits(4)) << shift; |
60 | 0 | break; |
61 | 0 | } |
62 | 0 | value += TRY(stream.read_bits(8)) << shift; |
63 | 0 | shift += 8; |
64 | 0 | } |
65 | | |
66 | 0 | return value; |
67 | 0 | } |
68 | | |
69 | | ALWAYS_INLINE ErrorOr<f32> F16(LittleEndianInputBitStream& stream) |
70 | 0 | { |
71 | 0 | #if defined(OSS_FUZZ) |
72 | | // FIXME: Use the below code path on oss-fuzz once it supports _Float16. |
73 | 0 | (void)stream; |
74 | 0 | return Error::from_string_literal("oss-fuzz does not yet support _Float16"); |
75 | | #else |
76 | | u16 const bits16 = TRY(stream.read_bits(16)); |
77 | | auto const biased_exp = (bits16 >> 10) & 0x1F; |
78 | | VERIFY(biased_exp != 31); |
79 | | return bit_cast<_Float16>(bits16); |
80 | | #endif |
81 | 0 | } |
82 | | |
83 | | template<Enum E> |
84 | | ErrorOr<E> read_enum(LittleEndianInputBitStream& stream) |
85 | 0 | { |
86 | 0 | return static_cast<E>(U32(0, 1, 2 + TRY(stream.read_bits(4)), 18 + TRY(stream.read_bits(6)))); |
87 | 0 | } Unexecuted instantiation: _ZN3Gfx9read_enumITkN2AK8Concepts4EnumENS_16ExtraChannelInfo16ExtraChannelTypeEEENS1_7ErrorOrIT_NS1_5ErrorEEERNS1_26LittleEndianInputBitStreamE Unexecuted instantiation: _ZN3Gfx9read_enumITkN2AK8Concepts4EnumENS_14ColourEncoding11ColourSpaceEEENS1_7ErrorOrIT_NS1_5ErrorEEERNS1_26LittleEndianInputBitStreamE Unexecuted instantiation: _ZN3Gfx9read_enumITkN2AK8Concepts4EnumENS_14ColourEncoding10WhitePointEEENS1_7ErrorOrIT_NS1_5ErrorEEERNS1_26LittleEndianInputBitStreamE Unexecuted instantiation: _ZN3Gfx9read_enumITkN2AK8Concepts4EnumENS_14ColourEncoding9PrimariesEEENS1_7ErrorOrIT_NS1_5ErrorEEERNS1_26LittleEndianInputBitStreamE Unexecuted instantiation: _ZN3Gfx9read_enumITkN2AK8Concepts4EnumENS_14ColourEncoding16TransferFunctionEEENS1_7ErrorOrIT_NS1_5ErrorEEERNS1_26LittleEndianInputBitStreamE Unexecuted instantiation: _ZN3Gfx9read_enumITkN2AK8Concepts4EnumENS_14ColourEncoding15RenderingIntentEEENS1_7ErrorOrIT_NS1_5ErrorEEERNS1_26LittleEndianInputBitStreamE |
88 | | /// |
89 | | |
90 | | ErrorOr<ByteBuffer> read_icc(LittleEndianInputBitStream& stream); |
91 | | |
92 | | } |