Import simple chart drawing code.
authorbernie <bernie@38d2e660-2303-0410-9eaa-f027e97ec537>
Wed, 4 Aug 2004 03:16:30 +0000 (03:16 +0000)
committerbernie <bernie@38d2e660-2303-0410-9eaa-f027e97ec537>
Wed, 4 Aug 2004 03:16:30 +0000 (03:16 +0000)
git-svn-id: https://src.develer.com/svnoss/bertos/trunk@105 38d2e660-2303-0410-9eaa-f027e97ec537

mware/charts.c [new file with mode: 0755]
mware/charts.h [new file with mode: 0755]

diff --git a/mware/charts.c b/mware/charts.c
new file mode 100755 (executable)
index 0000000..469f6f2
--- /dev/null
@@ -0,0 +1,146 @@
+/*!
+ * \file
+ * <!--
+ * Copyright 2004 Develer S.r.l. (http://www.develer.com/)
+ * Copyright 1999, 2000, 2001, 2003 Bernardo Innocenti <bernie@develer.com>
+ * This file is part of DevLib - See devlib/README for information.
+ * -->
+ *
+ * \brief Simple charts on top of mware/gfx routines (implementation).
+ *
+ * Sample usage:
+ *
+ * \code
+ *     bm = chart_init(0, ymax, N_POINTS_CURVE, ymin);
+ *
+ *     chart_drawCurve(bm, curve_y, curve_points + 1);
+ *     gfx_setViewRect(bm, xmin, ymax, xmax, ymin);
+ *     chart_drawDots(bm, samples_x, samples_y, samples_cnt);
+ *
+ *     print_bitmap(bm);
+ * \endcode
+ *
+ * \version $Id$
+ * \author Bernardo Innocenti <bernie@develer.com>
+ */
+
+/*
+ * $Log$
+ * Revision 1.1  2004/08/04 03:16:30  bernie
+ * Import simple chart drawing code.
+ *
+ */
+
+#include "charts.h"
+#include <mware/gfx.h>
+
+
+static Bitmap ChartBitmap;
+
+/*!
+ * Raster buffer to draw into.
+ *
+ * Bits in the bitmap bytes have vertical orientation,
+ * as required by the printer driver.
+ */
+DECLARE_WALL(wall_before_raster, WALL_SIZE)
+static uint8_t ChartRaster[BM_WIDTH * ((BM_HEIGHT + 7) / 8)];
+DECLARE_WALL(wall_after_raster, WALL_SIZE)
+
+
+Bitmap *chart_init(vcoord_t xmin, vcoord_t ymin, vcoord_t xmax, vcoord_t ymax)
+{
+       /* Initialize anti-corruption walls */
+       INIT_WALL(wall_before_raster, WALL_SIZE);
+       INIT_WALL(wall_after_raster, WALL_SIZE);
+
+       gfx_InitBitMap(&ChartBitmap, ChartRaster, BM_WIDTH, BM_HEIGHT);
+       gfx_ClearBitMap(&ChartBitmap);
+       gfx_DrawAxis(&ChartBitmap);
+
+       gfx_SetClipRect(&ChartBitmap, CHART_BORDERLEFT, CHART_BORDERTOP,
+               BM_WIDTH - CHART_BORDERRIGHT - 1, BM_HEIGHT - CHART_BORDERBOTTOM - 1);
+
+       gfx_SetViewRect(&ChartBitmap, xmin, ymin, xmax, ymax);
+
+       CHECK_WALL(wall_before_raster, WALL_SIZE);
+       CHECK_WALL(wall_after_raster, WALL_SIZE);
+
+       return &ChartBitmap;
+}
+
+
+/*!
+ * Draw the chart axes
+ */
+void chart_drawAxis(Bitmap *bm)
+{
+       /* Draw axis */
+       gfx_MoveTo(bm, CHART_BORDERLEFT, 4);
+       gfx_LineTo(bm, CHART_BORDERLEFT, CHART_BORDERTOP + CHART_HEIGHT - 1);
+       gfx_LineTo(bm, CHART_BORDERLEFT + CHART_WIDTH - 5, CHART_BORDERTOP + CHART_HEIGHT - 1);
+
+       /* Draw up arrow */
+       gfx_MoveTo(bm, CHART_BORDERLEFT - 2, 3);
+       gfx_LineTo(bm, CHART_BORDERLEFT + 2, 3);
+       gfx_LineTo(bm, CHART_BORDERLEFT, 0);
+       gfx_LineTo(bm, CHART_BORDERLEFT - 2, 3);
+
+       /* Draw right arrow */
+       gfx_MoveTo(bm, CHART_BORDERLEFT + CHART_WIDTH - 4, CHART_BORDERTOP + CHART_HEIGHT - 3);
+       gfx_LineTo(bm, CHART_BORDERLEFT + CHART_WIDTH - 4, CHART_BORDERTOP + CHART_HEIGHT + 1);
+       gfx_LineTo(bm, CHART_BORDERLEFT + CHART_WIDTH - 1, CHART_BORDERTOP + CHART_HEIGHT - 1);
+       gfx_LineTo(bm, CHART_BORDERLEFT + CHART_WIDTH - 4, CHART_BORDERTOP + CHART_HEIGHT - 3);
+
+       CHECK_WALL(wall_before_raster, WALL_SIZE);
+       CHECK_WALL(wall_after_raster, WALL_SIZE);
+}
+
+
+/*!
+ * Draw a set of \a curve_cnt connected segments, whose Y coordinates
+ * are identified by the \a curve_y array and X-coordinates are
+ * are evenly spaced by one virtual unit.
+ */
+void chart_drawCurve(Bitmap *bm, const vcoord_t *curve_y, int curve_cnt)
+{
+       int i;
+
+       gfx_MoveTo(bm, gfx_TransformX(bm, 0), gfx_TransformY(bm, curve_y[0]));
+
+       for (i = 1; i < curve_cnt; i++)
+               gfx_LineTo(bm, gfx_TransformX(bm, i), gfx_TransformY(bm, curve_y[i]));
+
+       CHECK_WALL(wall_before_raster, WALL_SIZE);
+       CHECK_WALL(wall_after_raster, WALL_SIZE);
+}
+
+
+/*!
+ * Disegna dei dot in corrispondenza delle coppie (dotsx[i];dotsy[i])
+ * Se dotsx e' NULL, i punti vengono disegnati ad intervalli regolari.
+ */
+void chart_drawDots(BitMap *bm, const vcoord_t *dotsx, const vcoord_t *dotsy, int cnt)
+{
+       int i;
+       coord_t x, y;
+
+       for (i = 0; i < cnt; i++)
+       {
+               if (dotsx)
+                       x = gfx_TransformX(bm, dotsx[i]);
+               else
+                       x = gfx_TransformX(bm, i);
+
+               y = gfx_TransformY(bm, dotsy[i]);
+
+               gfx_DrawRect(bm, x - 1, y - 1, x + 1, y + 1);
+
+               /* Disegna ticks sull'asse X */
+               gfx_DrawLine(bm, x, BM_HEIGHT - 1, x, CHART_HEIGHT - 1);
+       }
+
+       CHECK_WALL(wall_before_raster, WALL_SIZE);
+       CHECK_WALL(wall_after_raster, WALL_SIZE);
+}
+
diff --git a/mware/charts.h b/mware/charts.h
new file mode 100755 (executable)
index 0000000..8dec2c6
--- /dev/null
@@ -0,0 +1,67 @@
+/*!
+ * \file
+ * <!--
+ * Copyright 2004 Develer S.r.l. (http://www.develer.com/)
+ * Copyright 1999, 2000, 2001, 2003 Bernardo Innocenti <bernie@develer.com>
+ * This file is part of DevLib - See devlib/README for information.
+ * -->
+ *
+ * \brief Simple charts on top of mware/gfx routines (interface).
+ *
+ * \version $Id$
+ * \author Bernardo Innocenti <bernie@develer.com>
+ */
+
+/*
+ * $Log$
+ * Revision 1.1  2004/08/04 03:16:30  bernie
+ * Import simple chart drawing code.
+ *
+ */
+#ifndef MWARE_CHARTS_H
+#define MWARE_CHARTS_H
+
+#include <gfx.h> /* vcoord_t */
+
+/*!
+ * \name Width/height of the chart bitmap in pixels
+ * \{
+ */
+#define BM_WIDTH       PRT_HRES
+#define BM_HEIGHT      120
+/*\}*/
+
+/*!
+ * \name Width/height of the small ticks drawn over the axes
+ * \{
+ */
+#define TICKS_HEIGHT     2
+#define TICKS_WIDTH      3
+/*\}*/
+
+/*!
+ * \name Chart frame dimensions
+ * \{
+ */
+#define CHART_BORDERTOP       0
+#define CHART_BORDERBOTTOM    TICKS_HEIGHT
+#define CHART_BORDERLEFT      TICKS_WIDTH
+#define CHART_BORDERRIGHT     0
+/*\}*/
+
+/*!
+ * \name Chart size in pixels
+ * \{
+ */
+#define CHART_WIDTH     (BM_WIDTH - CHART_BORDERLEFT - CHART_BORDERRIGHT)
+#define CHART_HEIGHT    (BM_HEIGHT  - CHART_BORDERTOP - CHART_BORDERBOTTOM)
+/*\}*/
+
+
+/* Public function protos */
+extern BitMap *chart_init(vcoord_t xmin, vcoord_t ymin, float xmax, float ymax);
+extern void chart_drawAxis(BitMap *bm);
+extern void chart_drawCurve(BitMap *bm, const vcoord_t *curve_y, int curve_cnt);
+extern void chart_drawDots(BitMap *bm, const vcoord_t *dotsx, const float *dotsy, int cnt);
+
+#endif /* MWARE_CHARTS_H */