diff options
| author | Charles.Forsyth <devnull@localhost> | 2006-12-22 21:39:35 +0000 |
|---|---|---|
| committer | Charles.Forsyth <devnull@localhost> | 2006-12-22 21:39:35 +0000 |
| commit | 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a (patch) | |
| tree | c6e220ba61db3a6ea4052e6841296d829654e664 /os/js/fsv.c | |
| parent | 46439007cf417cbd9ac8049bb4122c890097a0fa (diff) | |
20060303
Diffstat (limited to 'os/js/fsv.c')
| -rw-r--r-- | os/js/fsv.c | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/os/js/fsv.c b/os/js/fsv.c new file mode 100644 index 00000000..9832ce3b --- /dev/null +++ b/os/js/fsv.c @@ -0,0 +1,198 @@ +#include "u.h" +#include "../port/lib.h" +#include "mem.h" +#include "io.h" +#include "dat.h" +#include "fns.h" + +#include <draw.h> +#include <memdraw.h> +#include "screen.h" + +extern Video *vid; +extern Memimage gscreen; + +static Vctlr* init(Vctlr* vctlr, int x, int y, int d); +static int setcolour(ulong p, ulong r, ulong g, ulong b); +static void enable(void); +static void disable(void); +static void move(int cx, int cy); +static void load(Cursor *c); +static int isloaded(void); + +extern void* memcpy(void*, void*, int); +extern void cursorupdate0(void); + +Vctlr FSV = { + "FSV", /* name */ + init, /* init */ + 0, /* page */ + setcolour, /* setcolor */ + + enable, /* enable cursor fn */ + disable, /* disable cursor fn */ + move, /* move cursor fn */ + load, /* load cursor fn */ + isloaded, /* is cursor loaded? */ + 0, /* deprecated */ + + 1024, /* screen width (x) */ + 768, /* screen height (y) */ + 3, /* depth */ + + 0, /* hidecount */ + 0, /* loaded */ +}; + +static int lastx=-1; +static int lasty=-1; + +static Vctlr* +init(Vctlr* vctlr, int x, int y, int d) +{ + USED(vctlr,x,y,d); + + return &FSV; +} + +static int +setcolour(ulong p, ulong r, ulong g, ulong b) +{ + if(gscreen.ldepth == 0) + return 0; /* can't change mono screen colormap */ + else{ + vid->addr = p << 24; + vid->color = r << 24; + vid->color = g << 24; + vid->color = b << 24; + return 1; + } +} + +static ulong backingstore[64]; +static Memdata backingstoredata = { + nil, + backingstore +}; + +static ulong backingnocursor[64]; +static Memdata backingnocursordata = { + nil, + backingnocursor +}; + +static ulong backwithcursor[64]; +static Memdata backwithcursordata = { + nil, + backwithcursor +}; + +static Memimage backingnocursormem = { + {0,0,16,16}, + {0,0,16,16}, + 3, + 0, + &backingnocursordata, + 0, + 16/4, + 0, + 0, +}; +static Memimage backingmem = { + {0,0,16,16}, + {0,0,16,16}, + 3, + 0, + &backingstoredata, + 0, + 16/4, + 0, + 0, +}; + +static void +disable(void) +{ + if(FSV.hidecount++) + return; + if(lastx < 0 || lasty < 0) + return; + + memimagedraw(&gscreen, Rect(lastx,lasty,lastx+16,lasty+16), + &backingnocursormem, Pt(0,0), memones, Pt(0,0)); +} + +static void +enable(void) +{ + uchar *p; + uchar mask; + uchar *cset; + int i; + + if(--FSV.hidecount > 0) + return; + FSV.hidecount = 0; + + if(lastx < 0 || lasty < 0) + return; + + memimagedraw(&backingmem,Rect(0,0,16,16),&gscreen,Pt(lastx,lasty),memones, + Pt(0,0)); + + memcpy(backingnocursor,backingstore,256); + p = (uchar*)backingmem.data->data; + + cset = FSV.cursor.set; + + for(i=0;i<32;i++) { + mask = ~cset[i]; + + if(!(mask&(1<<7))) *p = 0xff; + ++p; + if(!(mask&(1<<6))) *p = 0xff; + ++p; + if(!(mask&(1<<5))) *p = 0xff; + ++p; + if(!(mask&(1<<4))) *p = 0xff; + ++p; + if(!(mask&(1<<3))) *p = 0xff; + ++p; + if(!(mask&(1<<2))) *p = 0xff; + ++p; + if(!(mask&(1<<1))) *p = 0xff; + ++p; + if(!(mask&(1<<0))) *p = 0xff; + ++p; + } + + memimagedraw(&gscreen,Rect(lastx,lasty,lastx+16,lasty+16),&backingmem,Pt(0,0), + memones,Pt(0,0)); +} + +static void +move(int cx, int cy) +{ + if(!FSV.loaded) + return; + + disable(); + cursorupdate0(); + lastx = cx; + lasty = cy; + enable(); +} + + +static void +load(Cursor *curs) +{ + FSV.cursor = *curs; + FSV.loaded=1; +} + +static int +isloaded(void) +{ + return FSV.loaded; +} |
