From 8212f2aee3b15082294eaaa011ac943ba7c6a0b8 Mon Sep 17 00:00:00 2001 From: Subhransu Mohanty Date: Wed, 25 Nov 2015 14:09:59 +0900 Subject: [PATCH] eina: add new api eina_bezier_on_interval() I couldn't come up with a better name, if anyone has a suggestion. Signed-off-by: Cedric BAIL --- src/lib/eina/eina_bezier.c | 18 ++++++++++++++++++ src/lib/eina/eina_bezier.h | 13 +++++++++++++ src/tests/eina/eina_test_bezier.c | 22 ++++++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/src/lib/eina/eina_bezier.c b/src/lib/eina/eina_bezier.c index f07ca61..6494551 100644 --- a/src/lib/eina/eina_bezier.c +++ b/src/lib/eina/eina_bezier.c @@ -313,3 +313,21 @@ eina_bezier_bounds_get(const Eina_Bezier *b, double *x, double *y, double *w, do if (w) *w = xmax - xmin; if (h) *h = ymax - ymin; } + +EAPI void +eina_bezier_on_interval(Eina_Bezier *b, double t0, double t1, Eina_Bezier *result) +{ + Eina_Bezier bezier; + double t; + + if (t0 == 0 && t1 == 1) + { + *result = *b; + return; + } + + bezier = *b; + _eina_bezier_split_left(&bezier, t0, result); + t = (t1-t0)/(1-t0); + _eina_bezier_split_left(&bezier, t, result); +} diff --git a/src/lib/eina/eina_bezier.h b/src/lib/eina/eina_bezier.h index 407deb5..7fd0a79 100644 --- a/src/lib/eina/eina_bezier.h +++ b/src/lib/eina/eina_bezier.h @@ -157,4 +157,17 @@ EAPI void eina_bezier_split_at_length(const Eina_Bezier *b, double len, Eina_Bez */ EAPI void eina_bezier_bounds_get(const Eina_Bezier *b, double *x, double *y, double *w, double *h) EINA_ARG_NONNULL(1); +/** + * @brief find the bezier at given interval. + * + * @param b The floating point bezier. + * @param t0 The start interval. + * @param t1 The end interval. + * @param result The result bezier. + * + * @p b. No check is done on @p b. + * @since 1.16 + */ +EAPI void eina_bezier_on_interval(Eina_Bezier *b, double t0, double t1, Eina_Bezier *result); + #endif // EINA_BEZIER_H diff --git a/src/tests/eina/eina_test_bezier.c b/src/tests/eina/eina_test_bezier.c index fdfd9a3..a7a1598 100644 --- a/src/tests/eina/eina_test_bezier.c +++ b/src/tests/eina/eina_test_bezier.c @@ -195,6 +195,27 @@ START_TEST(eina_bezier_test_bounds_get) } END_TEST +START_TEST(eina_bezier_test_on_interval) +{ + Eina_Bezier b, res; + double px1, px2, py1, py2; + + eina_init(); + eina_bezier_values_set(&b, + 0, 0, + 10, 20, + 20, 90, + 30, 0); + eina_bezier_point_at(&b, 0.25, &px1, &py1); + eina_bezier_on_interval(&b, 0.25, 0.5, &res); + eina_bezier_point_at(&res, 0, &px2, &py2); + + fail_if(px1 != px2 || py1 != py2); + + eina_shutdown(); +} +END_TEST + void eina_test_bezier(TCase *tc) { @@ -205,4 +226,5 @@ eina_test_bezier(TCase *tc) tcase_add_test(tc, eina_bezier_test_point_at); tcase_add_test(tc, eina_bezier_test_split_at_length); tcase_add_test(tc, eina_bezier_test_bounds_get); + tcase_add_test(tc, eina_bezier_test_on_interval); } -- 2.7.4