17dd7cddfSDavid du Colombier #pragma src "/sys/src/libdraw" 27dd7cddfSDavid du Colombier #pragma lib "libdraw.a" 37dd7cddfSDavid du Colombier 47dd7cddfSDavid du Colombier typedef struct Cachefont Cachefont; 57dd7cddfSDavid du Colombier typedef struct Cacheinfo Cacheinfo; 67dd7cddfSDavid du Colombier typedef struct Cachesubf Cachesubf; 77dd7cddfSDavid du Colombier typedef struct Display Display; 87dd7cddfSDavid du Colombier typedef struct Font Font; 97dd7cddfSDavid du Colombier typedef struct Fontchar Fontchar; 107dd7cddfSDavid du Colombier typedef struct Image Image; 117dd7cddfSDavid du Colombier typedef struct Mouse Mouse; 127dd7cddfSDavid du Colombier typedef struct Point Point; 137dd7cddfSDavid du Colombier typedef struct Rectangle Rectangle; 147dd7cddfSDavid du Colombier typedef struct RGB RGB; 157dd7cddfSDavid du Colombier typedef struct Screen Screen; 167dd7cddfSDavid du Colombier typedef struct Subfont Subfont; 177dd7cddfSDavid du Colombier 1812fd1c83SDavid du Colombier #pragma incomplete Mouse 1912fd1c83SDavid du Colombier 207dd7cddfSDavid du Colombier #pragma varargck type "R" Rectangle 217dd7cddfSDavid du Colombier #pragma varargck type "P" Point 229a747e4fSDavid du Colombier extern int Rfmt(Fmt*); 239a747e4fSDavid du Colombier extern int Pfmt(Fmt*); 247dd7cddfSDavid du Colombier 257dd7cddfSDavid du Colombier enum 267dd7cddfSDavid du Colombier { 277dd7cddfSDavid du Colombier DOpaque = 0xFFFFFFFF, 2859cc4ca5SDavid du Colombier DTransparent = 0x00000000, /* only useful for allocimage, memfillcolor */ 297dd7cddfSDavid du Colombier DBlack = 0x000000FF, 307dd7cddfSDavid du Colombier DWhite = 0xFFFFFFFF, 317dd7cddfSDavid du Colombier DRed = 0xFF0000FF, 327dd7cddfSDavid du Colombier DGreen = 0x00FF00FF, 337dd7cddfSDavid du Colombier DBlue = 0x0000FFFF, 347dd7cddfSDavid du Colombier DCyan = 0x00FFFFFF, 357dd7cddfSDavid du Colombier DMagenta = 0xFF00FFFF, 367dd7cddfSDavid du Colombier DYellow = 0xFFFF00FF, 377dd7cddfSDavid du Colombier DPaleyellow = 0xFFFFAAFF, 387dd7cddfSDavid du Colombier DDarkyellow = 0xEEEE9EFF, 397dd7cddfSDavid du Colombier DDarkgreen = 0x448844FF, 407dd7cddfSDavid du Colombier DPalegreen = 0xAAFFAAFF, 417dd7cddfSDavid du Colombier DMedgreen = 0x88CC88FF, 427dd7cddfSDavid du Colombier DDarkblue = 0x000055FF, 437dd7cddfSDavid du Colombier DPalebluegreen= 0xAAFFFFFF, 447dd7cddfSDavid du Colombier DPaleblue = 0x0000BBFF, 457dd7cddfSDavid du Colombier DBluegreen = 0x008888FF, 467dd7cddfSDavid du Colombier DGreygreen = 0x55AAAAFF, 477dd7cddfSDavid du Colombier DPalegreygreen = 0x9EEEEEFF, 487dd7cddfSDavid du Colombier DYellowgreen = 0x99994CFF, 497dd7cddfSDavid du Colombier DMedblue = 0x000099FF, 507dd7cddfSDavid du Colombier DGreyblue = 0x005DBBFF, 517dd7cddfSDavid du Colombier DPalegreyblue = 0x4993DDFF, 527dd7cddfSDavid du Colombier DPurpleblue = 0x8888CCFF, 537dd7cddfSDavid du Colombier 547dd7cddfSDavid du Colombier DNotacolor = 0xFFFFFF00, 557dd7cddfSDavid du Colombier DNofill = DNotacolor, 567dd7cddfSDavid du Colombier 577dd7cddfSDavid du Colombier }; 587dd7cddfSDavid du Colombier 597dd7cddfSDavid du Colombier enum 607dd7cddfSDavid du Colombier { 617dd7cddfSDavid du Colombier Displaybufsize = 8000, 627dd7cddfSDavid du Colombier ICOSSCALE = 1024, 637dd7cddfSDavid du Colombier Borderwidth = 4, 647dd7cddfSDavid du Colombier }; 657dd7cddfSDavid du Colombier 667dd7cddfSDavid du Colombier enum 677dd7cddfSDavid du Colombier { 687dd7cddfSDavid du Colombier /* refresh methods */ 697dd7cddfSDavid du Colombier Refbackup = 0, 707dd7cddfSDavid du Colombier Refnone = 1, 717dd7cddfSDavid du Colombier Refmesg = 2 727dd7cddfSDavid du Colombier }; 737dd7cddfSDavid du Colombier #define NOREFRESH ((void*)-1) 747dd7cddfSDavid du Colombier 757dd7cddfSDavid du Colombier enum 767dd7cddfSDavid du Colombier { 777dd7cddfSDavid du Colombier /* line ends */ 787dd7cddfSDavid du Colombier Endsquare = 0, 797dd7cddfSDavid du Colombier Enddisc = 1, 807dd7cddfSDavid du Colombier Endarrow = 2, 817dd7cddfSDavid du Colombier Endmask = 0x1F 827dd7cddfSDavid du Colombier }; 837dd7cddfSDavid du Colombier 847dd7cddfSDavid du Colombier #define ARROW(a, b, c) (Endarrow|((a)<<5)|((b)<<14)|((c)<<23)) 857dd7cddfSDavid du Colombier 86ac57dd0bSDavid du Colombier typedef enum 879a747e4fSDavid du Colombier { 88ac57dd0bSDavid du Colombier /* Porter-Duff compositing operators */ 899a747e4fSDavid du Colombier Clear = 0, 909a747e4fSDavid du Colombier 919a747e4fSDavid du Colombier SinD = 8, 929a747e4fSDavid du Colombier DinS = 4, 939a747e4fSDavid du Colombier SoutD = 2, 949a747e4fSDavid du Colombier DoutS = 1, 959a747e4fSDavid du Colombier 969a747e4fSDavid du Colombier S = SinD|SoutD, 979a747e4fSDavid du Colombier SoverD = SinD|SoutD|DoutS, 989a747e4fSDavid du Colombier SatopD = SinD|DoutS, 999a747e4fSDavid du Colombier SxorD = SoutD|DoutS, 1009a747e4fSDavid du Colombier 1019a747e4fSDavid du Colombier D = DinS|DoutS, 1029a747e4fSDavid du Colombier DoverS = DinS|DoutS|SoutD, 1039a747e4fSDavid du Colombier DatopS = DinS|SoutD, 1049a747e4fSDavid du Colombier DxorS = DoutS|SoutD, /* == SxorD */ 1056a9fc400SDavid du Colombier 1066a9fc400SDavid du Colombier Ncomp = 12, 107ac57dd0bSDavid du Colombier } Drawop; 1089a747e4fSDavid du Colombier 1099a747e4fSDavid du Colombier /* 1107dd7cddfSDavid du Colombier * image channel descriptors 1117dd7cddfSDavid du Colombier */ 1127dd7cddfSDavid du Colombier enum { 1137dd7cddfSDavid du Colombier CRed = 0, 1147dd7cddfSDavid du Colombier CGreen, 1157dd7cddfSDavid du Colombier CBlue, 1167dd7cddfSDavid du Colombier CGrey, 1177dd7cddfSDavid du Colombier CAlpha, 1187dd7cddfSDavid du Colombier CMap, 1197dd7cddfSDavid du Colombier CIgnore, 1207dd7cddfSDavid du Colombier NChan, 1217dd7cddfSDavid du Colombier }; 1227dd7cddfSDavid du Colombier 1237dd7cddfSDavid du Colombier #define __DC(type, nbits) ((((type)&15)<<4)|((nbits)&15)) 1247dd7cddfSDavid du Colombier #define CHAN1(a,b) __DC(a,b) 1257dd7cddfSDavid du Colombier #define CHAN2(a,b,c,d) (CHAN1((a),(b))<<8|__DC((c),(d))) 1267dd7cddfSDavid du Colombier #define CHAN3(a,b,c,d,e,f) (CHAN2((a),(b),(c),(d))<<8|__DC((e),(f))) 1277dd7cddfSDavid du Colombier #define CHAN4(a,b,c,d,e,f,g,h) (CHAN3((a),(b),(c),(d),(e),(f))<<8|__DC((g),(h))) 1287dd7cddfSDavid du Colombier 1297dd7cddfSDavid du Colombier #define NBITS(c) ((c)&15) 1307dd7cddfSDavid du Colombier #define TYPE(c) (((c)>>4)&15) 1317dd7cddfSDavid du Colombier 1327dd7cddfSDavid du Colombier enum { 1337dd7cddfSDavid du Colombier GREY1 = CHAN1(CGrey, 1), 1347dd7cddfSDavid du Colombier GREY2 = CHAN1(CGrey, 2), 1357dd7cddfSDavid du Colombier GREY4 = CHAN1(CGrey, 4), 1367dd7cddfSDavid du Colombier GREY8 = CHAN1(CGrey, 8), 1377dd7cddfSDavid du Colombier CMAP8 = CHAN1(CMap, 8), 1387dd7cddfSDavid du Colombier RGB15 = CHAN4(CIgnore, 1, CRed, 5, CGreen, 5, CBlue, 5), 1397dd7cddfSDavid du Colombier RGB16 = CHAN3(CRed, 5, CGreen, 6, CBlue, 5), 1407dd7cddfSDavid du Colombier RGB24 = CHAN3(CRed, 8, CGreen, 8, CBlue, 8), 1417dd7cddfSDavid du Colombier RGBA32 = CHAN4(CRed, 8, CGreen, 8, CBlue, 8, CAlpha, 8), 1427dd7cddfSDavid du Colombier ARGB32 = CHAN4(CAlpha, 8, CRed, 8, CGreen, 8, CBlue, 8), /* stupid VGAs */ 1437dd7cddfSDavid du Colombier XRGB32 = CHAN4(CIgnore, 8, CRed, 8, CGreen, 8, CBlue, 8), 144668c4144SDavid du Colombier BGR24 = CHAN3(CBlue, 8, CGreen, 8, CRed, 8), 145668c4144SDavid du Colombier ABGR32 = CHAN4(CAlpha, 8, CBlue, 8, CGreen, 8, CRed, 8), 146668c4144SDavid du Colombier XBGR32 = CHAN4(CIgnore, 8, CBlue, 8, CGreen, 8, CRed, 8), 1477dd7cddfSDavid du Colombier }; 1487dd7cddfSDavid du Colombier 1497dd7cddfSDavid du Colombier extern char* chantostr(char*, ulong); 1507dd7cddfSDavid du Colombier extern ulong strtochan(char*); 1517dd7cddfSDavid du Colombier extern int chantodepth(ulong); 1527dd7cddfSDavid du Colombier 1537dd7cddfSDavid du Colombier struct Point 1547dd7cddfSDavid du Colombier { 1557dd7cddfSDavid du Colombier int x; 1567dd7cddfSDavid du Colombier int y; 1577dd7cddfSDavid du Colombier }; 1587dd7cddfSDavid du Colombier 1597dd7cddfSDavid du Colombier struct Rectangle 1607dd7cddfSDavid du Colombier { 1617dd7cddfSDavid du Colombier Point min; 1627dd7cddfSDavid du Colombier Point max; 1637dd7cddfSDavid du Colombier }; 1647dd7cddfSDavid du Colombier 1657dd7cddfSDavid du Colombier typedef void (*Reffn)(Image*, Rectangle, void*); 1667dd7cddfSDavid du Colombier 1677dd7cddfSDavid du Colombier struct Screen 1687dd7cddfSDavid du Colombier { 1697dd7cddfSDavid du Colombier Display *display; /* display holding data */ 1707dd7cddfSDavid du Colombier int id; /* id of system-held Screen */ 1717dd7cddfSDavid du Colombier Image *image; /* unused; for reference only */ 1727dd7cddfSDavid du Colombier Image *fill; /* color to paint behind windows */ 1737dd7cddfSDavid du Colombier }; 1747dd7cddfSDavid du Colombier 1757dd7cddfSDavid du Colombier struct Display 1767dd7cddfSDavid du Colombier { 1777dd7cddfSDavid du Colombier QLock qlock; 1787dd7cddfSDavid du Colombier int locking; /*program is using lockdisplay */ 1797dd7cddfSDavid du Colombier int dirno; 1807dd7cddfSDavid du Colombier int fd; 1817dd7cddfSDavid du Colombier int reffd; 1827dd7cddfSDavid du Colombier int ctlfd; 1837dd7cddfSDavid du Colombier int imageid; 1847dd7cddfSDavid du Colombier int local; 1857dd7cddfSDavid du Colombier void (*error)(Display*, char*); 1867dd7cddfSDavid du Colombier char *devdir; 1877dd7cddfSDavid du Colombier char *windir; 1887dd7cddfSDavid du Colombier char oldlabel[64]; 1897dd7cddfSDavid du Colombier ulong dataqid; 1907dd7cddfSDavid du Colombier Image *white; 1917dd7cddfSDavid du Colombier Image *black; 1927dd7cddfSDavid du Colombier Image *opaque; 1937dd7cddfSDavid du Colombier Image *transparent; 1949a747e4fSDavid du Colombier Image *image; 1959a747e4fSDavid du Colombier uchar *buf; 1969a747e4fSDavid du Colombier int bufsize; 1977dd7cddfSDavid du Colombier uchar *bufp; 1987dd7cddfSDavid du Colombier Font *defaultfont; 1997dd7cddfSDavid du Colombier Subfont *defaultsubfont; 2007dd7cddfSDavid du Colombier Image *windows; 2019a747e4fSDavid du Colombier Image *screenimage; 2029a747e4fSDavid du Colombier int _isnewdisplay; 2037dd7cddfSDavid du Colombier }; 2047dd7cddfSDavid du Colombier 2057dd7cddfSDavid du Colombier struct Image 2067dd7cddfSDavid du Colombier { 2077dd7cddfSDavid du Colombier Display *display; /* display holding data */ 2087dd7cddfSDavid du Colombier int id; /* id of system-held Image */ 2097dd7cddfSDavid du Colombier Rectangle r; /* rectangle in data area, local coords */ 2107dd7cddfSDavid du Colombier Rectangle clipr; /* clipping region */ 2117dd7cddfSDavid du Colombier int depth; /* number of bits per pixel */ 2127dd7cddfSDavid du Colombier ulong chan; 2137dd7cddfSDavid du Colombier int repl; /* flag: data replicates to tile clipr */ 2147dd7cddfSDavid du Colombier Screen *screen; /* 0 if not a window */ 2157dd7cddfSDavid du Colombier Image *next; /* next in list of windows */ 2167dd7cddfSDavid du Colombier }; 2177dd7cddfSDavid du Colombier 2187dd7cddfSDavid du Colombier struct RGB 2197dd7cddfSDavid du Colombier { 2207dd7cddfSDavid du Colombier ulong red; 2217dd7cddfSDavid du Colombier ulong green; 2227dd7cddfSDavid du Colombier ulong blue; 2237dd7cddfSDavid du Colombier }; 2247dd7cddfSDavid du Colombier 2257dd7cddfSDavid du Colombier /* 2267dd7cddfSDavid du Colombier * Subfonts 2277dd7cddfSDavid du Colombier * 2287dd7cddfSDavid du Colombier * given char c, Subfont *f, Fontchar *i, and Point p, one says 2297dd7cddfSDavid du Colombier * i = f->info+c; 2307dd7cddfSDavid du Colombier * draw(b, Rect(p.x+i->left, p.y+i->top, 2317dd7cddfSDavid du Colombier * p.x+i->left+((i+1)->x-i->x), p.y+i->bottom), 2327dd7cddfSDavid du Colombier * color, f->bits, Pt(i->x, i->top)); 2337dd7cddfSDavid du Colombier * p.x += i->width; 2347dd7cddfSDavid du Colombier * to draw characters in the specified color (itself an Image) in Image b. 2357dd7cddfSDavid du Colombier */ 2367dd7cddfSDavid du Colombier 2377dd7cddfSDavid du Colombier struct Fontchar 2387dd7cddfSDavid du Colombier { 2397dd7cddfSDavid du Colombier int x; /* left edge of bits */ 2407dd7cddfSDavid du Colombier uchar top; /* first non-zero scan-line */ 2417dd7cddfSDavid du Colombier uchar bottom; /* last non-zero scan-line + 1 */ 2427dd7cddfSDavid du Colombier char left; /* offset of baseline */ 2437dd7cddfSDavid du Colombier uchar width; /* width of baseline */ 2447dd7cddfSDavid du Colombier }; 2457dd7cddfSDavid du Colombier 2467dd7cddfSDavid du Colombier struct Subfont 2477dd7cddfSDavid du Colombier { 2487dd7cddfSDavid du Colombier char *name; 2497dd7cddfSDavid du Colombier short n; /* number of chars in font */ 2507dd7cddfSDavid du Colombier uchar height; /* height of image */ 2517dd7cddfSDavid du Colombier char ascent; /* top of image to baseline */ 2527dd7cddfSDavid du Colombier Fontchar *info; /* n+1 character descriptors */ 2537dd7cddfSDavid du Colombier Image *bits; /* of font */ 25480ee5cbfSDavid du Colombier int ref; 2557dd7cddfSDavid du Colombier }; 2567dd7cddfSDavid du Colombier 2577dd7cddfSDavid du Colombier enum 2587dd7cddfSDavid du Colombier { 2597dd7cddfSDavid du Colombier /* starting values */ 2607dd7cddfSDavid du Colombier LOG2NFCACHE = 6, 2617dd7cddfSDavid du Colombier NFCACHE = (1<<LOG2NFCACHE), /* #chars cached */ 2627dd7cddfSDavid du Colombier NFLOOK = 5, /* #chars to scan in cache */ 2637dd7cddfSDavid du Colombier NFSUBF = 2, /* #subfonts to cache */ 2647dd7cddfSDavid du Colombier /* max value */ 2657dd7cddfSDavid du Colombier MAXFCACHE = 1024+NFLOOK, /* upper limit */ 2667dd7cddfSDavid du Colombier MAXSUBF = 50, /* generous upper limit */ 2677dd7cddfSDavid du Colombier /* deltas */ 2687dd7cddfSDavid du Colombier DSUBF = 4, 2697dd7cddfSDavid du Colombier /* expiry ages */ 2707dd7cddfSDavid du Colombier SUBFAGE = 10000, 2717dd7cddfSDavid du Colombier CACHEAGE = 10000 2727dd7cddfSDavid du Colombier }; 2737dd7cddfSDavid du Colombier 2747dd7cddfSDavid du Colombier struct Cachefont 2757dd7cddfSDavid du Colombier { 2767dd7cddfSDavid du Colombier Rune min; /* lowest rune value to be taken from subfont */ 2777dd7cddfSDavid du Colombier Rune max; /* highest rune value+1 to be taken from subfont */ 2787dd7cddfSDavid du Colombier int offset; /* position in subfont of character at min */ 2797dd7cddfSDavid du Colombier char *name; /* stored in font */ 2807dd7cddfSDavid du Colombier char *subfontname; /* to access subfont */ 2817dd7cddfSDavid du Colombier }; 2827dd7cddfSDavid du Colombier 2837dd7cddfSDavid du Colombier struct Cacheinfo 2847dd7cddfSDavid du Colombier { 2857dd7cddfSDavid du Colombier ushort x; /* left edge of bits */ 2867dd7cddfSDavid du Colombier uchar width; /* width of baseline */ 2877dd7cddfSDavid du Colombier schar left; /* offset of baseline */ 2887dd7cddfSDavid du Colombier Rune value; /* value of character at this slot in cache */ 2897dd7cddfSDavid du Colombier ushort age; 2907dd7cddfSDavid du Colombier }; 2917dd7cddfSDavid du Colombier 2927dd7cddfSDavid du Colombier struct Cachesubf 2937dd7cddfSDavid du Colombier { 2947dd7cddfSDavid du Colombier ulong age; /* for replacement */ 2957dd7cddfSDavid du Colombier Cachefont *cf; /* font info that owns us */ 2967dd7cddfSDavid du Colombier Subfont *f; /* attached subfont */ 2977dd7cddfSDavid du Colombier }; 2987dd7cddfSDavid du Colombier 2997dd7cddfSDavid du Colombier struct Font 3007dd7cddfSDavid du Colombier { 3017dd7cddfSDavid du Colombier char *name; 3027dd7cddfSDavid du Colombier Display *display; 3037dd7cddfSDavid du Colombier short height; /* max height of image, interline spacing */ 3047dd7cddfSDavid du Colombier short ascent; /* top of image to baseline */ 3057dd7cddfSDavid du Colombier short width; /* widest so far; used in caching only */ 3067dd7cddfSDavid du Colombier short nsub; /* number of subfonts */ 3077dd7cddfSDavid du Colombier ulong age; /* increasing counter; used for LRU */ 3087dd7cddfSDavid du Colombier int maxdepth; /* maximum depth of all loaded subfonts */ 3097dd7cddfSDavid du Colombier int ncache; /* size of cache */ 3107dd7cddfSDavid du Colombier int nsubf; /* size of subfont list */ 3117dd7cddfSDavid du Colombier Cacheinfo *cache; 3127dd7cddfSDavid du Colombier Cachesubf *subf; 3137dd7cddfSDavid du Colombier Cachefont **sub; /* as read from file */ 3147dd7cddfSDavid du Colombier Image *cacheimage; 3157dd7cddfSDavid du Colombier }; 3167dd7cddfSDavid du Colombier 3177dd7cddfSDavid du Colombier #define Dx(r) ((r).max.x-(r).min.x) 3187dd7cddfSDavid du Colombier #define Dy(r) ((r).max.y-(r).min.y) 319a8453668SDavid du Colombier 320a8453668SDavid du Colombier /* 321a8453668SDavid du Colombier * One of a kind 322a8453668SDavid du Colombier */ 323a8453668SDavid du Colombier extern int mousescrollsize(int); 3247dd7cddfSDavid du Colombier 3257dd7cddfSDavid du Colombier /* 3267dd7cddfSDavid du Colombier * Image management 3277dd7cddfSDavid du Colombier */ 3287dd7cddfSDavid du Colombier extern Image* _allocimage(Image*, Display*, Rectangle, ulong, int, ulong, int, int); 3297dd7cddfSDavid du Colombier extern Image* allocimage(Display*, Rectangle, ulong, int, ulong); 3307dd7cddfSDavid du Colombier extern uchar* bufimage(Display*, int); 3317dd7cddfSDavid du Colombier extern int bytesperline(Rectangle, int); 3327dd7cddfSDavid du Colombier extern void closedisplay(Display*); 3337dd7cddfSDavid du Colombier extern void drawerror(Display*, char*); 3347dd7cddfSDavid du Colombier extern int flushimage(Display*, int); 3357dd7cddfSDavid du Colombier extern int freeimage(Image*); 3367dd7cddfSDavid du Colombier extern int _freeimage1(Image*); 3377dd7cddfSDavid du Colombier extern int geninitdraw(char*, void(*)(Display*, char*), char*, char*, char*, int); 3387dd7cddfSDavid du Colombier extern int initdraw(void(*)(Display*, char*), char*, char*); 339d9306527SDavid du Colombier extern int newwindow(char*); 3407dd7cddfSDavid du Colombier extern Display* initdisplay(char*, char*, void(*)(Display*, char*)); 3417dd7cddfSDavid du Colombier extern int loadimage(Image*, Rectangle, uchar*, int); 34280ee5cbfSDavid du Colombier extern int cloadimage(Image*, Rectangle, uchar*, int); 3437dd7cddfSDavid du Colombier extern int getwindow(Display*, int); 34480ee5cbfSDavid du Colombier extern int gengetwindow(Display*, char*, Image**, Screen**, int); 3457dd7cddfSDavid du Colombier extern Image* readimage(Display*, int, int); 3467dd7cddfSDavid du Colombier extern Image* creadimage(Display*, int, int); 3477dd7cddfSDavid du Colombier extern int unloadimage(Image*, Rectangle, uchar*, int); 3487dd7cddfSDavid du Colombier extern int wordsperline(Rectangle, int); 3497dd7cddfSDavid du Colombier extern int writeimage(int, Image*, int); 3507dd7cddfSDavid du Colombier extern Image* namedimage(Display*, char*); 3517dd7cddfSDavid du Colombier extern int nameimage(Image*, char*, int); 3527dd7cddfSDavid du Colombier extern Image* allocimagemix(Display*, ulong, ulong); 3537dd7cddfSDavid du Colombier 3547dd7cddfSDavid du Colombier /* 3557dd7cddfSDavid du Colombier * Colors 3567dd7cddfSDavid du Colombier */ 3577dd7cddfSDavid du Colombier extern void readcolmap(Display*, RGB*); 3587dd7cddfSDavid du Colombier extern void writecolmap(Display*, RGB*); 35980ee5cbfSDavid du Colombier extern ulong setalpha(ulong, uchar); 3607dd7cddfSDavid du Colombier 3617dd7cddfSDavid du Colombier /* 3627dd7cddfSDavid du Colombier * Windows 3637dd7cddfSDavid du Colombier */ 3647dd7cddfSDavid du Colombier extern Screen* allocscreen(Image*, Image*, int); 3657dd7cddfSDavid du Colombier extern Image* _allocwindow(Image*, Screen*, Rectangle, int, ulong); 3667dd7cddfSDavid du Colombier extern Image* allocwindow(Screen*, Rectangle, int, ulong); 3677dd7cddfSDavid du Colombier extern void bottomnwindows(Image**, int); 3687dd7cddfSDavid du Colombier extern void bottomwindow(Image*); 3697dd7cddfSDavid du Colombier extern int freescreen(Screen*); 3707dd7cddfSDavid du Colombier extern Screen* publicscreen(Display*, int, ulong); 3717dd7cddfSDavid du Colombier extern void topnwindows(Image**, int); 3727dd7cddfSDavid du Colombier extern void topwindow(Image*); 3737dd7cddfSDavid du Colombier extern int originwindow(Image*, Point, Point); 3747dd7cddfSDavid du Colombier 3757dd7cddfSDavid du Colombier /* 3767dd7cddfSDavid du Colombier * Geometry 3777dd7cddfSDavid du Colombier */ 3787dd7cddfSDavid du Colombier extern Point Pt(int, int); 3797dd7cddfSDavid du Colombier extern Rectangle Rect(int, int, int, int); 3807dd7cddfSDavid du Colombier extern Rectangle Rpt(Point, Point); 3817dd7cddfSDavid du Colombier extern Point addpt(Point, Point); 3827dd7cddfSDavid du Colombier extern Point subpt(Point, Point); 3837dd7cddfSDavid du Colombier extern Point divpt(Point, int); 3847dd7cddfSDavid du Colombier extern Point mulpt(Point, int); 3857dd7cddfSDavid du Colombier extern int eqpt(Point, Point); 3867dd7cddfSDavid du Colombier extern int eqrect(Rectangle, Rectangle); 3877dd7cddfSDavid du Colombier extern Rectangle insetrect(Rectangle, int); 3887dd7cddfSDavid du Colombier extern Rectangle rectaddpt(Rectangle, Point); 3897dd7cddfSDavid du Colombier extern Rectangle rectsubpt(Rectangle, Point); 3907dd7cddfSDavid du Colombier extern Rectangle canonrect(Rectangle); 3917dd7cddfSDavid du Colombier extern int rectXrect(Rectangle, Rectangle); 3927dd7cddfSDavid du Colombier extern int rectinrect(Rectangle, Rectangle); 3937dd7cddfSDavid du Colombier extern void combinerect(Rectangle*, Rectangle); 3947dd7cddfSDavid du Colombier extern int rectclip(Rectangle*, Rectangle); 3957dd7cddfSDavid du Colombier extern int ptinrect(Point, Rectangle); 3967dd7cddfSDavid du Colombier extern void replclipr(Image*, int, Rectangle); 3977dd7cddfSDavid du Colombier extern int drawreplxy(int, int, int); /* used to be drawsetxy */ 3987dd7cddfSDavid du Colombier extern Point drawrepl(Rectangle, Point); 3997dd7cddfSDavid du Colombier extern int rgb2cmap(int, int, int); 4007dd7cddfSDavid du Colombier extern int cmap2rgb(int); 4017dd7cddfSDavid du Colombier extern int cmap2rgba(int); 4027dd7cddfSDavid du Colombier extern void icossin(int, int*, int*); 4037dd7cddfSDavid du Colombier extern void icossin2(int, int, int*, int*); 4047dd7cddfSDavid du Colombier 4057dd7cddfSDavid du Colombier /* 4067dd7cddfSDavid du Colombier * Graphics 4077dd7cddfSDavid du Colombier */ 4087dd7cddfSDavid du Colombier extern void draw(Image*, Rectangle, Image*, Image*, Point); 409ac57dd0bSDavid du Colombier extern void drawop(Image*, Rectangle, Image*, Image*, Point, Drawop); 4107dd7cddfSDavid du Colombier extern void gendraw(Image*, Rectangle, Image*, Point, Image*, Point); 411ac57dd0bSDavid du Colombier extern void gendrawop(Image*, Rectangle, Image*, Point, Image*, Point, Drawop); 4127dd7cddfSDavid du Colombier extern void line(Image*, Point, Point, int, int, int, Image*, Point); 413ac57dd0bSDavid du Colombier extern void lineop(Image*, Point, Point, int, int, int, Image*, Point, Drawop); 4147dd7cddfSDavid du Colombier extern void poly(Image*, Point*, int, int, int, int, Image*, Point); 415ac57dd0bSDavid du Colombier extern void polyop(Image*, Point*, int, int, int, int, Image*, Point, Drawop); 4167dd7cddfSDavid du Colombier extern void fillpoly(Image*, Point*, int, int, Image*, Point); 417ac57dd0bSDavid du Colombier extern void fillpolyop(Image*, Point*, int, int, Image*, Point, Drawop); 4187dd7cddfSDavid du Colombier extern Point string(Image*, Point, Image*, Point, Font*, char*); 419ac57dd0bSDavid du Colombier extern Point stringop(Image*, Point, Image*, Point, Font*, char*, Drawop); 4207dd7cddfSDavid du Colombier extern Point stringn(Image*, Point, Image*, Point, Font*, char*, int); 421ac57dd0bSDavid du Colombier extern Point stringnop(Image*, Point, Image*, Point, Font*, char*, int, Drawop); 4227dd7cddfSDavid du Colombier extern Point runestring(Image*, Point, Image*, Point, Font*, Rune*); 423ac57dd0bSDavid du Colombier extern Point runestringop(Image*, Point, Image*, Point, Font*, Rune*, Drawop); 4247dd7cddfSDavid du Colombier extern Point runestringn(Image*, Point, Image*, Point, Font*, Rune*, int); 425ac57dd0bSDavid du Colombier extern Point runestringnop(Image*, Point, Image*, Point, Font*, Rune*, int, Drawop); 4267dd7cddfSDavid du Colombier extern Point stringbg(Image*, Point, Image*, Point, Font*, char*, Image*, Point); 427ac57dd0bSDavid du Colombier extern Point stringbgop(Image*, Point, Image*, Point, Font*, char*, Image*, Point, Drawop); 4287dd7cddfSDavid du Colombier extern Point stringnbg(Image*, Point, Image*, Point, Font*, char*, int, Image*, Point); 429ac57dd0bSDavid du Colombier extern Point stringnbgop(Image*, Point, Image*, Point, Font*, char*, int, Image*, Point, Drawop); 4307dd7cddfSDavid du Colombier extern Point runestringbg(Image*, Point, Image*, Point, Font*, Rune*, Image*, Point); 431ac57dd0bSDavid du Colombier extern Point runestringbgop(Image*, Point, Image*, Point, Font*, Rune*, Image*, Point, Drawop); 4327dd7cddfSDavid du Colombier extern Point runestringnbg(Image*, Point, Image*, Point, Font*, Rune*, int, Image*, Point); 433ac57dd0bSDavid du Colombier extern Point runestringnbgop(Image*, Point, Image*, Point, Font*, Rune*, int, Image*, Point, Drawop); 434ac57dd0bSDavid du Colombier extern Point _string(Image*, Point, Image*, Point, Font*, char*, Rune*, int, Rectangle, Image*, Point, Drawop); 4357dd7cddfSDavid du Colombier extern Point stringsubfont(Image*, Point, Image*, Subfont*, char*); 4367dd7cddfSDavid du Colombier extern int bezier(Image*, Point, Point, Point, Point, int, int, int, Image*, Point); 437ac57dd0bSDavid du Colombier extern int bezierop(Image*, Point, Point, Point, Point, int, int, int, Image*, Point, Drawop); 4387dd7cddfSDavid du Colombier extern int bezspline(Image*, Point*, int, int, int, int, Image*, Point); 439ac57dd0bSDavid du Colombier extern int bezsplineop(Image*, Point*, int, int, int, int, Image*, Point, Drawop); 440ac57dd0bSDavid du Colombier extern int bezsplinepts(Point*, int, Point**); 4417dd7cddfSDavid du Colombier extern int fillbezier(Image*, Point, Point, Point, Point, int, Image*, Point); 442ac57dd0bSDavid du Colombier extern int fillbezierop(Image*, Point, Point, Point, Point, int, Image*, Point, Drawop); 4437dd7cddfSDavid du Colombier extern int fillbezspline(Image*, Point*, int, int, Image*, Point); 444ac57dd0bSDavid du Colombier extern int fillbezsplineop(Image*, Point*, int, int, Image*, Point, Drawop); 4457dd7cddfSDavid du Colombier extern void ellipse(Image*, Point, int, int, int, Image*, Point); 446ac57dd0bSDavid du Colombier extern void ellipseop(Image*, Point, int, int, int, Image*, Point, Drawop); 4477dd7cddfSDavid du Colombier extern void fillellipse(Image*, Point, int, int, Image*, Point); 448ac57dd0bSDavid du Colombier extern void fillellipseop(Image*, Point, int, int, Image*, Point, Drawop); 4497dd7cddfSDavid du Colombier extern void arc(Image*, Point, int, int, int, Image*, Point, int, int); 450ac57dd0bSDavid du Colombier extern void arcop(Image*, Point, int, int, int, Image*, Point, int, int, Drawop); 4517dd7cddfSDavid du Colombier extern void fillarc(Image*, Point, int, int, Image*, Point, int, int); 452ac57dd0bSDavid du Colombier extern void fillarcop(Image*, Point, int, int, Image*, Point, int, int, Drawop); 4537dd7cddfSDavid du Colombier extern void border(Image*, Rectangle, int, Image*, Point); 454ac57dd0bSDavid du Colombier extern void borderop(Image*, Rectangle, int, Image*, Point, Drawop); 4557dd7cddfSDavid du Colombier 4567dd7cddfSDavid du Colombier /* 4577dd7cddfSDavid du Colombier * Font management 4587dd7cddfSDavid du Colombier */ 4597dd7cddfSDavid du Colombier extern Font* openfont(Display*, char*); 4607dd7cddfSDavid du Colombier extern Font* buildfont(Display*, char*, char*); 4617dd7cddfSDavid du Colombier extern void freefont(Font*); 4627dd7cddfSDavid du Colombier extern Font* mkfont(Subfont*, Rune); 4637dd7cddfSDavid du Colombier extern int cachechars(Font*, char**, Rune**, ushort*, int, int*, char**); 4647dd7cddfSDavid du Colombier extern void agefont(Font*); 4657dd7cddfSDavid du Colombier extern Subfont* allocsubfont(char*, int, int, int, Fontchar*, Image*); 4667dd7cddfSDavid du Colombier extern Subfont* lookupsubfont(Display*, char*); 4677dd7cddfSDavid du Colombier extern void installsubfont(char*, Subfont*); 4687dd7cddfSDavid du Colombier extern void uninstallsubfont(Subfont*); 4697dd7cddfSDavid du Colombier extern void freesubfont(Subfont*); 4707dd7cddfSDavid du Colombier extern Subfont* readsubfont(Display*, char*, int, int); 4717dd7cddfSDavid du Colombier extern Subfont* readsubfonti(Display*, char*, int, Image*, int); 4727dd7cddfSDavid du Colombier extern int writesubfont(int, Subfont*); 4737dd7cddfSDavid du Colombier extern void _unpackinfo(Fontchar*, uchar*, int); 4747dd7cddfSDavid du Colombier extern Point stringsize(Font*, char*); 4757dd7cddfSDavid du Colombier extern int stringwidth(Font*, char*); 4767dd7cddfSDavid du Colombier extern int stringnwidth(Font*, char*, int); 4777dd7cddfSDavid du Colombier extern Point runestringsize(Font*, Rune*); 4787dd7cddfSDavid du Colombier extern int runestringwidth(Font*, Rune*); 4797dd7cddfSDavid du Colombier extern int runestringnwidth(Font*, Rune*, int); 4807dd7cddfSDavid du Colombier extern Point strsubfontwidth(Subfont*, char*); 4817dd7cddfSDavid du Colombier extern int loadchar(Font*, Rune, Cacheinfo*, int, int, char**); 4827dd7cddfSDavid du Colombier extern char* subfontname(char*, char*, int); 4837dd7cddfSDavid du Colombier extern Subfont* _getsubfont(Display*, char*); 4847dd7cddfSDavid du Colombier extern Subfont* getdefont(Display*); 4857dd7cddfSDavid du Colombier extern void lockdisplay(Display*); 4867dd7cddfSDavid du Colombier extern void unlockdisplay(Display*); 4877dd7cddfSDavid du Colombier extern int drawlsetrefresh(ulong, int, void*, void*); 4887dd7cddfSDavid du Colombier 4897dd7cddfSDavid du Colombier /* 4907dd7cddfSDavid du Colombier * Predefined 4917dd7cddfSDavid du Colombier */ 4927dd7cddfSDavid du Colombier extern uchar defontdata[]; 4937dd7cddfSDavid du Colombier extern int sizeofdefont; 4947dd7cddfSDavid du Colombier extern Point ZP; 4957dd7cddfSDavid du Colombier extern Rectangle ZR; 4967dd7cddfSDavid du Colombier 4977dd7cddfSDavid du Colombier /* 4987dd7cddfSDavid du Colombier * Set up by initdraw() 4997dd7cddfSDavid du Colombier */ 5007dd7cddfSDavid du Colombier extern Display *display; 5017dd7cddfSDavid du Colombier extern Font *font; 5027dd7cddfSDavid du Colombier extern Image *screen; 50380ee5cbfSDavid du Colombier extern Screen *_screen; 5047dd7cddfSDavid du Colombier extern int _cursorfd; 50559cc4ca5SDavid du Colombier extern int _drawdebug; /* set to 1 to see errors from flushimage */ 506ac57dd0bSDavid du Colombier extern void _setdrawop(Display*, Drawop); 5077dd7cddfSDavid du Colombier 5087dd7cddfSDavid du Colombier #define BGSHORT(p) (((p)[0]<<0) | ((p)[1]<<8)) 5097dd7cddfSDavid du Colombier #define BGLONG(p) ((BGSHORT(p)<<0) | (BGSHORT(p+2)<<16)) 5107dd7cddfSDavid du Colombier #define BPSHORT(p, v) ((p)[0]=(v), (p)[1]=((v)>>8)) 5117dd7cddfSDavid du Colombier #define BPLONG(p, v) (BPSHORT(p, (v)), BPSHORT(p+2, (v)>>16)) 5127dd7cddfSDavid du Colombier 5137dd7cddfSDavid du Colombier /* 5149a747e4fSDavid du Colombier * Compressed image file parameters and helper routines 5157dd7cddfSDavid du Colombier */ 5167dd7cddfSDavid du Colombier #define NMATCH 3 /* shortest match possible */ 5177dd7cddfSDavid du Colombier #define NRUN (NMATCH+31) /* longest match possible */ 5187dd7cddfSDavid du Colombier #define NMEM 1024 /* window size */ 5197dd7cddfSDavid du Colombier #define NDUMP 128 /* maximum length of dump */ 5207dd7cddfSDavid du Colombier #define NCBLOCK 6000 /* size of compressed blocks */ 5219a747e4fSDavid du Colombier extern void _twiddlecompressed(uchar*, int); 5229a747e4fSDavid du Colombier extern int _compblocksize(Rectangle, int); 5237dd7cddfSDavid du Colombier 5247dd7cddfSDavid du Colombier /* XXX backwards helps; should go */ 525*bacfa46cSDavid du Colombier // extern int log2[]; /* was used by libmemlayer/line.c */ 5267dd7cddfSDavid du Colombier extern ulong drawld2chan[]; 5277dd7cddfSDavid du Colombier extern void drawsetdebug(int); 528