ref: 76f5318cbd58fbe2bfc8cb51856bfa217c673bb7
dir: /os/boot/rpcg/libg.h/
#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;