mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2025-12-20 16:10:04 +01:00
render/color: add wlr_color_primaries_transform_absolute_colorimetric
This commit is contained in:
parent
9b9d7d845d
commit
17f3f28865
3 changed files with 22 additions and 16 deletions
|
|
@ -165,4 +165,11 @@ void wlr_color_transform_unref(struct wlr_color_transform *tr);
|
||||||
void wlr_color_transform_eval(struct wlr_color_transform *tr,
|
void wlr_color_transform_eval(struct wlr_color_transform *tr,
|
||||||
float out[static 3], const float in[static 3]);
|
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
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -311,6 +311,18 @@ void wlr_color_primaries_to_xyz(const struct wlr_color_primaries *primaries, flo
|
||||||
memcpy(matrix, result, sizeof(result));
|
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,
|
void wlr_color_transfer_function_get_default_luminance(enum wlr_color_transfer_function tf,
|
||||||
struct wlr_color_luminances *lum) {
|
struct wlr_color_luminances *lum) {
|
||||||
switch (tf) {
|
switch (tf) {
|
||||||
|
|
|
||||||
|
|
@ -209,14 +209,7 @@ static bool render_pass_submit(struct wlr_render_pass *wlr_pass) {
|
||||||
struct wlr_color_primaries srgb;
|
struct wlr_color_primaries srgb;
|
||||||
wlr_color_primaries_from_named(&srgb, WLR_COLOR_NAMED_PRIMARIES_SRGB);
|
wlr_color_primaries_from_named(&srgb, WLR_COLOR_NAMED_PRIMARIES_SRGB);
|
||||||
|
|
||||||
float srgb_to_xyz[9];
|
wlr_color_primaries_transform_absolute_colorimetric(&srgb, &pass->primaries, matrix);
|
||||||
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);
|
|
||||||
} else {
|
} else {
|
||||||
wlr_matrix_identity(matrix);
|
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;
|
struct wlr_color_primaries srgb;
|
||||||
wlr_color_primaries_from_named(&srgb, WLR_COLOR_NAMED_PRIMARIES_SRGB);
|
wlr_color_primaries_from_named(&srgb, WLR_COLOR_NAMED_PRIMARIES_SRGB);
|
||||||
|
|
||||||
float src_primaries_to_xyz[9];
|
wlr_color_primaries_transform_absolute_colorimetric(options->primaries,
|
||||||
wlr_color_primaries_to_xyz(options->primaries, src_primaries_to_xyz);
|
&srgb, color_matrix);
|
||||||
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);
|
|
||||||
} else {
|
} else {
|
||||||
wlr_matrix_identity(color_matrix);
|
wlr_matrix_identity(color_matrix);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue