Skip to content

Commit 429467f

Browse files
nicoADKaster
authored andcommitted
LibGfx: Move ICC on-disk structs to new BinaryFormat.h
Removes some existing code duplication and allows future files to use these structs too.
1 parent 2a1cd84 commit 429467f

File tree

3 files changed

+113
-110
lines changed

3 files changed

+113
-110
lines changed
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
/*
2+
* Copyright (c) 2023, Nico Weber <thakis@chromium.org>
3+
*
4+
* SPDX-License-Identifier: BSD-2-Clause
5+
*/
6+
7+
#pragma once
8+
9+
#include <AK/Endian.h>
10+
#include <LibGfx/ICC/DistinctFourCC.h>
11+
#include <LibGfx/ICC/Profile.h>
12+
#include <LibGfx/ICC/TagTypes.h>
13+
14+
namespace Gfx::ICC {
15+
16+
// ICC V4, 4.2 dateTimeNumber
17+
// "All the dateTimeNumber values in a profile shall be in Coordinated Universal Time [...]."
18+
struct DateTimeNumber {
19+
BigEndian<u16> year;
20+
BigEndian<u16> month;
21+
BigEndian<u16> day;
22+
BigEndian<u16> hours;
23+
BigEndian<u16> minutes;
24+
BigEndian<u16> seconds;
25+
};
26+
27+
// ICC V4, 4.6 s15Fixed16Number
28+
using s15Fixed16Number = i32;
29+
30+
// ICC V4, 4.7 u16Fixed16Number
31+
using u16Fixed16Number = u32;
32+
33+
// ICC V4, 4.14 XYZNumber
34+
struct XYZNumber {
35+
BigEndian<s15Fixed16Number> x;
36+
BigEndian<s15Fixed16Number> y;
37+
BigEndian<s15Fixed16Number> z;
38+
39+
operator XYZ() const
40+
{
41+
return XYZ { x / (double)0x1'0000, y / (double)0x1'0000, z / (double)0x1'0000 };
42+
}
43+
};
44+
45+
// ICC V4, 7.2 Profile header
46+
struct ICCHeader {
47+
BigEndian<u32> profile_size;
48+
BigEndian<PreferredCMMType> preferred_cmm_type;
49+
50+
u8 profile_version_major;
51+
u8 profile_version_minor_bugfix;
52+
BigEndian<u16> profile_version_zero;
53+
54+
BigEndian<DeviceClass> profile_device_class;
55+
BigEndian<ColorSpace> data_color_space;
56+
BigEndian<ColorSpace> profile_connection_space; // "PCS" in the spec.
57+
58+
DateTimeNumber profile_creation_time;
59+
60+
BigEndian<u32> profile_file_signature;
61+
BigEndian<PrimaryPlatform> primary_platform;
62+
63+
BigEndian<u32> profile_flags;
64+
BigEndian<DeviceManufacturer> device_manufacturer;
65+
BigEndian<DeviceModel> device_model;
66+
BigEndian<u64> device_attributes;
67+
BigEndian<u32> rendering_intent;
68+
69+
XYZNumber pcs_illuminant;
70+
71+
BigEndian<Creator> profile_creator;
72+
73+
u8 profile_id[16];
74+
u8 reserved[28];
75+
};
76+
static_assert(AssertSize<ICCHeader, 128>());
77+
78+
// Common bits of ICC v4, Table 40 — lut16Type encoding and Table 44 — lut8Type encoding
79+
struct LUTHeader {
80+
u8 number_of_input_channels;
81+
u8 number_of_output_channels;
82+
u8 number_of_clut_grid_points;
83+
u8 reserved_for_padding;
84+
BigEndian<s15Fixed16Number> e_parameters[9];
85+
};
86+
static_assert(AssertSize<LUTHeader, 40>());
87+
88+
// Common bits of ICC v4, Table 45 — lutAToBType encoding and Table 47 — lutBToAType encoding
89+
struct AdvancedLUTHeader {
90+
u8 number_of_input_channels;
91+
u8 number_of_output_channels;
92+
BigEndian<u16> reserved_for_padding;
93+
BigEndian<u32> offset_to_b_curves;
94+
BigEndian<u32> offset_to_matrix;
95+
BigEndian<u32> offset_to_m_curves;
96+
BigEndian<u32> offset_to_clut;
97+
BigEndian<u32> offset_to_a_curves;
98+
};
99+
static_assert(AssertSize<AdvancedLUTHeader, 24>());
100+
101+
// ICC v4, Table 46 — lutAToBType CLUT encoding
102+
// ICC v4, Table 48 — lutBToAType CLUT encoding
103+
// (They're identical.)
104+
struct CLUTHeader {
105+
u8 number_of_grid_points_in_dimension[16];
106+
u8 precision_of_data_elements; // 1 for u8 entries, 2 for u16 entries.
107+
u8 reserved_for_padding[3];
108+
};
109+
static_assert(AssertSize<CLUTHeader, 20>());
110+
111+
}

Userland/Libraries/LibGfx/ICC/Profile.cpp

Lines changed: 1 addition & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66

77
#include <AK/Endian.h>
8+
#include <LibGfx/ICC/BinaryFormat.h>
89
#include <LibGfx/ICC/Profile.h>
910
#include <LibGfx/ICC/Tags.h>
1011
#include <math.h>
@@ -17,32 +18,6 @@ namespace Gfx::ICC {
1718

1819
namespace {
1920

20-
// ICC V4, 4.2 dateTimeNumber
21-
// "All the dateTimeNumber values in a profile shall be in Coordinated Universal Time [...]."
22-
struct DateTimeNumber {
23-
BigEndian<u16> year;
24-
BigEndian<u16> month;
25-
BigEndian<u16> day;
26-
BigEndian<u16> hours;
27-
BigEndian<u16> minutes;
28-
BigEndian<u16> seconds;
29-
};
30-
31-
// ICC V4, 4.6 s15Fixed16Number
32-
using s15Fixed16Number = i32;
33-
34-
// ICC V4, 4.14 XYZNumber
35-
struct XYZNumber {
36-
BigEndian<s15Fixed16Number> x;
37-
BigEndian<s15Fixed16Number> y;
38-
BigEndian<s15Fixed16Number> z;
39-
40-
operator XYZ() const
41-
{
42-
return XYZ { x / (double)0x1'0000, y / (double)0x1'0000, z / (double)0x1'0000 };
43-
}
44-
};
45-
4621
ErrorOr<time_t> parse_date_time_number(DateTimeNumber const& date_time)
4722
{
4823
// ICC V4, 4.2 dateTimeNumber
@@ -84,39 +59,6 @@ ErrorOr<time_t> parse_date_time_number(DateTimeNumber const& date_time)
8459
return timestamp;
8560
}
8661

87-
// ICC V4, 7.2 Profile header
88-
struct ICCHeader {
89-
BigEndian<u32> profile_size;
90-
BigEndian<PreferredCMMType> preferred_cmm_type;
91-
92-
u8 profile_version_major;
93-
u8 profile_version_minor_bugfix;
94-
BigEndian<u16> profile_version_zero;
95-
96-
BigEndian<DeviceClass> profile_device_class;
97-
BigEndian<ColorSpace> data_color_space;
98-
BigEndian<ColorSpace> profile_connection_space; // "PCS" in the spec.
99-
100-
DateTimeNumber profile_creation_time;
101-
102-
BigEndian<u32> profile_file_signature;
103-
BigEndian<PrimaryPlatform> primary_platform;
104-
105-
BigEndian<u32> profile_flags;
106-
BigEndian<DeviceManufacturer> device_manufacturer;
107-
BigEndian<DeviceModel> device_model;
108-
BigEndian<u64> device_attributes;
109-
BigEndian<u32> rendering_intent;
110-
111-
XYZNumber pcs_illuminant;
112-
113-
BigEndian<Creator> profile_creator;
114-
115-
u8 profile_id[16];
116-
u8 reserved[28];
117-
};
118-
static_assert(AssertSize<ICCHeader, 128>());
119-
12062
ErrorOr<u32> parse_size(ICCHeader const& header, ReadonlyBytes icc_bytes)
12163
{
12264
// ICC v4, 7.2.2 Profile size field

Userland/Libraries/LibGfx/ICC/TagTypes.cpp

Lines changed: 1 addition & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#include <AK/DeprecatedString.h>
88
#include <AK/Endian.h>
9+
#include <LibGfx/ICC/BinaryFormat.h>
910
#include <LibGfx/ICC/TagTypes.h>
1011
#include <LibGfx/ICC/Tags.h>
1112
#include <LibTextCodec/Decoder.h>
@@ -14,57 +15,6 @@ namespace Gfx::ICC {
1415

1516
namespace {
1617

17-
// ICC V4, 4.6 s15Fixed16Number
18-
using s15Fixed16Number = i32;
19-
20-
// ICC V4, 4.7 u16Fixed16Number
21-
using u16Fixed16Number = u32;
22-
23-
// ICC V4, 4.14 XYZNumber
24-
struct XYZNumber {
25-
BigEndian<s15Fixed16Number> x;
26-
BigEndian<s15Fixed16Number> y;
27-
BigEndian<s15Fixed16Number> z;
28-
29-
operator XYZ() const
30-
{
31-
return XYZ { x / (double)0x1'0000, y / (double)0x1'0000, z / (double)0x1'0000 };
32-
}
33-
};
34-
35-
// Common bits of ICC v4, Table 40 — lut16Type encoding and Table 44 — lut8Type encoding
36-
struct LUTHeader {
37-
u8 number_of_input_channels;
38-
u8 number_of_output_channels;
39-
u8 number_of_clut_grid_points;
40-
u8 reserved_for_padding;
41-
BigEndian<s15Fixed16Number> e_parameters[9];
42-
};
43-
static_assert(AssertSize<LUTHeader, 40>());
44-
45-
// Common bits of ICC v4, Table 45 — lutAToBType encoding and Table 47 — lutBToAType encoding
46-
struct AdvancedLUTHeader {
47-
u8 number_of_input_channels;
48-
u8 number_of_output_channels;
49-
BigEndian<u16> reserved_for_padding;
50-
BigEndian<u32> offset_to_b_curves;
51-
BigEndian<u32> offset_to_matrix;
52-
BigEndian<u32> offset_to_m_curves;
53-
BigEndian<u32> offset_to_clut;
54-
BigEndian<u32> offset_to_a_curves;
55-
};
56-
static_assert(AssertSize<AdvancedLUTHeader, 24>());
57-
58-
// ICC v4, Table 46 — lutAToBType CLUT encoding
59-
// ICC v4, Table 48 — lutBToAType CLUT encoding
60-
// (They're identical.)
61-
struct CLUTHeader {
62-
u8 number_of_grid_points_in_dimension[16];
63-
u8 precision_of_data_elements; // 1 for u8 entries, 2 for u16 entries.
64-
u8 reserved_for_padding[3];
65-
};
66-
static_assert(AssertSize<CLUTHeader, 20>());
67-
6818
ErrorOr<void> check_reserved(ReadonlyBytes tag_bytes)
6919
{
7020
if (tag_bytes.size() < 2 * sizeof(u32))

0 commit comments

Comments
 (0)