git: 9front

Download patch

ref: 659f503804a1e9fbfef23bcac74acdf2f06458fd
parent: e2161c3c4260b8f83e80cb4b6b9fbe139666f66b
author: rodri <rgl@antares-labs.eu>
date: Fri Jan 2 10:36:43 EST 2026

vnc: implement devdraw affinewarp protocol message 'a'

--- a/sys/src/cmd/vnc/devdraw.c
+++ b/sys/src/cmd/vnc/devdraw.c
@@ -870,6 +870,14 @@
 	p->y = BGLONG(a+1*4);
 }
 
+void
+drawwarp(Warp w, uchar *a)
+{
+	w[0][0] = BGLONG(a+0*3*4+0*4); w[0][1] = BGLONG(a+0*3*4+1*4); w[0][2] = BGLONG(a+0*3*4+2*4);
+	w[1][0] = BGLONG(a+1*3*4+0*4); w[1][1] = BGLONG(a+1*3*4+1*4); w[1][2] = BGLONG(a+1*3*4+2*4);
+	w[2][0] = BGLONG(a+2*3*4+0*4); w[2][1] = BGLONG(a+2*3*4+1*4); w[2][2] = BGLONG(a+2*3*4+2*4);
+}
+
 Point
 drawchar(Memimage *dst, Memimage *rdst, Point p, Memimage *src, Point *sp, DImage *font, int index, int op)
 {
@@ -1389,6 +1397,13 @@
 			q += sprint(q, " [%d %d]", BGLONG(a), BGLONG(a+4));
 			a += 8;
 			break;
+		case 'M':
+			q += sprint(q, " [[%d %d %d][%d %d %d][%d %d %d]]",
+				BGLONG(a),    BGLONG(a+ 4), BGLONG(a+ 8),
+				BGLONG(a+12), BGLONG(a+16), BGLONG(a+20),
+				BGLONG(a+24), BGLONG(a+28), BGLONG(a+32));
+			a += 36;
+			break;
 		case 'b':
 			q += sprint(q, " %d", *a++);
 			break;
@@ -1426,6 +1441,7 @@
 	Refx *refx;
 	CScreen *cs;
 	Refreshfn reffn;
+	Warp w;
 
 	a = av;
 	m = 0;
@@ -1514,6 +1530,22 @@
 				error(Edrawmem);
 			}
 			memfillcolor(i, value);
+			continue;
+
+		/* apply affine transform: 'a' dstid[4] R[4*4] srcid[4] P[2*4] M[3*3*4] smooth[1] */
+		case 'a':
+			printmesg(fmt="LRLPMb", a, 0);
+			m = 1+4+4*4+4+2*4+3*3*4+1;
+			if(n < m)
+				error(Eshortdraw);
+			dst = drawimage(client, a+1);
+			dstid = BGLONG(a+1);
+			drawrectangle(&r, a+5);
+			src = drawimage(client, a+21);
+			drawpoint(&p, a+25);
+			drawwarp(w, a+33);
+			memlaffinewarp(dst, r, src, p, w, a[33+3*3*4]);
+			dstflush(dstid, dst, r);
 			continue;
 
 		/* allocate screen: 'A' id[4] imageid[4] fillid[4] public[1] */
--