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