shithub: cardgen

ref: 1793e1013312086ebf77222bf984aa184e59946e
dir: /cardgen.c/

View raw version
#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 cardrad = 7;
int symwid = 30;
int symhgt = 30;

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 (11)",
	"Q (12)",
	"K (13)",
	"A (14)",
};


/* code */

int gentemplates = 0;

static void
dogentemplates(void)
{
	Memimage *mi;
	int fcard;
	int fsym;
	Rectangle r;
	Point p;
	
	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(-1, -1, cardwid+1, cardhgt+1), RGBA32);
	if (!mi)
		sysfatal("%r");
	
	memfillcolor(mi, DTransparent);
	p = Pt(cardrad*2, cardrad*2);
	memimageline(mi, p, p, Enddisc, Enddisc, cardrad*2, memwhite, ZP, SoverD);
	p = Pt(cardwid-cardrad*2, cardrad*2);
	memimageline(mi, p, p, Enddisc, Enddisc, cardrad*2, memwhite, ZP, SoverD);
	p = Pt(cardwid-cardrad*2, cardhgt-cardrad*2);
	memimageline(mi, p, p, Enddisc, Enddisc, cardrad*2, memwhite, ZP, SoverD);
	p = Pt(cardrad*2, cardhgt-cardrad*2);
	memimageline(mi, p, p, Enddisc, Enddisc, cardrad*2, memwhite, ZP, SoverD);
	r.min = Pt(cardrad*2, 0);
	r.max = Pt(cardwid-cardrad*2, cardhgt);
	memdraw(mi, r, memwhite, ZP, nil, ZP, S);
	r.min = Pt(0, cardrad*2);
	r.max = Pt(cardwid, cardhgt-cardrad*2);
	memdraw(mi, r, memwhite, ZP, nil, ZP, S);
	LN(Pt(-2, -2), Pt(cardwid+1, -2));
	LN(Pt(cardwid+1, -2), Pt(cardwid+1, cardhgt+1));
	LN(Pt(cardwid+1, cardhgt+1), Pt(-2, cardhgt+1));
	LN(Pt(-2, cardhgt+1), Pt(-2, -2));
	
	FINISH(fcard)
	
	mi = allocmemimage(Rect(-1, -1, symwid+1, symhgt+1), RGBA32);
	if (!mi)
		sysfatal("%r");
	
	memfillcolor(mi, DTransparent);
	LN(Pt(-2, -2), Pt(symwid+1, -2));
	LN(Pt(symwid+1, -2), Pt(symwid+1, symhgt+1));
	LN(Pt(symwid+1, symhgt+1), Pt(-2, symhgt+1));
	LN(Pt(-2, symhgt+1), Pt(-2, -2));
	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;
	Rectangle r;
	
	label = labels[num];
	if (!label)
		return;
	
	defont = getmemdefont();
	text = memsubfontwidth(defont, label);
	
	mi = allocmemimage(Rect(0, 0, cardwid, cardhgt), RGBA32);
	if (!mi)
		sysfatal("%r");
	
	memfillcolor(mi, DTransparent);
	memdraw(mi, mi->r, card, ZP, nil, ZP, S);
	r = insetrect(sym->r, 1);
	for (i = 0; i < nelem(symlocs); i++) {
		memdraw(mi, rectaddpt(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));
		}
	}
}