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); }