summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNico Weber <thakis@chromium.org>2022-12-30 08:15:49 -0500
committerAndreas Kling <kling@serenityos.org>2022-12-30 17:21:57 +0100
commit743e9fc786a957be979762e1d659690d04a2b9d9 (patch)
tree1f7d9c9a43571db13ad7e5b107e0ad15371e2e7e
parentac039d93f0eb8f6abf6d65aa08ff8cabfb2de265 (diff)
downloadserenity-743e9fc786a957be979762e1d659690d04a2b9d9.zip
LibGfx: Read rendering intent from ICCProfile header
-rw-r--r--Userland/Libraries/LibGfx/ICCProfile.cpp33
-rw-r--r--Userland/Libraries/LibGfx/ICCProfile.h11
2 files changed, 44 insertions, 0 deletions
diff --git a/Userland/Libraries/LibGfx/ICCProfile.cpp b/Userland/Libraries/LibGfx/ICCProfile.cpp
index 6597f27c61..00ba415c99 100644
--- a/Userland/Libraries/LibGfx/ICCProfile.cpp
+++ b/Userland/Libraries/LibGfx/ICCProfile.cpp
@@ -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;
}
diff --git a/Userland/Libraries/LibGfx/ICCProfile.h b/Userland/Libraries/LibGfx/ICCProfile.h
index 8171dbfdbe..ab8910b4a1 100644
--- a/Userland/Libraries/LibGfx/ICCProfile.h
+++ b/Userland/Libraries/LibGfx/ICCProfile.h
@@ -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;
};
}