render/color: add wlr_color_primaries_transform_absolute_colorimetric

This commit is contained in:
Félix Poisot 2025-11-01 15:15:51 +00:00 committed by Simon Ser
parent 9b9d7d845d
commit 17f3f28865
3 changed files with 22 additions and 16 deletions

View file

@ -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

View file

@ -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) {

View file

@ -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);
}