Coverage Report

Created: 2025-09-05 06:52

/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
}