diff --git a/types/wlr_color_management_v1.c b/types/wlr_color_management_v1.c index b84781f6e..3af0b51e8 100644 --- a/types/wlr_color_management_v1.c +++ b/types/wlr_color_management_v1.c @@ -76,6 +76,17 @@ static enum wlr_color_named_primaries named_primaries_to_wlr( } } +static enum wp_color_manager_v1_primaries named_primaries_from_wlr( + enum wlr_color_named_primaries primaries) { + switch (primaries) { + case WLR_COLOR_NAMED_PRIMARIES_SRGB: + return WP_COLOR_MANAGER_V1_PRIMARIES_SRGB; + case WLR_COLOR_NAMED_PRIMARIES_BT2020: + return WP_COLOR_MANAGER_V1_PRIMARIES_BT2020; + } + abort(); +} + static enum wlr_color_transfer_function transfer_function_to_wlr( enum wp_color_manager_v1_transfer_function tf) { switch (tf) { @@ -90,6 +101,19 @@ static enum wlr_color_transfer_function transfer_function_to_wlr( } } +static enum wp_color_manager_v1_transfer_function transfer_function_from_wlr( + enum wlr_color_transfer_function tf) { + switch (tf) { + case WLR_COLOR_TRANSFER_FUNCTION_SRGB: + return WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_SRGB; + case WLR_COLOR_TRANSFER_FUNCTION_ST2084_PQ: + return WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_ST2084_PQ; + case WLR_COLOR_TRANSFER_FUNCTION_EXT_LINEAR: + return WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_EXT_LINEAR; + } + abort(); +} + static int32_t encode_cie1931_coord(float value) { return round(value * 1000 * 1000); } @@ -238,6 +262,11 @@ static void cm_output_handle_get_image_description(struct wl_client *client, .tf_named = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_SRGB, .primaries_named = WP_COLOR_MANAGER_V1_PRIMARIES_SRGB, }; + const struct wlr_output_image_description *image_desc = cm_output->output->image_description; + if (image_desc != NULL) { + data.tf_named = transfer_function_from_wlr(image_desc->transfer_function); + data.primaries_named = named_primaries_from_wlr(image_desc->primaries); + } image_desc_create_ready(cm_output->manager, cm_output_resource, id, &data, true); } @@ -691,6 +720,7 @@ static void manager_handle_get_output(struct wl_client *client, } cm_output->manager = manager; + cm_output->output = output; uint32_t version = wl_resource_get_version(manager_resource); cm_output->resource = wl_resource_create(client,