basic rectangle drawing functions - ploot - simple plotting tools
 (HTM) git clone git://bitreich.org/ploot git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ploot
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Tags
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 6e13cd89684d0129aa13995c3f0e2ba4f0a7aae1
 (DIR) parent 1fc2d491d5051732caac4426d73cb22c2d870f6d
 (HTM) Author: Josuah Demangeon <mail@josuah.net>
       Date:   Mon, 30 Apr 2018 11:33:21 +0200
       
       basic rectangle drawing functions
       
       Diffstat:
         D deffont.h                           |      27 ---------------------------
         M font-14x7.h                         |      16 +++++++---------
         M font.c                              |     113 +++++++++++++++++++++----------
         A font.h                              |      29 +++++++++++++++++++++++++++++
         D txt                                 |       0 
       
       5 files changed, 113 insertions(+), 72 deletions(-)
       ---
 (DIR) diff --git a/deffont.h b/deffont.h
       @@ -1,27 +0,0 @@
       -#include <stddef.h>
       -
       -#define _ 0
       -#define X 1
       -#define B(x) char glyph_ ## x[WIDTH * HEIGHT]
       -#define b(x) glyph_ ## x
       -#define NOPR NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
       -#define NOPRINT NOPR, NOPR, NOPR, NOPR
       -
       -#define FONT(x) char *font_ ## x[] = { \
       -        NULL, NULL, NULL, NULL, \
       -        NULL, NULL, NULL, NULL, \
       -        NULL, NULL, NULL, NULL, \
       -        NULL, NULL, NULL, NULL, \
       -        NULL, NULL, NULL, NULL, \
       -        NULL, NULL, NULL, NULL, \
       -        b(space), b(bang), b(double), b(hash), \
       -        b(dollar), b(percent), b(ampersand), b(single), \
       -        b(l_round), b(r_round), b(asterisk), b(plus), \
       -        b(coma), b(minus), b(dot), b(slash), \
       -        b(0), b(1), b(2), b(3), \
       -        b(4), b(5), b(6), b(7), \
       -        b(8), b(9), b(column), b(semicolumn), \
       -        b(l_angle), b(equal), b(r_angle), b(question), \
       -        b(column), b(semicolumn), b(l_angle), b(equal), \
       -        b(r_angle), b(question) \
       -}
 (DIR) diff --git a/font-14x7.h b/font-14x7.h
       @@ -1,7 +1,5 @@
       -#include "deffont.h"
       -
       -#define WIDTH 14
       -#define HEIGHT 7
       +#define FONT_WIDTH 14
       +#define FONT_HEIGHT 6
        
        B(space) = {
        _        ,_,_,_,_,_,
       @@ -73,6 +71,7 @@ _        ,_,_,_,_,_
        
        B(dollar) = {
        _        ,_,_,_,_,_,
       +_        ,_,_,_,_,_,
        _        ,_,_,X,_,_,
        _        ,_,X,X,X,_,
        _        ,X,_,X,_,X,
       @@ -85,21 +84,20 @@ _        ,X,_,X,_,X,
        _        ,_,X,X,X,_,
        _        ,_,_,X,_,_,
        _        ,_,_,_,_,_,
       -_        ,_,_,_,_,_
        };
        
        B(percent) = {
        _        ,_,_,_,_,_,
        _        ,_,_,_,_,_,
       -_        ,_,_,_,_,X,
       +_        ,_,_,_,_,_,
        _        ,X,X,_,_,X,
        _        ,X,X,_,X,_,
        _        ,_,_,_,X,_,
        _        ,_,_,X,_,_,
       +_        ,_,_,X,_,_,
        _        ,_,X,_,_,_,
        _        ,_,X,_,X,X,
        _        ,X,_,_,X,X,
       -_        ,X,_,_,_,_,
        _        ,_,_,_,_,_,
        _        ,_,_,_,_,_,
        _        ,_,_,_,_,_
       @@ -381,7 +379,7 @@ B(6) = {
        _        ,_,_,_,_,_,
        _        ,_,_,_,_,_,
        _        ,_,X,X,X,_,
       -_        ,X,_,_,_,_,
       +_        ,X,_,_,_,X,
        _        ,X,_,_,_,_,
        _        ,X,_,_,_,_,
        _        ,X,X,X,X,_,
       @@ -438,7 +436,7 @@ _        ,X,_,_,_,X,
        _        ,_,X,X,X,X,
        _        ,_,_,_,_,X,
        _        ,_,_,_,_,X,
       -_        ,_,_,_,_,X,
       +_        ,X,_,_,_,X,
        _        ,_,X,X,X,_,
        _        ,_,_,_,_,_,
        _        ,_,_,_,_,_,
 (DIR) diff --git a/font.c b/font.c
       @@ -9,63 +9,104 @@
        #include <stdlib.h>
        #include <string.h>
        
       -#include "arg.h"
       +#include "font.h"
       +#include "font-14x7.h"
       +
       +#define WIDTH 100
       +#define HEIGHT 100
       +
       +#define MIN(x, y) ((x) < (y) ? (x) : (y))
       +#define MAX(x, y) ((x) > (y) ? (x) : (y))
        
        typedef uint16_t Color[4];
        
       -enum { R, G, B, A };
       +typedef struct {
       +        Color *b;        /* buffer */
       +        int w;                /* width */
       +        int h;                /* height */
       +} Canvas;
        
       -Color *canvas;
       +Color buffer[WIDTH * HEIGHT];
        
       -char *argv0;
       -int wflag = 0;
       -int hflag = 0;
       +void
       +ffdraw_pixel(Canvas *can, Color c,
       +        int x, int y)
       +{
       +        memcpy(can->b + x + (can->h - 1 - y) * can->w, c, sizeof(*can->b));
       +}
        
        void
       -usage()
       +ffdraw_rectangle(Canvas *can, Color c,
       +        int x1, int y1,
       +        int x2, int y2)
        {
       -        fputs("ploot -w width -h height <data.csv >image.ff\n", stderr);
       -        exit(1);
       +        int x, y, xmin, ymin, xmax, ymax;
       +
       +        xmin = MIN(x1, x2); xmax = MAX(x1, x2);
       +        ymin = MIN(y1, y2); ymax = MAX(y1, y2);
       +
       +        for (x = xmin; x <= xmax; x++)
       +                for (y = ymin; y <= ymax; y++)
       +                        ffdraw_pixel(can, c, x, y);
       +}
       +
       +void
       +ffdraw_line(Canvas *can, Color c,
       +        int x1, int y1,
       +        int x2, int y2)
       +{
       +        int x, y;
       +
       +        (void)c;
       +        (void)can;
       +
       +        x = x1;
       +        y = y1;
       +        while (x < x2 && y < y2) {
       +                x++; y++;
       +        }
        }
        
        void
       -ffdraw(Color *canvas, int w, int h)
       +ffdraw_fill(Canvas *can, Color c)
        {
       -        Color col = { 0xffff, 0xffff, 0x0000, 0xffff };
       -        size_t n;
       +        ffdraw_rectangle(can, c, 0, 0, can->w - 1, can->h - 1);
       +}
        
       -        for (n = w * h; n > 0; n--)
       -                memcpy(canvas + n - 1, col, sizeof(col));
       +void
       +ffdraw(Canvas *can)
       +{
       +        Color c1 = { 0x2222, 0x2222, 0x2222, 0xffff };
       +        Color c2 = { 0x3333, 0xffff, 0x8888, 0xffff };
       +
       +        ffdraw_fill(can, c1);
       +        ffdraw_rectangle(can, c2,
       +                0, 20,
       +                can->w - 10, 4);
       +}
       +
       +void
       +usage(void)
       +{
       +        fprintf(stderr, "ploot <data.csv >image.ff\n");
       +        exit(1);
        }
        
        int
       -main(int argc, char **argv)
       +main(void)
        {
                uint32_t w, h;
       +        Canvas can;
        
       -        ARGBEGIN {
       -        case 'w':
       -                wflag = atoi(EARGF(usage()));
       -                break;
       -        case 'h':
       -                hflag = atoi(EARGF(usage()));
       -                break;
       -        } ARGEND;
       -
       -        if (wflag == 0 || hflag == 0)
       -                usage();
       -
       -        if ((canvas = calloc(wflag * hflag, sizeof(*canvas))) == NULL) {
       -                perror("allocating memory for the canvas");
       -                return 1;
       -        }
       -
       +        can.b = buffer;
       +        can.w = WIDTH;
       +        can.h = HEIGHT;
       +        w = htonl(WIDTH);
       +        h = htonl(HEIGHT);
                fputs("farbfeld", stdout);
       -        w = htonl(wflag);
       -        h = htonl(hflag);
                fwrite(&w, sizeof(w), 1, stdout);
                fwrite(&h, sizeof(h), 1, stdout);
       -        ffdraw(canvas, wflag, hflag);
       -        fwrite(canvas, wflag * hflag, sizeof(*canvas), stdout);
       +        ffdraw(&can);
       +        fwrite(can.b, WIDTH * HEIGHT, sizeof(*can.b), stdout);
                return 0;
        }
 (DIR) diff --git a/font.h b/font.h
       @@ -0,0 +1,29 @@
       +#include <stddef.h>
       +
       +/*
       + * Macros to make the fonts header file more readable.
       + */
       +#define _ 0
       +#define X 1
       +#define B(x) char glyph_ ## x[FONT_WIDTH * FONT_HEIGHT]
       +#define b(x) glyph_ ## x
       +#define NOPR NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
       +#define NOPRINT NOPR, NOPR, NOPR, NOPR
       +#define FONT(x) char *font_ ## x[] = { \
       +        NULL, NULL, NULL, NULL, \
       +        NULL, NULL, NULL, NULL, \
       +        NULL, NULL, NULL, NULL, \
       +        NULL, NULL, NULL, NULL, \
       +        NULL, NULL, NULL, NULL, \
       +        NULL, NULL, NULL, NULL, \
       +        b(space), b(bang), b(double), b(hash), \
       +        b(dollar), b(percent), b(ampersand), b(single), \
       +        b(l_round), b(r_round), b(asterisk), b(plus), \
       +        b(coma), b(minus), b(dot), b(slash), \
       +        b(0), b(1), b(2), b(3), \
       +        b(4), b(5), b(6), b(7), \
       +        b(8), b(9), b(column), b(semicolumn), \
       +        b(l_angle), b(equal), b(r_angle), b(question), \
       +        b(column), b(semicolumn), b(l_angle), b(equal), \
       +        b(r_angle), b(question) \
       +}
 (DIR) diff --git a/txt b/txt