shithub: cardgen

Download patch

ref: 1a1dabe2ae71cc38da2bb664354739c22f8c4291
parent: 1793e1013312086ebf77222bf984aa184e59946e
author: sirjofri <sirjofri@sirjofri.de>
date: Sat Feb 14 08:11:22 EST 2026

adds default syms

--- a/cardgen.c
+++ b/cardgen.c
@@ -6,7 +6,7 @@
 static void
 usage(void)
 {
-	fprint(2, "usage: %s\n", argv0);
+	fprint(2, "usage: %s [-t]\n", argv0);
 	exits("usage");
 }
 
@@ -54,6 +54,169 @@
 
 /* code */
 
+Memimage *memred;
+
+static void
+drawspades(Memimage *mi)
+{
+	/*
+	     /\
+	   *    *
+	     |
+	*/
+	
+	Point c, p, q;
+	int d, r;
+	
+	Point tip[3];
+	Point bot[5];
+	
+	r = Dx(mi->r)/5;
+	c.x = Dx(mi->r)/2 - 1;
+	c.y = Dy(mi->r)/2 - 1;
+	
+	/* points */
+	d = Dx(mi->r)/4.5;
+	p.x = c.x - d;
+	p.y = c.y+1;
+	q.x = c.x;
+	q.y = Dy(mi->r)/4;
+	memimageline(mi, p, q, Enddisc, Enddisc, r, memblack, ZP, SoverD);
+	
+	p.x = c.x + d;
+	memimageline(mi, p, q, Enddisc, Enddisc, r, memblack, ZP, SoverD);
+	
+	tip[0] = Pt(c.x+d/2, (p.y - q.y)/2);
+	tip[1] = Pt(c.x, (p.y - q.y)/10-1);
+	tip[2] = Pt(c.x-d/2, (p.y - q.y)/2);
+	
+	bot[0] = Pt(c.x, c.y);
+	d = Dx(mi->r)/10.;
+	r = Dx(mi->r)/6.;
+	bot[1] = Pt(c.x-d, Dy(mi->r)/15.*13.);
+	bot[2] = Pt(c.x-r, Dy(mi->r)/15.*14.5);
+	bot[3] = Pt(c.x+r, Dy(mi->r)/15.*14.5);
+	bot[4] = Pt(c.x+d, Dy(mi->r)/15.*13.);
+	
+	memfillpoly(mi, tip, nelem(tip), 0, memblack, ZP, SoverD);
+	memfillpoly(mi, bot, nelem(bot), 0, memblack, ZP, SoverD);
+}
+
+static void
+drawclubs(Memimage *mi)
+{
+	/*
+	     *
+	   *   *
+	     |
+	*/
+	
+	Point p;
+	int r;
+	int cx;
+	float d;
+	
+	r = Dx(mi->r) / 4.5;
+	d = 4.;
+	
+	/* center point */
+	p.x = cx = Dx(mi->r) / 2 -1;
+	p.y = Dy(mi->r) / 5 + 1;
+	memimageline(mi, p, p, Enddisc, Enddisc, r, memblack, ZP, SoverD);
+	
+	/* left point */
+	p.y = Dy(mi->r) / 2 + 1;
+	p.x = cx - Dx(mi->r) / d;
+	memimageline(mi, p, p, Enddisc, Enddisc, r, memblack, ZP, SoverD);
+	
+	/* right point */
+	p.x = cx + Dx(mi->r) / d;
+	memimageline(mi, p, p, Enddisc, Enddisc, r, memblack, ZP, SoverD);
+	
+	/* line */
+	p.x = Dx(mi->r) / 2 -1;
+	p.y = Dy(mi->r) / 5 + 1;
+	memimageline(mi, p, Pt(p.x, Dy(mi->r)/15.*14.),
+		Endsquare, Endsquare, Dx(mi->r)/20, memblack, ZP, SoverD);
+}
+
+static void
+drawhearts(Memimage *mi)
+{
+	/*
+	    *  *
+	     \/
+	*/
+	
+	Point p, q, c;
+	int r, d;
+	float f = 0.7;
+	
+	c.x = Dx(mi->r)/2 - 1;
+	c.y = Dy(mi->r)/2;
+	
+	r = Dx(mi->r)/4.5;
+	d = Dx(mi->r)/4.5;
+	p.x = c.x - d;
+	p.y = c.y - d;
+	q.x = c.x + r*f;
+	q.y = c.y + r*f;
+	memimageline(mi, p, q, Enddisc, Endsquare, r, memred, ZP, SoverD);
+	p.x = c.x + d;
+	q.x = c.x - r*f;
+	memimageline(mi, p, q, Enddisc, Endsquare, r, memred, ZP, SoverD);
+}
+
+static void
+drawdiamonds(Memimage *mi)
+{
+	/* circle, starting at (1.0, 0.0), counterclockwise. */
+	Point p[12];
+	Point c;
+	int i;
+	float x, y, f;
+	float outer, inner;
+	
+	/* outer distance: diamond corners.
+	   inner distance: inner curve. */
+	outer = Dx(mi->r)/2.;
+	inner = Dx(mi->r)/3.4;
+	
+	c.x = Dx(mi->r)/2. -1;
+	c.y = Dy(mi->r)/2. -1;
+	
+	for (i = 0; i < nelem(p); i++) {
+		f = ( ((float)i) / nelem(p) ) * PI*2.;
+		x = cos(f);
+		y = sin(f);
+		f = i%3 == 0 ? outer : inner;
+		p[i].x = c.x + x * f;
+		p[i].y = c.y + y * f;
+	}
+	memfillpoly(mi, p, nelem(p), 0, memred, ZP, SoverD);
+}
+
+static void
+drawborder(Memimage *mi)
+{
+	memimageline(mi,
+		Pt(mi->r.min.x, mi->r.min.y),
+		Pt(mi->r.max.x, mi->r.min.y),
+		Endsquare, Endsquare, 0, memblack, ZP, S);
+	memimageline(mi,
+		Pt(mi->r.max.x-1, mi->r.min.y),
+		Pt(mi->r.max.x-1, mi->r.max.y),
+		Endsquare, Endsquare, 0, memblack, ZP, S);
+	memimageline(mi,
+		Pt(mi->r.max.x, mi->r.max.y-1),
+		Pt(mi->r.min.x, mi->r.max.y-1),
+		Endsquare, Endsquare, 0, memblack, ZP, S);
+	memimageline(mi,
+		Pt(mi->r.min.x, mi->r.max.y),
+		Pt(mi->r.min.x, mi->r.min.y),
+		Endsquare, Endsquare, 0, memblack, ZP, S);
+}
+
 int gentemplates = 0;
 
 static void
