]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/9/pc/vga.c
kernel: cleanup makefile for $CONF.$O target
[plan9front.git] / sys / src / 9 / pc / vga.c
index 587d8c185d038645c412ef41f0c8f32f94c55062..2cfbd8078b3dafe3af74470361bb5af985d6cadd 100644 (file)
 #include <cursor.h>
 #include "screen.h"
 
-static Memimage* back;
 static Memimage *conscol;
+static Memimage *back;
 
 static Point curpos;
 static Rectangle window;
 static int *xp;
 static int xbuf[256];
 Lock vgascreenlock;
-int drawdebug;
 
 void
-vgaimageinit(ulong chan)
+vgaimageinit(ulong)
 {
-       if(back == nil){
-               back = allocmemimage(Rect(0,0,1,1), chan);      /* RSC BUG */
-               if(back == nil)
-                       panic("back alloc");            /* RSC BUG */
-               back->flags |= Frepl;
-               back->clipr = Rect(-0x3FFFFFF, -0x3FFFFFF, 0x3FFFFFF, 0x3FFFFFF);
-               memfillcolor(back, DBlack);
-       }
-
-       if(conscol == nil){
-               conscol = allocmemimage(Rect(0,0,1,1), chan);   /* RSC BUG */
-               if(conscol == nil)
-                       panic("conscol alloc"); /* RSC BUG */
-               conscol->flags |= Frepl;
-               conscol->clipr = Rect(-0x3FFFFFF, -0x3FFFFFF, 0x3FFFFFF, 0x3FFFFFF);
-               memfillcolor(conscol, DWhite);
-       }
+       conscol = memblack;
+       back = memwhite;
 }
 
 static void
@@ -69,13 +53,11 @@ vgascreenputc(VGAscr* scr, char* buf, Rectangle *flushr)
        int h, w, pos;
        Rectangle r;
 
