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
--
⑨