@@ -62,6 +225,10 @@
 	Memimage *mi;
 	int fcard;
 	int fsym;
+	int fdiamonds;
+	int fhearts;
+	int fclubs;
+	int fspades;
 	Rectangle r;
 	Point p;
 	
@@ -71,9 +238,20 @@
 	fsym = create("tsym", OWRITE, 0664);
 	if (fsym < 0)
 		sysfatal("%r");
+	fdiamonds = create("tsym0", OWRITE, 0664);
+	if (fdiamonds < 0)
+		sysfatal("%r");
+	fhearts = create("tsym1", OWRITE, 0664);
+	if (fhearts < 0)
+		sysfatal("%r");
+	fclubs = create("tsym2", OWRITE, 0664);
+	if (fclubs < 0)
+		sysfatal("%r");
+	fspades = create("tsym3", OWRITE, 0664);
+	if (fspades < 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);
+#define FINISH(A) drawborder(mi);writememimage(A, mi);freememimage(mi);close(A);
 	
 	mi = allocmemimage(Rect(-1, -1, cardwid+1, cardhgt+1), RGBA32);
 	if (!mi)
@@ -94,10 +272,6 @@
 	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)
 	
@@ -106,13 +280,36 @@
 		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
+	mi = allocmemimage(Rect(-1, -1, symwid+1, symhgt+1), RGBA32);
+	if (!mi)
+		sysfatal("%r");
+	memfillcolor(mi, DTransparent);
+	drawdiamonds(mi);
+	FINISH(fdiamonds);
+	
+	mi = allocmemimage(Rect(-1, -1, symwid+1, symhgt+1), RGBA32);
+	if (!mi)
+		sysfatal("%r");
+	memfillcolor(mi, DTransparent);
+	drawhearts(mi);
+	FINISH(fhearts);
+	
+	mi = allocmemimage(Rect(-1, -1, symwid+1, symhgt+1), RGBA32);
+	if (!mi)
+		sysfatal("%r");
+	memfillcolor(mi, DTransparent);
+	drawclubs(mi);
+	FINISH(fclubs);
+	
+	mi = allocmemimage(Rect(-1, -1, symwid+1, symhgt+1), RGBA32);
+	if (!mi)
+		sysfatal("%r");
+	memfillcolor(mi, DTransparent);
+	drawspades(mi);
+	FINISH(fspades);
+	
 #undef FINISH
 }
 
@@ -197,6 +394,11 @@
 	
 	if (memimageinit() < 0)
 		sysfatal("memimageinit: %r");
+	
+	memred = allocmemimage(Rect(0, 0, 1, 1), RGB24);
+	memfillcolor(memred, 0xFF0000FF);
+	memred->flags |= Frepl;
+	memred->clipr = memblack->clipr;
 	
 	if (gentemplates) {
 		dogentemplates();
--