tdevdraw: add Cursor2 support on macOS 10.14 Mojave - plan9port - [fork] Plan 9 from user space (HTM) git clone git://src.adamsgaard.dk/plan9port (DIR) Log (DIR) Files (DIR) Refs (DIR) README (DIR) LICENSE --- (DIR) commit 7d43dde539378fb5730df6ce961f7916f495746e (DIR) parent be0a15c47b75dc73a5c389cca125692f0cfdf726 (HTM) Author: Russ Cox <rsc@swtch.com> Date: Thu, 15 Nov 2018 20:28:56 -0500 devdraw: add Cursor2 support on macOS 10.14 Mojave This replaces the pixel-art scaling algorithm used for upscaling before. The results were not crisp enough to serve as everyday cursors. Diffstat: M src/cmd/devdraw/bigarrow.h | 70 +++++++++++++++++++++++++++++++ M src/cmd/devdraw/cocoa-screen-metal… | 62 +++++++++++++------------------ M src/cmd/devdraw/cocoa-screen.h | 2 +- M src/cmd/devdraw/cocoa-screen.m | 10 +++++++++- M src/cmd/devdraw/cocoa-srv.c | 6 ++---- M src/cmd/devdraw/mkfile | 2 ++ M src/cmd/devdraw/osx-screen.h | 2 +- M src/cmd/devdraw/osx-srv.c | 4 ++-- 8 files changed, 113 insertions(+), 45 deletions(-) --- (DIR) diff --git a/src/cmd/devdraw/bigarrow.h b/src/cmd/devdraw/bigarrow.h t@@ -11,3 +11,73 @@ Cursor bigarrow = { 0x61, 0xF0, 0x60, 0xE0, 0x40, 0x40, 0x00, 0x00, }, }; + +Cursor2 bigarrow2 = { + { -2, -2 }, + { 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x00, 0x00, 0x03, + 0xC0, 0x00, 0x00, 0x07, + 0xC0, 0x00, 0x00, 0x1E, + 0xC0, 0x00, 0x00, 0x3C, + 0xC0, 0x00, 0x00, 0xF0, + 0xC0, 0x00, 0x03, 0xE0, + 0xC0, 0x00, 0x0F, 0x80, + 0xC0, 0x00, 0x0E, 0x00, + 0xC0, 0x00, 0x07, 0x00, + 0xC0, 0x00, 0x03, 0x80, + 0xC0, 0x00, 0x01, 0xC0, + 0xC0, 0x00, 0x00, 0xE0, + 0xC0, 0x00, 0x00, 0x70, + 0xC0, 0x00, 0x00, 0x38, + 0xC0, 0x00, 0x00, 0x1C, + 0xC0, 0x00, 0x00, 0x0E, + 0xC0, 0x00, 0x00, 0x07, + 0xC0, 0x00, 0x00, 0x03, + 0xC0, 0xC0, 0x00, 0x07, + 0xC0, 0xE0, 0x00, 0x0E, + 0xC1, 0xF0, 0x00, 0x1C, + 0xC1, 0xB8, 0x00, 0x38, + 0xC3, 0x9C, 0x00, 0x70, + 0xC3, 0x0E, 0x00, 0xE0, + 0xC7, 0x07, 0x01, 0xC0, + 0xCE, 0x03, 0x83, 0x80, + 0xCC, 0x01, 0xC7, 0x00, + 0xDC, 0x00, 0xEE, 0x00, + 0xF8, 0x00, 0x7C, 0x00, + 0xF0, 0x00, 0x38, 0x00, + }, + { 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x3F, 0xFF, 0xFF, 0xFC, + 0x3F, 0xFF, 0xFF, 0xF8, + 0x3F, 0xFF, 0xFF, 0xE0, + 0x3F, 0xFF, 0xFF, 0xC0, + 0x3F, 0xFF, 0xFF, 0x00, + 0x3F, 0xFF, 0xFC, 0x00, + 0x3F, 0xFF, 0xF0, 0x00, + 0x3F, 0xFF, 0xF0, 0x00, + 0x3F, 0xFF, 0xF8, 0x00, + 0x3F, 0xFF, 0xFC, 0x00, + 0x3F, 0xFF, 0xFE, 0x00, + 0x3F, 0xFF, 0xFF, 0x00, + 0x3F, 0xFF, 0xFF, 0x80, + 0x3F, 0xFF, 0xFF, 0xC0, + 0x3F, 0xFF, 0xFF, 0xE0, + 0x3F, 0xFF, 0xFF, 0xF0, + 0x3F, 0xFF, 0xFF, 0xF8, + 0x3F, 0xFF, 0xFF, 0xFC, + 0x3F, 0x3F, 0xFF, 0xF8, + 0x3F, 0x1F, 0xFF, 0xF0, + 0x3E, 0x0F, 0xFF, 0xE0, + 0x3E, 0x07, 0xFF, 0xC0, + 0x3C, 0x03, 0xFF, 0x80, + 0x3C, 0x01, 0xFF, 0x00, + 0x38, 0x00, 0xFE, 0x00, + 0x30, 0x00, 0x7C, 0x00, + 0x30, 0x00, 0x38, 0x00, + 0x20, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + } +}; (DIR) diff --git a/src/cmd/devdraw/cocoa-screen-metal.m b/src/cmd/devdraw/cocoa-screen-metal.m t@@ -252,21 +252,30 @@ threadmain(int argc, char **argv) [myContent enlargeLastInputRect:r]; } +typedef struct Cursors Cursors; +struct Cursors { + Cursor *c; + Cursor2 *c2; +}; + + (void)callsetcursor:(NSValue *)v { + Cursors *cs; Cursor *c; + Cursor2 *c2; NSBitmapImageRep *r, *r2; NSImage *i; NSPoint p; - uint b, x, y, a; uchar *plane[5], *plane2[5]; - uchar pu, pb, pl, pr, pc; // upper, bottom, left, right, center - uchar pul, pur, pbl, pbr; - uchar ful, fur, fbl, fbr; + int b; - c = [v pointerValue]; + cs = [v pointerValue]; + c = cs->c; if(!c) c = &bigarrow; + c2 = cs->c2; + if(!c2) + c2 = &bigarrow2; r = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:nil t@@ -280,7 +289,7 @@ threadmain(int argc, char **argv) bytesPerRow:2 bitsPerPixel:0]; [r getBitmapDataPlanes:plane]; - for(b=0; b<2*16; b++){ + for(b=0; b<nelem(c->set); b++){ plane[0][b] = ~c->set[b] & c->clr[b]; plane[1][b] = c->set[b] | c->clr[b]; } t@@ -297,33 +306,9 @@ threadmain(int argc, char **argv) bytesPerRow:4 bitsPerPixel:0]; [r2 getBitmapDataPlanes:plane2]; - // https://en.wikipedia.org/wiki/Pixel-art_scaling_algorithms#EPX/Scale2×/AdvMAME2× - for(a=0; a<2; a++){ - for(y=0; y<16; y++){ - for(x=0; x<2; x++){ - pc = plane[a][x+2*y]; - pu = y==0 ? pc : plane[a][x+2*(y-1)]; - pb = y==15 ? pc : plane[a][x+2*(y+1)]; - pl = (pc>>1) | (x==0 ? pc&0x80 : (plane[a][x-1+2*y]&1)<<7); - pr = (pc<<1) | (x==1 ? pc&1 : (plane[a][x+1+2*y]&0x80)>>7); - ful = ~(pl^pu) & (pl^pb) & (pu^pr); - pul = (ful & pu) | (~ful & pc); - fur = ~(pu^pr) & (pu^pl) & (pr^pb); - pur = (fur & pr) | (~fur & pc); - fbl = ~(pb^pl) & (pb^pr) & (pl^pu); - pbl = (fbl & pl) | (~fbl & pc); - fbr = ~(pr^pb) & (pr^pu) & (pb^pl); - pbr = (fbr & pb) | (~fbr & pc); - plane2[a][2*x+4*2*y] = (pul&0x80) | ((pul&0x40)>>1) | ((pul&0x20)>>2) | ((pul&0x10)>>3) - | ((pur&0x80)>>1) | ((pur&0x40)>>2) | ((pur&0x20)>>3) | ((pur&0x10)>>4); - plane2[a][2*x+1+4*2*y] = ((pul&0x8)<<4) | ((pul&0x4)<<3) | ((pul&0x2)<<2) | ((pul&0x1)<<1) - | ((pur&0x8)<<3) | ((pur&0x4)<<2) | ((pur&0x2)<<1) | (pur&0x1); - plane2[a][2*x+4*(2*y+1)] = (pbl&0x80) | ((pbl&0x40)>>1) | ((pbl&0x20)>>2) | ((pbl&0x10)>>3) - | ((pbr&0x80)>>1) | ((pbr&0x40)>>2) | ((pbr&0x20)>>3) | ((pbr&0x10)>>4); - plane2[a][2*x+1+4*(2*y+1)] = ((pbl&0x8)<<4) | ((pbl&0x4)<<3) | ((pbl&0x2)<<2) | ((pbl&0x1)<<1) - | ((pbr&0x8)<<3) | ((pbr&0x4)<<2) | ((pbr&0x2)<<1) | (pbr&0x1); - } - } + for(b=0; b<nelem(c2->set); b++){ + plane2[0][b] = ~c2->set[b] & c2->clr[b]; + plane2[1][b] = c2->set[b] | c2->clr[b]; } // For checking out the cursor bitmap image t@@ -943,7 +928,7 @@ attachscreen(char *label, char *winsize) withObject:[NSValue valueWithPointer:winsize] waitUntilDone:YES]; kicklabel(label); - setcursor(nil); + setcursor(nil, nil); mouseresized = 0; return initimg(); } t@@ -1099,11 +1084,16 @@ kicklabel(char *label) } void -setcursor(Cursor *c) +setcursor(Cursor *c, Cursor2 *c2) { + Cursors cs; + + cs.c = c; + cs.c2 = c2; + [AppDelegate performSelectorOnMainThread:@selector(callsetcursor:) - withObject:[NSValue valueWithPointer:c] + withObject:[NSValue valueWithPointer:&cs] waitUntilDone:YES]; } (DIR) diff --git a/src/cmd/devdraw/cocoa-screen.h b/src/cmd/devdraw/cocoa-screen.h t@@ -2,7 +2,7 @@ Memimage *attachscreen(char*, char*); void setmouse(Point); -void setcursor(Cursor*); +void setcursor(Cursor*, Cursor2*); void setlabel(char*); char* getsnarf(void); void putsnarf(char*); (DIR) diff --git a/src/cmd/devdraw/cocoa-screen.m b/src/cmd/devdraw/cocoa-screen.m t@@ -1410,8 +1410,10 @@ kicklabel0(char *label) { } void -setcursor(Cursor *c) +setcursor(Cursor *c, Cursor2 *c2) { + USED(c2); + /* * No cursor change unless in main thread. */ t@@ -1658,3 +1660,9 @@ setprocname(const char *s) if(err != noErr) fprint(2, "Call to set process name failed\n"); } + +void +resizewindow(Rectangle r) +{ + USED(r); +} (DIR) diff --git a/src/cmd/devdraw/cocoa-srv.c b/src/cmd/devdraw/cocoa-srv.c t@@ -163,9 +163,9 @@ runmsg(Wsysmsg *m) case Tcursor: if(m->arrowcursor) - setcursor(nil); + setcursor(nil, nil); else - setcursor(&m->cursor); + setcursor(&m->cursor, &m->cursor2); replymsg(m); break; t@@ -221,9 +221,7 @@ runmsg(Wsysmsg *m) break; case Tresize: -#if OSX_VERSION >= 101400 resizewindow(m->rect); -#endif replymsg(m); break; } (DIR) diff --git a/src/cmd/devdraw/mkfile b/src/cmd/devdraw/mkfile t@@ -3,6 +3,8 @@ TARG=devdraw +SHORTLIB=draw memdraw + WSYSOFILES=\ devdraw.$O\ latin1.$O\ (DIR) diff --git a/src/cmd/devdraw/osx-screen.h b/src/cmd/devdraw/osx-screen.h t@@ -5,7 +5,7 @@ void zunlock(void); Memimage *attachscreen(char*, char*); void setmouse(Point); -void setcursor(Cursor*); +void setcursor(Cursor*, Cursor2*); void setlabel(char*); char* getsnarf(void); void putsnarf(char*); (DIR) diff --git a/src/cmd/devdraw/osx-srv.c b/src/cmd/devdraw/osx-srv.c t@@ -230,9 +230,9 @@ runmsg(Wsysmsg *m) case Tcursor: if(m->arrowcursor) - setcursor(nil); + setcursor(nil, nil); else - setcursor(&m->cursor); + setcursor(&m->cursor, &m->cursor2); replymsg(m); break;