ref: d6198959f03e4369688f0f13808f5dbad0c0c948
dir: /cardgen.c/
#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));
}
}
}