This is an automated email from the git hooks/post-receive script.
git pushed a commit to branch master
in repository echart.
View the commit online.
commit 514e9d297b0efce11748098fd81d1c1bab3f779d
Author: Vincent Torri <[email protected]>
AuthorDate: Mon May 25 09:00:45 2026 +0200
add pie chart, display all charts
---
src/bin/echart_main.c | 119 ++++++++++++-------
src/lib/Echart.h | 1 +
src/lib/echart_pie.c | 318 ++++++++++++++++++++++++++++++++++++++++++++++++++
src/lib/echart_pie.h | 19 +++
src/lib/meson.build | 6 +-
5 files changed, 421 insertions(+), 42 deletions(-)
diff --git a/src/bin/echart_main.c b/src/bin/echart_main.c
index 859fce9..0d40f8b 100644
--- a/src/bin/echart_main.c
+++ b/src/bin/echart_main.c
@@ -19,6 +19,10 @@ elm_main(int argc, char **argv)
unsigned int num;
int w;
int h;
+ int wo;
+ int ho;
+ int xo;
+ int yo;
for (int i = 1; i < argc; i++)
{
@@ -34,25 +38,10 @@ elm_main(int argc, char **argv)
echart_init();
- num = 6;
- absciss = (double *)calloc(num, sizeof(double));
- absciss[0] = 1;
- absciss[1] = 2;
- absciss[2] = 4;
- absciss[3] = 5;
- absciss[4] = 7;
- absciss[5] = 8;
-
- d = (double *)calloc(num, sizeof(double));
- d[0] = 1.5;
- d[1] = -1.5;
- d[2] = 2.3;
- d[3] = 7.9;
- d[4] = -4.2;
- d[5] = 8.4;
-
- w = 200;
- h = 200;
+ wo = 200 * elm_config_scale_get();
+ ho = 200 * elm_config_scale_get();
+ w = wo * 4;
+ h = ho * 2;
elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
@@ -75,11 +64,30 @@ elm_main(int argc, char **argv)
/* echart_title_color_set(o, 255, 0, 0, 255); */
/* evas_object_show(o);*/
-#if 0
/* line */
+
+ num = 6;
+ absciss = (double *)calloc(num, sizeof(double));
+ absciss[0] = 1;
+ absciss[1] = 2;
+ absciss[2] = 4;
+ absciss[3] = 5;
+ absciss[4] = 7;
+ absciss[5] = 8;
+
+ d = (double *)calloc(num, sizeof(double));
+ d[0] = 1.5;
+ d[1] = -1.5;
+ d[2] = 2.3;
+ d[3] = 7.9;
+ d[4] = -4.2;
+ d[5] = 8.4;
+ xo = 0;
+ yo = 0;
+
o = line = echart_line_add(evas_object_evas_get(win));
- evas_object_move(o, 0, 0);
- evas_object_resize(o, w * elm_config_scale_get(), h * elm_config_scale_get());
+ evas_object_move(o, xo, yo);
+ evas_object_resize(o, wo, ho);
echart_line_data_set(o, d, num);
echart_line_color_set(o, 255, 0, 0, 255);
echart_line_width_set(o, 3);
@@ -87,8 +95,8 @@ elm_main(int argc, char **argv)
/* grid abscissa */
o = echart_grid_add(evas_object_evas_get(win));
- evas_object_move(o, 0, 0);
- evas_object_resize(o, w * elm_config_scale_get(), h * elm_config_scale_get());
+ evas_object_move(o, xo, yo);
+ evas_object_resize(o, wo, ho);
echart_grid_set(o, 0, 1, 0.2);
echart_grid_color_set(o, 0, 0, 255, 255);
echart_grid_width_set(o, 3);
@@ -96,30 +104,61 @@ elm_main(int argc, char **argv)
/* grid ordinate */
o = echart_grid_ord_add(evas_object_evas_get(win));
- evas_object_move(o, 0, 0);
- evas_object_resize(o, w * elm_config_scale_get(), h * elm_config_scale_get());
+ evas_object_move(o, xo, yo);
+ evas_object_resize(o, wo, ho);
echart_grid_set(o, -4.1, 8.4, (8.4 + 4.1) / 5);
echart_grid_color_set(o, 0, 0, 255, 255);
echart_grid_width_set(o, 3);
evas_object_show(o);
-#else
+
+ /* vbar */
+ int nd = 3;
+
+ xo = 2 * wo;
+ yo = 0;
+ o = echart_bar_add(evas_object_evas_get(win));
+ evas_object_move(o, xo, yo);
+ evas_object_resize(o, wo, ho);
+ double v1[3] = { 3, 6, 4 };
+ echart_bar_data_append(o, v1, nd);
+ v1[0] = 6;
+ v1[1] = 4;
+ v1[2] = 3;
+ echart_bar_data_append(o, v1, nd);
+ evas_object_show(o);
+
+ /* hbar */
+ nd = 3;
+
+ xo = 3 * wo;
+ yo = 0;
o = echart_bar_add(evas_object_evas_get(win));
echart_bar_horizontal_set(o, 1);
- evas_object_move(o, 0, 0);
- evas_object_resize(o, w * elm_config_scale_get(), h * elm_config_scale_get());
- int nd = 3;
- double v[3] = { 3, 6, 4 };
- echart_bar_data_append(o, v, nd);
- v[0] = 6;
- v[1] = 4;
- v[2] = 3;
- echart_bar_data_append(o, v, nd);
+ evas_object_move(o, xo, yo);
+ evas_object_resize(o, wo, ho);
+ v1[0] = 3;
+ v1[1] = 6;
+ v1[2] = 4;
+ echart_bar_data_append(o, v1, nd);
+ v1[0] = 6;
+ v1[1] = 4;
+ v1[2] = 3;
+ echart_bar_data_append(o, v1, nd);
evas_object_show(o);
-#endif
- evas_object_resize(win,
- w * elm_config_scale_get(),
- h * elm_config_scale_get());
+ /* pie */
+ xo = 0;
+ yo = ho;
+
+ o = echart_pie_add(evas_object_evas_get(win));
+ evas_object_move(o, xo, yo);
+ evas_object_resize(o, wo, yo);
+ nd = 5;
+ double v2[5] = { 11, 4, 2, 9, 7 };
+ echart_pie_data_set(o, v2, nd);
+ evas_object_show(o);
+
+ evas_object_resize(win, w, h);
evas_object_show(win);
elm_run();
diff --git a/src/lib/Echart.h b/src/lib/Echart.h
index 3e85b10..5a7c420 100644
--- a/src/lib/Echart.h
+++ b/src/lib/Echart.h
@@ -47,6 +47,7 @@
#include "echart_grid_ord.h"
#include "echart_bar.h"
#include "echart_line.h"
+#include "echart_pie.h"
#include "echart_chart.h"
#endif
diff --git a/src/lib/echart_pie.c b/src/lib/echart_pie.c
new file mode 100644
index 0000000..41b3fff
--- /dev/null
+++ b/src/lib/echart_pie.c
@@ -0,0 +1,318 @@
+/*
+ * SPDX-FileCopyrightText: Vincent Torri <[email protected]>
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <config.h>
+
+#define _USE_MATH_DEFINES
+#include <math.h>
+
+#include "Echart.h"
+#include "echart_color.h"
+#include "echart_private.h"
+
+/*============================================================================*
+ * Local *
+ *============================================================================*/
+
+#define X_VG(x) (w) * ((x) - sd->ymin) / (sd->ymax - sd->ymin)
+#define Y_VG(y) (h) * (sd->ymax - (y)) / (sd->ymax - sd->ymin)
+
+typedef struct Data Data;
+typedef struct Chart_Pie Chart_Pie;
+
+struct Data
+{
+ Evas_Vg_Shape *pie;
+ double value;
+ unsigned char r, g, b;
+};
+
+struct Chart_Pie
+{
+ Evas_Object_Smart_Clipped_Data __clipped_data;
+
+ Evas_Object *o_bg;
+ Evas_Object *o_vg;
+
+ /* evas_vg */
+ Evas_Vg_Container *container;
+
+ /* data */
+ Data *data;
+ double sum;
+ int nbr_values;
+};
+
+static Evas_Smart *_pie_smart = NULL;
+static Evas_Smart_Class _parent_sc = EVAS_SMART_CLASS_INIT_NULL;
+
+/* Evas_Object smart callbacks */
+
+static void
+_pie_smart_add(Evas_Object *obj)
+{
+ Chart_Pie *sd;
+
+ INF(" * %s", __FUNCTION__);
+
+ sd = calloc(1, sizeof(Chart_Pie));
+ EINA_SAFETY_ON_NULL_RETURN(sd);
+
+ sd->o_bg = evas_object_rectangle_add(evas_object_evas_get(obj));
+ evas_object_move(sd->o_bg, 0, 0);
+ sd->o_vg = evas_object_vg_add(evas_object_evas_get(obj));
+
+ /* evas_vg */
+ sd->container = evas_vg_container_add(sd->o_vg);
+ evas_object_vg_root_node_set(sd->o_vg, sd->container);
+
+ /* data */
+
+ evas_object_smart_data_set(obj, sd);
+
+ _parent_sc.add(obj);
+}
+
+static void
+_pie_smart_del(Evas_Object *obj)
+{
+ Chart_Pie *sd;
+
+ INF(" * %s", __FUNCTION__);
+
+ sd = evas_object_smart_data_get(obj);
+ EINA_SAFETY_ON_NULL_RETURN(sd);
+
+ _parent_sc.del(obj);
+
+ free(sd->data);
+ evas_object_del(sd->o_bg);
+ evas_object_del(sd->o_vg);
+
+ evas_object_smart_data_set(obj, NULL);
+ memset(sd, 0, sizeof(*sd));
+ free(sd);
+}
+
+static void
+_pie_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
+{
+ Chart_Pie *sd;
+ Evas_Coord ox;
+ Evas_Coord oy;
+
+ INF(" * %s", __FUNCTION__);
+
+ sd = evas_object_smart_data_get(obj);
+ EINA_SAFETY_ON_NULL_RETURN(sd);
+
+ evas_object_geometry_get(obj, &ox, &oy, NULL, NULL);
+ if ((x == ox) && (y == oy))
+ return;
+
+ evas_object_move(sd->o_bg, x, y);
+ evas_object_move(sd->o_vg, x, y);
+
+ evas_object_smart_changed(obj);
+}
+
+static void
+_pie_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
+{
+ Chart_Pie *sd;
+ Evas_Coord ow;
+ Evas_Coord oh;
+
+ INF(" * %s", __FUNCTION__);
+
+ sd = evas_object_smart_data_get(obj);
+ EINA_SAFETY_ON_NULL_RETURN(sd);
+
+ evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
+ if ((w == ow) && (h == oh))
+ return;
+
+ evas_object_resize(sd->o_bg, w, h);
+ evas_object_resize(sd->o_vg, w, h);
+
+ evas_object_smart_changed(obj);
+}
+
+static void
+_pie_smart_show(Evas_Object *obj)
+{
+ Chart_Pie *sd;
+
+ INF(" * %s", __FUNCTION__);
+
+ sd = evas_object_smart_data_get(obj);
+ EINA_SAFETY_ON_NULL_RETURN(sd);
+
+ evas_object_show(sd->o_bg);
+ evas_object_show(sd->o_vg);
+}
+
+static void
+_pie_smart_hide(Evas_Object *obj)
+{
+ Chart_Pie *sd;
+
+ INF(" * %s", __FUNCTION__);
+
+ sd = evas_object_smart_data_get(obj);
+ EINA_SAFETY_ON_NULL_RETURN(sd);
+
+ evas_object_hide(sd->o_bg);
+ evas_object_hide(sd->o_vg);
+}
+
+static void
+_pie_smart_calculate(Evas_Object *obj)
+{
+ Chart_Pie *sd;
+ double theta0;
+ double theta1;
+ double rad;
+ int w, h;
+
+ INF(" * %s", __FUNCTION__);
+
+ sd = evas_object_smart_data_get(obj);
+ EINA_SAFETY_ON_NULL_RETURN(sd);
+
+ evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+ rad = (w < h) ? w : h;
+ rad /= 4;
+
+ theta0 = 0;
+ for (int i = 0; i < sd->nbr_values; i++)
+ {
+ theta1 = 2 * M_PI * sd->data[i].value / sd->sum;
+ printf("theta0 %f theta1 %f %f %f\n", theta0, theta1, sd->data[i].value, sd->sum);
+ printf("end point : %f %f\n", cos(theta0 + theta1), sin(theta0 + theta1));
+
+ evas_vg_shape_append_move_to(sd->data[i].pie, 0, 0);
+ evas_vg_shape_append_line_to(sd->data[i].pie,
+ rad * cos(theta0), -rad * sin(theta0));
+ evas_vg_shape_append_arc_to(sd->data[i].pie,
+ rad * cos(theta0 + theta1), -rad * sin(theta0 + theta1),
+ rad, rad,
+ 3, EINA_FALSE, EINA_FALSE);
+ evas_vg_shape_append_line_to(sd->data[i].pie, 0, 0);
+ evas_vg_shape_stroke_width_set(sd->data[i].pie, 1);
+ evas_vg_shape_stroke_color_set(sd->data[i].pie, 255, 255, 255, 255);
+ evas_vg_node_color_set(sd->data[i].pie, sd->data[i].r, sd->data[i].g, sd->data[i].b, 255);
+ evas_vg_node_origin_set(sd->data[i].pie, w/2, h/2);
+
+ theta0 += theta1;
+ }
+}
+
+static void
+_pie_smart_init(void)
+{
+ static Evas_Smart_Class sc;
+
+ INF(" * %s", __FUNCTION__);
+
+ evas_object_smart_clipped_smart_set(&_parent_sc);
+ sc = _parent_sc;
+ sc.name = "pie";
+ sc.version = EVAS_SMART_CLASS_VERSION;
+ sc.add = _pie_smart_add;
+ sc.del = _pie_smart_del;
+ sc.move = _pie_smart_move;
+ sc.resize = _pie_smart_resize;
+ sc.show = _pie_smart_show;
+ sc.hide = _pie_smart_hide;
+ sc.calculate = _pie_smart_calculate;
+ _pie_smart = evas_smart_class_new(&sc);
+}
+
+/*============================================================================*
+ * Global *
+ *============================================================================*/
+
+/*============================================================================*
+ * API *
+ *============================================================================*/
+
+ECH_API Evas_Object *
+echart_pie_add(Evas *evas)
+{
+ Evas_Object *obj;
+
+ INF(" * %s", __FUNCTION__);
+
+ if (!_pie_smart) _pie_smart_init();
+ obj = evas_object_smart_add(evas, _pie_smart);
+
+ return obj;
+}
+
+ECH_API void
+echart_pie_data_set(Evas_Object *obj, double *values, int nbr_values)
+{
+ Chart_Pie *sd;
+ unsigned int c;
+
+ sd = evas_object_smart_data_get(obj);
+ EINA_SAFETY_ON_NULL_RETURN(sd);
+
+ if (!values || (nbr_values <= 0))
+ return;
+
+ sd->nbr_values = nbr_values;
+
+ sd->data = "" * sizeof(Data));
+ if (!sd->data)
+ {
+ ERR("Can not allocate memory.");
+ return;
+ }
+
+ for (int i = 0; i < sd->nbr_values; i++)
+ {
+ sd->sum += values[i];
+ }
+
+ for (int i = 0; i < sd->nbr_values; i++)
+ {
+ sd->data[i].value = values[i];
+ c = echart_color_get(i).line;
+ sd->data[i].r = (unsigned char)((c >> 16) & 0xff);
+ sd->data[i].g = (unsigned char)((c >> 8) & 0xff);
+ sd->data[i].b = (unsigned char)((c >> 0) & 0xff);
+ sd->data[i].pie = evas_vg_shape_add(sd->container);
+ }
+
+ evas_object_smart_changed(obj);
+}
+
+ECH_API int
+echart_pie_nbr_values_get(Evas_Object *obj)
+{
+ Chart_Pie *sd;
+
+ sd = evas_object_smart_data_get(obj);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(sd, 0);
+
+ return sd->nbr_values;
+}
+
+ECH_API void
+echart_pie_color_set(Evas_Object *obj, int serie_num, int r, int g, int b, int a)
+{
+ Chart_Pie *sd;
+
+ sd = evas_object_smart_data_get(obj);
+ EINA_SAFETY_ON_NULL_RETURN(sd);
+
+ sd->data[serie_num].r = r;
+ sd->data[serie_num].g = g;
+ sd->data[serie_num].b = b;
+
+ evas_object_smart_changed(obj);
+}
diff --git a/src/lib/echart_pie.h b/src/lib/echart_pie.h
new file mode 100644
index 0000000..c18410e
--- /dev/null
+++ b/src/lib/echart_pie.h
@@ -0,0 +1,19 @@
+/*
+ * SPDX-FileCopyrightText: Vincent Torri <[email protected]>
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#ifndef ECHART_PIE_H
+#define ECHART_PIE_H
+
+#include <Evas.h>
+
+ECH_API Evas_Object *echart_pie_add(Evas *evas);
+
+ECH_API void echart_pie_data_set(Evas_Object *obj, double *values, int nbr_vamues);
+
+ECH_API int echart_pie_nbr_values_get(Evas_Object *obj);
+
+ECH_API void echart_pie_color_set(Evas_Object *obj, int idx, int r, int g, int b, int a);
+
+#endif /* ECHART_PIE_H */
diff --git a/src/lib/meson.build b/src/lib/meson.build
index 3fce511..c752800 100644
--- a/src/lib/meson.build
+++ b/src/lib/meson.build
@@ -3,23 +3,25 @@
echart_header = files([
'Echart.h',
+ 'echart_bar.h',
'echart_chart.h',
'echart_color.h',
'echart_grid.h',
'echart_grid_ord.h',
'echart_line.h',
'echart_main.h',
- 'echart_bar.h',
+ 'echart_pie.h',
])
echart_lib_src = files([
+ 'echart_bar.c',
'echart_chart.c',
'echart_color.c',
'echart_grid.c',
'echart_grid_ord.c',
'echart_line.c',
'echart_main.c',
- 'echart_bar.c',
+ 'echart_pie.c',
])
config_dir += [ include_directories('.') ]
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.