From dc6632f19b5a0359fc08eb22f7822f645eee6418 Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Mon, 10 Jun 2024 18:47:25 +0200 Subject: [PATCH] color-device: Derive color space from monitor calibration This ignores the white point calibration for now because our color state isn't expressive enough, yet. Co-authored-by: Joan Torres Part-of: --- src/backends/meta-color-device.c | 55 +++++++++++++++++++++++++++++--- src/backends/meta-monitor.c | 16 ++++++++++ src/backends/meta-monitor.h | 4 +++ 3 files changed, 70 insertions(+), 5 deletions(-) diff --git a/src/backends/meta-color-device.c b/src/backends/meta-color-device.c index 3eb799326..6fbd0ec3a 100644 --- a/src/backends/meta-color-device.c +++ b/src/backends/meta-color-device.c @@ -623,19 +623,64 @@ on_manager_ready (MetaColorManager *color_manager, create_cd_device (color_device); } +static ClutterColorspace +get_color_space_from_monitor (MetaMonitor *monitor) +{ + switch (meta_monitor_get_color_space (monitor)) + { + case META_OUTPUT_COLORSPACE_DEFAULT: + case META_OUTPUT_COLORSPACE_UNKNOWN: + return CLUTTER_COLORSPACE_DEFAULT; + case META_OUTPUT_COLORSPACE_BT2020: + return CLUTTER_COLORSPACE_BT2020; + } + g_assert_not_reached (); +} + +static ClutterTransferFunction +get_transfer_function_from_monitor (MetaMonitor *monitor) +{ + const MetaOutputHdrMetadata *hdr_metadata = + meta_monitor_get_hdr_metadata (monitor); + + if (!hdr_metadata->active) + return CLUTTER_TRANSFER_FUNCTION_DEFAULT; + + switch (hdr_metadata->eotf) + { + case META_OUTPUT_HDR_METADATA_EOTF_PQ: + return CLUTTER_TRANSFER_FUNCTION_PQ; + case META_OUTPUT_HDR_METADATA_EOTF_TRADITIONAL_GAMMA_SDR: + return CLUTTER_TRANSFER_FUNCTION_DEFAULT; + case META_OUTPUT_HDR_METADATA_EOTF_TRADITIONAL_GAMMA_HDR: + g_warning ("Unhandled HDR EOTF (traditional gamma hdr)"); + return CLUTTER_TRANSFER_FUNCTION_DEFAULT; + case META_OUTPUT_HDR_METADATA_EOTF_HLG: + g_warning ("Unhandled HDR EOTF (HLG)"); + return CLUTTER_TRANSFER_FUNCTION_DEFAULT; + } + + g_assert_not_reached (); +} + static UpdateResult update_color_state (MetaColorDevice *color_device) { + MetaMonitor *monitor = color_device->monitor; MetaBackend *backend = meta_color_manager_get_backend (color_device->color_manager); ClutterContext *clutter_context = meta_backend_get_clutter_context (backend); - ClutterColorManager *clutter_color_manager = - clutter_context_get_color_manager (clutter_context); - ClutterColorState *color_state; + g_autoptr (ClutterColorState) color_state = NULL; + ClutterColorspace colorspace; + ClutterTransferFunction transfer_function; UpdateResult result = 0; - color_state = - clutter_color_manager_get_default_color_state (clutter_color_manager); + colorspace = get_color_space_from_monitor (monitor); + transfer_function = get_transfer_function_from_monitor (monitor); + + color_state = clutter_color_state_new (clutter_context, + colorspace, + transfer_function); if (!color_device->color_state || !clutter_color_state_equals (color_device->color_state, color_state)) diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c index 55413d1b8..b650832f3 100644 --- a/src/backends/meta-monitor.c +++ b/src/backends/meta-monitor.c @@ -2276,6 +2276,14 @@ meta_monitor_get_min_refresh_rate (MetaMonitor *monitor, min_refresh_rate); } +MetaOutputColorspace +meta_monitor_get_color_space (MetaMonitor *monitor) +{ + MetaOutput *output = meta_monitor_get_main_output (monitor); + + return meta_output_peek_color_space (output); +} + gboolean meta_monitor_set_color_space (MetaMonitor *monitor, MetaOutputColorspace color_space, @@ -2307,6 +2315,14 @@ meta_monitor_set_color_space (MetaMonitor *monitor, return TRUE; } +MetaOutputHdrMetadata * +meta_monitor_get_hdr_metadata (MetaMonitor *monitor) +{ + MetaOutput *output = meta_monitor_get_main_output (monitor); + + return meta_output_peek_hdr_metadata (output); +} + gboolean meta_monitor_set_hdr_metadata (MetaMonitor *monitor, MetaOutputHdrMetadata *metadata, diff --git a/src/backends/meta-monitor.h b/src/backends/meta-monitor.h index 15e7fac65..54ba4e48b 100644 --- a/src/backends/meta-monitor.h +++ b/src/backends/meta-monitor.h @@ -312,10 +312,14 @@ size_t meta_monitor_get_gamma_lut_size (MetaMonitor *monitor); void meta_monitor_set_gamma_lut (MetaMonitor *monitor, const MetaGammaLut *lut); +MetaOutputColorspace meta_monitor_get_color_space (MetaMonitor *monitor); + gboolean meta_monitor_set_color_space (MetaMonitor *monitor, MetaOutputColorspace color_space, GError **error); +MetaOutputHdrMetadata * meta_monitor_get_hdr_metadata (MetaMonitor *monitor); + gboolean meta_monitor_set_hdr_metadata (MetaMonitor *monitor, MetaOutputHdrMetadata *metadata, GError **error);