1*363b328dSDavid du Colombier #ifndef _PLAN9_SOURCE 2*363b328dSDavid du Colombier This header file is an extension to ANSI/POSIX 340ef9009SDavid du Colombier #endif 440ef9009SDavid du Colombier 5*363b328dSDavid du Colombier #ifndef __DRAW_H_ 6*363b328dSDavid du Colombier #define __DRAW_H_ 740ef9009SDavid du Colombier #pragma src "/sys/src/ape/lib/draw" 840ef9009SDavid du Colombier #pragma lib "/$M/lib/ape/libdraw.a" 940ef9009SDavid du Colombier 10*363b328dSDavid du Colombier #include <u.h> 11*363b328dSDavid du Colombier #include <fmt.h> 12*363b328dSDavid du Colombier #include <qlock.h> 13*363b328dSDavid du Colombier 1440ef9009SDavid du Colombier typedef struct Cachefont Cachefont; 1540ef9009SDavid du Colombier typedef struct Cacheinfo Cacheinfo; 1640ef9009SDavid du Colombier typedef struct Cachesubf Cachesubf; 1740ef9009SDavid du Colombier typedef struct Display Display; 1840ef9009SDavid du Colombier typedef struct Font Font; 1940ef9009SDavid du Colombier typedef struct Fontchar Fontchar; 2040ef9009SDavid du Colombier typedef struct Image Image; 2140ef9009SDavid du Colombier typedef struct Mouse Mouse; 2240ef9009SDavid du Colombier typedef struct Point Point; 2340ef9009SDavid du Colombier typedef struct Rectangle Rectangle; 2440ef9009SDavid du Colombier typedef struct RGB RGB; 2540ef9009SDavid du Colombier typedef struct Screen Screen; 2640ef9009SDavid du Colombier typedef struct Subfont Subfont; 2740ef9009SDavid du Colombier 2840ef9009SDavid du Colombier #pragma varargck type "R" Rectangle 2940ef9009SDavid du Colombier #pragma varargck type "P" Point 3040ef9009SDavid du Colombier extern int Rfmt(Fmt*); 3140ef9009SDavid du Colombier extern int Pfmt(Fmt*); 3240ef9009SDavid du Colombier 3340ef9009SDavid du Colombier enum 3440ef9009SDavid du Colombier { 3540ef9009SDavid du Colombier DOpaque = 0xFFFFFFFF, 3640ef9009SDavid du Colombier DTransparent = 0x00000000, /* only useful for allocimage, memfillcolor */ 3740ef9009SDavid du Colombier DBlack = 0x000000FF, 3840ef9009SDavid du Colombier DWhite = 0xFFFFFFFF, 3940ef9009SDavid du Colombier DRed = 0xFF0000FF, 4040ef9009SDavid du Colombier DGreen = 0x00FF00FF, 4140ef9009SDavid du Colombier DBlue = 0x0000FFFF, 4240ef9009SDavid du Colombier DCyan = 0x00FFFFFF, 4340ef9009SDavid du Colombier DMagenta = 0xFF00FFFF, 4440ef9009SDavid du Colombier DYellow = 0xFFFF00FF, 4540ef9009SDavid du Colombier DPaleyellow = 0xFFFFAAFF, 4640ef9009SDavid du Colombier DDarkyellow = 0xEEEE9EFF, 4740ef9009SDavid du Colombier DDarkgreen = 0x448844FF, 4840ef9009SDavid du Colombier DPalegreen = 0xAAFFAAFF, 4940ef9009SDavid du Colombier DMedgreen = 0x88CC88FF, 5040ef9009SDavid du Colombier DDarkblue = 0x000055FF, 5140ef9009SDavid du Colombier DPalebluegreen= 0xAAFFFFFF, 5240ef9009SDavid du Colombier DPaleblue = 0x0000BBFF, 5340ef9009SDavid du Colombier DBluegreen = 0x008888FF, 5440ef9009SDavid du Colombier DGreygreen = 0x55AAAAFF, 5540ef9009SDavid du Colombier DPalegreygreen = 0x9EEEEEFF, 5640ef9009SDavid du Colombier DYellowgreen = 0x99994CFF, 5740ef9009SDavid du Colombier DMedblue = 0x000099FF, 5840ef9009SDavid du Colombier DGreyblue = 0x005DBBFF, 5940ef9009SDavid du Colombier DPalegreyblue = 0x4993DDFF, 6040ef9009SDavid du Colombier DPurpleblue = 0x8888CCFF, 6140ef9009SDavid du Colombier 6240ef9009SDavid du Colombier DNotacolor = 0xFFFFFF00, 6340ef9009SDavid du Colombier DNofill = DNotacolor, 6440ef9009SDavid du Colombier 6540ef9009SDavid du Colombier }; 6640ef9009SDavid du Colombier 6740ef9009SDavid du Colombier enum 6840ef9009SDavid du Colombier { 6940ef9009SDavid du Colombier Displaybufsize = 8000, 7040ef9009SDavid du Colombier ICOSSCALE = 1024, 7140ef9009SDavid du Colombier Borderwidth = 4, 7240ef9009SDavid du Colombier }; 7340ef9009SDavid du Colombier 7440ef9009SDavid du Colombier enum 7540ef9009SDavid du Colombier { 7640ef9009SDavid du Colombier /* refresh methods */ 7740ef9009SDavid du Colombier Refbackup = 0, 7840ef9009SDavid du Colombier Refnone = 1, 7940ef9009SDavid du Colombier Refmesg = 2 8040ef9009SDavid du Colombier }; 8140ef9009SDavid du Colombier #define NOREFRESH ((void*)-1) 8240ef9009SDavid du Colombier 8340ef9009SDavid du Colombier enum 8440ef9009SDavid du Colombier { 8540ef9009SDavid du Colombier /* line ends */ 8640ef9009SDavid du Colombier Endsquare = 0, 8740ef9009SDavid du Colombier Enddisc = 1, 8840ef9009SDavid du Colombier Endarrow = 2, 8940ef9009SDavid du Colombier Endmask = 0x1F 9040ef9009SDavid du Colombier }; 9140ef9009SDavid du Colombier 9240ef9009SDavid du Colombier #define ARROW(a, b, c) (Endarrow|((a)<<5)|((b)<<14)|((c)<<23)) 9340ef9009SDavid du Colombier 9440ef9009SDavid du Colombier typedef enum 9540ef9009SDavid du Colombier { 9640ef9009SDavid du Colombier /* Porter-Duff compositing operators */ 9740ef9009SDavid du Colombier Clear = 0, 9840ef9009SDavid du Colombier 9940ef9009SDavid du Colombier SinD = 8, 10040ef9009SDavid du Colombier DinS = 4, 10140ef9009SDavid du Colombier SoutD = 2, 10240ef9009SDavid du Colombier DoutS = 1, 10340ef9009SDavid du Colombier 10440ef9009SDavid du Colombier S = SinD|SoutD, 10540ef9009SDavid du Colombier SoverD = SinD|SoutD|DoutS, 10640ef9009SDavid du Colombier SatopD = SinD|DoutS, 10740ef9009SDavid du Colombier SxorD = SoutD|DoutS, 10840ef9009SDavid du Colombier 10940ef9009SDavid du Colombier D = DinS|DoutS, 11040ef9009SDavid du Colombier DoverS = DinS|DoutS|SoutD, 11140ef9009SDavid du Colombier DatopS = DinS|SoutD, 11240ef9009SDavid du Colombier DxorS = DoutS|SoutD, /* == SxorD */ 11340ef9009SDavid du Colombier 11440ef9009SDavid du Colombier Ncomp = 12, 11540ef9009SDavid du Colombier } Drawop; 11640ef9009SDavid du Colombier 11740ef9009SDavid du Colombier /* 11840ef9009SDavid du Colombier * image channel descriptors 11940ef9009SDavid du Colombier */ 12040ef9009SDavid du Colombier enum { 12140ef9009SDavid du Colombier CRed = 0, 12240ef9009SDavid du Colombier CGreen, 12340ef9009SDavid du Colombier CBlue, 12440ef9009SDavid du Colombier CGrey, 12540ef9009SDavid du Colombier CAlpha, 12640ef9009SDavid du Colombier CMap, 12740ef9009SDavid du Colombier CIgnore, 12840ef9009SDavid du Colombier NChan, 12940ef9009SDavid du Colombier }; 13040ef9009SDavid du Colombier 13140ef9009SDavid du Colombier #define __DC(type, nbits) ((((type)&15)<<4)|((nbits)&15)) 13240ef9009SDavid du Colombier #define CHAN1(a,b) __DC(a,b) 13340ef9009SDavid du Colombier #define CHAN2(a,b,c,d) (CHAN1((a),(b))<<8|__DC((c),(d))) 13440ef9009SDavid du Colombier #define CHAN3(a,b,c,d,e,f) (CHAN2((a),(b),(c),(d))<<8|__DC((e),(f))) 13540ef9009SDavid du Colombier #define CHAN4(a,b,c,d,e,f,g,h) (CHAN3((a),(b),(c),(d),(e),(f))<<8|__DC((g),(h))) 13640ef9009SDavid du Colombier 13740ef9009SDavid du Colombier #define NBITS(c) ((c)&15) 13840ef9009SDavid du Colombier #define TYPE(c) (((c)>>4)&15) 13940ef9009SDavid du Colombier 14040ef9009SDavid du Colombier enum { 14140ef9009SDavid du Colombier GREY1 = CHAN1(CGrey, 1), 14240ef9009SDavid du Colombier GREY2 = CHAN1(CGrey, 2), 14340ef9009SDavid du Colombier GREY4 = CHAN1(CGrey, 4), 14440ef9009SDavid du Colombier GREY8 = CHAN1(CGrey, 8), 14540ef9009SDavid du Colombier CMAP8 = CHAN1(CMap, 8), 14640ef9009SDavid du Colombier RGB15 = CHAN4(CIgnore, 1, CRed, 5, CGreen, 5, CBlue, 5), 14740ef9009SDavid du Colombier RGB16 = CHAN3(CRed, 5, CGreen, 6, CBlue, 5), 14840ef9009SDavid du Colombier RGB24 = CHAN3(CRed, 8, CGreen, 8, CBlue, 8), 14940ef9009SDavid du Colombier RGBA32 = CHAN4(CRed, 8, CGreen, 8, CBlue, 8, CAlpha, 8), 15040ef9009SDavid du Colombier ARGB32 = CHAN4(CAlpha, 8, CRed, 8, CGreen, 8, CBlue, 8), /* stupid VGAs */ 15140ef9009SDavid du Colombier XRGB32 = CHAN4(CIgnore, 8, CRed, 8, CGreen, 8, CBlue, 8), 152*363b328dSDavid du Colombier BGR24 = CHAN3(CBlue, 8, CGreen, 8, CRed, 8), 153*363b328dSDavid du Colombier ABGR32 = CHAN4(CAlpha, 8, CBlue, 8, CGreen, 8, CRed, 8), 154*363b328dSDavid du Colombier XBGR32 = CHAN4(CIgnore, 8, CBlue, 8, CGreen, 8, CRed, 8), 15540ef9009SDavid du Colombier }; 15640ef9009SDavid du Colombier 15740ef9009SDavid du Colombier extern char* chantostr(char*, ulong); 15840ef9009SDavid du Colombier extern ulong strtochan(char*); 15940ef9009SDavid du Colombier extern int chantodepth(ulong); 16040ef9009SDavid du Colombier 16140ef9009SDavid du Colombier struct Point 16240ef9009SDavid du Colombier { 16340ef9009SDavid du Colombier int x; 16440ef9009SDavid du Colombier int y; 16540ef9009SDavid du Colombier }; 16640ef9009SDavid du Colombier 16740ef9009SDavid du Colombier struct Rectangle 16840ef9009SDavid du Colombier { 16940ef9009SDavid du Colombier Point min; 17040ef9009SDavid du Colombier Point max; 17140ef9009SDavid du Colombier }; 17240ef9009SDavid du Colombier 17340ef9009SDavid du Colombier typedef void (*Reffn)(Image*, Rectangle, void*); 17440ef9009SDavid du Colombier 17540ef9009SDavid du Colombier struct Screen 17640ef9009SDavid du Colombier { 17740ef9009SDavid du Colombier Display *display; /* display holding data */ 17840ef9009SDavid du Colombier int id; /* id of system-held Screen */ 17940ef9009SDavid du Colombier Image *image; /* unused; for reference only */ 18040ef9009SDavid du Colombier Image *fill; /* color to paint behind windows */ 18140ef9009SDavid du Colombier }; 18240ef9009SDavid du Colombier 18340ef9009SDavid du Colombier struct Display 18440ef9009SDavid du Colombier { 18540ef9009SDavid du Colombier QLock qlock; 18640ef9009SDavid du Colombier int locking; /*program is using lockdisplay */ 18740ef9009SDavid du Colombier int dirno; 18840ef9009SDavid du Colombier int fd; 18940ef9009SDavid du Colombier int reffd; 19040ef9009SDavid du Colombier int ctlfd; 19140ef9009SDavid du Colombier int imageid; 19240ef9009SDavid du Colombier int local; 19340ef9009SDavid du Colombier void (*error)(Display*, char*); 19440ef9009SDavid du Colombier char *devdir; 19540ef9009SDavid du Colombier char *windir; 19640ef9009SDavid du Colombier char oldlabel[64]; 19740ef9009SDavid du Colombier ulong dataqid; 19840ef9009SDavid du Colombier Image *white; 19940ef9009SDavid du Colombier Image *black; 20040ef9009SDavid du Colombier Image *opaque; 20140ef9009SDavid du Colombier Image *transparent; 20240ef9009SDavid du Colombier Image *image; 20340ef9009SDavid du Colombier uchar *buf; 20440ef9009SDavid du Colombier int bufsize; 20540ef9009SDavid du Colombier uchar *bufp; 20640ef9009SDavid du Colombier Font *defaultfont; 20740ef9009SDavid du Colombier Subfont *defaultsubfont; 20840ef9009SDavid du Colombier Image *windows; 20940ef9009SDavid du Colombier Image *screenimage; 21040ef9009SDavid du Colombier int _isnewdisplay; 21140ef9009SDavid du Colombier }; 21240ef9009SDavid du Colombier 21340ef9009SDavid du Colombier struct Image 21440ef9009SDavid du Colombier { 21540ef9009SDavid du Colombier Display *display; /* display holding data */ 21640ef9009SDavid du Colombier int id; /* id of system-held Image */ 21740ef9009SDavid du Colombier Rectangle r; /* rectangle in data area, local coords */ 21840ef9009SDavid du Colombier Rectangle clipr; /* clipping region */ 21940ef9009SDavid du Colombier int depth; /* number of bits per pixel */ 22040ef9009SDavid du Colombier ulong chan; 22140ef9009SDavid du Colombier int repl; /* flag: data replicates to tile clipr */ 22240ef9009SDavid du Colombier Screen *screen; /* 0 if not a window */ 22340ef9009SDavid du Colombier Image *next; /* next in list of windows */ 22440ef9009SDavid du Colombier }; 22540ef9009SDavid du Colombier 22640ef9009SDavid du Colombier struct RGB 22740ef9009SDavid du Colombier { 22840ef9009SDavid du Colombier ulong red; 22940ef9009SDavid du Colombier ulong green; 23040ef9009SDavid du Colombier ulong blue; 23140ef9009SDavid du Colombier }; 23240ef9009SDavid du Colombier 23340ef9009SDavid du Colombier /* 23440ef9009SDavid du Colombier * Subfonts 23540ef9009SDavid du Colombier * 23640ef9009SDavid du Colombier * given char c, Subfont *f, Fontchar *i, and Point p, one says 23740ef9009SDavid du Colombier * i = f->info+c; 23840ef9009SDavid du Colombier * draw(b, Rect(p.x+i->left, p.y+i->top, 23940ef9009SDavid du Colombier * p.x+i->left+((i+1)->x-i->x), p.y+i->bottom), 24040ef9009SDavid du Colombier * color, f->bits, Pt(i->x, i->top)); 24140ef9009SDavid du Colombier * p.x += i->width; 24240ef9009SDavid du Colombier * to draw characters in the specified color (itself an Image) in Image b. 24340ef9009SDavid du Colombier */ 24440ef9009SDavid du Colombier 24540ef9009SDavid du Colombier struct Fontchar 24640ef9009SDavid du Colombier { 24740ef9009SDavid du Colombier int x; /* left edge of bits */ 24840ef9009SDavid du Colombier uchar top; /* first non-zero scan-line */ 24940ef9009SDavid du Colombier uchar bottom; /* last non-zero scan-line + 1 */ 25040ef9009SDavid du Colombier char left; /* offset of baseline */ 25140ef9009SDavid du Colombier uchar width; /* width of baseline */ 25240ef9009SDavid du Colombier }; 25340ef9009SDavid du Colombier 25440ef9009SDavid du Colombier struct Subfont 25540ef9009SDavid du Colombier { 25640ef9009SDavid du Colombier char *name; 25740ef9009SDavid du Colombier short n; /* number of chars in font */ 25840ef9009SDavid du Colombier uchar height; /* height of image */ 25940ef9009SDavid du Colombier char ascent; /* top of image to baseline */ 26040ef9009SDavid du Colombier Fontchar *info; /* n+1 character descriptors */ 26140ef9009SDavid du Colombier Image *bits; /* of font */ 26240ef9009SDavid du Colombier int ref; 26340ef9009SDavid du Colombier }; 26440ef9009SDavid du Colombier 26540ef9009SDavid du Colombier enum 26640ef9009SDavid du Colombier { 26740ef9009SDavid du Colombier /* starting values */ 26840ef9009SDavid du Colombier LOG2NFCACHE = 6, 26940ef9009SDavid du Colombier NFCACHE = (1<<LOG2NFCACHE), /* #chars cached */ 27040ef9009SDavid du Colombier NFLOOK = 5, /* #chars to scan in cache */ 27140ef9009SDavid du Colombier NFSUBF = 2, /* #subfonts to cache */ 27240ef9009SDavid du Colombier /* max value */ 27340ef9009SDavid du Colombier MAXFCACHE = 1024+NFLOOK, /* upper limit */ 27440ef9009SDavid du Colombier MAXSUBF = 50, /* generous upper limit */ 27540ef9009SDavid du Colombier /* deltas */ 27640ef9009SDavid du Colombier DSUBF = 4, 27740ef9009SDavid du Colombier /* expiry ages */ 27840ef9009SDavid du Colombier SUBFAGE = 10000, 27940ef9009SDavid du Colombier CACHEAGE = 10000 28040ef9009SDavid du Colombier }; 28140ef9009SDavid du Colombier 28240ef9009SDavid du Colombier struct Cachefont 28340ef9009SDavid du Colombier { 28440ef9009SDavid du Colombier Rune min; /* lowest rune value to be taken from subfont */ 28540ef9009SDavid du Colombier Rune max; /* highest rune value+1 to be taken from subfont */ 28640ef9009SDavid du Colombier int offset; /* position in subfont of character at min */ 28740ef9009SDavid du Colombier char *name; /* stored in font */ 28840ef9009SDavid du Colombier char *subfontname; /* to access subfont */ 28940ef9009SDavid du Colombier }; 29040ef9009SDavid du Colombier 29140ef9009SDavid du Colombier struct Cacheinfo 29240ef9009SDavid du Colombier { 29340ef9009SDavid du Colombier ushort x; /* left edge of bits */ 29440ef9009SDavid du Colombier uchar width; /* width of baseline */ 29540ef9009SDavid du Colombier schar left; /* offset of baseline */ 29640ef9009SDavid du Colombier Rune value; /* value of character at this slot in cache */ 29740ef9009SDavid du Colombier ushort age; 29840ef9009SDavid du Colombier }; 29940ef9009SDavid du Colombier 30040ef9009SDavid du Colombier struct Cachesubf 30140ef9009SDavid du Colombier { 30240ef9009SDavid du Colombier ulong age; /* for replacement */ 30340ef9009SDavid du Colombier Cachefont *cf; /* font info that owns us */ 30440ef9009SDavid du Colombier Subfont *f; /* attached subfont */ 30540ef9009SDavid du Colombier }; 30640ef9009SDavid du Colombier 30740ef9009SDavid du Colombier struct Font 30840ef9009SDavid du Colombier { 30940ef9009SDavid du Colombier char *name; 31040ef9009SDavid du Colombier Display *display; 31140ef9009SDavid du Colombier short height; /* max height of image, interline spacing */ 31240ef9009SDavid du Colombier short ascent; /* top of image to baseline */ 31340ef9009SDavid du Colombier short width; /* widest so far; used in caching only */ 31440ef9009SDavid du Colombier short nsub; /* number of subfonts */ 31540ef9009SDavid du Colombier ulong age; /* increasing counter; used for LRU */ 31640ef9009SDavid du Colombier int maxdepth; /* maximum depth of all loaded subfonts */ 31740ef9009SDavid du Colombier int ncache; /* size of cache */ 31840ef9009SDavid du Colombier int nsubf; /* size of subfont list */ 31940ef9009SDavid du Colombier Cacheinfo *cache; 32040ef9009SDavid du Colombier Cachesubf *subf; 32140ef9009SDavid du Colombier Cachefont **sub; /* as read from file */ 32240ef9009SDavid du Colombier Image *cacheimage; 32340ef9009SDavid du Colombier }; 32440ef9009SDavid du Colombier 32540ef9009SDavid du Colombier #define Dx(r) ((r).max.x-(r).min.x) 32640ef9009SDavid du Colombier #define Dy(r) ((r).max.y-(r).min.y) 32740ef9009SDavid du Colombier 328*363b328dSDavid du Colombier #ifdef __cplusplus 329*363b328dSDavid du Colombier extern "C" { 330*363b328dSDavid du Colombier #endif 331*363b328dSDavid du Colombier 33240ef9009SDavid du Colombier /* 33340ef9009SDavid du Colombier * Image management 33440ef9009SDavid du Colombier */ 33540ef9009SDavid du Colombier extern Image* _allocimage(Image*, Display*, Rectangle, ulong, int, ulong, int, int); 33640ef9009SDavid du Colombier extern Image* allocimage(Display*, Rectangle, ulong, int, ulong); 33740ef9009SDavid du Colombier extern uchar* bufimage(Display*, int); 33840ef9009SDavid du Colombier extern int bytesperline(Rectangle, int); 33940ef9009SDavid du Colombier extern void closedisplay(Display*); 34040ef9009SDavid du Colombier extern void drawerror(Display*, char*); 34140ef9009SDavid du Colombier extern int flushimage(Display*, int); 34240ef9009SDavid du Colombier extern int freeimage(Image*); 34340ef9009SDavid du Colombier extern int _freeimage1(Image*); 34440ef9009SDavid du Colombier extern int geninitdraw(char*, void(*)(Display*, char*), char*, char*, char*, int); 34540ef9009SDavid du Colombier extern int initdraw(void(*)(Display*, char*), char*, char*); 34640ef9009SDavid du Colombier extern int newwindow(char*); 34740ef9009SDavid du Colombier extern Display* initdisplay(char*, char*, void(*)(Display*, char*)); 34840ef9009SDavid du Colombier extern int loadimage(Image*, Rectangle, uchar*, int); 34940ef9009SDavid du Colombier extern int cloadimage(Image*, Rectangle, uchar*, int); 35040ef9009SDavid du Colombier extern int getwindow(Display*, int); 35140ef9009SDavid du Colombier extern int gengetwindow(Display*, char*, Image**, Screen**, int); 35240ef9009SDavid du Colombier extern Image* readimage(Display*, int, int); 35340ef9009SDavid du Colombier extern Image* creadimage(Display*, int, int); 35440ef9009SDavid du Colombier extern int unloadimage(Image*, Rectangle, uchar*, int); 35540ef9009SDavid du Colombier extern int wordsperline(Rectangle, int); 35640ef9009SDavid du Colombier extern int writeimage(int, Image*, int); 35740ef9009SDavid du Colombier extern Image* namedimage(Display*, char*); 35840ef9009SDavid du Colombier extern int nameimage(Image*, char*, int); 35940ef9009SDavid du Colombier extern Image* allocimagemix(Display*, ulong, ulong); 36040ef9009SDavid du Colombier 36140ef9009SDavid du Colombier /* 36240ef9009SDavid du Colombier * Colors 36340ef9009SDavid du Colombier */ 36440ef9009SDavid du Colombier extern void readcolmap(Display*, RGB*); 36540ef9009SDavid du Colombier extern void writecolmap(Display*, RGB*); 36640ef9009SDavid du Colombier extern ulong setalpha(ulong, uchar); 36740ef9009SDavid du Colombier 36840ef9009SDavid du Colombier /* 36940ef9009SDavid du Colombier * Windows 37040ef9009SDavid du Colombier */ 37140ef9009SDavid du Colombier extern Screen* allocscreen(Image*, Image*, int); 37240ef9009SDavid du Colombier extern Image* _allocwindow(Image*, Screen*, Rectangle, int, ulong); 37340ef9009SDavid du Colombier extern Image* allocwindow(Screen*, Rectangle, int, ulong); 37440ef9009SDavid du Colombier extern void bottomnwindows(Image**, int); 37540ef9009SDavid du Colombier extern void bottomwindow(Image*); 37640ef9009SDavid du Colombier extern int freescreen(Screen*); 37740ef9009SDavid du Colombier extern Screen* publicscreen(Display*, int, ulong); 37840ef9009SDavid du Colombier extern void topnwindows(Image**, int); 37940ef9009SDavid du Colombier extern void topwindow(Image*); 38040ef9009SDavid du Colombier extern int originwindow(Image*, Point, Point); 38140ef9009SDavid du Colombier 38240ef9009SDavid du Colombier /* 38340ef9009SDavid du Colombier * Geometry 38440ef9009SDavid du Colombier */ 38540ef9009SDavid du Colombier extern Point Pt(int, int); 38640ef9009SDavid du Colombier extern Rectangle Rect(int, int, int, int); 38740ef9009SDavid du Colombier extern Rectangle Rpt(Point, Point); 38840ef9009SDavid du Colombier extern Point addpt(Point, Point); 38940ef9009SDavid du Colombier extern Point subpt(Point, Point); 39040ef9009SDavid du Colombier extern Point divpt(Point, int); 39140ef9009SDavid du Colombier extern Point mulpt(Point, int); 39240ef9009SDavid du Colombier extern int eqpt(Point, Point); 39340ef9009SDavid du Colombier extern int eqrect(Rectangle, Rectangle); 39440ef9009SDavid du Colombier extern Rectangle insetrect(Rectangle, int); 39540ef9009SDavid du Colombier extern Rectangle rectaddpt(Rectangle, Point); 39640ef9009SDavid du Colombier extern Rectangle rectsubpt(Rectangle, Point); 39740ef9009SDavid du Colombier extern Rectangle canonrect(Rectangle); 39840ef9009SDavid du Colombier extern int rectXrect(Rectangle, Rectangle); 39940ef9009SDavid du Colombier extern int rectinrect(Rectangle, Rectangle); 40040ef9009SDavid du Colombier extern void combinerect(Rectangle*, Rectangle); 40140ef9009SDavid du Colombier extern int rectclip(Rectangle*, Rectangle); 40240ef9009SDavid du Colombier extern int ptinrect(Point, Rectangle); 40340ef9009SDavid du Colombier extern void replclipr(Image*, int, Rectangle); 40440ef9009SDavid du Colombier extern int drawreplxy(int, int, int); /* used to be drawsetxy */ 40540ef9009SDavid du Colombier extern Point drawrepl(Rectangle, Point); 40640ef9009SDavid du Colombier extern int rgb2cmap(int, int, int); 40740ef9009SDavid du Colombier extern int cmap2rgb(int); 40840ef9009SDavid du Colombier extern int cmap2rgba(int); 40940ef9009SDavid du Colombier extern void icossin(int, int*, int*); 41040ef9009SDavid du Colombier extern void icossin2(int, int, int*, int*); 41140ef9009SDavid du Colombier 41240ef9009SDavid du Colombier /* 41340ef9009SDavid du Colombier * Graphics 41440ef9009SDavid du Colombier */ 41540ef9009SDavid du Colombier extern void draw(Image*, Rectangle, Image*, Image*, Point); 41640ef9009SDavid du Colombier extern void drawop(Image*, Rectangle, Image*, Image*, Point, Drawop); 41740ef9009SDavid du Colombier extern void gendraw(Image*, Rectangle, Image*, Point, Image*, Point); 41840ef9009SDavid du Colombier extern void gendrawop(Image*, Rectangle, Image*, Point, Image*, Point, Drawop); 41940ef9009SDavid du Colombier extern void line(Image*, Point, Point, int, int, int, Image*, Point); 42040ef9009SDavid du Colombier extern void lineop(Image*, Point, Point, int, int, int, Image*, Point, Drawop); 42140ef9009SDavid du Colombier extern void poly(Image*, Point*, int, int, int, int, Image*, Point); 42240ef9009SDavid du Colombier extern void polyop(Image*, Point*, int, int, int, int, Image*, Point, Drawop); 42340ef9009SDavid du Colombier extern void fillpoly(Image*, Point*, int, int, Image*, Point); 42440ef9009SDavid du Colombier extern void fillpolyop(Image*, Point*, int, int, Image*, Point, Drawop); 42540ef9009SDavid du Colombier extern Point string(Image*, Point, Image*, Point, Font*, char*); 42640ef9009SDavid du Colombier extern Point stringop(Image*, Point, Image*, Point, Font*, char*, Drawop); 42740ef9009SDavid du Colombier extern Point stringn(Image*, Point, Image*, Point, Font*, char*, int); 42840ef9009SDavid du Colombier extern Point stringnop(Image*, Point, Image*, Point, Font*, char*, int, Drawop); 42940ef9009SDavid du Colombier extern Point runestring(Image*, Point, Image*, Point, Font*, Rune*); 43040ef9009SDavid du Colombier extern Point runestringop(Image*, Point, Image*, Point, Font*, Rune*, Drawop); 43140ef9009SDavid du Colombier extern Point runestringn(Image*, Point, Image*, Point, Font*, Rune*, int); 43240ef9009SDavid du Colombier extern Point runestringnop(Image*, Point, Image*, Point, Font*, Rune*, int, Drawop); 43340ef9009SDavid du Colombier extern Point stringbg(Image*, Point, Image*, Point, Font*, char*, Image*, Point); 43440ef9009SDavid du Colombier extern Point stringbgop(Image*, Point, Image*, Point, Font*, char*, Image*, Point, Drawop); 43540ef9009SDavid du Colombier extern Point stringnbg(Image*, Point, Image*, Point, Font*, char*, int, Image*, Point); 43640ef9009SDavid du Colombier extern Point stringnbgop(Image*, Point, Image*, Point, Font*, char*, int, Image*, Point, Drawop); 43740ef9009SDavid du Colombier extern Point runestringbg(Image*, Point, Image*, Point, Font*, Rune*, Image*, Point); 43840ef9009SDavid du Colombier extern Point runestringbgop(Image*, Point, Image*, Point, Font*, Rune*, Image*, Point, Drawop); 43940ef9009SDavid du Colombier extern Point runestringnbg(Image*, Point, Image*, Point, Font*, Rune*, int, Image*, Point); 44040ef9009SDavid du Colombier extern Point runestringnbgop(Image*, Point, Image*, Point, Font*, Rune*, int, Image*, Point, Drawop); 44140ef9009SDavid du Colombier extern Point _string(Image*, Point, Image*, Point, Font*, char*, Rune*, int, Rectangle, Image*, Point, Drawop); 44240ef9009SDavid du Colombier extern Point stringsubfont(Image*, Point, Image*, Subfont*, char*); 44340ef9009SDavid du Colombier extern int bezier(Image*, Point, Point, Point, Point, int, int, int, Image*, Point); 44440ef9009SDavid du Colombier extern int bezierop(Image*, Point, Point, Point, Point, int, int, int, Image*, Point, Drawop); 44540ef9009SDavid du Colombier extern int bezspline(Image*, Point*, int, int, int, int, Image*, Point); 44640ef9009SDavid du Colombier extern int bezsplineop(Image*, Point*, int, int, int, int, Image*, Point, Drawop); 44740ef9009SDavid du Colombier extern int bezsplinepts(Point*, int, Point**); 44840ef9009SDavid du Colombier extern int fillbezier(Image*, Point, Point, Point, Point, int, Image*, Point); 44940ef9009SDavid du Colombier extern int fillbezierop(Image*, Point, Point, Point, Point, int, Image*, Point, Drawop); 45040ef9009SDavid du Colombier extern int fillbezspline(Image*, Point*, int, int, Image*, Point); 45140ef9009SDavid du Colombier extern int fillbezsplineop(Image*, Point*, int, int, Image*, Point, Drawop); 45240ef9009SDavid du Colombier extern void ellipse(Image*, Point, int, int, int, Image*, Point); 45340ef9009SDavid du Colombier extern void ellipseop(Image*, Point, int, int, int, Image*, Point, Drawop); 45440ef9009SDavid du Colombier extern void fillellipse(Image*, Point, int, int, Image*, Point); 45540ef9009SDavid du Colombier extern void fillellipseop(Image*, Point, int, int, Image*, Point, Drawop); 45640ef9009SDavid du Colombier extern void arc(Image*, Point, int, int, int, Image*, Point, int, int); 45740ef9009SDavid du Colombier extern void arcop(Image*, Point, int, int, int, Image*, Point, int, int, Drawop); 45840ef9009SDavid du Colombier extern void fillarc(Image*, Point, int, int, Image*, Point, int, int); 45940ef9009SDavid du Colombier extern void fillarcop(Image*, Point, int, int, Image*, Point, int, int, Drawop); 46040ef9009SDavid du Colombier extern void border(Image*, Rectangle, int, Image*, Point); 46140ef9009SDavid du Colombier extern void borderop(Image*, Rectangle, int, Image*, Point, Drawop); 46240ef9009SDavid du Colombier 46340ef9009SDavid du Colombier /* 46440ef9009SDavid du Colombier * Font management 46540ef9009SDavid du Colombier */ 46640ef9009SDavid du Colombier extern Font* openfont(Display*, char*); 46740ef9009SDavid du Colombier extern Font* buildfont(Display*, char*, char*); 46840ef9009SDavid du Colombier extern void freefont(Font*); 46940ef9009SDavid du Colombier extern Font* mkfont(Subfont*, Rune); 47040ef9009SDavid du Colombier extern int cachechars(Font*, char**, Rune**, ushort*, int, int*, char**); 47140ef9009SDavid du Colombier extern void agefont(Font*); 47240ef9009SDavid du Colombier extern Subfont* allocsubfont(char*, int, int, int, Fontchar*, Image*); 47340ef9009SDavid du Colombier extern Subfont* lookupsubfont(Display*, char*); 47440ef9009SDavid du Colombier extern void installsubfont(char*, Subfont*); 47540ef9009SDavid du Colombier extern void uninstallsubfont(Subfont*); 47640ef9009SDavid du Colombier extern void freesubfont(Subfont*); 47740ef9009SDavid du Colombier extern Subfont* readsubfont(Display*, char*, int, int); 47840ef9009SDavid du Colombier extern Subfont* readsubfonti(Display*, char*, int, Image*, int); 47940ef9009SDavid du Colombier extern int writesubfont(int, Subfont*); 48040ef9009SDavid du Colombier extern void _unpackinfo(Fontchar*, uchar*, int); 48140ef9009SDavid du Colombier extern Point stringsize(Font*, char*); 48240ef9009SDavid du Colombier extern int stringwidth(Font*, char*); 48340ef9009SDavid du Colombier extern int stringnwidth(Font*, char*, int); 48440ef9009SDavid du Colombier extern Point runestringsize(Font*, Rune*); 48540ef9009SDavid du Colombier extern int runestringwidth(Font*, Rune*); 48640ef9009SDavid du Colombier extern int runestringnwidth(Font*, Rune*, int); 48740ef9009SDavid du Colombier extern Point strsubfontwidth(Subfont*, char*); 48840ef9009SDavid du Colombier extern int loadchar(Font*, Rune, Cacheinfo*, int, int, char**); 48940ef9009SDavid du Colombier extern char* subfontname(char*, char*, int); 49040ef9009SDavid du Colombier extern Subfont* _getsubfont(Display*, char*); 49140ef9009SDavid du Colombier extern Subfont* getdefont(Display*); 49240ef9009SDavid du Colombier extern void lockdisplay(Display*); 49340ef9009SDavid du Colombier extern void unlockdisplay(Display*); 49440ef9009SDavid du Colombier extern int drawlsetrefresh(ulong, int, void*, void*); 49540ef9009SDavid du Colombier 49640ef9009SDavid du Colombier /* 49740ef9009SDavid du Colombier * Predefined 49840ef9009SDavid du Colombier */ 49940ef9009SDavid du Colombier extern uchar defontdata[]; 50040ef9009SDavid du Colombier extern int sizeofdefont; 50140ef9009SDavid du Colombier extern Point ZP; 50240ef9009SDavid du Colombier extern Rectangle ZR; 50340ef9009SDavid du Colombier 50440ef9009SDavid du Colombier /* 50540ef9009SDavid du Colombier * Set up by initdraw() 50640ef9009SDavid du Colombier */ 50740ef9009SDavid du Colombier extern Display *display; 50840ef9009SDavid du Colombier extern Font *font; 50940ef9009SDavid du Colombier extern Image *screen; 51040ef9009SDavid du Colombier extern Screen *_screen; 51140ef9009SDavid du Colombier extern int _cursorfd; 51240ef9009SDavid du Colombier extern int _drawdebug; /* set to 1 to see errors from flushimage */ 51340ef9009SDavid du Colombier extern void _setdrawop(Display*, Drawop); 51440ef9009SDavid du Colombier 51540ef9009SDavid du Colombier #define BGSHORT(p) (((p)[0]<<0) | ((p)[1]<<8)) 51640ef9009SDavid du Colombier #define BGLONG(p) ((BGSHORT(p)<<0) | (BGSHORT(p+2)<<16)) 51740ef9009SDavid du Colombier #define BPSHORT(p, v) ((p)[0]=(v), (p)[1]=((v)>>8)) 51840ef9009SDavid du Colombier #define BPLONG(p, v) (BPSHORT(p, (v)), BPSHORT(p+2, (v)>>16)) 51940ef9009SDavid du Colombier 52040ef9009SDavid du Colombier /* 52140ef9009SDavid du Colombier * Compressed image file parameters and helper routines 52240ef9009SDavid du Colombier */ 52340ef9009SDavid du Colombier #define NMATCH 3 /* shortest match possible */ 52440ef9009SDavid du Colombier #define NRUN (NMATCH+31) /* longest match possible */ 52540ef9009SDavid du Colombier #define NMEM 1024 /* window size */ 52640ef9009SDavid du Colombier #define NDUMP 128 /* maximum length of dump */ 52740ef9009SDavid du Colombier #define NCBLOCK 6000 /* size of compressed blocks */ 52840ef9009SDavid du Colombier extern void _twiddlecompressed(uchar*, int); 52940ef9009SDavid du Colombier extern int _compblocksize(Rectangle, int); 53040ef9009SDavid du Colombier 53140ef9009SDavid du Colombier /* XXX backwards helps; should go */ 53240ef9009SDavid du Colombier extern ulong drawld2chan[]; 53340ef9009SDavid du Colombier extern void drawsetdebug(int); 534*363b328dSDavid du Colombier 535*363b328dSDavid du Colombier #ifdef __cplusplus 536*363b328dSDavid du Colombier } 537*363b328dSDavid du Colombier #endif 538*363b328dSDavid du Colombier 539*363b328dSDavid du Colombier #endif 540