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 <joan.torres@suse.com>
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3904>
This commit is contained in:
Sebastian Wick 2024-06-10 18:47:25 +02:00
parent 357e5c92f2
commit dc6632f19b
3 changed files with 70 additions and 5 deletions

View File

@ -623,19 +623,64 @@ on_manager_ready (MetaColorManager *color_manager,
create_cd_device (color_device); 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 static UpdateResult
update_color_state (MetaColorDevice *color_device) update_color_state (MetaColorDevice *color_device)
{ {
MetaMonitor *monitor = color_device->monitor;
MetaBackend *backend = MetaBackend *backend =
meta_color_manager_get_backend (color_device->color_manager); meta_color_manager_get_backend (color_device->color_manager);
ClutterContext *clutter_context = meta_backend_get_clutter_context (backend); ClutterContext *clutter_context = meta_backend_get_clutter_context (backend);
ClutterColorManager *clutter_color_manager = g_autoptr (ClutterColorState) color_state = NULL;
clutter_context_get_color_manager (clutter_context); ClutterColorspace colorspace;
ClutterColorState *color_state; ClutterTransferFunction transfer_function;
UpdateResult result = 0; UpdateResult result = 0;
color_state = colorspace = get_color_space_from_monitor (monitor);
clutter_color_manager_get_default_color_state (clutter_color_manager); transfer_function = get_transfer_function_from_monitor (monitor);
color_state = clutter_color_state_new (clutter_context,
colorspace,
transfer_function);
if (!color_device->color_state || if (!color_device->color_state ||
!clutter_color_state_equals (color_device->color_state, color_state)) !clutter_color_state_equals (color_device->color_state, color_state))

View File

@ -2276,6 +2276,14 @@ meta_monitor_get_min_refresh_rate (MetaMonitor *monitor,
min_refresh_rate); 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 gboolean
meta_monitor_set_color_space (MetaMonitor *monitor, meta_monitor_set_color_space (MetaMonitor *monitor,
MetaOutputColorspace color_space, MetaOutputColorspace color_space,
@ -2307,6 +2315,14 @@ meta_monitor_set_color_space (MetaMonitor *monitor,
return TRUE; 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 gboolean
meta_monitor_set_hdr_metadata (MetaMonitor *monitor, meta_monitor_set_hdr_metadata (MetaMonitor *monitor,
MetaOutputHdrMetadata *metadata, MetaOutputHdrMetadata *metadata,

View File

@ -312,10 +312,14 @@ size_t meta_monitor_get_gamma_lut_size (MetaMonitor *monitor);
void meta_monitor_set_gamma_lut (MetaMonitor *monitor, void meta_monitor_set_gamma_lut (MetaMonitor *monitor,
const MetaGammaLut *lut); const MetaGammaLut *lut);
MetaOutputColorspace meta_monitor_get_color_space (MetaMonitor *monitor);
gboolean meta_monitor_set_color_space (MetaMonitor *monitor, gboolean meta_monitor_set_color_space (MetaMonitor *monitor,
MetaOutputColorspace color_space, MetaOutputColorspace color_space,
GError **error); GError **error);
MetaOutputHdrMetadata * meta_monitor_get_hdr_metadata (MetaMonitor *monitor);
gboolean meta_monitor_set_hdr_metadata (MetaMonitor *monitor, gboolean meta_monitor_set_hdr_metadata (MetaMonitor *monitor,
MetaOutputHdrMetadata *metadata, MetaOutputHdrMetadata *metadata,
GError **error); GError **error);