fix coordinames - ploot - simple plotting tools | |
git clone git://bitreich.org/ploot git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65… | |
Log | |
Files | |
Refs | |
Tags | |
README | |
LICENSE | |
--- | |
commit eb743275f407b73af41d4c5559f173e3e54d7cbd | |
parent 543398796b10e8f93841918a617933c853efe0ff | |
Author: Josuah Demangeon <[email protected]> | |
Date: Mon, 30 Apr 2018 20:39:04 +0200 | |
fix coordinames | |
Diffstat: | |
M Makefile | 2 ++ | |
M ffdraw.c | 25 ++++++++++++++----------- | |
M ffdraw.h | 2 +- | |
A ffplot.c | 0 | |
M font_14x7.c | 2 +- | |
M main.c | 108 ++++++++++++++++++++++++++++-… | |
6 files changed, 117 insertions(+), 22 deletions(-) | |
--- | |
diff --git a/Makefile b/Makefile | |
@@ -17,3 +17,5 @@ clean:x | |
rm -f *.o ploot | |
x: | |
+ | |
+$(SRC): arg.h ffdraw.h font.h font_14x7.h | |
diff --git a/ffdraw.c b/ffdraw.c | |
@@ -11,20 +11,24 @@ | |
#include <stdlib.h> | |
#include "ffdraw.h" | |
-#include "font_14x7.h" | |
#define WIDTH 100 | |
#define HEIGHT 100 | |
Color buffer[WIDTH * HEIGHT]; | |
+/* | |
+ * Convert (x,y) coordinates to (row,col) for printing into the buffer. | |
+ * The buffer only contain one number, so the coordinate is a single integer: | |
+ * width * x + y. | |
+ */ | |
void | |
ffdraw_pixel(Canvas *can, Color col, | |
int x, int y) | |
{ | |
- if (x >= can->w || y >= can->h) | |
+ if (x >= can->h || y >= can->w) | |
return; | |
- memcpy(can->b + x + (can->h - 1 - y) * can->w, col, sizeof(*can->b)); | |
+ memcpy(can->b + can->w * (can->h - 1 - x) + y, col, sizeof(*can->b)); | |
} | |
void | |
@@ -87,12 +91,12 @@ ffdraw_char(Canvas *can, Color col, char c, Font *f, | |
if (c & 0x80) | |
c = '\0'; | |
- x -= f->w / 2; | |
- y -= f->h / 2; | |
+ x -= f->h / 2; | |
+ y -= f->w / 2; | |
- for (xf = 0; xf < f->w; xf++) | |
- for (yf = 0; yf < f->h; yf++) | |
- if (f->b[(int)c][(f->h - yf - 1) * f->w + xf] > 0) | |
+ for (xf = 0; xf < f->h; xf++) | |
+ for (yf = 0; yf < f->w; yf++) | |
+ if (f->b[(int)c][f->w * (f->h - xf - 1) + yf] > 0) | |
ffdraw_pixel(can, col, x + xf, y + yf); | |
} | |
@@ -103,13 +107,12 @@ void | |
ffdraw_str(Canvas *can, Color col, char *s, Font *f, | |
int x, int y) | |
{ | |
- for (; *s; x += f->w, s++) | |
+ for (; *s != '\0'; y += f->w, s++) | |
ffdraw_char(can, col, *s, f, x, y); | |
- | |
} | |
void | |
ffdraw_fill(Canvas *can, Color col) | |
{ | |
- ffdraw_rectangle(can, col, 0, 0, can->w - 1, can->h - 1); | |
+ ffdraw_rectangle(can, col, 0, 0, can->h - 1, can->w - 1); | |
} | |
diff --git a/ffdraw.h b/ffdraw.h | |
@@ -12,7 +12,7 @@ typedef struct { | |
typedef struct { | |
int w; /* width */ | |
int h; /* height */ | |
- char *b[255]; /* buffer */ | |
+ char *b[128]; /* buffer */ | |
} Font; | |
/* ffdraw.c */ | |
diff --git a/ffplot.c b/ffplot.c | |
diff --git a/font_14x7.c b/font_14x7.c | |
@@ -586,7 +586,7 @@ C(A) = { | |
_,_,_,_,_,_,_, | |
_,_,_,_,_,_,_, | |
_,_,_,X,_,_,_, | |
- _,_,X,_,X,_,_, | |
+ _,_,_,X,_,_,_, | |
_,_,X,_,X,_,_, | |
_,_,X,_,X,_,_, | |
_,X,_,_,_,X,_, | |
diff --git a/main.c b/main.c | |
@@ -2,14 +2,101 @@ | |
#include <stdlib.h> | |
#include <stdio.h> | |
+#include <time.h> | |
#include "ffdraw.h" | |
#include "font_14x7.h" | |
-#define WIDTH 500 | |
-#define HEIGHT 100 | |
+/* as you see, no css skills needed */ | |
-Color buffer[WIDTH * HEIGHT]; | |
+#define MARGIN 5 | |
+#define FONT_H 14 | |
+#define FONT_W 7 | |
+ | |
+/* height */ | |
+ | |
+#define TITLE_H (MARGIN + FONT_H + MARGIN) | |
+#define PLOT_H 100 | |
+#define XLABEL_H (MARGIN + FONT_H + MARGIN) | |
+ | |
+#define IMAGE_H (TITLE_H + PLOT_H + XLABEL_H) | |
+ | |
+#define TITLE_B (0) | |
+#define TITLE_E (TITLE_H) | |
+#define PLOT_X_B (TITLE_H) | |
+#define PLOT_X_E (IMAGE_H - XLABEL_H) | |
+#define XLABEL_B (IMAGE_H - XLABEL_H) | |
+#define XLABEL_E (IMAGE_H) | |
+ | |
+/* width */ | |
+ | |
+#define YLABEL_W (MARGIN + 50 + MARGIN) | |
+#define PLOT_W 500 | |
+#define LEGEND_W (MARGIN + 70 + MARGIN) | |
+ | |
+#define IMAGE_W (YLABEL_W + PLOT_W + LEGEND_W) | |
+ | |
+#define YLABEL_B (0) | |
+#define YLABEL_E (YLABEL_W) | |
+#define PLOT_Y_B (YLABEL_W) | |
+#define PLOT_Y_E (IMAGE_W - LEGEND_W) | |
+#define LEGEND_B (IMAGE_W - LEGEND_W) | |
+#define LEGEND_E (IMAGE_W) | |
+ | |
+#define MID(x, y) ((x - y) / 2) | |
+ | |
+Color buffer[IMAGE_W * IMAGE_H]; | |
+ | |
+Color c_axis = { 0xffff, 0xffff, 0xffff, 0xfff }; | |
+Font *font = &font_14x7; | |
+ | |
+void | |
+ffplot_xaxis(Canvas *can, Color col, time_t tmax, time_t tstep) | |
+{ | |
+ time_t t; | |
+ int x, y, ystep, width; | |
+ char str[sizeof("YYYY/MM/DD")], *fmt; | |
+ | |
+ if (tstep < 3600) { | |
+ fmt = "%H:%M:%S"; | |
+ width = sizeof("HH:MM:SS"); | |
+ } else { | |
+ fmt = "%Y/%m/%d"; | |
+ width = sizeof("YYYY/MM/DD"); | |
+ } | |
+ | |
+ ystep = MARGIN + FONT_W * width + MARGIN; | |
+ | |
+ t = tmax % tstep; | |
+ x = XLABEL_B + FONT_H / 2; | |
+ y = PLOT_Y_B + PLOT_W % ystep - width / 2; | |
+ | |
+ while (y > PLOT_Y_B) { | |
+ strftime(str, sizeof(str), fmt, localtime(&t)); | |
+ ffdraw_str(can, col, str, font, x, y); | |
+ | |
+ y -= ystep; | |
+ t -= tstep; | |
+ } | |
+} | |
+ | |
+void | |
+ffplot_(Canvas *can) | |
+{ | |
+ (void)can; | |
+} | |
+ | |
+void | |
+ffplot_graph(Canvas *can) | |
+{ | |
+ (void)can; | |
+} | |
+ | |
+void | |
+ffplot_legend(Canvas *can) | |
+{ | |
+ (void)can; | |
+} | |
static void | |
ffdraw(Canvas *can) | |
@@ -18,8 +105,11 @@ ffdraw(Canvas *can) | |
Color col2 = { 0x3333, 0xffff, 0x8888, 0xffff }; | |
ffdraw_fill(can, col1); | |
+ ffplot_xaxis(can, col2, 3600 * 24 * 30, 360); | |
+/* | |
ffdraw_line(can, col2, 49,1,9,79); | |
- ffdraw_str(can, col2, "R\\S`T'UaVbWcYdZe\nfghb\tjoi\rklmnopqrstuvwxyz{… | |
+ ffdraw_str(can, col2, "R\\S`T'UaVbWcYdZe\nfghb\tjoi\rklmnopqrstuvwxyz{… | |
+*/ | |
} | |
int | |
@@ -29,14 +119,14 @@ main(void) | |
Canvas can; | |
can.b = buffer; | |
- can.w = WIDTH; | |
- can.h = HEIGHT; | |
- w = htonl(WIDTH); | |
- h = htonl(HEIGHT); | |
+ can.w = IMAGE_W; | |
+ can.h = IMAGE_H; | |
+ w = htonl(IMAGE_W); | |
+ h = htonl(IMAGE_H); | |
fputs("farbfeld", stdout); | |
fwrite(&w, sizeof(w), 1, stdout); | |
fwrite(&h, sizeof(h), 1, stdout); | |
ffdraw(&can); | |
- fwrite(can.b, WIDTH * HEIGHT, sizeof(*can.b), stdout); | |
+ fwrite(can.b, IMAGE_W * IMAGE_H, sizeof(*can.b), stdout); | |
return 0; | |
} |