-//     drawdebug = 1;
-       if(xp < xbuf || xp >= &xbuf[sizeof(xbuf)])
+       if(xp < xbuf || xp >= &xbuf[nelem(xbuf)])
                xp = xbuf;
 
        h = scr->memdefont->height;
        switch(buf[0]){
-
        case '\n':
                if(curpos.y+h >= window.max.y){
                        vgascroll(scr);
@@ -100,7 +82,7 @@ vgascreenputc(VGAscr* scr, char* buf, Rectangle *flushr)
                pos = 4-(pos%4);
                *xp++ = curpos.x;
                r = Rect(curpos.x, curpos.y, curpos.x+pos*w, curpos.y + h);
-               memimagedraw(scr->gscreen, r, back, back->r.min, nil, back->r.min, S);
+               memimagedraw(scr->gscreen, r, back, ZP, nil, ZP, S);
                curpos.x += pos*w;
                break;
 
@@ -109,7 +91,7 @@ vgascreenputc(VGAscr* scr, char* buf, Rectangle *flushr)
                        break;
                xp--;
                r = Rect(*xp, curpos.y, curpos.x, curpos.y+h);
-               memimagedraw(scr->gscreen, r, back, back->r.min, nil, ZP, S);
+               memimagedraw(scr->gscreen, r, back, r.min, nil, ZP, S);
                combinerect(flushr, r);
                curpos.x = *xp;
                break;
@@ -126,20 +108,20 @@ vgascreenputc(VGAscr* scr, char* buf, Rectangle *flushr)
 
                *xp++ = curpos.x;
                r = Rect(curpos.x, curpos.y, curpos.x+w, curpos.y+h);
-               memimagedraw(scr->gscreen, r, back, back->r.min, nil, back->r.min, S);
+               memimagedraw(scr->gscreen, r, back, r.min, nil, ZP, S);
                memimagestring(scr->gscreen, curpos, conscol, ZP, scr->memdefont, buf);
                combinerect(flushr, r);
                curpos.x += w;
        }
-//     drawdebug = 0;
 }
 
 static void
 vgascreenputs(char* s, int n)
 {
-       int i, gotdraw;
-       Rune r;
-       char buf[4];
+       static char rb[UTFmax+1];
+       static int nrb;
+       char *e;
+       int gotdraw;
        VGAscr *scr;
        Rectangle flushr;
 
@@ -164,18 +146,14 @@ vgascreenputs(char* s, int n)
 
        flushr = Rect(10000, 10000, -10000, -10000);
 
-       while(n > 0){
-               i = chartorune(&r, s);
-               if(i == 0){
-                       s++;
-                       --n;
-                       continue;
+       e = s + n;
+       while(s < e){
+               rb[nrb++] = *s++;
+               if(nrb >= UTFmax || fullrune(rb, nrb)){
+                       rb[nrb] = 0;
+                       vgascreenputc(scr, rb, &flushr);
+                       nrb = 0;
                }
-               memmove(buf, s, i);
-               buf[i] = 0;
-               n -= i;
-               s += i;
-               vgascreenputc(scr, buf, &flushr);
        }
        flushmemscreen(flushr);
 
@@ -184,19 +162,64 @@ vgascreenputs(char* s, int n)
        unlock(&vgascreenlock);
 }
 
+static Memimage*
+mkcolor(Memimage *screen, ulong color)
+{
+       Memimage *i;
+
+       if(i = allocmemimage(Rect(0,0,1,1), screen->chan)){
+               i->flags |= Frepl;
+               i->clipr = screen->r;
+               memfillcolor(i, color);
+       }
+       return i;
+}
+
 void
 vgascreenwin(VGAscr* scr)
 {
-       int h, w;
+       Memimage *i;
+       Rectangle r;
+       Point p;
+       int h;
 
+       qlock(&drawlock);
+       
        h = scr->memdefont->height;
-       w = scr->memdefont->info[' '].width;
+       r = scr->gscreen->r;
 
-       window = insetrect(scr->gscreen->r, 48);
-       window.max.x = window.min.x+((window.max.x-window.min.x)/w)*w;
-       window.max.y = window.min.y+((window.max.y-window.min.y)/h)*h;
+       if(i = mkcolor(scr->gscreen, 0x0D686BFF)){
+               memimagedraw(scr->gscreen, r, i, ZP, nil, ZP, S);
+               freememimage(i);
+       }
+
+       r = scr->gscreen->clipr;
+       window = insetrect(r, 20);
+       memimagedraw(scr->gscreen, window, conscol, ZP, memopaque, ZP, S);
+       window = insetrect(window, 4);
+       memimagedraw(scr->gscreen, window, back, ZP, memopaque, ZP, S);
+
+       if(i = mkcolor(scr->gscreen, 0xAAAAAAFF)){
+               memimagedraw(scr->gscreen, Rect(window.min.x, window.min.y,
+                       window.max.x, window.min.y+h+5+6), i, ZP, nil, ZP, S);
+               freememimage(i);
+
+               window = insetrect(window, 5);
+               p = addpt(window.min, Pt(10, 0));
+               memimagestring(scr->gscreen, p, memblack, ZP, scr->memdefont, " Plan 9 Console ");
+               window.min.y += h+6;
+       } else
+               window = insetrect(window, 5);
+
+       window.max.y = window.min.y+(Dy(window)/h)*h;
        curpos = window.min;
 
+       flushmemscreen(r);
+
+       qunlock(&drawlock);
+
+       vgascreenputs(kmesg.buf, kmesg.n);
+
        screenputs = vgascreenputs;
 }
 
@@ -234,30 +257,9 @@ addvgaseg(char *name, ulong pa, ulong size)
        Physseg seg;
 
        memset(&seg, 0, sizeof seg);
-       seg.attr = SG_PHYSICAL;
+       seg.attr = SG_PHYSICAL | SG_DEVICE | SG_NOEXEC;
        seg.name = name;
        seg.pa = pa;
        seg.size = size;
        addphysseg(&seg);
 }
-
-void
-cornerstring(char *s)
-{
-       int h, w;
-       VGAscr *scr;
-       Rectangle r;
-       Point p;
-
-       scr = &vgascreen[0];
-       if(scr->vaddr == nil || screenputs != vgascreenputs)
-               return;
-       p = memsubfontwidth(scr->memdefont, s);
-       w = p.x;
-       h = scr->memdefont->height;
-
-       r = Rect(0, 0, w, h);
-       memimagedraw(scr->gscreen, r, back, back->r.min, nil, back->r.min, S);
-       memimagestring(scr->gscreen, r.min, conscol, ZP, scr->memdefont, s);
-//     flushmemscreen(r);
-}