shithub: riscv

Download patch

ref: ffde0eda463e8b908975abcabc5345cfaa1a14f7
parent: e2ca58cb3ef6991fb467b30b7693e7b91692fa82
author: cinap_lenrek <[email protected]>
date: Sun Jun 25 18:14:52 EDT 2017

aux/vga: simplify vesa by adding rgbmask2chan() function

--- a/sys/src/cmd/aux/vga/vesa.c
+++ b/sys/src/cmd/aux/vga/vesa.c
@@ -36,8 +36,6 @@
 	int	dx, dy;
 	int	depth;
 	char	*model;
-	int	r, g, b, x;
-	int	ro, go, bo, xo;
 	int	directcolor;	/* flags */
 	ulong	paddr;
 };
@@ -119,6 +117,36 @@
 	return f[0];
 }
 
+static char*
+rgbmask2chan(char *buf, int depth, u32int rm, u32int gm, u32int bm)
+{
+	u32int m[4], dm;	/* r,g,b,x */
+	char tmp[32];
+	int c, n;
+
+	dm = 1<<depth-1;
+	dm |= dm-1;
+
+	m[0] = rm & dm;
+	m[1] = gm & dm;
+	m[2] = bm & dm;
+	m[3] = (~(m[0] | m[1] | m[2])) & dm;
+
+	buf[0] = 0;
+Next:
+	for(c=0; c<4; c++){
+		for(n = 0; m[c] & (1<<n); n++)
+			;
+		if(n){
+			m[0] >>= n, m[1] >>= n, m[2] >>= n, m[3] >>= n;
+			snprint(tmp, sizeof tmp, "%c%d%s", "rgbx"[c], n, buf);
+			strcpy(buf, tmp);
+			goto Next;
+		}
+	}
+	return buf;
+}
+
 Mode*
 dbvesamode(Vga *vga, char *size)
 {
@@ -732,14 +760,6 @@
 		m->model = modelstr[mod];
 		break;
 	}
-	m->r = p[31];
-	m->g = p[33];
-	m->b = p[35];
-	m->x = p[37];
-	m->ro = p[32];
-	m->go = p[34];
-	m->bo = p[36];
-	m->xo = p[38];
 	m->directcolor = p[39];
 	m->paddr = LONG(p+40);
 
@@ -747,45 +767,11 @@
 	if(m->depth <= 8)
 		snprint(m->chan, sizeof m->chan, "%c%d", 
 			(m->attr & AttrColor) ? 'm' : 'k', m->depth);
-	else {
-		int o;
-		ulong d, c, x;
-
-		m->xo = m->x = 0;
-		d = 1<<m->depth-1;
-		d |= d-1;
-		c = ((1<<m->r)-1) << m->ro;
-		c |= ((1<<m->g)-1) << m->go;
-		c |= ((1<<m->b)-1) << m->bo;
-		if(x = d ^ c){
-			for(; (x & 1) == 0; x >>= 1)
-				m->xo++;
-			for(; (x & 1) == 1; x >>= 1)
-				m->x++;
-		}
-
-		o = 0;
-		m->chan[0] = 0;
-		while(o < m->depth){
-			char tmp[sizeof m->chan];
-
-			if(m->r && m->ro == o){
-				snprint(tmp, sizeof tmp, "r%d%s", m->r, m->chan);
-				o += m->r;
-			}else if(m->g && m->go == o){
-				snprint(tmp, sizeof tmp, "g%d%s", m->g, m->chan);
-				o += m->g;
-			}else if(m->b && m->bo == o){
-				snprint(tmp, sizeof tmp, "b%d%s", m->b, m->chan);
-				o += m->b;
-			}else if(m->x && m->xo == o){
-				snprint(tmp, sizeof tmp, "x%d%s", m->x, m->chan);
-				o += m->x;
-			}else
-				break;
-			strncpy(m->chan, tmp, sizeof m->chan);
-		}
-	}
+	else
+		rgbmask2chan(m->chan, m->depth,
+			(1UL<<p[31])-1 << p[32],
+			(1UL<<p[33])-1 << p[34],
+			(1UL<<p[35])-1 << p[36]);
 	return 0;
 }