shithub: cardgen

Download patch

ref: d6198959f03e4369688f0f13808f5dbad0c0c948
author: sirjofri <sirjofri@sirjofri.de>
date: Fri Feb 13 13:26:40 EST 2026

adds program

--- /dev/null
+++ b/cardgen.c
@@ -1,0 +1,198 @@
+#include <u.h>
+#include <libc.h>
+#include <draw.h>
+#include <memdraw.h>
+
+static void
+usage(void)
+{
+	fprint(2, "usage: %s\n", argv0);
+	exits("usage");
+}
+
+int cardwid = 200;
+int cardhgt = 300;
+int symwid = 30;
+int symhgt = 30;
+int ncards = 15; /* max number */
+
+Point symlocs[2] = {
+	{ 10, 10 },
+	{ 200-30-10, 300-30-10 },
+};
+
+Point lbllocs[2] = {
+	{ 10+30+10, 20 },
+	{ 200-30-10-10, 300-20-10 },
+};
+
+/* 0 left, 1 right */
+int lblalign[2] = {
+	0,
+	1,
+};
+
+/* nils will be skipped */
+char *labels[15] = {
+	nil,
+	nil,
+	"2",
+	"3",
+	"4",
+	"5",
+	"6",
+	"7",
+	"8",
+	"9",
+	"10",
+	"J",
+	"Q",
+	"K",
+	"A",
+};
+
+
+/* code */
+
+int gentemplates = 0;
+
+static void
+dogentemplates(void)
+{
+	Memimage *mi;
+	int fcard;
+	int fsym;
+	
+	fcard = create("tcard", OWRITE, 0664);
+	if (fcard < 0)
+		sysfatal("%r");
+	fsym = create("tsym", OWRITE, 0664);
+	if (fsym < 0)
+		sysfatal("%r");
+
+#define LN(A, B) memimageline(mi, A, B, Endsquare, Endsquare, 1, memblack, ZP, S)
+#define FINISH(A) writememimage(A, mi);freememimage(mi);close(A);
+	
+	mi = allocmemimage(Rect(0, 0, cardwid, cardhgt), RGB24);
+	if (!mi)
+		sysfatal("%r");
+	
+	memfillcolor(mi, DWhite);
+	LN(Pt(-1, -1), Pt(cardwid, -1));
+	LN(Pt(cardwid, -1), Pt(cardwid, cardhgt));
+	LN(Pt(cardwid, cardhgt), Pt(-1, cardhgt));
+	LN(Pt(-1, cardhgt), Pt(-1, -1));
+	
+	FINISH(fcard)
+	
+	mi = allocmemimage(Rect(0, 0, symwid, symhgt), RGBA32);
+	if (!mi)
+		sysfatal("%r");
+	
+	memfillcolor(mi, DTransparent);
+	LN(Pt(-1, -1), Pt(symwid, -1));
+	LN(Pt(symwid, -1), Pt(symwid, symhgt));
+	LN(Pt(symwid, symhgt), Pt(-1, symhgt));
+	LN(Pt(-1, symhgt), Pt(-1, -1));
+	FINISH(fsym);
+	
+#undef LN
+#undef FINISH
+}
+
+static Memimage*
+load(char *name)
+{
+	Memimage *mi;
+	int fd;
+	fd = open(name, OREAD);
+	if (fd < 0)
+		sysfatal("%r");
+	mi = readmemimage(fd);
+	if (!mi)
+		sysfatal("creadmemimage %s: %r", name);
+	close(fd);
+	return mi;
+}
+
+Memimage *card;
+Memimage *syms[4];
+
+static void
+gencard(int num, Memimage *sym, int fadd)
+{
+	Memimage *mi;
+	int i, fd;
+	char *file;
+	Memsubfont *defont;
+	char *label;
+	Point text;
+	Point p;
+	
+	label = labels[num];
+	if (!label)
+		return;
+	
+	defont = getmemdefont();
+	text = memsubfontwidth(defont, label);
+	
+	mi = allocmemimage(Rect(0, 0, cardwid, cardhgt), RGB24);
+	if (!mi)
+		sysfatal("%r");
+	
+	memdraw(mi, mi->r, card, ZP, nil, ZP, S);
+	for (i = 0; i < nelem(symlocs); i++) {
+		memdraw(mi, rectaddpt(sym->r, symlocs[i]), sym, ZP, nil, ZP, SatopD);
+	}
+	
+	for (i = 0; i < nelem(lbllocs); i++) {
+		p = lbllocs[i];
+		if (lblalign[i])
+			p.x -= text.x;
+		memimagestring(mi, p, memblack, ZP, defont, label);
+	}
+	
+	file = smprint("out/%d", num+fadd);
+	if (!file)
+		sysfatal("%r");
+	fd = create(file, OWRITE, 0644);
+	if (fd < 0)
+		sysfatal("%r");
+	writememimage(fd, mi);
+	freememimage(mi);
+	close(fd);
+}
+
+void
+main(int argc, char **argv)
+{
+	int i, j;
+	
+	ARGBEGIN{
+	case 't':
+		gentemplates++;
+		break;
+	case 'h':
+		usage();
+	}ARGEND;
+	
+	if (memimageinit() < 0)
+		sysfatal("memimageinit: %r");
+	
+	if (gentemplates) {
+		dogentemplates();
+		exits(nil);
+	}
+	
+	card = load("card");
+	syms[0] = load("sym0");
+	syms[1] = load("sym1");
+	syms[2] = load("sym2");
+	syms[3] = load("sym3");
+	
+	for (j = 0; j < 4; j++) {
+		for (i = 0; i < nelem(labels); i++) {
+			gencard(i, syms[j], j*nelem(labels));
+		}
+	}
+}
--- /dev/null
+++ b/mkfile
@@ -1,0 +1,6 @@
+</$objtype/mkfile
+
+TARG=cardgen
+OFILES=cardgen.$O
+
+</sys/src/cmd/mkone
--