/* Sortof fun, draw graphics on wyse/link terminals! */ #include #include "gscreen.h" #include "curses.h" #define FONTSIZE 16 #define FONTMASK 15 #define BYTESIZE 8 #define BYTEMASK 7 short GSrows, GScols; static struct gscreen { unsigned char data[512 * FONTSIZE]; unsigned char *map[512]; short ref[512]; } GS; void GSbegin() { int i; PSbegin(); GSrows = PSrows * FONTSIZE; GScols = PScols * BYTESIZE; memset(GS.data,0,512 * FONTSIZE); memset(GS.ref,0,sizeof GS.ref); for (i = 0; i < 512; ++i) GS.map[i] = GS.data + i * FONTSIZE; PSfont(0,GS.data); PSfill(&GIANT_RECT,0); GS.ref[0] = PSrows * PScols; } void GSend() { PSend(); /* restore default fonts! */ write(1,"\033c@0D\033c@1A",10); } int GSputpixel(row,col,color) { CHTYPE ch = winchrc(curscr,row >> 4,col >> 3); unsigned char *m; int idx,mask; ch = (ch & A_BOLD) ? ch & 255 | 0x100 : ch & 255; m = GS.map[ch]; idx = row & FONTMASK; mask = 0x80 >> (col & BYTEMASK); mask = (color & 1) ? m[idx] | mask : m[idx] & ~mask; if (m[idx] ^ mask) { /* pixel changed */ if (GS.ref[ch] > 1) { CHTYPE a; --GS.ref[ch]; /* allocate new char */ for (ch = 0; GS.ref[ch];) { if (++ch == 512) return -1; /* ran out of chars */ } ++GS.ref[ch]; memcpy(GS.map[ch],m,FONTSIZE); m = GS.map[ch]; if (ch & 0x100) ch = ch & 255 | A_BOLD; a = ch; PSwrtattr(row >> 4,col >> 3,1,&a); } else if (ch & 0x100) ch = ch & 255 | A_BOLD; m[idx] = mask; PSfont(ch,m); } return 0; } int GSgetpixel(row,col) { CHTYPE ch = winchrc(curscr,row >> 4,col >> 3); ch = (ch & A_BOLD) ? ch & 255 | 0x100 : ch & 255; return (GS.map[ch][row & FONTMASK] >> (BYTESIZE - (col & BYTEMASK))) & 1; }