color_management_v1: implement set_luminances

v2: Fix coding errors
v3: Fall back to default luminances if not set
v4: Return luminances, with override max for PQ
This commit is contained in:
Christopher Snowhill 2026-03-24 02:48:16 -07:00
parent fd870f6d27
commit 5994c3d055
5 changed files with 86 additions and 8 deletions

View file

@ -12,6 +12,7 @@
#include <wlr/types/wlr_single_pixel_buffer_v1.h>
#include <wlr/util/transform.h>
#include "types/wlr_scene.h"
#include "render/color.h"
static double get_surface_preferred_buffer_scale(struct wlr_surface *surface) {
double scale = 1;
@ -278,11 +279,14 @@ static void surface_reconfigure(struct wlr_scene_surface *scene_surface) {
enum wlr_color_transfer_function tf = WLR_COLOR_TRANSFER_FUNCTION_GAMMA22;
enum wlr_color_named_primaries primaries = WLR_COLOR_NAMED_PRIMARIES_SRGB;
struct wlr_color_luminances luminances;
wlr_color_transfer_function_get_default_luminance(tf, &luminances);
const struct wlr_image_description_v1_data *img_desc =
wlr_surface_get_image_description_v1_data(surface);
if (img_desc != NULL) {
tf = wlr_color_manager_v1_transfer_function_to_wlr(img_desc->tf_named);
primaries = wlr_color_manager_v1_primaries_to_wlr(img_desc->primaries_named);
wlr_color_manager_v1_get_luminances(img_desc, &luminances);
}
enum wlr_color_encoding color_encoding = WLR_COLOR_ENCODING_NONE;
@ -307,6 +311,7 @@ static void surface_reconfigure(struct wlr_scene_surface *scene_surface) {
wlr_scene_buffer_set_primaries(scene_buffer, primaries);
wlr_scene_buffer_set_color_encoding(scene_buffer, color_encoding);
wlr_scene_buffer_set_color_range(scene_buffer, color_range);
wlr_scene_buffer_set_luminances(scene_buffer, &luminances);
scene_buffer_unmark_client_buffer(scene_buffer);

View file

@ -1148,6 +1148,20 @@ void wlr_scene_buffer_set_color_range(struct wlr_scene_buffer *scene_buffer,
scene_node_update(&scene_buffer->node, NULL);
}
void wlr_scene_buffer_set_luminances(struct wlr_scene_buffer *scene_buffer,
const struct wlr_color_luminances *lum) {
if (scene_buffer->has_luminances &&
scene_buffer->luminances.min == lum->min &&
scene_buffer->luminances.max == lum->max &&
scene_buffer->luminances.reference == lum->reference) {
return;
}
scene_buffer->has_luminances = true;
scene_buffer->luminances = *lum;
scene_node_update(&scene_buffer->node, NULL);
}
static struct wlr_texture *scene_buffer_get_texture(
struct wlr_scene_buffer *scene_buffer, struct wlr_renderer *renderer) {
if (scene_buffer->buffer == NULL || scene_buffer->texture != NULL) {
@ -1495,8 +1509,12 @@ static void scene_entry_render(struct render_list_entry *entry, const struct ren
}
struct wlr_color_luminances src_lum, srgb_lum;
wlr_color_transfer_function_get_default_luminance(
scene_buffer->transfer_function, &src_lum);
if (scene_buffer->has_luminances) {
src_lum = scene_buffer->luminances;
} else {
wlr_color_transfer_function_get_default_luminance(
scene_buffer->transfer_function, &src_lum);
}
wlr_color_transfer_function_get_default_luminance(
WLR_COLOR_TRANSFER_FUNCTION_SRGB, &srgb_lum);
float luminance_multiplier = get_luminance_multiplier(&src_lum, &srgb_lum);