From 17f3f2886509930ebadd709aa05af4fe81d54174 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Poisot?= Date: Sat, 1 Nov 2025 15:15:51 +0000 Subject: [PATCH] render/color: add wlr_color_primaries_transform_absolute_colorimetric --- include/wlr/render/color.h | 7 +++++++ render/color.c | 12 ++++++++++++ render/vulkan/pass.c | 19 +++---------------- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/include/wlr/render/color.h b/include/wlr/render/color.h index b97e4c91d..44bbedfb8 100644 --- a/include/wlr/render/color.h +++ b/include/wlr/render/color.h @@ -165,4 +165,11 @@ void wlr_color_transform_unref(struct wlr_color_transform *tr); void wlr_color_transform_eval(struct wlr_color_transform *tr, float out[static 3], const float in[static 3]); +/** + * Compute the matrix to convert between two linear RGB color spaces + */ +void wlr_color_primaries_transform_absolute_colorimetric( + const struct wlr_color_primaries *source, + const struct wlr_color_primaries *destination, float matrix[static 9]); + #endif diff --git a/render/color.c b/render/color.c index 0a1a67be3..662c5b480 100644 --- a/render/color.c +++ b/render/color.c @@ -311,6 +311,18 @@ void wlr_color_primaries_to_xyz(const struct wlr_color_primaries *primaries, flo memcpy(matrix, result, sizeof(result)); } +void wlr_color_primaries_transform_absolute_colorimetric( + const struct wlr_color_primaries *source, + const struct wlr_color_primaries *destination, float matrix[static 9]) { + float source_to_xyz[9]; + wlr_color_primaries_to_xyz(source, source_to_xyz); + float destination_to_xyz[9]; + wlr_color_primaries_to_xyz(destination, destination_to_xyz); + float xyz_to_destination[9]; + matrix_invert(xyz_to_destination, destination_to_xyz); + wlr_matrix_multiply(matrix, xyz_to_destination, source_to_xyz); +} + void wlr_color_transfer_function_get_default_luminance(enum wlr_color_transfer_function tf, struct wlr_color_luminances *lum) { switch (tf) { diff --git a/render/vulkan/pass.c b/render/vulkan/pass.c index c69d48e6c..67b4280f6 100644 --- a/render/vulkan/pass.c +++ b/render/vulkan/pass.c @@ -209,14 +209,7 @@ static bool render_pass_submit(struct wlr_render_pass *wlr_pass) { struct wlr_color_primaries srgb; wlr_color_primaries_from_named(&srgb, WLR_COLOR_NAMED_PRIMARIES_SRGB); - float srgb_to_xyz[9]; - wlr_color_primaries_to_xyz(&srgb, srgb_to_xyz); - float dst_primaries_to_xyz[9]; - wlr_color_primaries_to_xyz(&pass->primaries, dst_primaries_to_xyz); - float xyz_to_dst_primaries[9]; - matrix_invert(xyz_to_dst_primaries, dst_primaries_to_xyz); - - wlr_matrix_multiply(matrix, xyz_to_dst_primaries, srgb_to_xyz); + wlr_color_primaries_transform_absolute_colorimetric(&srgb, &pass->primaries, matrix); } else { wlr_matrix_identity(matrix); } @@ -850,14 +843,8 @@ static void render_pass_add_texture(struct wlr_render_pass *wlr_pass, struct wlr_color_primaries srgb; wlr_color_primaries_from_named(&srgb, WLR_COLOR_NAMED_PRIMARIES_SRGB); - float src_primaries_to_xyz[9]; - wlr_color_primaries_to_xyz(options->primaries, src_primaries_to_xyz); - float srgb_to_xyz[9]; - wlr_color_primaries_to_xyz(&srgb, srgb_to_xyz); - float xyz_to_srgb[9]; - matrix_invert(xyz_to_srgb, srgb_to_xyz); - - wlr_matrix_multiply(color_matrix, xyz_to_srgb, src_primaries_to_xyz); + wlr_color_primaries_transform_absolute_colorimetric(options->primaries, + &srgb, color_matrix); } else { wlr_matrix_identity(color_matrix); }