From cda3951a9a7e9731294a12da2de1dd7e103e4119 Mon Sep 17 00:00:00 2001 From: Pekka Paalanen Date: Mon, 22 Mar 2021 17:32:07 +0200 Subject: [PATCH] color: add from sRGB to output color transformation This is needed when drawing anything internal directly to an output, like the borders/decorations in a nested compositor setup. This makes the assumption that the internal stuff starts in sRGB, which should be safe. As borders are never blended with other content, this should also be sufficient. This patch is a reminder that that path exists, rather than a real implementation. To be implemented when someone needs it. Signed-off-by: Pekka Paalanen --- include/libweston/libweston.h | 1 + libweston/color-noop.c | 15 +++++++++++++++ libweston/color.h | 16 ++++++++++++++++ libweston/compositor.c | 4 ++++ libweston/renderer-gl/gl-renderer.c | 2 ++ 5 files changed, 38 insertions(+) diff --git a/include/libweston/libweston.h b/include/libweston/libweston.h index c69a6655..d7c0ec15 100644 --- a/include/libweston/libweston.h +++ b/include/libweston/libweston.h @@ -374,6 +374,7 @@ struct weston_output { int scale; bool use_renderer_shadow_buffer; + struct weston_color_transform *from_sRGB_to_output; struct weston_color_transform *from_blend_to_output; bool from_blend_to_output_by_backend; diff --git a/libweston/color-noop.c b/libweston/color-noop.c index 89015222..6726ed8e 100644 --- a/libweston/color-noop.c +++ b/libweston/color-noop.c @@ -75,6 +75,19 @@ cmnoop_get_output_color_transform(struct weston_color_manager *cm_base, return true; } +static bool +cmnoop_get_sRGB_to_output_color_transform(struct weston_color_manager *cm_base, + struct weston_output *output, + struct weston_color_transform **xform_out) +{ + /* TODO: Assert output has no colorspace set */ + + /* Identity transform */ + *xform_out = NULL; + + return true; +} + static bool cmnoop_init(struct weston_color_manager *cm_base) { @@ -109,6 +122,8 @@ weston_color_manager_noop_create(struct weston_compositor *compositor) cm->base.get_surface_color_transform = cmnoop_get_surface_color_transform; cm->base.get_output_color_transform = cmnoop_get_output_color_transform; + cm->base.get_sRGB_to_output_color_transform = + cmnoop_get_sRGB_to_output_color_transform; return &cm->base; } diff --git a/libweston/color.h b/libweston/color.h index 1c330e5f..c13d20cd 100644 --- a/libweston/color.h +++ b/libweston/color.h @@ -176,6 +176,22 @@ struct weston_color_manager { (*get_output_color_transform)(struct weston_color_manager *cm, struct weston_output *output, struct weston_color_transform **xform_out); + + /** Get sRGB to output transformation + * + * \param cm The color manager. + * \param output The output for the destination color space. + * \param xform_out Pointer for storing the weston_color_transform. + * \return True on success, false on failure. + * + * The callee is responsible for increasing the reference count on the + * weston_color_transform it stores via xform_out. On failure, xform_out + * is untouched. + */ + bool + (*get_sRGB_to_output_color_transform)(struct weston_color_manager *cm, + struct weston_output *output, + struct weston_color_transform **xform_out); }; struct weston_color_transform * diff --git a/libweston/compositor.c b/libweston/compositor.c index e94849bd..3f4f4b0b 100644 --- a/libweston/compositor.c +++ b/libweston/compositor.c @@ -6272,6 +6272,8 @@ weston_output_transform_coordinate(struct weston_output *output, static void weston_output_reset_color_transforms(struct weston_output *output) { + weston_color_transform_unref(output->from_sRGB_to_output); + output->from_sRGB_to_output = NULL; weston_color_transform_unref(output->from_blend_to_output); output->from_blend_to_output = NULL; } @@ -6687,6 +6689,8 @@ weston_output_enable(struct weston_output *output) ok = cm->get_output_color_transform(cm, output, &output->from_blend_to_output); + ok = ok && cm->get_sRGB_to_output_color_transform(cm, output, + &output->from_sRGB_to_output); if (!ok) { weston_log("Creating color transformation for output \"%s\" failed.\n", output->name); diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c index f20dee1f..ec320dbd 100644 --- a/libweston/renderer-gl/gl-renderer.c +++ b/libweston/renderer-gl/gl-renderer.c @@ -1272,6 +1272,8 @@ draw_output_borders(struct weston_output *output, if (border_status == BORDER_STATUS_CLEAN) return; /* Clean. Nothing to do. */ + assert(output->from_sRGB_to_output == NULL); + top = &go->borders[GL_RENDERER_BORDER_TOP]; bottom = &go->borders[GL_RENDERER_BORDER_BOTTOM]; left = &go->borders[GL_RENDERER_BORDER_LEFT];