From 80d97db856cb2426366d9988d6e681833f592367 Mon Sep 17 00:00:00 2001 From: Leandro Ribeiro Date: Wed, 15 Nov 2023 12:56:49 -0300 Subject: color-lcms: changes to the parameters of translate_curve_element() Not a behavior change, but this allow us to decide what function pointer to use within this function (instead of forcing callers to decide that). In the following commits this will be helpful. We'll add more curves besides 3x1D LUT's and, depending on the curve, the function pointer signature may differ. Also, we now pass the xform directly to the function, and it can select the curves depending if it is being called for a pre or a post curve. Signed-off-by: Leandro Ribeiro --- libweston/color-lcms/color-transform.c | 43 ++++++++++++++++++++++++---------- shared/weston-assert.h | 3 +++ tests/assert-test.c | 4 ++++ 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/libweston/color-lcms/color-transform.c b/libweston/color-lcms/color-transform.c index 3cd71eeb..d5af355f 100644 --- a/libweston/color-lcms/color-transform.c +++ b/libweston/color-lcms/color-transform.c @@ -464,24 +464,45 @@ merge_curvesets(cmsPipeline **lut, cmsContext context_id) return modified; } +enum color_transform_step { + PRE_CURVE, + POST_CURVE, +}; + static bool -translate_curve_element(struct weston_color_curve *curve, - cmsToneCurve *stash[3], - void (*func)(struct weston_color_transform *xform, - float *values, unsigned len), - cmsStage *elem) +translate_curve_element(struct cmlcms_color_transform *xform, + cmsStage *elem, enum color_transform_step step) { + struct weston_compositor *compositor = xform->base.cm->compositor; + struct weston_color_curve *curve; + cmsToneCurve **stash; _cmsStageToneCurvesData *trc_data; unsigned i; - assert(cmsStageType(elem) == cmsSigCurveSetElemType); + weston_assert_uint64_eq(compositor, cmsStageType(elem), + cmsSigCurveSetElemType); trc_data = cmsStageData(elem); if (trc_data->nCurves != 3) return false; + switch(step) { + case PRE_CURVE: + curve = &xform->base.pre_curve; + curve->u.lut_3x1d.fill_in = cmlcms_fill_in_pre_curve; + stash = xform->pre_curve; + break; + case POST_CURVE: + curve = &xform->base.post_curve; + curve->u.lut_3x1d.fill_in = cmlcms_fill_in_post_curve; + stash = xform->post_curve; + break; + default: + weston_assert_not_reached(compositor, + "curve should be a pre or post curve"); + } + curve->type = WESTON_COLOR_CURVE_TYPE_LUT_3x1D; - curve->u.lut_3x1d.fill_in = func; curve->u.lut_3x1d.optimal_len = cmlcms_reasonable_1D_points(); for (i = 0; i < 3; i++) { @@ -533,9 +554,7 @@ translate_pipeline(struct cmlcms_color_transform *xform, const cmsPipeline *lut) return true; if (cmsStageType(elem) == cmsSigCurveSetElemType) { - if (!translate_curve_element(&xform->base.pre_curve, - xform->pre_curve, - cmlcms_fill_in_pre_curve, elem)) + if (!translate_curve_element(xform, elem, PRE_CURVE)) return false; elem = cmsStageNext(elem); @@ -555,9 +574,7 @@ translate_pipeline(struct cmlcms_color_transform *xform, const cmsPipeline *lut) return true; if (cmsStageType(elem) == cmsSigCurveSetElemType) { - if (!translate_curve_element(&xform->base.post_curve, - xform->post_curve, - cmlcms_fill_in_post_curve, elem)) + if (!translate_curve_element(xform, elem, POST_CURVE)) return false; elem = cmsStageNext(elem); diff --git a/shared/weston-assert.h b/shared/weston-assert.h index 6e313dc1..909c9997 100644 --- a/shared/weston-assert.h +++ b/shared/weston-assert.h @@ -109,6 +109,9 @@ do { \ #define weston_assert_uint32_lt(compositor, a, b) \ weston_assert_(compositor, a, b, uint32_t, "%u", <) +#define weston_assert_uint64_eq(compositor, a, b) \ + weston_assert_(compositor, a, b, uint64_t, "%" PRIx64, ==) + #define weston_assert_str_eq(compositor, a, b) \ weston_assert_fn_(compositor, strcmp, a, b, const char *, "%s", ==) diff --git a/tests/assert-test.c b/tests/assert-test.c index ab776758..acc134b7 100644 --- a/tests/assert-test.c +++ b/tests/assert-test.c @@ -132,4 +132,8 @@ TEST(asserts) abort_if_not(ret); ret = weston_assert_bit_is_set(compositor, bitfield, 57); abort_if_not(ret == false); + + uint64_t max_uint64 = UINT64_MAX; + ret = weston_assert_uint64_eq(compositor, max_uint64, 0); + abort_if_not(ret == false); } -- cgit v1.2.3