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];