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/boot/rpcg/libg.h | |
| parent | 46439007cf417cbd9ac8049bb4122c890097a0fa (diff) | |
20060303
Diffstat (limited to 'os/boot/rpcg/libg.h')
| -rw-r--r-- | os/boot/rpcg/libg.h | 418 |
1 files changed, 418 insertions, 0 deletions
diff --git a/os/boot/rpcg/libg.h b/os/boot/rpcg/libg.h new file mode 100644 index 00000000..5c2cec26 --- /dev/null +++ b/os/boot/rpcg/libg.h @@ -0,0 +1,418 @@ +#pragma src "/sys/src/libg" +#pragma lib "libg.a" + +enum /* constants for I/O to devgraphics */ +{ + Tilehdr = 40, + Tilesize = 8000 +}; + +/* + * you may think it's a blit, but it's gnot + */ +enum +{ + EMAXMSG = 128+8192, /* size of 9p header+data */ +}; + +/* + * Types + */ + +typedef struct Bitmap Bitmap; +typedef struct Display Display; +typedef struct Point Point; +typedef struct Rectangle Rectangle; +typedef struct Cursor Cursor; +typedef struct Mouse Mouse; +typedef struct Menu Menu; +typedef struct Font Font; +typedef struct Fontchar Fontchar; +typedef struct Subfont Subfont; +typedef struct Cachefont Cachefont; +typedef struct Cacheinfo Cacheinfo; +typedef struct Cachesubf Cachesubf; +typedef struct Event Event; +typedef struct Slave Slave; +typedef struct Ebuf Ebuf; +typedef struct RGB RGB; +typedef struct Linedesc Linedesc; +typedef struct DRefret DRefret; + +struct DRefret +{ + int n; /* number of bytes */ + int dy; /* number of lines */ + uchar *dp; /* pointer to data */ +}; + +struct Point +{ + int x; + int y; +}; + +struct Rectangle +{ + Point min; + Point max; +}; + +typedef DRefret DRefresh(Display*, int, Rectangle, uchar*, uchar*, int); + +struct Bitmap +{ + Rectangle r; /* rectangle in data area, local coords */ + Rectangle clipr; /* clipping region */ + int ldepth; /* log base 2 of number of bits per pixel */ + ulong *base; /* pointer to start of data */ + int zero; /* base+zero=&word containing (0,0) */ + ulong width; /* width in words of total data area */ + Display *display; /* if present */ +}; + +struct Display +{ + uchar *data; /* transfer buffer */ + Rectangle r; + int ldepth; + Rectangle bb; /* bounding box of changes */ + int waste; /* unused part of bb */ + Rectangle bound; /* memory for boundin/boundout */ + Bitmap *image; /* owner */ + int id; + int fd; + int ctlfd; + int local; + int bytewidth; + void *drdata1; /* storage for drefresh() */ + void *drdata2; /* storage for drefresh() */ + DRefresh *drefresh; +}; + + +struct Mouse +{ + int buttons; /* bit array: LMR=124 */ + Point xy; + ulong msec; +}; + +struct Cursor +{ + Point offset; + uchar clr[2*16]; + uchar set[2*16]; +}; + +struct Menu +{ + char **item; + char *(*gen)(int); + int lasthit; +}; + +struct Linedesc +{ + int x0; + int y0; + char xmajor; + char slopeneg; + long dminor; + long dmajor; +}; + +/* + * Subfonts + * + * given char c, Subfont *f, Fontchar *i, and Point p, one says + * i = f->info+c; + * bitblt(b, Pt(p.x+i->left,p.y+i->top), + * bitmap, Rect(i->x,i->top,(i+1)->x,i->bottom), + * fc); + * p.x += i->width; + * where bitmap b is the repository of the images. + * + */ + +struct Fontchar +{ + short x; /* left edge of bits */ + uchar top; /* first non-zero scan-line */ + uchar bottom; /* last non-zero scan-line + 1 */ + char left; /* offset of baseline */ + uchar width; /* width of baseline */ +}; + +struct Subfont +{ + short n; /* number of chars in font */ + uchar height; /* height of bitmap */ + char ascent; /* top of bitmap to baseline */ + Fontchar *info; /* n+1 character descriptors */ + Bitmap *bits; /* of font */ +}; + +enum +{ + /* starting values */ + LOG2NFCACHE = 6, + NFCACHE = (1<<LOG2NFCACHE), /* #chars cached */ + NFLOOK = 5, /* #chars to scan in cache */ + NFSUBF = 2, /* #subfonts to cache */ + /* max value */ + MAXFCACHE = 2048+NFLOOK, /* generous upper limit */ + MAXSUBF = 50, /* generous upper limit */ + /* deltas */ + DSUBF = 4, + /* expiry ages */ + SUBFAGE = 10000, + CACHEAGE = 10000, +}; + +struct Cachefont +{ + Rune min; /* lowest rune value to be taken from subfont */ + Rune max; /* highest rune value+1 to be taken from subfont */ + int offset; /* position in subfont of character at min */ + int abs; /* name has been made absolute */ + char *name; +}; + +struct Cacheinfo +{ + Rune value; /* value of character at this slot in cache */ + ushort age; + ulong xright; /* right edge of bits */ + Fontchar; +}; + +struct Cachesubf +{ + ulong age; /* for replacement */ + Cachefont *cf; /* font info that owns us */ + Subfont *f; /* attached subfont */ +}; + +struct Font +{ + char *name; + short height; /* max height of bitmap, interline spacing */ + short ascent; /* top of bitmap to baseline */ + int maxldepth; /* over all loaded subfonts */ + short width; /* widest so far; used in caching only */ + short ldepth; /* of images */ + short nsub; /* number of subfonts */ + ulong age; /* increasing counter; used for LRU */ + int ncache; /* size of cache */ + int nsubf; /* size of subfont list */ + Cacheinfo *cache; + Cachesubf *subf; + Cachefont **sub; /* as read from file */ + Bitmap *cacheimage; +}; + +struct Event +{ + int kbdc; + Mouse mouse; + int n; /* number of characters in mesage */ + uchar data[EMAXMSG]; /* message from an arbitrary file descriptor */ +}; + +struct Slave{ + int pid; + Ebuf *head; /* queue of messages for this descriptor */ + Ebuf *tail; +}; + +struct Ebuf{ + Ebuf *next; + int n; /* number of bytes in buf */ + uchar buf[EMAXMSG]; +}; + +struct RGB +{ + ulong red; + ulong green; + ulong blue; +}; + +/* + * Codes for bitblt etc. + * + * D + * 0 1 + * --------- + * 0 | 1 | 2 | + * S |---|---| + * 1 | 4 | 8 | + * --------- + * + * Usually used as D|S; DorS is so tracebacks are readable. + */ +typedef +enum Fcode +{ + Zero = 0x0, + DnorS = 0x1, + DandnotS = 0x2, + notS = 0x3, + notDandS = 0x4, + notD = 0x5, + DxorS = 0x6, + DnandS = 0x7, + DandS = 0x8, + DxnorS = 0x9, + D = 0xA, + DornotS = 0xB, + S = 0xC, + notDorS = 0xD, + DorS = 0xE, + F = 0xF, +} Fcode; + +/* + * Miscellany + */ + +extern Point add(Point, Point), sub(Point, Point); +extern Point mul(Point, int), div(Point, int); +extern Rectangle rsubp(Rectangle, Point), raddp(Rectangle, Point), inset(Rectangle, int); +extern Rectangle rmul(Rectangle, int), rdiv(Rectangle, int); +extern Rectangle rshift(Rectangle, int), rcanon(Rectangle); +extern Bitmap* balloc(Rectangle, int); +extern Bitmap* ballocnomem(Rectangle, int); +extern Bitmap* brealloc(Bitmap*, Rectangle, int); +extern Bitmap* breallocnomem(Bitmap*, Rectangle, int); +extern int bbytewidth(Bitmap*, int*, int*); +extern void bfree(Bitmap*); +extern void bfreemem(Bitmap*); +extern int rectclip(Rectangle*, Rectangle); +extern void binit(void(*)(char*), char*, char*); +extern void binit1(void(*)(char*), char*, char*, int); +extern void bclose(void); +extern void berror(char*); +extern void bitblt(Bitmap*, Point, Bitmap*, Rectangle, Fcode); +extern int bitbltclip(void*); +extern Font* rdfontfile(char*, int); +extern void ffree(Font*); +extern void fminldepth(Font*); +extern Font* mkfont(Subfont*, Rune); +extern Subfont* subfalloc(int, int, int, Fontchar*, Bitmap*); +extern void subffree(Subfont*); +extern int cachechars(Font*, char**, ushort*, int, int*); +extern Point string(Bitmap*, Point, Font*, char*, Fcode); +extern Point subfstring(Bitmap*, Point, Subfont*, char*, Fcode); +extern void segment(Bitmap*, Point, Point, int, Fcode); +extern void point(Bitmap*, Point, int, Fcode); +extern void arc(Bitmap*, Point, Point, Point, int, Fcode); +extern void circle(Bitmap*, Point, int, int, Fcode); +extern void disc(Bitmap*, Point, int, int, Fcode); +extern void ellipse(Bitmap*, Point, int, int, int, Fcode); +extern long strwidth(Font*, char*); +extern void agefont(Font*); +extern int loadchar(Font*, Rune, Cacheinfo*, int, int); +extern Point strsize(Font*, char*); +extern long charwidth(Font*, Rune); +extern void texture(Bitmap*, Rectangle, Bitmap*, Fcode); +extern void wrbitmap(Bitmap*, int, int, uchar*); +extern void rdbitmap(Bitmap*, int, int, uchar*); +extern void wrbitmapfile(int, Bitmap*); +extern Bitmap* rdbitmapfile(int); +extern void wrsubfontfile(int, Subfont*); +extern void wrcolmap(Bitmap*, RGB*); +extern void rdcolmap(Bitmap*, RGB*); +extern Subfont* rdsubfontfile(int, Bitmap*); +extern void _unpackinfo(Fontchar*, uchar*, int); + +extern int ptinrect(Point, Rectangle), rectinrect(Rectangle, Rectangle); +extern int rectXrect(Rectangle, Rectangle); +extern int eqpt(Point, Point), eqrect(Rectangle, Rectangle); +extern void border(Bitmap*, Rectangle, int, Fcode); +extern void cursorswitch(Cursor*); +extern void cursorset(Point); +extern Rectangle bscreenrect(Rectangle*); +extern void bflush(void); +extern void bexit(void); +extern int _clipline(Rectangle, Point*, Point*, Linedesc*); +extern int clipline(Rectangle, Point*, Point*); +extern int clipr(Bitmap*, Rectangle); + +extern void einit(ulong); +extern ulong estart(ulong, int, int); +extern ulong etimer(ulong, int); +extern ulong event(Event*); +extern ulong eread(ulong, Event*); +extern Ebuf* ebread(Slave*); +extern Mouse emouse(void); +extern int ekbd(void); +extern int ecanread(ulong); +extern int ecanmouse(void); +extern int ecankbd(void); +extern void ereshaped(Rectangle); /* supplied by user */ +extern int menuhit(int, Mouse*, Menu*); +extern Rectangle getrect(int, Mouse*); +extern ulong rgbpix(Bitmap*, RGB); +extern int _gminor(long, Linedesc*); + +enum{ + Emouse = 1, + Ekeyboard = 2, +}; + +enum +{ + MAXSLAVE = 32, +}; + +#define Pt(x, y) ((Point){(x), (y)}) +#define Rect(x1, y1, x2, y2) ((Rectangle){Pt(x1, y1), Pt(x2, y2)}) +#define Rpt(p1, p2) ((Rectangle){(p1), (p2)}) + + +#define Dx(r) ((r).max.x-(r).min.x) +#define Dy(r) ((r).max.y-(r).min.y) + +extern Bitmap screen; +extern Font *font; +extern uchar _btmp[8192]; + +extern int _mousefd; +extern int _cursorfd; + +#define BGSHORT(p) (((p)[0]<<0) | ((p)[1]<<8)) +#define BGLONG(p) ((BGSHORT(p)<<0) | (BGSHORT(p+2)<<16)) +#define BPSHORT(p, v) ((p)[0]=(v), (p)[1]=((v)>>8)) +#define BPLONG(p, v) (BPSHORT(p, (v)), BPSHORT(p+2, (v)>>16)) + +ulong *wordaddr(Bitmap*, Point); +uchar *byteaddr(Bitmap*, Point); +int dfree(Display*); +int dwritectl(Display*, char*, int); +int dreadctl(Display*, char*, int); +int dinfo(Display*, int, int*, Rectangle*); +void* dinit(Display*, Bitmap*, int, int); +int ddelete(Display*); +void dfreemem(Display*); +int dreadctl(Display*, char*, int); +int dwritectl(Display*, char*, int); +void dbound(Display*, Rectangle); +void bload(Bitmap*, Rectangle, uchar*); +ulong bunload(Bitmap*, Rectangle, uchar*); +void drefresh(Display*, Rectangle); +Display *dopen(char*, int, DRefresh*); +Bitmap* dbitmap(Display*, DRefresh*, int); +void dclose(Display*); +void dflush(Display*); +void _bltinit(void); +Bitmap* battach(Bitmap*, int, int); +int readmouse(Mouse*); +int atomouse(Mouse*, char*, int); + +/* + * Refresh functions + */ +DRefresh drtexture; +DRefresh drbackstore; |
