idrawille.c - ploot - simple plotting tools Err bitreich.org 70 hgit clone git://bitreich.org/ploot git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ploot URL:git://bitreich.org/ploot git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ploot bitreich.org 70 1Log /scm/ploot/log.gph bitreich.org 70 1Files /scm/ploot/files.gph bitreich.org 70 1Refs /scm/ploot/refs.gph bitreich.org 70 1Tags /scm/ploot/tag bitreich.org 70 1README /scm/ploot/file/README.md.gph bitreich.org 70 1LICENSE /scm/ploot/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 idrawille.c (3796B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 #include "drawille.h" Err bitreich.org 70 i 2 #include Err bitreich.org 70 i 3 #include Err bitreich.org 70 i 4 #include Err bitreich.org 70 i 5 #include Err bitreich.org 70 i 6 #include Err bitreich.org 70 i 7 #include "font.h" Err bitreich.org 70 i 8 Err bitreich.org 70 i 9 /* Err bitreich.org 70 i 10 * Terminal-based plotting using drawille character, aka drawille. Err bitreich.org 70 i 11 */ Err bitreich.org 70 i 12 Err bitreich.org 70 i 13 /* parameters used to draw a line */ Err bitreich.org 70 i 14 struct line { Err bitreich.org 70 i 15 int x0, y0, x1, y1; /* point of the line */ Err bitreich.org 70 i 16 int dx, dy, sx, sy, err; /* parameters for the algorythm */ Err bitreich.org 70 i 17 }; Err bitreich.org 70 i 18 Err bitreich.org 70 i 19 /* Err bitreich.org 70 i 20 * Turn on the bit at position (row, col) of a single cell. The Err bitreich.org 70 i 21 * pattern is not linear (1-4-2-5-3-6-7-8), because it matches the Err bitreich.org 70 i 22 * drawille pattern. Err bitreich.org 70 i 23 */ Err bitreich.org 70 i 24 static void Err bitreich.org 70 i 25 drawille_cell_dot(uint8_t *cell, int row, int col) Err bitreich.org 70 i 26 { Err bitreich.org 70 i 27 uint8_t flags[4][2] = { Err bitreich.org 70 i 28 { 0x01, 0x08 }, Err bitreich.org 70 i 29 { 0x02, 0x10 }, Err bitreich.org 70 i 30 { 0x04, 0x20 }, Err bitreich.org 70 i 31 { 0x40, 0x80 }, Err bitreich.org 70 i 32 }; Err bitreich.org 70 i 33 Err bitreich.org 70 i 34 *cell |= flags[row][col]; Err bitreich.org 70 i 35 } Err bitreich.org 70 i 36 Err bitreich.org 70 i 37 static size_t Err bitreich.org 70 i 38 drawille_cell_utf(uint8_t cell, char *utf) Err bitreich.org 70 i 39 { Err bitreich.org 70 i 40 long rune; Err bitreich.org 70 i 41 Err bitreich.org 70 i 42 rune = 10240 + cell; Err bitreich.org 70 i 43 utf[0] = (char)(0xe0 | (0x0f & (rune >> 12))); /* 1110xxxx */ Err bitreich.org 70 i 44 utf[1] = (char)(0x80 | (0x3f & (rune >> 6))); /* 10xxxxxx */ Err bitreich.org 70 i 45 utf[2] = (char)(0x80 | (0x3f & (rune))); /* 10xxxxxx */ Err bitreich.org 70 i 46 return 3; Err bitreich.org 70 i 47 } Err bitreich.org 70 i 48 Err bitreich.org 70 i 49 static uint8_t Err bitreich.org 70 i 50 drawille_get(struct drawille *drw, int row, int col) Err bitreich.org 70 i 51 { Err bitreich.org 70 i 52 return drw->buf[row * drw->col + col]; Err bitreich.org 70 i 53 } Err bitreich.org 70 i 54 Err bitreich.org 70 i 55 size_t Err bitreich.org 70 i 56 drawille_put_row(FILE *fp, struct drawille *drw, int row) Err bitreich.org 70 i 57 { Err bitreich.org 70 i 58 char txt[] = "xxx"; Err bitreich.org 70 i 59 size_t n; Err bitreich.org 70 i 60 Err bitreich.org 70 i 61 n = 0; Err bitreich.org 70 i 62 for (int col = 0; col < drw->col; col++) { Err bitreich.org 70 i 63 drawille_cell_utf(drawille_get(drw, row, col), txt); Err bitreich.org 70 i 64 n += fputs(txt, fp); Err bitreich.org 70 i 65 } Err bitreich.org 70 i 66 return n; Err bitreich.org 70 i 67 } Err bitreich.org 70 i 68 Err bitreich.org 70 i 69 /* Err bitreich.org 70 i 70 * Coordinates are passed as (x, y), but the canvas stores bits as Err bitreich.org 70 i 71 * (row, col). Conversion is made by this function. Err bitreich.org 70 i 72 */ Err bitreich.org 70 i 73 void Err bitreich.org 70 i 74 drawille_dot(struct drawille *drw, int x, int y) Err bitreich.org 70 i 75 { Err bitreich.org 70 i 76 if (x < 0 || x / 2 >= drw->col || y < 0 || y / 4 >= drw->row) Err bitreich.org 70 i 77 return; Err bitreich.org 70 i 78 drawille_cell_dot(drw->buf + (drw->row - y / 4 - 1) * drw->col + (x / 2), Err bitreich.org 70 i 79 3 - y % 4, Err bitreich.org 70 i 80 x % 2); Err bitreich.org 70 i 81 } Err bitreich.org 70 i 82 Err bitreich.org 70 i 83 struct drawille * Err bitreich.org 70 i 84 drawille_new(int row, int col) Err bitreich.org 70 i 85 { Err bitreich.org 70 i 86 struct drawille *drw; Err bitreich.org 70 i 87 Err bitreich.org 70 i 88 if ((drw = calloc(sizeof(struct drawille) + row * col, 1)) == NULL) Err bitreich.org 70 i 89 return NULL; Err bitreich.org 70 i 90 drw->row = row; Err bitreich.org 70 i 91 drw->col = col; Err bitreich.org 70 i 92 return drw; Err bitreich.org 70 i 93 } Err bitreich.org 70 i 94 Err bitreich.org 70 i 95 static void Err bitreich.org 70 i 96 drawille_line_init(struct line *l, int x0, int y0, int x1, int y1) Err bitreich.org 70 i 97 { Err bitreich.org 70 i 98 l->x0 = x0; Err bitreich.org 70 i 99 l->y0 = y0; Err bitreich.org 70 i 100 l->x1 = x1; Err bitreich.org 70 i 101 l->y1 = y1; Err bitreich.org 70 i 102 l->sx = x0 < x1 ? 1 : -1; Err bitreich.org 70 i 103 l->sy = y0 < y1 ? 1 : -1; Err bitreich.org 70 i 104 l->dx = abs(x1 - x0); Err bitreich.org 70 i 105 l->dy = abs(y1 - y0); Err bitreich.org 70 i 106 l->err = (l->dx > l->dy ? l->dx : -l->dy) / 2; Err bitreich.org 70 i 107 } Err bitreich.org 70 i 108 Err bitreich.org 70 i 109 static int Err bitreich.org 70 i 110 drawille_line_next(struct line *l) Err bitreich.org 70 i 111 { Err bitreich.org 70 i 112 int err; Err bitreich.org 70 i 113 Err bitreich.org 70 i 114 if (l->x0 == l->x1 && l->y0 == l->y1) Err bitreich.org 70 i 115 return 0; Err bitreich.org 70 i 116 Err bitreich.org 70 i 117 err = l->err; Err bitreich.org 70 i 118 if (err > -l->dx) { Err bitreich.org 70 i 119 l->x0 += l->sx; Err bitreich.org 70 i 120 l->err -= l->dy; Err bitreich.org 70 i 121 } Err bitreich.org 70 i 122 if (err < l->dy) { Err bitreich.org 70 i 123 l->y0 += l->sy; Err bitreich.org 70 i 124 l->err += l->dx; Err bitreich.org 70 i 125 } Err bitreich.org 70 i 126 return 1; Err bitreich.org 70 i 127 } Err bitreich.org 70 i 128 Err bitreich.org 70 i 129 void Err bitreich.org 70 i 130 drawille_line(struct drawille *drw, int x0, int y0, int x1, int y1) Err bitreich.org 70 i 131 { Err bitreich.org 70 i 132 struct line l; Err bitreich.org 70 i 133 Err bitreich.org 70 i 134 drawille_line_init(&l, x0, y0, x1, y1); Err bitreich.org 70 i 135 do { Err bitreich.org 70 i 136 drawille_dot(drw, l.x0, l.y0); Err bitreich.org 70 i 137 } while (drawille_line_next(&l)); Err bitreich.org 70 i 138 } Err bitreich.org 70 i 139 Err bitreich.org 70 i 140 void Err bitreich.org 70 i 141 drawille_histogram_dot(struct drawille *drw, int x, int y, int zero) Err bitreich.org 70 i 142 { Err bitreich.org 70 i 143 int sign; Err bitreich.org 70 i 144 Err bitreich.org 70 i 145 sign = (y > zero) ? (+1) : (-1); Err bitreich.org 70 i 146 for (; y != zero; y -= sign) Err bitreich.org 70 i 147 drawille_dot(drw, x, y); Err bitreich.org 70 i 148 drawille_dot(drw, x, y); Err bitreich.org 70 i 149 } Err bitreich.org 70 i 150 Err bitreich.org 70 i 151 void Err bitreich.org 70 i 152 drawille_histogram_line(struct drawille *drw, int x0, int y0, int x1, int y1, int zero) Err bitreich.org 70 i 153 { Err bitreich.org 70 i 154 struct line l; Err bitreich.org 70 i 155 Err bitreich.org 70 i 156 drawille_line_init(&l, x0, y0, x1, y1); Err bitreich.org 70 i 157 do { Err bitreich.org 70 i 158 drawille_histogram_dot(drw, l.x0, l.y0, zero); Err bitreich.org 70 i 159 } while (drawille_line_next(&l)); Err bitreich.org 70 i 160 } Err bitreich.org 70 i 161 Err bitreich.org 70 i 162 static int Err bitreich.org 70 i 163 drawille_text_glyph(struct drawille *drw, int x, int y, struct font *font, int c) Err bitreich.org 70 i 164 { Err bitreich.org 70 i 165 int w; Err bitreich.org 70 i 166 char *glyph; Err bitreich.org 70 i 167 Err bitreich.org 70 i 168 glyph = font->glyph[(c > 127 || c < 0) ? 0 : c]; Err bitreich.org 70 i 169 w = strlen(glyph) / font->height; Err bitreich.org 70 i 170 for (int ix = 0; ix < w; ix++) Err bitreich.org 70 i 171 for (int iy = 0; iy < font->height; iy++) Err bitreich.org 70 i 172 if (glyph[ix + (font->height - 1) * w - iy * w] == 3) Err bitreich.org 70 i 173 drawille_dot(drw, x + ix, y + iy); Err bitreich.org 70 i 174 return w; Err bitreich.org 70 i 175 } Err bitreich.org 70 i 176 Err bitreich.org 70 i 177 char * Err bitreich.org 70 i 178 drawille_text(struct drawille *drw, int x, int y, struct font *font, char *s) Err bitreich.org 70 i 179 { Err bitreich.org 70 i 180 if (drw->row*4 < font->height) Err bitreich.org 70 i 181 return NULL; Err bitreich.org 70 i 182 for (; *s != '\0' && x < drw->col*2; s++, x++) Err bitreich.org 70 i 183 x += drawille_text_glyph(drw, x, y, font, *s); Err bitreich.org 70 i 184 return s; Err bitreich.org 70 i 185 } Err bitreich.org 70 .