diff --git a/Userland/Libraries/LibGfx/ICCProfile.cpp b/Userland/Libraries/LibGfx/ICCProfile.cpp index 6406492965..89327360b3 100644 --- a/Userland/Libraries/LibGfx/ICCProfile.cpp +++ b/Userland/Libraries/LibGfx/ICCProfile.cpp @@ -99,7 +99,7 @@ struct ICCHeader { DateTimeNumber profile_creation_time; BigEndian profile_file_signature; - BigEndian primary_platform; + BigEndian primary_platform; BigEndian profile_flags; BigEndian device_manufacturer; @@ -226,6 +226,19 @@ ErrorOr parse_file_signature(ICCHeader const& header) return {}; } +ErrorOr parse_primary_platform(ICCHeader const& header) +{ + // ICC v4, 7.2.10 Primary platform field + switch (header.primary_platform) { + case PrimaryPlatform::Apple: + case PrimaryPlatform::Microsoft: + case PrimaryPlatform::SiliconGraphics: + case PrimaryPlatform::Sun: + return header.primary_platform; + } + return Error::from_string_literal("ICC::Profile: Invalid primary platform"); +} + Optional parse_device_manufacturer(ICCHeader const& header) { // ICC v4, 7.2.12 Device manufacturer field @@ -439,6 +452,21 @@ StringView profile_connection_space_name(ColorSpace color_space) } } +StringView primary_platform_name(PrimaryPlatform primary_platform) +{ + switch (primary_platform) { + case PrimaryPlatform::Apple: + return "Apple"sv; + case PrimaryPlatform::Microsoft: + return "Microsoft"sv; + case PrimaryPlatform::SiliconGraphics: + return "Silicon Graphics"sv; + case PrimaryPlatform::Sun: + return "Sun"sv; + } + VERIFY_NOT_REACHED(); +} + StringView rendering_intent_name(RenderingIntent rendering_intent) { switch (rendering_intent) { @@ -482,6 +510,7 @@ ErrorOr> Profile::try_load_from_externally_owned_memory(R profile->m_data_color_space = TRY(parse_data_color_space(header)); profile->m_connection_space = TRY(parse_connection_space(header)); profile->m_creation_timestamp = TRY(parse_creation_date_time(header)); + profile->m_primary_platform = TRY(parse_primary_platform(header)); profile->m_flags = Flags { header.profile_flags }; profile->m_device_manufacturer = parse_device_manufacturer(header); profile->m_device_model = parse_device_model(header); diff --git a/Userland/Libraries/LibGfx/ICCProfile.h b/Userland/Libraries/LibGfx/ICCProfile.h index 162ad260d0..8bb97204ad 100644 --- a/Userland/Libraries/LibGfx/ICCProfile.h +++ b/Userland/Libraries/LibGfx/ICCProfile.h @@ -104,6 +104,15 @@ enum class ColorSpace : u32 { StringView data_color_space_name(ColorSpace); StringView profile_connection_space_name(ColorSpace); +// ICC v4, 7.2.10 Primary platform field, Table 20 — Primary platforms +enum class PrimaryPlatform : u32 { + Apple = 0x4150504C, // 'APPL' + Microsoft = 0x4D534654, // 'MSFT' + SiliconGraphics = 0x53474920, // 'SGI ' + Sun = 0x53554E57, // 'SUNW' +}; +StringView primary_platform_name(PrimaryPlatform); + // ICC v4, 7.2.15 Rendering intent field enum class RenderingIntent { Perceptual, @@ -215,6 +224,7 @@ public: ColorSpace connection_space() const { return m_connection_space; } time_t creation_timestamp() const { return m_creation_timestamp; } + PrimaryPlatform primary_platform() const { return m_primary_platform; } Flags flags() const { return m_flags; } Optional device_manufacturer() const { return m_device_manufacturer; } Optional device_model() const { return m_device_model; } @@ -233,6 +243,7 @@ private: ColorSpace m_data_color_space; ColorSpace m_connection_space; time_t m_creation_timestamp; + PrimaryPlatform m_primary_platform; Flags m_flags; Optional m_device_manufacturer; Optional m_device_model; diff --git a/Userland/Utilities/icc.cpp b/Userland/Utilities/icc.cpp index 708068c28d..ac786a87fe 100644 --- a/Userland/Utilities/icc.cpp +++ b/Userland/Utilities/icc.cpp @@ -37,6 +37,7 @@ ErrorOr serenity_main(Main::Arguments arguments) outln("data color space: {}", Gfx::ICC::data_color_space_name(profile->data_color_space())); outln("connection space: {}", Gfx::ICC::profile_connection_space_name(profile->connection_space())); outln("creation date and time: {}", Core::DateTime::from_timestamp(profile->creation_timestamp()).to_deprecated_string()); + outln("primary platform: {}", Gfx::ICC::primary_platform_name(profile->primary_platform())); auto flags = profile->flags(); outln("flags: 0x{:08x}", flags.bits());