1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 05:27:46 +00:00

LibGfx: Read rendering intent from ICCProfile header

This commit is contained in:
Nico Weber 2022-12-30 08:15:49 -05:00 committed by Andreas Kling
parent ac039d93f0
commit 743e9fc786
2 changed files with 44 additions and 0 deletions

View file

@ -160,6 +160,22 @@ ErrorOr<ColorSpace> parse_data_color_space(ICCHeader const& header)
return Error::from_string_literal("ICC::Profile: Invalid data color space");
}
ErrorOr<RenderingIntent> parse_rendering_intent(ICCHeader const& header)
{
// ICC v4, 7.2.15 Rendering intent field
switch (header.rendering_intent) {
case 0:
return RenderingIntent::Perceptual;
case 1:
return RenderingIntent::MediaRelativeColorimetric;
case 2:
return RenderingIntent::Saturation;
case 3:
return RenderingIntent::ICCAbsoluteColorimetric;
}
return Error::from_string_literal("ICC::Profile: Invalid rendering intent");
}
ErrorOr<time_t> parse_creation_date_time(ICCHeader const& header)
{
// iCC v4, 7.2.8 Date and time field
@ -255,6 +271,22 @@ char const* color_space_name(ColorSpace color_space)
}
}
char const* rendering_intent_name(RenderingIntent rendering_intent)
{
switch (rendering_intent) {
case RenderingIntent::Perceptual:
return "Perceptual";
case RenderingIntent::MediaRelativeColorimetric:
return "Media-relative colorimetric";
case RenderingIntent::Saturation:
return "Saturation";
case RenderingIntent::ICCAbsoluteColorimetric:
return "ICC-absolute colorimetric";
default:
return NULL;
}
}
ErrorOr<NonnullRefPtr<Profile>> Profile::try_load_from_externally_owned_memory(ReadonlyBytes bytes)
{
auto profile = adopt_ref(*new Profile());
@ -269,6 +301,7 @@ ErrorOr<NonnullRefPtr<Profile>> Profile::try_load_from_externally_owned_memory(R
profile->m_device_class = TRY(parse_device_class(header));
profile->m_data_color_space = TRY(parse_data_color_space(header));
profile->m_creation_timestamp = TRY(parse_creation_date_time(header));
profile->m_rendering_intent = TRY(parse_rendering_intent(header));
return profile;
}

View file

@ -75,6 +75,15 @@ enum class ColorSpace : u32 {
};
char const* color_space_name(ColorSpace);
// ICC v4, 7.2.15 Rendering intent field
enum class RenderingIntent {
Perceptual,
MediaRelativeColorimetric,
Saturation,
ICCAbsoluteColorimetric,
};
char const* rendering_intent_name(RenderingIntent);
class Profile : public RefCounted<Profile> {
public:
static ErrorOr<NonnullRefPtr<Profile>> try_load_from_externally_owned_memory(ReadonlyBytes bytes);
@ -83,12 +92,14 @@ public:
DeviceClass device_class() const { return m_device_class; }
ColorSpace data_color_space() const { return m_data_color_space; }
time_t creation_timestamp() const { return m_creation_timestamp; }
RenderingIntent rendering_intent() const { return m_rendering_intent; }
private:
Version m_version;
DeviceClass m_device_class;
ColorSpace m_data_color_space;
time_t m_creation_timestamp;
RenderingIntent m_rendering_intent;
};
}