From dfba19abde95abe9a51c58725066450edf172003 Mon Sep 17 00:00:00 2001 From: Pekka Paalanen Date: Fri, 29 Apr 2022 11:20:34 +0300 Subject: [PATCH] color: simplify color manager API with weston_output_color_outcome I am going to need to add yet another output property to be set by a color manager: HDR Static Metadata Type 1. With the old color manager API design, I would have needed to add the fourth function pointer to be called always in the same group as the previous three. This seemed more convoluted than it needs to be. Therefore collapse the three existing function pointers in the API into just one that is resposible for setting up all three things. Signed-off-by: Pekka Paalanen --- include/libweston/libweston.h | 3 -- libweston/color-lcms/color-lcms.c | 52 +++++++++++++++++++-------- libweston/color-noop.c | 60 ++++++++----------------------- libweston/color.h | 52 +++++---------------------- libweston/compositor.c | 37 +++++-------------- 5 files changed, 70 insertions(+), 134 deletions(-) diff --git a/include/libweston/libweston.h b/include/libweston/libweston.h index 09bb4b4c..2eec0be3 100644 --- a/include/libweston/libweston.h +++ b/include/libweston/libweston.h @@ -415,9 +415,6 @@ struct weston_output { bool from_blend_to_output_by_backend; enum weston_eotf_mode eotf_mode; - /* XXX: temporary allocation to be removed in the next commit */ - struct weston_output_color_outcome colorout_; - struct weston_output_color_outcome *color_outcome; int (*enable)(struct weston_output *output); diff --git a/libweston/color-lcms/color-lcms.c b/libweston/color-lcms/color-lcms.c index 23d2b79d..e3668832 100644 --- a/libweston/color-lcms/color-lcms.c +++ b/libweston/color-lcms/color-lcms.c @@ -126,11 +126,10 @@ cmlcms_get_surface_color_transform(struct weston_color_manager *cm_base, } static bool -cmlcms_get_output_color_transform(struct weston_color_manager *cm_base, - struct weston_output *output, - struct weston_color_transform **xform_out) +cmlcms_get_blend_to_output_color_transform(struct weston_color_manager_lcms *cm, + struct weston_output *output, + struct weston_color_transform **xform_out) { - struct weston_color_manager_lcms *cm = get_cmlcms(cm_base); struct cmlcms_color_transform_search_param param = {}; struct cmlcms_color_transform *xform; @@ -148,11 +147,10 @@ cmlcms_get_output_color_transform(struct weston_color_manager *cm_base, } static bool -cmlcms_get_sRGB_to_output_color_transform(struct weston_color_manager *cm_base, +cmlcms_get_sRGB_to_output_color_transform(struct weston_color_manager_lcms *cm, struct weston_output *output, struct weston_color_transform **xform_out) { - struct weston_color_manager_lcms *cm = get_cmlcms(cm_base); struct cmlcms_color_transform_search_param param = {}; struct cmlcms_color_transform *xform; @@ -177,11 +175,10 @@ cmlcms_get_sRGB_to_output_color_transform(struct weston_color_manager *cm_base, } static bool -cmlcms_get_sRGB_to_blend_color_transform(struct weston_color_manager *cm_base, +cmlcms_get_sRGB_to_blend_color_transform(struct weston_color_manager_lcms *cm, struct weston_output *output, struct weston_color_transform **xform_out) { - struct weston_color_manager_lcms *cm = get_cmlcms(cm_base); struct cmlcms_color_transform_search_param param = {}; struct cmlcms_color_transform *xform; @@ -198,6 +195,36 @@ cmlcms_get_sRGB_to_blend_color_transform(struct weston_color_manager *cm_base, return true; } +static struct weston_output_color_outcome * +cmlcms_create_output_color_outcome(struct weston_color_manager *cm_base, + struct weston_output *output) +{ + struct weston_color_manager_lcms *cm = get_cmlcms(cm_base); + struct weston_output_color_outcome *co; + + co = zalloc(sizeof *co); + if (!co) + return NULL; + + if (!cmlcms_get_blend_to_output_color_transform(cm, output, + &co->from_blend_to_output)) + goto out_fail; + + if (!cmlcms_get_sRGB_to_blend_color_transform(cm, output, + &co->from_sRGB_to_blend)) + goto out_fail; + + if (!cmlcms_get_sRGB_to_output_color_transform(cm, output, + &co->from_sRGB_to_output)) + goto out_fail; + + return co; + +out_fail: + weston_output_color_outcome_destroy(&co); + return NULL; +} + static void lcms_error_logger(cmsContext context_id, cmsUInt32Number error_code, @@ -264,13 +291,8 @@ weston_color_manager_create(struct weston_compositor *compositor) cm->base.destroy_color_profile = cmlcms_destroy_color_profile; cm->base.get_color_profile_from_icc = cmlcms_get_color_profile_from_icc; cm->base.destroy_color_transform = cmlcms_destroy_color_transform; - cm->base.get_surface_color_transform = - cmlcms_get_surface_color_transform; - cm->base.get_output_color_transform = cmlcms_get_output_color_transform; - cm->base.get_sRGB_to_output_color_transform = - cmlcms_get_sRGB_to_output_color_transform; - cm->base.get_sRGB_to_blend_color_transform = - cmlcms_get_sRGB_to_blend_color_transform; + cm->base.get_surface_color_transform = cmlcms_get_surface_color_transform; + cm->base.create_output_color_outcome = cmlcms_create_output_color_outcome; wl_list_init(&cm->color_transform_list); wl_list_init(&cm->color_profile_list); diff --git a/libweston/color-noop.c b/libweston/color-noop.c index 0b67d5a6..2e1461f3 100644 --- a/libweston/color-noop.c +++ b/libweston/color-noop.c @@ -96,52 +96,27 @@ cmnoop_get_surface_color_transform(struct weston_color_manager *cm_base, return true; } -static bool -cmnoop_get_output_color_transform(struct weston_color_manager *cm_base, - struct weston_output *output, - struct weston_color_transform **xform_out) +static struct weston_output_color_outcome * +cmnoop_create_output_color_outcome(struct weston_color_manager *cm_base, + struct weston_output *output) { - assert(output->color_profile == NULL); - - if (!check_output_eotf_mode(output)) - return false; - - /* Identity transform */ - *xform_out = NULL; + struct weston_output_color_outcome *co; - 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) -{ assert(output->color_profile == NULL); if (!check_output_eotf_mode(output)) - return false; - - /* Identity transform */ - *xform_out = NULL; - - return true; -} - -static bool -cmnoop_get_sRGB_to_blend_color_transform(struct weston_color_manager *cm_base, - struct weston_output *output, - struct weston_color_transform **xform_out) -{ - assert(output->color_profile == NULL); + return NULL; - if (!check_output_eotf_mode(output)) - return false; + co = zalloc(sizeof *co); + if (!co) + return NULL; - /* Identity transform */ - *xform_out = NULL; + /* Identity transform on everything */ + co->from_blend_to_output = NULL; + co->from_sRGB_to_blend = NULL; + co->from_sRGB_to_output = NULL; - return true; + return co; } static bool @@ -177,13 +152,8 @@ weston_color_manager_noop_create(struct weston_compositor *compositor) cm->base.destroy_color_profile = cmnoop_destroy_color_profile; cm->base.get_color_profile_from_icc = cmnoop_get_color_profile_from_icc; cm->base.destroy_color_transform = cmnoop_destroy_color_transform; - 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; - cm->base.get_sRGB_to_blend_color_transform = - cmnoop_get_sRGB_to_blend_color_transform; + cm->base.get_surface_color_transform = cmnoop_get_surface_color_transform; + cm->base.create_output_color_outcome = cmnoop_create_output_color_outcome; return &cm->base; } diff --git a/libweston/color.h b/libweston/color.h index b5064587..b8b30d5b 100644 --- a/libweston/color.h +++ b/libweston/color.h @@ -297,53 +297,19 @@ struct weston_color_manager { struct weston_output *output, struct weston_surface_color_transform *surf_xform); - /** Get output's blending space to output transformation + /** Compute derived color properties for an output * * \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_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); - - /** Get sRGB to output's blending space transformation - * - * \param cm The color manager. - * \param output The output for the destination blending color space. - * \param xform_out Pointer for storing the weston_color_transform. - * \return True on success, false on failure. + * \param output The output. + * \return A new color_outcome object on success, NULL 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. + * The callee (color manager) must inspect the weston_output (color + * profile, EOTF mode, etc.) and create a fully populated + * weston_output_color_outcome object. */ - bool - (*get_sRGB_to_blend_color_transform)(struct weston_color_manager *cm, - struct weston_output *output, - struct weston_color_transform **xform_out); + struct weston_output_color_outcome * + (*create_output_color_outcome)(struct weston_color_manager *cm, + struct weston_output *output); }; void diff --git a/libweston/compositor.c b/libweston/compositor.c index 8c77bacf..000fb69e 100644 --- a/libweston/compositor.c +++ b/libweston/compositor.c @@ -6472,49 +6472,30 @@ weston_output_color_outcome_destroy(struct weston_output_color_outcome **pco) return; weston_color_transform_unref(co->from_sRGB_to_output); - co->from_sRGB_to_output = NULL; weston_color_transform_unref(co->from_sRGB_to_blend); - co->from_sRGB_to_blend = NULL; weston_color_transform_unref(co->from_blend_to_output); - co->from_blend_to_output = NULL; - /* XXX: added in the next commit */ - /* free(co); */ + free(co); *pco = NULL; } static bool -weston_output_set_color_transforms(struct weston_output *output) +weston_output_set_color_outcome(struct weston_output *output) { struct weston_color_manager *cm = output->compositor->color_manager; - struct weston_color_transform *blend_to_output = NULL; - struct weston_color_transform *sRGB_to_output = NULL; - struct weston_color_transform *sRGB_to_blend = NULL; - bool ok; - - ok = cm->get_output_color_transform(cm, output, &blend_to_output); - ok = ok && cm->get_sRGB_to_output_color_transform(cm, output, - &sRGB_to_output); - ok = ok && cm->get_sRGB_to_blend_color_transform(cm, output, - &sRGB_to_blend); - if (!ok) { + struct weston_output_color_outcome *colorout; + + colorout = cm->create_output_color_outcome(cm, output); + if (!colorout) { weston_log("Creating color transformation for output \"%s\" failed.\n", output->name); - weston_color_transform_unref(blend_to_output); - weston_color_transform_unref(sRGB_to_output); - weston_color_transform_unref(sRGB_to_blend); return false; } weston_output_color_outcome_destroy(&output->color_outcome); + output->color_outcome = colorout; - /* XXX: temporary allocation to be removed in the next commit */ - output->color_outcome = &output->colorout_; - - output->color_outcome->from_blend_to_output = blend_to_output; - output->color_outcome->from_sRGB_to_output = sRGB_to_output; - output->color_outcome->from_sRGB_to_blend = sRGB_to_blend; output->from_blend_to_output_by_backend = false; weston_log("Output '%s' using color profile: %s\n", output->name, @@ -6734,7 +6715,7 @@ weston_output_set_color_profile(struct weston_output *output, output->color_profile = weston_color_profile_ref(cprof); if (output->enabled) { - if (!weston_output_set_color_transforms(output)) { + if (!weston_output_set_color_outcome(output)) { /* Failed, roll back */ weston_color_profile_unref(output->color_profile); output->color_profile = old; @@ -6990,7 +6971,7 @@ weston_output_enable(struct weston_output *output) weston_log("Output '%s' attempts EOTF mode: %s\n", output->name, weston_eotf_mode_to_str(output->eotf_mode)); - if (!weston_output_set_color_transforms(output)) + if (!weston_output_set_color_outcome(output)) return -1; /* Enable the output (set up the crtc or create a