shithub: riscv

Download patch

ref: 13a74150acae35fef6f9a07900c902335a810660
parent: c029a0c9130b7a9b5a9c3883e813dd8d8a0a770d
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat Apr 22 18:19:17 EDT 2017

vt: handle nocolor flag and reversed background colors

--- a/sys/src/cmd/vt/main.c
+++ b/sys/src/cmd/vt/main.c
@@ -47,6 +47,11 @@
 Rune	*onscreenrbuf;
 uchar	*onscreenabuf;
 uchar	*onscreencbuf;
+
+#define onscreenr(x, y) &onscreenrbuf[((y)*(xmax+2) + (x))]
+#define onscreena(x, y) &onscreenabuf[((y)*(xmax+2) + (x))]
+#define onscreenc(x, y) &onscreencbuf[((y)*(xmax+2) + (x))]
+
 int	yscrmin, yscrmax;
 int	attr, defattr;
 
@@ -300,18 +305,40 @@
 	}
 }
 
-#define onscreenr(x, y) &onscreenrbuf[((y)*(xmax+2) + (x))]
-#define onscreena(x, y) &onscreenabuf[((y)*(xmax+2) + (x))]
-#define onscreenc(x, y) &onscreencbuf[((y)*(xmax+2) + (x))]
+Image*
+bgcol(int a, int c)
+{
+	if(nocolor || (c & (1<<0)) == 0){
+		if(a & TReverse)
+			return fgcolor;
+		return bgcolor;
+	}
+	if((a & TReverse) != 0)
+		c >>= 4;
+	return colors[(c>>1)&7];
+}
 
-#define bgcol(a, c) (((a)&TReverse)!=0 ? (c)>>4 : (c&15))
-#define fgcol(a, c) ((((a)&TReverse)==0 ? (c)>>4 : (c&15)) | (((a)&THighIntensity)!=0)<<4)
+Image*
+fgcol(int a, int c)
+{
+	if(nocolor || (c & (1<<4)) == 0){
+		if(a & TReverse)
+			return bgcolor;
+		return fgcolor;
+	}
+	if((a & TReverse) == 0)
+		c >>= 4;
+	if(a & THighIntensity)
+		return hicolors[(c>>1)&7];
+	return colors[(c>>1)&7];
+}
 
 void
 drawscreen(void)
 {
 	int x, y, n;
-	uchar c, *ap, *cp;
+	uchar *ap, *cp;
+	Image *c;
 	Rune *rp;
 
 	draw(screen, screen->r, bgcolor, nil, ZP);
@@ -320,15 +347,15 @@
 	for(y = 0; y <= ymax; y++){
 		for(x = 0; x <= xmax; x += n){
 			cp = onscreenc(x, y);
-			if((*cp & 1) == 0){
+			ap = onscreena(x, y);
+			c = bgcol(*ap, *cp);
+			if(c == bgcolor){
 				n = 1;
 				continue;
 			}
-			ap = onscreena(x, y);
-			c = bgcol(*ap, *cp);
 			for(n = 1; x+n <= xmax && bgcol(ap[n], cp[n]) == c; n++)
 				;
-			draw(screen, Rpt(pt(x, y), pt(x+n, y+1)), colors[c>>1], nil, ZP);
+			draw(screen, Rpt(pt(x, y), pt(x+n, y+1)), c, nil, ZP);
 		}
 	}
 
@@ -345,9 +372,7 @@
 			c = fgcol(*ap, *cp);
 			for(n = 1; x+n <= xmax && rp[n] != 0 && fgcol(ap[n], cp[n]) == c; n++)
 				;
-			runestringn(screen, pt(x, y),
-				(c&1) ? (((c&16) ? hicolors : colors)[(c&15)>>1]) : fgcolor,
-				ZP, font, rp, n);
+			runestringn(screen, pt(x, y), c, ZP, font, rp, n);
 		}
 		if(*onscreenr(x, y) == 0)
 			runestringn(screen, pt(x, y),