From 74a01e3f39d94d7733a8b88694e49435080c6731 Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Wed, 27 Mar 2024 16:51:08 +0100 Subject: [PATCH] color-device: Use a sRGB profile if the EDID is missing This makes sure the ColorDevice can initialize successfully even if the display doesn't have an EDID. Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3394 Part-of: --- src/backends/meta-color-device.c | 80 +++++++++++++++++--------------- 1 file changed, 43 insertions(+), 37 deletions(-) diff --git a/src/backends/meta-color-device.c b/src/backends/meta-color-device.c index 3032d34c2..0d6cf40db 100644 --- a/src/backends/meta-color-device.c +++ b/src/backends/meta-color-device.c @@ -963,56 +963,62 @@ static void create_device_profile_from_edid (MetaColorDevice *color_device, GTask *task) { - const MetaEdidInfo *edid_info; + const MetaEdidInfo *edid_info = + meta_monitor_get_edid_info (color_device->monitor); + GenerateProfileData *data = g_task_get_task_data (task); + g_autoptr (CdIcc) cd_icc = NULL; + g_autoptr (GBytes) bytes = NULL; + g_autofree char *file_md5_checksum = NULL; + g_autoptr (GError) error = NULL; - edid_info = meta_monitor_get_edid_info (color_device->monitor); if (edid_info) { - g_autoptr (CdIcc) cd_icc = NULL; - GBytes *bytes; - g_autoptr (GError) error = NULL; - GenerateProfileData *data = g_task_get_task_data (task); - const char *file_path = data->file_path; - g_autofree char *file_md5_checksum = NULL; - meta_topic (META_DEBUG_COLOR, "Generating ICC profile for '%s' from EDID", meta_color_device_get_id (color_device)); cd_icc = create_icc_profile_from_edid (color_device, - edid_info, file_path, + edid_info, data->file_path, &error); - if (!cd_icc) - { - g_task_return_error (task, g_steal_pointer (&error)); - g_object_unref (task); - return; - } - - bytes = cd_icc_save_data (cd_icc, CD_ICC_SAVE_FLAGS_NONE, &error); - if (!bytes) - { - g_task_return_error (task, g_steal_pointer (&error)); - g_object_unref (task); - return; - } - - file_md5_checksum = g_compute_checksum_for_bytes (G_CHECKSUM_MD5, bytes); - cd_icc_add_metadata (cd_icc, CD_PROFILE_METADATA_FILE_CHECKSUM, - file_md5_checksum); - - data->color_calibration = - meta_color_calibration_new (cd_icc, NULL); - data->cd_icc = g_steal_pointer (&cd_icc); - data->bytes = bytes; - save_icc_profile (file_path, task); } else { - g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, - "No EDID available"); - g_object_unref (task); + meta_topic (META_DEBUG_COLOR, + "Generating sRGB ICC profile for '%s' because EDID is missing", + meta_color_device_get_id (color_device)); + + cd_icc = cd_icc_new (); + + if (!cd_icc_create_default_full (cd_icc, + CD_ICC_LOAD_FLAGS_PRIMARIES, + &error)) + g_clear_object (&cd_icc); } + + if (!cd_icc) + { + g_task_return_error (task, g_steal_pointer (&error)); + g_object_unref (task); + return; + } + + bytes = cd_icc_save_data (cd_icc, CD_ICC_SAVE_FLAGS_NONE, &error); + if (!bytes) + { + g_task_return_error (task, g_steal_pointer (&error)); + g_object_unref (task); + return; + } + + file_md5_checksum = g_compute_checksum_for_bytes (G_CHECKSUM_MD5, bytes); + cd_icc_add_metadata (cd_icc, CD_PROFILE_METADATA_FILE_CHECKSUM, + file_md5_checksum); + + data->color_calibration = + meta_color_calibration_new (cd_icc, NULL); + data->cd_icc = g_steal_pointer (&cd_icc); + data->bytes = g_steal_pointer (&bytes); + save_icc_profile (data->file_path, task); } static void