137da2899SCharles.Forsyth #pragma src "/usr/inferno/libdraw" 237da2899SCharles.Forsyth 337da2899SCharles.Forsyth #pragma varargck argpos _drawprint 2 437da2899SCharles.Forsyth 537da2899SCharles.Forsyth typedef struct Cachefont Cachefont; 637da2899SCharles.Forsyth typedef struct Cacheinfo Cacheinfo; 737da2899SCharles.Forsyth typedef struct Cachesubf Cachesubf; 837da2899SCharles.Forsyth typedef struct Display Display; 937da2899SCharles.Forsyth typedef struct Font Font; 1037da2899SCharles.Forsyth typedef struct Fontchar Fontchar; 1137da2899SCharles.Forsyth typedef struct Image Image; 1237da2899SCharles.Forsyth typedef struct Mouse Mouse; 1337da2899SCharles.Forsyth typedef struct Point Point; 1437da2899SCharles.Forsyth typedef struct Rectangle Rectangle; 1537da2899SCharles.Forsyth typedef struct RGB RGB; 1637da2899SCharles.Forsyth typedef struct Refreshq Refreshq; 1737da2899SCharles.Forsyth typedef struct Screen Screen; 1837da2899SCharles.Forsyth typedef struct Subfont Subfont; 1937da2899SCharles.Forsyth 2037da2899SCharles.Forsyth #pragma varargck type "R" Rectangle 2137da2899SCharles.Forsyth #pragma varargck type "P" Point 2237da2899SCharles.Forsyth extern int Rfmt(Fmt*); 2337da2899SCharles.Forsyth extern int Pfmt(Fmt*); 2437da2899SCharles.Forsyth 2537da2899SCharles.Forsyth enum 2637da2899SCharles.Forsyth { 2737da2899SCharles.Forsyth DOpaque = 0xFFFFFFFF, 2837da2899SCharles.Forsyth DTransparent = 0x00000000, /* only useful for allocimage, memfillcolor */ 2937da2899SCharles.Forsyth DBlack = 0x000000FF, 3037da2899SCharles.Forsyth DWhite = 0xFFFFFFFF, 3137da2899SCharles.Forsyth DRed = 0xFF0000FF, 3237da2899SCharles.Forsyth DGreen = 0x00FF00FF, 3337da2899SCharles.Forsyth DBlue = 0x0000FFFF, 3437da2899SCharles.Forsyth DCyan = 0x00FFFFFF, 3537da2899SCharles.Forsyth DMagenta = 0xFF00FFFF, 3637da2899SCharles.Forsyth DYellow = 0xFFFF00FF, 3737da2899SCharles.Forsyth DPaleyellow = 0xFFFFAAFF, 3837da2899SCharles.Forsyth DDarkyellow = 0xEEEE9EFF, 3937da2899SCharles.Forsyth DDarkgreen = 0x448844FF, 4037da2899SCharles.Forsyth DPalegreen = 0xAAFFAAFF, 4137da2899SCharles.Forsyth DMedgreen = 0x88CC88FF, 4237da2899SCharles.Forsyth DDarkblue = 0x000055FF, 4337da2899SCharles.Forsyth DPalebluegreen= 0xAAFFFFFF, 4437da2899SCharles.Forsyth DPaleblue = 0x0000BBFF, 4537da2899SCharles.Forsyth DBluegreen = 0x008888FF, 4637da2899SCharles.Forsyth DGreygreen = 0x55AAAAFF, 4737da2899SCharles.Forsyth DPalegreygreen = 0x9EEEEEFF, 4837da2899SCharles.Forsyth DYellowgreen = 0x99994CFF, 4937da2899SCharles.Forsyth DMedblue = 0x000099FF, 5037da2899SCharles.Forsyth DGreyblue = 0x005DBBFF, 5137da2899SCharles.Forsyth DPalegreyblue = 0x4993DDFF, 5237da2899SCharles.Forsyth DPurpleblue = 0x8888CCFF, 5337da2899SCharles.Forsyth 5437da2899SCharles.Forsyth DNotacolor = 0xFFFFFF00, 5537da2899SCharles.Forsyth DNofill = DNotacolor, 5637da2899SCharles.Forsyth 5737da2899SCharles.Forsyth }; 5837da2899SCharles.Forsyth 5937da2899SCharles.Forsyth enum 6037da2899SCharles.Forsyth { 6137da2899SCharles.Forsyth Displaybufsize = 8000, 6237da2899SCharles.Forsyth ICOSSCALE = 1024, 6337da2899SCharles.Forsyth Borderwidth = 4, 6437da2899SCharles.Forsyth }; 6537da2899SCharles.Forsyth 6637da2899SCharles.Forsyth enum 6737da2899SCharles.Forsyth { 6837da2899SCharles.Forsyth /* refresh methods */ 6937da2899SCharles.Forsyth Refbackup = 0, 7037da2899SCharles.Forsyth Refnone = 1, 7137da2899SCharles.Forsyth Refmesg = 2 7237da2899SCharles.Forsyth }; 7337da2899SCharles.Forsyth #define NOREFRESH ((void*)-1) 7437da2899SCharles.Forsyth 7537da2899SCharles.Forsyth enum 7637da2899SCharles.Forsyth { 7737da2899SCharles.Forsyth /* line ends */ 7837da2899SCharles.Forsyth Endsquare = 0, 7937da2899SCharles.Forsyth Enddisc = 1, 8037da2899SCharles.Forsyth Endarrow = 2, 8137da2899SCharles.Forsyth Endmask = 0x1F 8237da2899SCharles.Forsyth }; 8337da2899SCharles.Forsyth 8437da2899SCharles.Forsyth #define ARROW(a, b, c) (Endarrow|((a)<<5)|((b)<<14)|((c)<<23)) 8537da2899SCharles.Forsyth 8637da2899SCharles.Forsyth /* 8737da2899SCharles.Forsyth * image channel descriptors 8837da2899SCharles.Forsyth */ 8937da2899SCharles.Forsyth enum { 9037da2899SCharles.Forsyth CRed = 0, 9137da2899SCharles.Forsyth CGreen, 9237da2899SCharles.Forsyth CBlue, 9337da2899SCharles.Forsyth CGrey, 9437da2899SCharles.Forsyth CAlpha, 9537da2899SCharles.Forsyth CMap, 9637da2899SCharles.Forsyth CIgnore, 9737da2899SCharles.Forsyth NChan, 9837da2899SCharles.Forsyth }; 9937da2899SCharles.Forsyth 10037da2899SCharles.Forsyth #define __DC(type, nbits) ((((type)&15)<<4)|((nbits)&15)) 10137da2899SCharles.Forsyth #define CHAN1(a,b) __DC(a,b) 10237da2899SCharles.Forsyth #define CHAN2(a,b,c,d) (CHAN1((a),(b))<<8|__DC((c),(d))) 10337da2899SCharles.Forsyth #define CHAN3(a,b,c,d,e,f) (CHAN2((a),(b),(c),(d))<<8|__DC((e),(f))) 10437da2899SCharles.Forsyth #define CHAN4(a,b,c,d,e,f,g,h) (CHAN3((a),(b),(c),(d),(e),(f))<<8|__DC((g),(h))) 10537da2899SCharles.Forsyth 10637da2899SCharles.Forsyth #define NBITS(c) ((c)&15) 10737da2899SCharles.Forsyth #define TYPE(c) (((c)>>4)&15) 10837da2899SCharles.Forsyth 10937da2899SCharles.Forsyth enum { 11037da2899SCharles.Forsyth GREY1 = CHAN1(CGrey, 1), 11137da2899SCharles.Forsyth GREY2 = CHAN1(CGrey, 2), 11237da2899SCharles.Forsyth GREY4 = CHAN1(CGrey, 4), 11337da2899SCharles.Forsyth GREY8 = CHAN1(CGrey, 8), 11437da2899SCharles.Forsyth CMAP8 = CHAN1(CMap, 8), 11537da2899SCharles.Forsyth RGB15 = CHAN4(CIgnore, 1, CRed, 5, CGreen, 5, CBlue, 5), 11637da2899SCharles.Forsyth RGB16 = CHAN3(CRed, 5, CGreen, 6, CBlue, 5), 11737da2899SCharles.Forsyth RGB24 = CHAN3(CRed, 8, CGreen, 8, CBlue, 8), 11837da2899SCharles.Forsyth RGBA32 = CHAN4(CRed, 8, CGreen, 8, CBlue, 8, CAlpha, 8), 11937da2899SCharles.Forsyth ARGB32 = CHAN4(CAlpha, 8, CRed, 8, CGreen, 8, CBlue, 8), /* stupid VGAs */ 12037da2899SCharles.Forsyth XRGB32 = CHAN4(CIgnore, 8, CRed, 8, CGreen, 8, CBlue, 8), 121*8911721eSCharles.Forsyth BGR24 = CHAN3(CBlue, 8, CGreen, 8, CRed, 8), 122*8911721eSCharles.Forsyth ABGR32 = CHAN4(CAlpha, 8, CBlue, 8, CGreen, 8, CRed, 8), 123*8911721eSCharles.Forsyth XBGR32 = CHAN4(CIgnore, 8, CBlue, 8, CGreen, 8, CRed, 8), 12437da2899SCharles.Forsyth }; 12537da2899SCharles.Forsyth 12637da2899SCharles.Forsyth /* compositing operators */ 12737da2899SCharles.Forsyth 12837da2899SCharles.Forsyth typedef enum 12937da2899SCharles.Forsyth { 13037da2899SCharles.Forsyth SinD = 1<<3, 13137da2899SCharles.Forsyth DinS = 1<<2, 13237da2899SCharles.Forsyth SoutD = 1<<1, 13337da2899SCharles.Forsyth DoutS = 1 <<0, 13437da2899SCharles.Forsyth 13537da2899SCharles.Forsyth S = SinD|SoutD, 13637da2899SCharles.Forsyth SoverD = SinD|SoutD|DoutS, 13737da2899SCharles.Forsyth SatopD = SinD|DoutS, 13837da2899SCharles.Forsyth SxorD = SoutD|DoutS, 13937da2899SCharles.Forsyth 14037da2899SCharles.Forsyth D = DinS|DoutS, 14137da2899SCharles.Forsyth DoverS = DinS|DoutS|SoutD, 14237da2899SCharles.Forsyth DatopS = DinS|SoutD, 14337da2899SCharles.Forsyth DxorS = DoutS|SoutD, 14437da2899SCharles.Forsyth 14537da2899SCharles.Forsyth Clear = 0, 14637da2899SCharles.Forsyth 14737da2899SCharles.Forsyth Ncomp = 12, 14837da2899SCharles.Forsyth } Drawop; 14937da2899SCharles.Forsyth 15037da2899SCharles.Forsyth extern char* chantostr(char*, ulong); 15137da2899SCharles.Forsyth extern ulong strtochan(char*); 15237da2899SCharles.Forsyth extern int chantodepth(ulong); 15337da2899SCharles.Forsyth 15437da2899SCharles.Forsyth struct Point 15537da2899SCharles.Forsyth { 15637da2899SCharles.Forsyth int x; 15737da2899SCharles.Forsyth int y; 15837da2899SCharles.Forsyth }; 15937da2899SCharles.Forsyth 16037da2899SCharles.Forsyth struct Rectangle 16137da2899SCharles.Forsyth { 16237da2899SCharles.Forsyth Point min; 16337da2899SCharles.Forsyth Point max; 16437da2899SCharles.Forsyth }; 16537da2899SCharles.Forsyth 16637da2899SCharles.Forsyth typedef void (*Reffn)(Image*, Rectangle, void*); 16737da2899SCharles.Forsyth 16837da2899SCharles.Forsyth struct Screen 16937da2899SCharles.Forsyth { 17037da2899SCharles.Forsyth Display *display; /* display holding data */ 17137da2899SCharles.Forsyth int id; /* id of system-held Screen */ 17237da2899SCharles.Forsyth Image *image; /* unused; for reference only */ 17337da2899SCharles.Forsyth Image *fill; /* color to paint behind windows */ 17437da2899SCharles.Forsyth }; 17537da2899SCharles.Forsyth 17637da2899SCharles.Forsyth struct Refreshq 17737da2899SCharles.Forsyth { 17837da2899SCharles.Forsyth Reffn reffn; 17937da2899SCharles.Forsyth void *refptr; 18037da2899SCharles.Forsyth Rectangle r; 18137da2899SCharles.Forsyth Refreshq *next; 18237da2899SCharles.Forsyth }; 18337da2899SCharles.Forsyth 18437da2899SCharles.Forsyth struct Display 18537da2899SCharles.Forsyth { 18637da2899SCharles.Forsyth void* qlock; 18737da2899SCharles.Forsyth int locking; /*program is using lockdisplay */ 18837da2899SCharles.Forsyth int dirno; 18937da2899SCharles.Forsyth void *datachan; 19037da2899SCharles.Forsyth void *refchan; 19137da2899SCharles.Forsyth void *ctlchan; 19237da2899SCharles.Forsyth int imageid; 19337da2899SCharles.Forsyth int local; 19437da2899SCharles.Forsyth int depth; 19537da2899SCharles.Forsyth ulong chan; 19637da2899SCharles.Forsyth void (*error)(Display*, char*); 19737da2899SCharles.Forsyth char *devdir; 19837da2899SCharles.Forsyth char *windir; 19937da2899SCharles.Forsyth char oldlabel[64]; 20037da2899SCharles.Forsyth ulong dataqid; 20137da2899SCharles.Forsyth Image *white; 20237da2899SCharles.Forsyth Image *black; 20337da2899SCharles.Forsyth Image *image; 20437da2899SCharles.Forsyth Image *opaque; 20537da2899SCharles.Forsyth Image *transparent; 20637da2899SCharles.Forsyth uchar buf[Displaybufsize+1]; /* +1 for flush message */ 20737da2899SCharles.Forsyth int bufsize; 20837da2899SCharles.Forsyth uchar *bufp; 20937da2899SCharles.Forsyth Font *defaultfont; 21037da2899SCharles.Forsyth Subfont *defaultsubfont; 21137da2899SCharles.Forsyth Image *windows; 21237da2899SCharles.Forsyth void *limbo; 21337da2899SCharles.Forsyth Refreshq *refhead; 21437da2899SCharles.Forsyth Refreshq *reftail; 21537da2899SCharles.Forsyth }; 21637da2899SCharles.Forsyth 21737da2899SCharles.Forsyth struct Image 21837da2899SCharles.Forsyth { 21937da2899SCharles.Forsyth Display *display; /* display holding data */ 22037da2899SCharles.Forsyth int id; /* id of system-held Image */ 22137da2899SCharles.Forsyth Rectangle r; /* rectangle in data area, local coords */ 22237da2899SCharles.Forsyth Rectangle clipr; /* clipping region */ 22337da2899SCharles.Forsyth int depth; /* number of bits per pixel */ 22437da2899SCharles.Forsyth ulong chan; 22537da2899SCharles.Forsyth int repl; /* flag: data replicates to tile clipr */ 22637da2899SCharles.Forsyth Screen *screen; /* 0 if not a window */ 22737da2899SCharles.Forsyth Image *next; /* next in list of windows */ 22837da2899SCharles.Forsyth Reffn reffn; 22937da2899SCharles.Forsyth void *refptr; 23037da2899SCharles.Forsyth }; 23137da2899SCharles.Forsyth 23237da2899SCharles.Forsyth struct RGB 23337da2899SCharles.Forsyth { 23437da2899SCharles.Forsyth ulong red; 23537da2899SCharles.Forsyth ulong green; 23637da2899SCharles.Forsyth ulong blue; 23737da2899SCharles.Forsyth }; 23837da2899SCharles.Forsyth 23937da2899SCharles.Forsyth /* 24037da2899SCharles.Forsyth * Subfonts 24137da2899SCharles.Forsyth * 24237da2899SCharles.Forsyth * given char c, Subfont *f, Fontchar *i, and Point p, one says 24337da2899SCharles.Forsyth * i = f->info+c; 24437da2899SCharles.Forsyth * draw(b, Rect(p.x+i->left, p.y+i->top, 24537da2899SCharles.Forsyth * p.x+i->left+((i+1)->x-i->x), p.y+i->bottom), 24637da2899SCharles.Forsyth * color, f->bits, Pt(i->x, i->top)); 24737da2899SCharles.Forsyth * p.x += i->width; 24837da2899SCharles.Forsyth * to draw characters in the specified color (itself an Image) in Image b. 24937da2899SCharles.Forsyth */ 25037da2899SCharles.Forsyth 25137da2899SCharles.Forsyth struct Fontchar 25237da2899SCharles.Forsyth { 25337da2899SCharles.Forsyth int x; /* left edge of bits */ 25437da2899SCharles.Forsyth uchar top; /* first non-zero scan-line */ 25537da2899SCharles.Forsyth uchar bottom; /* last non-zero scan-line + 1 */ 25637da2899SCharles.Forsyth char left; /* offset of baseline */ 25737da2899SCharles.Forsyth uchar width; /* width of baseline */ 25837da2899SCharles.Forsyth }; 25937da2899SCharles.Forsyth 26037da2899SCharles.Forsyth struct Subfont 26137da2899SCharles.Forsyth { 26237da2899SCharles.Forsyth char *name; 26337da2899SCharles.Forsyth short n; /* number of chars in font */ 26437da2899SCharles.Forsyth uchar height; /* height of image */ 26537da2899SCharles.Forsyth char ascent; /* top of image to baseline */ 26637da2899SCharles.Forsyth Fontchar *info; /* n+1 character descriptors */ 26737da2899SCharles.Forsyth Image *bits; /* of font */ 26837da2899SCharles.Forsyth int ref; 26937da2899SCharles.Forsyth }; 27037da2899SCharles.Forsyth 27137da2899SCharles.Forsyth enum 27237da2899SCharles.Forsyth { 27337da2899SCharles.Forsyth /* starting values */ 27437da2899SCharles.Forsyth LOG2NFCACHE = 6, 27537da2899SCharles.Forsyth NFCACHE = (1<<LOG2NFCACHE), /* #chars cached */ 27637da2899SCharles.Forsyth NFLOOK = 5, /* #chars to scan in cache */ 27737da2899SCharles.Forsyth NFSUBF = 2, /* #subfonts to cache */ 27837da2899SCharles.Forsyth /* max value */ 27937da2899SCharles.Forsyth MAXFCACHE = 1024+NFLOOK, /* upper limit */ 28037da2899SCharles.Forsyth MAXSUBF = 50, /* generous upper limit */ 28137da2899SCharles.Forsyth /* deltas */ 28237da2899SCharles.Forsyth DSUBF = 4, 28337da2899SCharles.Forsyth /* expiry ages */ 28437da2899SCharles.Forsyth SUBFAGE = 10000, 28537da2899SCharles.Forsyth CACHEAGE = 10000 28637da2899SCharles.Forsyth }; 28737da2899SCharles.Forsyth 28837da2899SCharles.Forsyth struct Cachefont 28937da2899SCharles.Forsyth { 29037da2899SCharles.Forsyth Rune min; /* lowest rune value to be taken from subfont */ 29137da2899SCharles.Forsyth Rune max; /* highest rune value+1 to be taken from subfont */ 29237da2899SCharles.Forsyth int offset; /* position in subfont of character at min */ 29337da2899SCharles.Forsyth char *name; /* stored in font */ 29437da2899SCharles.Forsyth char *subfontname; /* to access subfont */ 29537da2899SCharles.Forsyth }; 29637da2899SCharles.Forsyth 29737da2899SCharles.Forsyth struct Cacheinfo 29837da2899SCharles.Forsyth { 29937da2899SCharles.Forsyth ushort x; /* left edge of bits */ 30037da2899SCharles.Forsyth uchar width; /* width of baseline */ 30137da2899SCharles.Forsyth schar left; /* offset of baseline */ 30237da2899SCharles.Forsyth Rune value; /* value of character at this slot in cache */ 30337da2899SCharles.Forsyth ushort age; 30437da2899SCharles.Forsyth }; 30537da2899SCharles.Forsyth 30637da2899SCharles.Forsyth struct Cachesubf 30737da2899SCharles.Forsyth { 30837da2899SCharles.Forsyth ulong age; /* for replacement */ 30937da2899SCharles.Forsyth Cachefont *cf; /* font info that owns us */ 31037da2899SCharles.Forsyth Subfont *f; /* attached subfont */ 31137da2899SCharles.Forsyth }; 31237da2899SCharles.Forsyth 31337da2899SCharles.Forsyth struct Font 31437da2899SCharles.Forsyth { 31537da2899SCharles.Forsyth char *name; 31637da2899SCharles.Forsyth Display *display; 31737da2899SCharles.Forsyth short height; /* max height of image, interline spacing */ 31837da2899SCharles.Forsyth short ascent; /* top of image to baseline */ 31937da2899SCharles.Forsyth short width; /* widest so far; used in caching only */ 32037da2899SCharles.Forsyth short nsub; /* number of subfonts */ 32137da2899SCharles.Forsyth ulong age; /* increasing counter; used for LRU */ 32237da2899SCharles.Forsyth int maxdepth; /* maximum depth of all loaded subfonts */ 32337da2899SCharles.Forsyth int ncache; /* size of cache */ 32437da2899SCharles.Forsyth int nsubf; /* size of subfont list */ 32537da2899SCharles.Forsyth Cacheinfo *cache; 32637da2899SCharles.Forsyth Cachesubf *subf; 32737da2899SCharles.Forsyth Cachefont **sub; /* as read from file */ 32837da2899SCharles.Forsyth Image *cacheimage; 32937da2899SCharles.Forsyth }; 33037da2899SCharles.Forsyth 33137da2899SCharles.Forsyth #define Dx(r) ((r).max.x-(r).min.x) 33237da2899SCharles.Forsyth #define Dy(r) ((r).max.y-(r).min.y) 33337da2899SCharles.Forsyth 33437da2899SCharles.Forsyth /* 33537da2899SCharles.Forsyth * Image management 33637da2899SCharles.Forsyth */ 33737da2899SCharles.Forsyth extern Image* _allocimage(Image*, Display*, Rectangle, ulong, int, ulong, int, int); 33837da2899SCharles.Forsyth extern Image* allocimage(Display*, Rectangle, ulong, int, ulong); 33937da2899SCharles.Forsyth extern uchar* bufimage(Display*, int); 34037da2899SCharles.Forsyth extern int bytesperline(Rectangle, int); 34137da2899SCharles.Forsyth extern void closedisplay(Display*); 34237da2899SCharles.Forsyth extern void drawerror(Display*, char*); 34337da2899SCharles.Forsyth extern int _drawprint(int, char*, ...); 34437da2899SCharles.Forsyth extern int flushimage(Display*, int); 34537da2899SCharles.Forsyth extern int freeimage(Image*); 34637da2899SCharles.Forsyth extern int _freeimage1(Image*); 34737da2899SCharles.Forsyth extern int geninitdraw(char*, void(*)(Display*, char*), char*, char*, char*, int); 34837da2899SCharles.Forsyth extern int initdraw(void(*)(Display*, char*), char*, char*); 34937da2899SCharles.Forsyth extern Display* initdisplay(char*, char*, void(*)(Display*, char*)); 35037da2899SCharles.Forsyth extern int loadimage(Image*, Rectangle, uchar*, int); 35137da2899SCharles.Forsyth extern int cloadimage(Image*, Rectangle, uchar*, int); 35237da2899SCharles.Forsyth extern int getwindow(Display*, int); 35337da2899SCharles.Forsyth extern int gengetwindow(Display*, char*, Image**, Screen**, int); 35437da2899SCharles.Forsyth extern Image* readimage(Display*, int, int); 35537da2899SCharles.Forsyth extern Image* creadimage(Display*, int, int); 35637da2899SCharles.Forsyth extern int unloadimage(Image*, Rectangle, uchar*, int); 35737da2899SCharles.Forsyth extern int wordsperline(Rectangle, int); 35837da2899SCharles.Forsyth extern int writeimage(int, Image*, int); 35937da2899SCharles.Forsyth extern Image* namedimage(Display*, char*); 36037da2899SCharles.Forsyth extern int nameimage(Image*, char*, int); 36137da2899SCharles.Forsyth extern Image* allocimagemix(Display*, ulong, ulong); 36237da2899SCharles.Forsyth 36337da2899SCharles.Forsyth /* 36437da2899SCharles.Forsyth * Colors 36537da2899SCharles.Forsyth */ 36637da2899SCharles.Forsyth extern void readcolmap(Display*, RGB*); 36737da2899SCharles.Forsyth extern void writecolmap(Display*, RGB*); 36837da2899SCharles.Forsyth extern ulong setalpha(ulong, uchar); 36937da2899SCharles.Forsyth 37037da2899SCharles.Forsyth /* 37137da2899SCharles.Forsyth * Windows 37237da2899SCharles.Forsyth */ 37337da2899SCharles.Forsyth extern Screen* allocscreen(Image*, Image*, int); 37437da2899SCharles.Forsyth extern Image* _allocwindow(Image*, Screen*, Rectangle, int, ulong); 37537da2899SCharles.Forsyth extern Image* allocwindow(Screen*, Rectangle, int, ulong); 37637da2899SCharles.Forsyth extern void bottomnwindows(Image**, int); 37737da2899SCharles.Forsyth extern void bottomwindow(Image*); 37837da2899SCharles.Forsyth extern int freescreen(Screen*); 37937da2899SCharles.Forsyth extern Screen* publicscreen(Display*, int, ulong); 38037da2899SCharles.Forsyth extern void topnwindows(Image**, int); 38137da2899SCharles.Forsyth extern void topwindow(Image*); 38237da2899SCharles.Forsyth extern int originwindow(Image*, Point, Point); 38337da2899SCharles.Forsyth 38437da2899SCharles.Forsyth /* 38537da2899SCharles.Forsyth * Geometry 38637da2899SCharles.Forsyth */ 38737da2899SCharles.Forsyth extern Point Pt(int, int); 38837da2899SCharles.Forsyth extern Rectangle Rect(int, int, int, int); 38937da2899SCharles.Forsyth extern Rectangle Rpt(Point, Point); 39037da2899SCharles.Forsyth extern Point addpt(Point, Point); 39137da2899SCharles.Forsyth extern Point subpt(Point, Point); 39237da2899SCharles.Forsyth extern Point divpt(Point, int); 39337da2899SCharles.Forsyth extern Point mulpt(Point, int); 39437da2899SCharles.Forsyth extern int eqpt(Point, Point); 39537da2899SCharles.Forsyth extern int eqrect(Rectangle, Rectangle); 39637da2899SCharles.Forsyth extern Rectangle insetrect(Rectangle, int); 39737da2899SCharles.Forsyth extern Rectangle rectaddpt(Rectangle, Point); 39837da2899SCharles.Forsyth extern Rectangle rectsubpt(Rectangle, Point); 39937da2899SCharles.Forsyth extern Rectangle canonrect(Rectangle); 40037da2899SCharles.Forsyth extern int rectXrect(Rectangle, Rectangle); 40137da2899SCharles.Forsyth extern int rectinrect(Rectangle, Rectangle); 40237da2899SCharles.Forsyth extern void combinerect(Rectangle*, Rectangle); 40337da2899SCharles.Forsyth extern int rectclip(Rectangle*, Rectangle); 40437da2899SCharles.Forsyth extern int ptinrect(Point, Rectangle); 40537da2899SCharles.Forsyth extern void replclipr(Image*, int, Rectangle); 40637da2899SCharles.Forsyth extern int drawreplxy(int, int, int); /* used to be drawsetxy */ 40737da2899SCharles.Forsyth extern Point drawrepl(Rectangle, Point); 40837da2899SCharles.Forsyth extern int rgb2cmap(int, int, int); 40937da2899SCharles.Forsyth extern int cmap2rgb(int); 41037da2899SCharles.Forsyth extern int cmap2rgba(int); 41137da2899SCharles.Forsyth extern void icossin(int, int*, int*); 41237da2899SCharles.Forsyth extern void icossin2(int, int, int*, int*); 41337da2899SCharles.Forsyth 41437da2899SCharles.Forsyth /* 41537da2899SCharles.Forsyth * Graphics 41637da2899SCharles.Forsyth */ 41737da2899SCharles.Forsyth extern void draw(Image*, Rectangle, Image*, Image*, Point); 41837da2899SCharles.Forsyth extern void drawop(Image*, Rectangle, Image*, Image*, Point, Drawop); 41937da2899SCharles.Forsyth extern void gendraw(Image*, Rectangle, Image*, Point, Image*, Point); 42037da2899SCharles.Forsyth extern void gendrawop(Image*, Rectangle, Image*, Point, Image*, Point, Drawop); 42137da2899SCharles.Forsyth extern void line(Image*, Point, Point, int, int, int, Image*, Point); 42237da2899SCharles.Forsyth extern void lineop(Image*, Point, Point, int, int, int, Image*, Point, Drawop); 42337da2899SCharles.Forsyth extern void poly(Image*, Point*, int, int, int, int, Image*, Point); 42437da2899SCharles.Forsyth extern void polyop(Image*, Point*, int, int, int, int, Image*, Point, Drawop); 42537da2899SCharles.Forsyth extern void fillpoly(Image*, Point*, int, int, Image*, Point); 42637da2899SCharles.Forsyth extern void fillpolyop(Image*, Point*, int, int, Image*, Point, Drawop); 42737da2899SCharles.Forsyth extern Point string(Image*, Point, Image*, Point, Font*, char*); 42837da2899SCharles.Forsyth extern Point stringop(Image*, Point, Image*, Point, Font*, char*, Drawop); 42937da2899SCharles.Forsyth extern Point stringn(Image*, Point, Image*, Point, Font*, char*, int); 43037da2899SCharles.Forsyth extern Point stringnop(Image*, Point, Image*, Point, Font*, char*, int, Drawop); 43137da2899SCharles.Forsyth extern Point runestring(Image*, Point, Image*, Point, Font*, Rune*); 43237da2899SCharles.Forsyth extern Point runestringop(Image*, Point, Image*, Point, Font*, Rune*, Drawop); 43337da2899SCharles.Forsyth extern Point runestringn(Image*, Point, Image*, Point, Font*, Rune*, int); 43437da2899SCharles.Forsyth extern Point runestringnop(Image*, Point, Image*, Point, Font*, Rune*, int, Drawop); 43537da2899SCharles.Forsyth extern Point stringbg(Image*, Point, Image*, Point, Font*, char*, Image*, Point); 43637da2899SCharles.Forsyth extern Point stringbgop(Image*, Point, Image*, Point, Font*, char*, Image*, Point, Drawop); 43737da2899SCharles.Forsyth extern Point stringnbg(Image*, Point, Image*, Point, Font*, char*, int, Image*, Point); 43837da2899SCharles.Forsyth extern Point stringnbgop(Image*, Point, Image*, Point, Font*, char*, int, Image*, Point, Drawop); 43937da2899SCharles.Forsyth extern Point runestringbg(Image*, Point, Image*, Point, Font*, Rune*, Image*, Point); 44037da2899SCharles.Forsyth extern Point runestringbgop(Image*, Point, Image*, Point, Font*, Rune*, Image*, Point, Drawop); 44137da2899SCharles.Forsyth extern Point runestringnbg(Image*, Point, Image*, Point, Font*, Rune*, int, Image*, Point); 44237da2899SCharles.Forsyth extern Point runestringnbgop(Image*, Point, Image*, Point, Font*, Rune*, int, Image*, Point, Drawop); 44337da2899SCharles.Forsyth extern Point _string(Image*, Point, Image*, Point, Font*, char*, Rune*, int, Rectangle, Image*, Point, Drawop); 44437da2899SCharles.Forsyth extern Point stringsubfont(Image*, Point, Image*, Subfont*, char*); 44537da2899SCharles.Forsyth extern int bezier(Image*, Point, Point, Point, Point, int, int, int, Image*, Point); 44637da2899SCharles.Forsyth extern int bezierop(Image*, Point, Point, Point, Point, int, int, int, Image*, Point, Drawop); 44737da2899SCharles.Forsyth extern int bezspline(Image*, Point*, int, int, int, int, Image*, Point); 44837da2899SCharles.Forsyth extern int bezsplineop(Image*, Point*, int, int, int, int, Image*, Point, Drawop); 44937da2899SCharles.Forsyth extern int getbezsplinepts(Point*, int, Point**); 45037da2899SCharles.Forsyth extern int fillbezier(Image*, Point, Point, Point, Point, int, Image*, Point); 45137da2899SCharles.Forsyth extern int fillbezierop(Image*, Point, Point, Point, Point, int, Image*, Point, Drawop); 45237da2899SCharles.Forsyth extern int fillbezspline(Image*, Point*, int, int, Image*, Point); 45337da2899SCharles.Forsyth extern int fillbezsplineop(Image*, Point*, int, int, Image*, Point, Drawop); 45437da2899SCharles.Forsyth extern void ellipse(Image*, Point, int, int, int, Image*, Point); 45537da2899SCharles.Forsyth extern void ellipseop(Image*, Point, int, int, int, Image*, Point, Drawop); 45637da2899SCharles.Forsyth extern void fillellipse(Image*, Point, int, int, Image*, Point); 45737da2899SCharles.Forsyth extern void fillellipseop(Image*, Point, int, int, Image*, Point, Drawop); 45837da2899SCharles.Forsyth extern void arc(Image*, Point, int, int, int, Image*, Point, int, int); 45937da2899SCharles.Forsyth extern void arcop(Image*, Point, int, int, int, Image*, Point, int, int, Drawop); 46037da2899SCharles.Forsyth extern void fillarc(Image*, Point, int, int, Image*, Point, int, int); 46137da2899SCharles.Forsyth extern void fillarcop(Image*, Point, int, int, Image*, Point, int, int, Drawop); 46237da2899SCharles.Forsyth extern void border(Image*, Rectangle, int, Image*, Point); 46337da2899SCharles.Forsyth extern void borderop(Image*, Rectangle, int, Image*, Point, Drawop); 46437da2899SCharles.Forsyth 46537da2899SCharles.Forsyth /* 46637da2899SCharles.Forsyth * Font management 46737da2899SCharles.Forsyth */ 46837da2899SCharles.Forsyth extern Font* openfont(Display*, char*); 46937da2899SCharles.Forsyth extern Font* buildfont(Display*, char*, char*); 47037da2899SCharles.Forsyth extern void freefont(Font*); 47137da2899SCharles.Forsyth extern Font* mkfont(Subfont*, Rune); 47237da2899SCharles.Forsyth extern int cachechars(Font*, char**, Rune**, ushort*, int, int*, char**); 47337da2899SCharles.Forsyth extern void agefont(Font*); 47437da2899SCharles.Forsyth extern Subfont* allocsubfont(char*, int, int, int, Fontchar*, Image*); 47537da2899SCharles.Forsyth extern Subfont* lookupsubfont(Display*, char*); 47637da2899SCharles.Forsyth extern void installsubfont(char*, Subfont*); 47737da2899SCharles.Forsyth extern void uninstallsubfont(Subfont*); 47837da2899SCharles.Forsyth extern void freesubfont(Subfont*); 47937da2899SCharles.Forsyth extern Subfont* readsubfont(Display*, char*, int, int); 48037da2899SCharles.Forsyth extern Subfont* readsubfonti(Display*, char*, int, Image*, int); 48137da2899SCharles.Forsyth extern int writesubfont(int, Subfont*); 48237da2899SCharles.Forsyth extern void _unpackinfo(Fontchar*, uchar*, int); 48337da2899SCharles.Forsyth extern Point stringsize(Font*, char*); 48437da2899SCharles.Forsyth extern int stringwidth(Font*, char*); 48537da2899SCharles.Forsyth extern int stringnwidth(Font*, char*, int); 48637da2899SCharles.Forsyth extern Point runestringsize(Font*, Rune*); 48737da2899SCharles.Forsyth extern int runestringwidth(Font*, Rune*); 48837da2899SCharles.Forsyth extern int runestringnwidth(Font*, Rune*, int); 48937da2899SCharles.Forsyth extern Point strsubfontwidth(Subfont*, char*); 49037da2899SCharles.Forsyth extern int loadchar(Font*, Rune, Cacheinfo*, int, int, char**); 49137da2899SCharles.Forsyth extern char* subfontname(char*, char*, int); 49237da2899SCharles.Forsyth extern Subfont* _getsubfont(Display*, char*); 49337da2899SCharles.Forsyth extern Subfont* getdefont(Display*); 49437da2899SCharles.Forsyth extern int lockdisplay(Display*); 49537da2899SCharles.Forsyth extern void unlockdisplay(Display*); 49637da2899SCharles.Forsyth extern int drawlsetrefresh(ulong, int, void*, void*); 49737da2899SCharles.Forsyth 49837da2899SCharles.Forsyth /* Compositing operator utility */ 49937da2899SCharles.Forsyth extern void _setdrawop(Display*, Drawop); 50037da2899SCharles.Forsyth 50137da2899SCharles.Forsyth /* 50237da2899SCharles.Forsyth * Predefined 50337da2899SCharles.Forsyth */ 50437da2899SCharles.Forsyth extern uchar defontdata[]; 50537da2899SCharles.Forsyth extern int sizeofdefont; 50637da2899SCharles.Forsyth extern Point ZP; 50737da2899SCharles.Forsyth extern Rectangle ZR; 50837da2899SCharles.Forsyth 50937da2899SCharles.Forsyth /* 51037da2899SCharles.Forsyth * Set up by initdraw() 51137da2899SCharles.Forsyth */ 51237da2899SCharles.Forsyth extern int _cursorfd; 51337da2899SCharles.Forsyth extern int _drawdebug; /* set to 1 to see errors from flushimage */ 51437da2899SCharles.Forsyth 51537da2899SCharles.Forsyth #define BGSHORT(p) (((p)[0]<<0) | ((p)[1]<<8)) 51637da2899SCharles.Forsyth #define BGLONG(p) ((BGSHORT(p)<<0) | (BGSHORT(p+2)<<16)) 51737da2899SCharles.Forsyth #define BPSHORT(p, v) ((p)[0]=(v), (p)[1]=((v)>>8)) 51837da2899SCharles.Forsyth #define BPLONG(p, v) (BPSHORT(p, (v)), BPSHORT(p+2, (v)>>16)) 51937da2899SCharles.Forsyth 52037da2899SCharles.Forsyth /* 52137da2899SCharles.Forsyth * Compressed image file parameters 52237da2899SCharles.Forsyth */ 52337da2899SCharles.Forsyth #define NMATCH 3 /* shortest match possible */ 52437da2899SCharles.Forsyth #define NRUN (NMATCH+31) /* longest match possible */ 52537da2899SCharles.Forsyth #define NMEM 1024 /* window size */ 52637da2899SCharles.Forsyth #define NDUMP 128 /* maximum length of dump */ 52737da2899SCharles.Forsyth #define NCBLOCK 6000 /* size of compressed blocks */ 52837da2899SCharles.Forsyth extern void _twiddlecompressed(uchar*, int); 52937da2899SCharles.Forsyth extern int _compblocksize(Rectangle, int); 53037da2899SCharles.Forsyth 53137da2899SCharles.Forsyth /* XXX backwards helps; should go */ 53237da2899SCharles.Forsyth extern ulong drawld2chan[]; 53337da2899SCharles.Forsyth extern void drawsetdebug(int); 53437da2899SCharles.Forsyth 53537da2899SCharles.Forsyth /* 53637da2899SCharles.Forsyth * Inferno interface 53737da2899SCharles.Forsyth */ 53837da2899SCharles.Forsyth extern Font* font_open(Display*, char*); 53937da2899SCharles.Forsyth extern void font_close(Font*); 54037da2899SCharles.Forsyth 54137da2899SCharles.Forsyth /* 54237da2899SCharles.Forsyth * Macros to convert between C and Limbo types 54337da2899SCharles.Forsyth */ 54437da2899SCharles.Forsyth #define IRECT(r) (*(Rectangle*)&(r)) 54537da2899SCharles.Forsyth #define DRECT(r) (*(Draw_Rect*)&(r)) 54637da2899SCharles.Forsyth #define IPOINT(p) (*(Point*)&(p)) 54737da2899SCharles.Forsyth #define DPOINT(p) (*(Draw_Point*)&(p)) 54837da2899SCharles.Forsyth 54937da2899SCharles.Forsyth #define P2P(p1, p2) (p1).x = (p2).x, (p1).y = (p2).y 55037da2899SCharles.Forsyth #define R2R(r1, r2) (r1).min.x = (r2).min.x, (r1).min.y = (r2).min.y,\ 55137da2899SCharles.Forsyth (r1).max.x = (r2).max.x, (r1).max.y = (r2).max.y 55237da2899SCharles.Forsyth extern Image* display_open(Display*, char*); 553