summaryrefslogtreecommitdiff
path: root/sys/src/9/pc/screen.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2017-06-25 22:22:58 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2017-06-25 22:22:58 +0200
commitaab4e32ce05a26bff7386bb86ffc24589cbe601c (patch)
tree3ee177109bf3b076b6cccf461cf559c284fa845a /sys/src/9/pc/screen.c
parentffde0eda463e8b908975abcabc5345cfaa1a14f7 (diff)
pc, pc64: support for multiboot framebuffer, common bootargs and multiboot code
Diffstat (limited to 'sys/src/9/pc/screen.c')
-rw-r--r--sys/src/9/pc/screen.c33
1 files changed, 31 insertions, 2 deletions
diff --git a/sys/src/9/pc/screen.c b/sys/src/9/pc/screen.c
index 69018c4fe..20df768fd 100644
--- a/sys/src/9/pc/screen.c
+++ b/sys/src/9/pc/screen.c
@@ -587,6 +587,36 @@ bootmapfb(VGAscr *scr, ulong pa, ulong sz)
return vgalinearaddr0(scr, pa, sz);
}
+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;
+}
+
/*
* called early on boot to attach to framebuffer
* setup by bootloader/firmware or plan9.
@@ -682,11 +712,10 @@ bootscreenconf(VGAscr *scr)
char conf[100], chan[30];
conf[0] = '\0';
- if(scr != nil && scr->paddr != 0)
+ if(scr != nil && scr->paddr != 0 && scr->gscreen != nil)
snprint(conf, sizeof(conf), "%dx%dx%d %s %#p %d\n",
scr->gscreen->r.max.x, scr->gscreen->r.max.y,
scr->gscreen->depth, chantostr(chan, scr->gscreen->chan),
scr->paddr, scr->apsize);
-
ksetenv("*bootscreen", conf, 1);
}