summaryrefslogtreecommitdiff
path: root/os/js/fsv.c
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2006-12-22 21:39:35 +0000
committerCharles.Forsyth <devnull@localhost>2006-12-22 21:39:35 +0000
commit74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a (patch)
treec6e220ba61db3a6ea4052e6841296d829654e664 /os/js/fsv.c
parent46439007cf417cbd9ac8049bb4122c890097a0fa (diff)
20060303
Diffstat (limited to 'os/js/fsv.c')
-rw-r--r--os/js/fsv.c198
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;
+}