From 8581c2b56763d7787604c8c833d2bd78bdc6a466 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 15 Nov 2018 20:22:59 -0500 Subject: libdraw: add Cursor2, a 32x32 high-res cursor Also add setcursor2, esetcursor2, and draw protocol encoding. Calls to the old setcursor, esetcursor create a 32x32 by pixel doubling when needed. --- include/cursor.h | 10 ++++++++++ include/draw.h | 3 ++- include/drawfcall.h | 6 ++++++ include/event.h | 2 ++ include/mouse.h | 2 ++ src/libdraw/cursor.c | 32 ++++++++++++++++++++++++++++++++ src/libdraw/drawclient.c | 7 ++++++- src/libdraw/drawfcall.c | 14 +++++++++++--- src/libdraw/event.c | 8 +++++++- src/libdraw/mkfile | 1 + src/libdraw/mouse.c | 8 +++++++- 11 files changed, 86 insertions(+), 7 deletions(-) create mode 100644 src/libdraw/cursor.c diff --git a/include/cursor.h b/include/cursor.h index d53baf81..e39d2ea5 100644 --- a/include/cursor.h +++ b/include/cursor.h @@ -12,6 +12,16 @@ struct Cursor uchar set[2*16]; }; +typedef struct Cursor2 Cursor2; +struct Cursor2 +{ + Point offset; + uchar clr[4*32]; + uchar set[4*32]; +}; + +void scalecursor(Cursor2*, Cursor*); + #if defined(__cplusplus) } #endif diff --git a/include/draw.h b/include/draw.h index 3a012959..2f283bdf 100644 --- a/include/draw.h +++ b/include/draw.h @@ -568,9 +568,10 @@ int mousescrollsize(int); */ struct Mouse; struct Cursor; +struct Cursor2; int _displaybouncemouse(Display *d, struct Mouse *m); int _displayconnect(Display *d); -int _displaycursor(Display *d, struct Cursor *c); +int _displaycursor(Display *d, struct Cursor *c, struct Cursor2 *c2); int _displayinit(Display *d, char *label, char *winsize); int _displaylabel(Display *d, char *label); int _displaymoveto(Display *d, Point p); diff --git a/include/drawfcall.h b/include/drawfcall.h index fb339919..acab98c5 100644 --- a/include/drawfcall.h +++ b/include/drawfcall.h @@ -13,6 +13,9 @@ tag[1] Rmoveto tag[1] Tcursor cursor[] tag[1] Rcursor +tag[1] Tcursor2 cursor[] +tag[1] Rcursor2 + tag[1] Tbouncemouse x[4] y[4] button[4] tag[1] Rbouncemouse @@ -89,6 +92,8 @@ enum { Rtop, Tresize = 26, Rresize, + Tcursor2 = 28, + Rcursor2, Tmax, }; @@ -104,6 +109,7 @@ struct Wsysmsg Mouse mouse; int resized; Cursor cursor; + Cursor2 cursor2; int arrowcursor; Rune rune; char *winsize; diff --git a/include/event.h b/include/event.h index 09cb5c78..e66bf117 100644 --- a/include/event.h +++ b/include/event.h @@ -61,7 +61,9 @@ extern int emenuhit(int, Mouse*, Menu*); extern int eatomouse(Mouse*, char*, int); extern Rectangle getrect(int, Mouse*); struct Cursor; +struct Cursor2; extern void esetcursor(struct Cursor*); +extern void esetcursor2(struct Cursor*, struct Cursor2*); extern void emoveto(Point); extern Rectangle egetrect(int, Mouse*); extern void edrawgetrect(Rectangle, int); diff --git a/include/mouse.h b/include/mouse.h index 3d5c975f..c46d51e9 100644 --- a/include/mouse.h +++ b/include/mouse.h @@ -38,7 +38,9 @@ extern void moveto(Mousectl*, Point); extern int readmouse(Mousectl*); extern void closemouse(Mousectl*); struct Cursor; +struct Cursor2; extern void setcursor(Mousectl*, struct Cursor*); +extern void setcursor2(Mousectl*, struct Cursor*, struct Cursor2*); extern void drawgetrect(Rectangle, int); extern Rectangle getrect(int, Mousectl*); extern int menuhit(int, Mousectl*, Menu*, Screen*); diff --git a/src/libdraw/cursor.c b/src/libdraw/cursor.c new file mode 100644 index 00000000..58f447b1 --- /dev/null +++ b/src/libdraw/cursor.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include + +static uint8 expand[16] = { + 0x00, 0x03, 0x0c, 0x0f, + 0x30, 0x33, 0x3c, 0x3f, + 0xc0, 0xc3, 0xcc, 0xcf, + 0xf0, 0xf3, 0xfc, 0xff, +}; + +void +scalecursor(Cursor2 *c2, Cursor *c) +{ + int y; + + c2->offset.x = 2*c->offset.x; + c2->offset.y = 2*c->offset.y; + memset(c2->clr, 0, sizeof c2->clr); + memset(c2->set, 0, sizeof c2->set); + for(y = 0; y < 16; y++) { + c2->clr[8*y] = c2->clr[8*y+4] = expand[c->clr[2*y]>>4]; + c2->set[8*y] = c2->set[8*y+4] = expand[c->set[2*y]>>4]; + c2->clr[8*y+1] = c2->clr[8*y+5] = expand[c->clr[2*y]&15]; + c2->set[8*y+1] = c2->set[8*y+5] = expand[c->set[2*y]&15]; + c2->clr[8*y+2] = c2->clr[8*y+6] = expand[c->clr[2*y+1]>>4]; + c2->set[8*y+2] = c2->set[8*y+6] = expand[c->set[2*y+1]>>4]; + c2->clr[8*y+3] = c2->clr[8*y+7] = expand[c->clr[2*y+1]&15]; + c2->set[8*y+3] = c2->set[8*y+7] = expand[c->set[2*y+1]&15]; + } +} diff --git a/src/libdraw/drawclient.c b/src/libdraw/drawclient.c index f0c09430..de20d3a3 100644 --- a/src/libdraw/drawclient.c +++ b/src/libdraw/drawclient.c @@ -292,17 +292,22 @@ _displaymoveto(Display *d, Point p) } int -_displaycursor(Display *d, Cursor *c) +_displaycursor(Display *d, Cursor *c, Cursor2 *c2) { Wsysmsg tx, rx; tx.type = Tcursor; if(c == nil){ memset(&tx.cursor, 0, sizeof tx.cursor); + memset(&tx.cursor2, 0, sizeof tx.cursor2); tx.arrowcursor = 1; }else{ tx.arrowcursor = 0; tx.cursor = *c; + if(c2 != nil) + tx.cursor2 = *c2; + else + scalecursor(&tx.cursor2, c); } return displayrpc(d, &tx, &rx, nil); } diff --git a/src/libdraw/drawfcall.c b/src/libdraw/drawfcall.c index e2d3c642..e36413b6 100644 --- a/src/libdraw/drawfcall.c +++ b/src/libdraw/drawfcall.c @@ -64,7 +64,7 @@ sizeW2M(Wsysmsg *m) case Tmoveto: return 4+1+1+4+4; case Tcursor: - return 4+1+1+4+4+2*16+2*16+1; + return 4+1+1+4+4+2*16+2*16+4+4+4*32+4*32+1; case Rerror: return 4+1+1+_stringsize(m->error); case Rrdkbd: @@ -141,7 +141,11 @@ convW2M(Wsysmsg *m, uchar *p, uint n) PUT(p+10, m->cursor.offset.y); memmove(p+14, m->cursor.clr, sizeof m->cursor.clr); memmove(p+46, m->cursor.set, sizeof m->cursor.set); - p[78] = m->arrowcursor; + PUT(p+78, m->cursor2.offset.x); + PUT(p+82, m->cursor2.offset.y); + memmove(p+86, m->cursor2.clr, sizeof m->cursor2.clr); + memmove(p+214, m->cursor2.set, sizeof m->cursor2.set); + p[342] = m->arrowcursor; break; case Rrdkbd: PUT2(p+6, m->rune); @@ -229,7 +233,11 @@ convM2W(uchar *p, uint n, Wsysmsg *m) GET(p+10, m->cursor.offset.y); memmove(m->cursor.clr, p+14, sizeof m->cursor.clr); memmove(m->cursor.set, p+46, sizeof m->cursor.set); - m->arrowcursor = p[78]; + GET(p+78, m->cursor2.offset.x); + GET(p+82, m->cursor2.offset.y); + memmove(m->cursor2.clr, p+86, sizeof m->cursor2.clr); + memmove(m->cursor2.set, p+214, sizeof m->cursor2.set); + m->arrowcursor = p[342]; break; case Rrdkbd: GET2(p+6, m->rune); diff --git a/src/libdraw/event.c b/src/libdraw/event.c index f113d1f0..b369c020 100644 --- a/src/libdraw/event.c +++ b/src/libdraw/event.c @@ -416,7 +416,13 @@ emoveto(Point pt) void esetcursor(Cursor *c) { - _displaycursor(display, c); + _displaycursor(display, c, nil); +} + +void +esetcursor2(Cursor *c, Cursor2 *c2) +{ + _displaycursor(display, c, c2); } int diff --git a/src/libdraw/mkfile b/src/libdraw/mkfile index ddb0e833..003bf3ce 100644 --- a/src/libdraw/mkfile +++ b/src/libdraw/mkfile @@ -14,6 +14,7 @@ OFILES=\ cloadimage.$O\ computil.$O\ creadimage.$O\ + cursor.$O\ debug.$O\ defont.$O\ draw.$O\ diff --git a/src/libdraw/mouse.c b/src/libdraw/mouse.c index ad1a069b..fc486be4 100644 --- a/src/libdraw/mouse.c +++ b/src/libdraw/mouse.c @@ -85,6 +85,12 @@ initmouse(char *file, Image *i) void setcursor(Mousectl *mc, Cursor *c) { - _displaycursor(mc->display, c); + _displaycursor(mc->display, c, nil); +} + +void +setcursor2(Mousectl *mc, Cursor *c, Cursor2 *c2) +{ + _displaycursor(mc->display, c, c2); } -- cgit v1.2.3