cedric pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=8212f2aee3b15082294eaaa011ac943ba7c6a0b8

commit 8212f2aee3b15082294eaaa011ac943ba7c6a0b8
Author: Subhransu Mohanty <sub.moha...@samsung.com>
Date:   Wed Nov 25 14:09:59 2015 +0900

    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 <ced...@osg.samsung.com>
---
 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);
 }

-- 


Reply via email to