plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

memdraw.h (6266B)


      1 #ifndef _MEMDRAW_H_
      2 #define _MEMDRAW_H_ 1
      3 #if defined(__cplusplus)
      4 extern "C" { 
      5 #endif
      6 
      7 AUTOLIB(memdraw)
      8 AUTOLIB(memlayer)
      9 
     10 typedef struct	Memimage Memimage;
     11 typedef struct	Memdata Memdata;
     12 typedef struct	Memsubfont Memsubfont;
     13 typedef struct	Memlayer Memlayer;
     14 typedef struct	Memcmap Memcmap;
     15 typedef struct	Memdrawparam	Memdrawparam;
     16 
     17 /*
     18  * Memdata is allocated from main pool, but .data from the image pool.
     19  * Memdata is allocated separately to permit patching its pointer after
     20  * compaction when windows share the image data.
     21  * The first word of data is a back pointer to the Memdata, to find
     22  * The word to patch.
     23  */
     24 
     25 struct Memdata
     26 {
     27 	u32int	*base;	/* allocated data pointer */
     28 	uchar	*bdata;	/* pointer to first byte of actual data; word-aligned */
     29 	int	ref;	/* number of Memimages using this data */
     30 	void*	imref;
     31 	int	allocd;	/* is this malloc'd? */
     32 };
     33 
     34 enum {
     35 	Frepl	= 1<<0,	/* is replicated */
     36 	Fsimple	= 1<<1,	/* is 1x1 */
     37 	Fgrey	= 1<<2,	/* is grey */
     38 	Falpha	= 1<<3,	/* has explicit alpha */
     39 	Fcmap	= 1<<4,	/* has cmap channel */
     40 	Fbytes	= 1<<5	/* has only 8-bit channels */
     41 };
     42 
     43 struct Memimage
     44 {
     45 	Rectangle	r;	/* rectangle in data area, local coords */
     46 	Rectangle	clipr;	/* clipping region */
     47 	int		depth;	/* number of bits of storage per pixel */
     48 	int		nchan;	/* number of channels */
     49 	u32int		chan;	/* channel descriptions */
     50 	Memcmap		*cmap;
     51 
     52 	Memdata		*data;	/* pointer to data; shared by windows in this image */
     53 	int		zero;	/* data->bdata+zero==&byte containing (0,0) */
     54 	u32int		width;	/* width in words of a single scan line */
     55 	Memlayer	*layer;	/* nil if not a layer*/
     56 	u32int		flags;
     57 	void		*X;
     58 	int		screenref;	/* reference count if this is a screen */
     59 
     60 	int		shift[NChan];
     61 	int		mask[NChan];
     62 	int		nbits[NChan];
     63 };
     64 
     65 struct Memcmap
     66 {
     67 	uchar	cmap2rgb[3*256];
     68 	uchar	rgb2cmap[16*16*16];
     69 };
     70 
     71 /*
     72  * Subfonts
     73  *
     74  * given char c, Subfont *f, Fontchar *i, and Point p, one says
     75  *	i = f->info+c;
     76  *	draw(b, Rect(p.x+i->left, p.y+i->top,
     77  *		p.x+i->left+((i+1)->x-i->x), p.y+i->bottom),
     78  *		color, f->bits, Pt(i->x, i->top));
     79  *	p.x += i->width;
     80  * to draw characters in the specified color (itself a Memimage) in Memimage b.
     81  */
     82 
     83 struct	Memsubfont
     84 {
     85 	char		*name;
     86 	short		n;		/* number of chars in font */
     87 	uchar		height;		/* height of bitmap */
     88 	char		ascent;		/* top of bitmap to baseline */
     89 	Fontchar	*info;		/* n+1 character descriptors */
     90 	Memimage	*bits;		/* of font */
     91 };
     92 
     93 /*
     94  * Encapsulated parameters and information for sub-draw routines.
     95  */
     96 enum {
     97 	Simplesrc=1<<0,
     98 	Simplemask=1<<1,
     99 	Replsrc=1<<2,
    100 	Replmask=1<<3,
    101 	Fullsrc=1<<4,
    102 	Fullmask=1<<5
    103 };
    104 struct	Memdrawparam
    105 {
    106 	Memimage *dst;
    107 	Rectangle	r;
    108 	Memimage *src;
    109 	Rectangle sr;
    110 	Memimage *mask;
    111 	Rectangle mr;
    112 	int op;
    113 
    114 	u32int state;
    115 	u32int mval;	/* if Simplemask, the mask pixel in mask format */
    116 	u32int mrgba;	/* mval in rgba */
    117 	u32int sval;	/* if Simplesrc, the source pixel in src format */
    118 	u32int srgba;	/* sval in rgba */
    119 	u32int sdval;	/* sval in dst format */
    120 };
    121 
    122 /*
    123  * Memimage management
    124  */
    125 
    126 extern Memimage*	allocmemimage(Rectangle, u32int);
    127 extern Memimage*	allocmemimaged(Rectangle, u32int, Memdata*, void*);
    128 extern Memimage*	readmemimage(int);
    129 extern Memimage*	creadmemimage(int);
    130 extern int		writememimage(int, Memimage*);
    131 extern void		freememimage(Memimage*);
    132 extern int		loadmemimage(Memimage*, Rectangle, uchar*, int);
    133 extern int		cloadmemimage(Memimage*, Rectangle, uchar*, int);
    134 extern int		unloadmemimage(Memimage*, Rectangle, uchar*, int);
    135 extern u32int*		wordaddr(Memimage*, Point);
    136 extern uchar*		byteaddr(Memimage*, Point);
    137 extern int		drawclip(Memimage*, Rectangle*, Memimage*, Point*,
    138 				Memimage*, Point*, Rectangle*, Rectangle*);
    139 extern void		memfillcolor(Memimage*, u32int);
    140 extern int		memsetchan(Memimage*, u32int);
    141 extern u32int		pixelbits(Memimage*, Point);
    142 
    143 /*
    144  * Graphics
    145  */
    146 extern void	memdraw(Memimage*, Rectangle, Memimage*, Point, 
    147 			Memimage*, Point, int);
    148 extern void	memline(Memimage*, Point, Point, int, int, int,
    149 			Memimage*, Point, int);
    150 extern void	mempoly(Memimage*, Point*, int, int, int, int,
    151 			Memimage*, Point, int);
    152 extern void	memfillpoly(Memimage*, Point*, int, int,
    153 			Memimage*, Point, int);
    154 extern void	_memfillpolysc(Memimage*, Point*, int, int,
    155 			Memimage*, Point, int, int, int, int);
    156 extern void	memimagedraw(Memimage*, Rectangle, Memimage*, Point,
    157 			Memimage*, Point, int);
    158 extern int	hwdraw(Memdrawparam*);
    159 extern void	memimageline(Memimage*, Point, Point, int, int, int,
    160 			Memimage*, Point, int);
    161 extern void	_memimageline(Memimage*, Point, Point, int, int, int,
    162 			Memimage*, Point, Rectangle, int);
    163 extern Point	memimagestring(Memimage*, Point, Memimage*, Point,
    164 			Memsubfont*, char*);
    165 extern void	memellipse(Memimage*, Point, int, int, int,
    166 			Memimage*, Point, int);
    167 extern void	memarc(Memimage*, Point, int, int, int, Memimage*,
    168 			Point, int, int, int);
    169 extern Rectangle memlinebbox(Point, Point, int, int, int);
    170 extern int	memlineendsize(int);
    171 extern void	_memmkcmap(void);
    172 extern void	memimageinit(void);
    173 
    174 /*
    175  * Subfont management
    176  */
    177 extern Memsubfont*	allocmemsubfont(char*, int, int, int, Fontchar*, Memimage*);
    178 extern Memsubfont*	openmemsubfont(char*);
    179 extern void		freememsubfont(Memsubfont*);
    180 extern Point		memsubfontwidth(Memsubfont*, char*);
    181 
    182 /*
    183  * Predefined 
    184  */
    185 extern	Memimage*	memwhite;
    186 extern	Memimage*	memblack;
    187 extern	Memimage*	memopaque;
    188 extern	Memimage*	memtransparent;
    189 extern	Memcmap*	memdefcmap;
    190 
    191 /*
    192  * Kernel interface
    193  */
    194 void			memimagemove(void*, void*);
    195 
    196 /*
    197  * Kernel cruft
    198  */
    199 extern void		rdb(void);
    200 extern int		iprint(char*, ...);
    201 extern int		drawdebug;
    202 
    203 /*
    204  * For other implementations, like x11.
    205  */
    206 extern void		_memfillcolor(Memimage*, u32int);
    207 extern Memimage*	_allocmemimage(Rectangle, u32int);
    208 extern int		_cloadmemimage(Memimage*, Rectangle, uchar*, int);
    209 extern int		_loadmemimage(Memimage*, Rectangle, uchar*, int);
    210 extern void		_freememimage(Memimage*);
    211 extern u32int		_rgbatoimg(Memimage*, u32int);
    212 extern u32int		_imgtorgba(Memimage*, u32int);
    213 extern u32int		_pixelbits(Memimage*, Point);
    214 extern int		_unloadmemimage(Memimage*, Rectangle, uchar*, int);
    215 extern Memdrawparam*	_memimagedrawsetup(Memimage*,
    216 				Rectangle, Memimage*, Point, Memimage*,
    217 				Point, int);
    218 extern void		_memimagedraw(Memdrawparam*);
    219 
    220 #if defined(__cplusplus)
    221 }
    222 #endif
    223 #endif