shithub: cardgen

ref: d6198959f03e4369688f0f13808f5dbad0c0c948
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 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));
		}
	}
}