#pragma src "/sys/src/alef/lib/libg" #pragma lib "/$M/lib/alef/libg.a" /* * Types */ aggr Point { int x; int y; }; aggr Rectangle { Point min; Point max; }; aggr Bitmap { Rectangle r; /* rectangle in data area, local coords */ Rectangle clipr; /* clipping region */ int ldepth; int id; Bitmap *cache; /* zero; distinguishes bitmap from layer */ }; aggr Mouse { int buttons; Point xy; uint msec; }; aggr Cursor { Point offset; byte clr[2*16]; byte set[2*16]; }; aggr Linedesc { int x0; int y0; byte xmajor; byte slopeneg; int dminor; int dmajor; }; adt Menu { extern byte **item; extern byte *(*gen)(int); int lasthit; (int, Mouse) hit(*Menu, int, chan(Mouse), Mouse); }; /* * 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. * */ aggr Fontchar { usint x; /* left edge of bits */ byte top; /* first non-zero scan-line */ byte bottom; /* last non-zero scan-line + 1 */ byte left; /* offset of baseline */ byte width; /* width of baseline */ }; aggr Subfont { sint n; /* number of chars in font */ byte height; /* height of bitmap */ byte ascent; /* top of bitmap to baseline */ Fontchar *info; /* n+1 character descriptors */ int id; /* 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, }; aggr 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 */ byte *name; }; aggr Cacheinfo { Rune value; /* value of character at this slot in cache */ usint age; uint xright; /* right edge of bits */ Fontchar; }; aggr Cachesubf { uint age; /* for replacement */ Cachefont *cf; /* loaded subfont */ Subfont *f; /* subfont font; multiplexed between subfonts */ }; aggr Font { byte *name; byte height; /* max height of bitmap, interline spacing */ byte ascent; /* top of bitmap to baseline */ byte width; /* widest so far; used in caching only */ byte ldepth; /* of images */ sint id; /* of font */ sint nsub; /* number of subfonts */ uint 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 */ }; aggr RGB { uint red; uint green; uint 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. */ 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, }; /* * Miscellany */ extern Point add(Point, Point); extern Point sub(Point, Point); extern Point mul(Point, int); extern Point div(Point, int); extern Rectangle rsubp(Rectangle, Point); extern Rectangle raddp(Rectangle, Point); extern Rectangle inset(Rectangle, int); extern Rectangle rmul(Rectangle, int); extern Rectangle rdiv(Rectangle, int); extern Rectangle rshift(Rectangle, int); extern Rectangle rcanon(Rectangle); extern Bitmap* balloc(Rectangle, int); extern void bfree(Bitmap*); extern int rectclip(Rectangle*, Rectangle); extern void binit(void(*)(byte*), byte*, byte*); extern void bclose(void); extern void berror(byte*); extern void bitblt(Bitmap*, Point, Bitmap*, Rectangle, Fcode); extern int bitbltclip(void*); extern Font* rdfontfile(byte*, int); extern void ffree(Font*); extern Font* mkfont(Subfont*, Rune); extern Subfont* subfalloc(int, int, int, Fontchar*, Bitmap*, uint, uint); extern void subffree(Subfont*); extern int cachechars(Font*, byte**, usint*, int, int*); extern Point string(Bitmap*, Point, Font*, byte*, 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 int strwidth(Font*, byte*); extern void agefont(Font*); extern int loadchar(Font*, Rune, Cacheinfo*, int, int); extern Point strsize(Font*, byte*); extern int charwidth(Font*, Rune); extern void texture(Bitmap*, Rectangle, Bitmap*, Fcode); extern void wrbitmap(Bitmap*, int, int, byte*); extern void rdbitmap(Bitmap*, int, int, byte*); extern void wrbitmapfile(int, Bitmap*); extern Bitmap* rdbitmapfile(int); extern void wrsubfontfile(int, Subfont*); extern Subfont* rdsubfontfile(int, Bitmap*); extern void _unpackinfo(Fontchar*, byte*, int); extern void rdcolmap(Bitmap*, RGB*); extern void wrcolmap(Bitmap*, RGB*); extern int ptinrect(Point, Rectangle); extern int rectinrect(Rectangle, Rectangle); extern int rectXrect(Rectangle, Rectangle); extern int eqpt(Point, Point); extern int eqrect(Rectangle, Rectangle); extern void border(Bitmap*, Rectangle, int, Fcode); extern void cursorswitch(Cursor*); extern void cursorset(Point); extern Rectangle bscreenrect(Rectangle*); extern byte* bneed(int); extern void bflush(void); extern void bexit(void); extern int bwrite(void); extern int _clipline(Rectangle, Point*, Point*, Linedesc*); extern int clipline(Rectangle, Point*, Point*); extern int clipr(Bitmap*, Rectangle); extern uint rgbpix(Bitmap*, RGB); extern int _gminor(int, Linedesc*); #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 int bitbltfd; extern Bitmap screen; extern Font *font; extern byte _btmp[8192]; #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) {(p)[0]=(v); (p)[1]=(v)>>8; (p)[2]=(v)>>16; (p)[3]=(v)>>24; }