From 99b75f2943cf265564a970eefe474bdcb6b49605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sigrid=20Solveig=20Hafl=C3=ADnud=C3=B3ttir?= Date: Wed, 23 Jun 2021 13:45:02 +0000 Subject: [PATCH] add chr2img for Plan 9 --- mkfile | 7 +++- src/chr2img.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 src/chr2img.c diff --git a/mkfile b/mkfile index 06a19c0..0461450 100644 --- a/mkfile +++ b/mkfile @@ -1,6 +1,6 @@ +#include +#include +#include + +static int hor = 44, ver = 26, bpp = 1; +static int SZ; + +#define xy2n(x, y) ((y & 7) + (x/8 + y/8 * hor)*bpp*8) + +static u8int * +readall(int f, int *isz) +{ + int bufsz, sz, n; + u8int *s; + + bufsz = 1023; + s = nil; + for(sz = 0;; sz += n){ + if(bufsz-sz < 1024){ + bufsz *= 2; + s = realloc(s, bufsz); + } + if((n = readn(f, s+sz, bufsz-sz)) < 1) + break; + } + if(n < 0 || sz < 1){ + free(s); + return nil; + } + *isz = sz; + + return s; +} + +static int +getcoli(int x, int y, u8int *p) +{ + int ch1, ch2, r; + + r = xy2n(x, y); + ch1 = (p[r+0] >> (7 - x & 7)) & 1; + ch2 = bpp < 2 ? 0 : (p[r+8] >> (7 - x & 7)) & 1; + + return ch2<<1 | ch1; +} + +static void +usage(void) +{ + fprint(2, "usage: %s [-1] [-2] [-w WIDTH]\n", argv0); + exits("usage"); +} + +void +main(int argc, char **argv) +{ + int sz, esz, h, w, x, y; + Memimage *m; + Memdata d; + u8int *p; + ulong col[2][4] = { + {DWhite, DBlack, 0, 0}, + {DTransparent, DWhite, 0x72dec2ff, 0x666666ff}, + }; + + ARGBEGIN{ + case '1': + bpp = 1; + break; + case '2': + bpp = 2; + break; + case 'w': + hor = atoi(EARGF(usage())); + break; + }ARGEND + + memimageinit(); + + if((p = readall(0, &sz)) == nil) + sysfatal("%r"); + + ver = sz / (bpp*8) / hor; + esz = (hor * ver * (bpp*8)); + w = hor*8; + h = ver*8; + if(sz != esz) + fprint(2, "warning: size differs (%d vs %d), dimensions must be wrong\n", sz, esz); + + memset(&d, 0, sizeof(d)); + if((d.base = malloc(4*w*h)) == nil) + sysfatal("memory"); + d.bdata = (uchar*)d.base; + + for(y = 0; y < h; y++){ + for(x = 0; x < w; x++) + d.base[y*w + x] = col[bpp-1][getcoli(x, y, p)]; + } + + if((m = allocmemimaged(Rect(0, 0, w, h), RGBA32, &d)) == nil) + sysfatal("%r"); + if(writememimage(1, m) != 0) + sysfatal("%r"); + + exits(nil); +}