Commit Diff


commit - 522b0689c340d26feeac360640bf7e2e0582353c
commit + 55dedf713c04d00add59ba54464150b3a5a3aa60
blob - /dev/null
blob + 08784ce92540af3156204a8190ee46eab1e4ab11 (mode 644)
--- /dev/null
+++ include/memdraw.h
@@ -0,0 +1,209 @@
+typedef struct	Memimage Memimage;
+typedef struct	Memdata Memdata;
+typedef struct	Memsubfont Memsubfont;
+typedef struct	Memlayer Memlayer;
+typedef struct	Memcmap Memcmap;
+typedef struct	Memdrawparam	Memdrawparam;
+
+/*
+ * Memdata is allocated from main pool, but .data from the image pool.
+ * Memdata is allocated separately to permit patching its pointer after
+ * compaction when windows share the image data.
+ * The first word of data is a back pointer to the Memdata, to find
+ * The word to patch.
+ */
+
+struct Memdata
+{
+	u32int	*base;	/* allocated data pointer */
+	uchar	*bdata;	/* pointer to first byte of actual data; word-aligned */
+	int	ref;	/* number of Memimages using this data */
+	void*	imref;
+	int	allocd;	/* is this malloc'd? */
+};
+
+enum {
+	Frepl	= 1<<0,	/* is replicated */
+	Fsimple	= 1<<1,	/* is 1x1 */
+	Fgrey	= 1<<2,	/* is grey */
+	Falpha	= 1<<3,	/* has explicit alpha */
+	Fcmap	= 1<<4,	/* has cmap channel */
+	Fbytes	= 1<<5,	/* has only 8-bit channels */
+};
+
+struct Memimage
+{
+	Rectangle	r;	/* rectangle in data area, local coords */
+	Rectangle	clipr;	/* clipping region */
+	int		depth;	/* number of bits of storage per pixel */
+	int		nchan;	/* number of channels */
+	u32int		chan;	/* channel descriptions */
+	Memcmap		*cmap;
+
+	Memdata		*data;	/* pointer to data; shared by windows in this image */
+	int		zero;	/* data->bdata+zero==&byte containing (0,0) */
+	u32int		width;	/* width in words of a single scan line */
+	Memlayer	*layer;	/* nil if not a layer*/
+	u32int		flags;
+	void		*X;
+
+	int		shift[NChan];
+	int		mask[NChan];
+	int		nbits[NChan];
+};
+
+struct Memcmap
+{
+	uchar	cmap2rgb[3*256];
+	uchar	rgb2cmap[16*16*16];
+};
+
+/*
+ * Subfonts
+ *
+ * given char c, Subfont *f, Fontchar *i, and Point p, one says
+ *	i = f->info+c;
+ *	draw(b, Rect(p.x+i->left, p.y+i->top,
+ *		p.x+i->left+((i+1)->x-i->x), p.y+i->bottom),
+ *		color, f->bits, Pt(i->x, i->top));
+ *	p.x += i->width;
+ * to draw characters in the specified color (itself a Memimage) in Memimage b.
+ */
+
+struct	Memsubfont
+{
+	char		*name;
+	short		n;		/* number of chars in font */
+	uchar		height;		/* height of bitmap */
+	char		ascent;		/* top of bitmap to baseline */
+	Fontchar	*info;		/* n+1 character descriptors */
+	Memimage	*bits;		/* of font */
+};
+
+/*
+ * Encapsulated parameters and information for sub-draw routines.
+ */
+enum {
+	Simplesrc=1<<0,
+	Simplemask=1<<1,
+	Replsrc=1<<2,
+	Replmask=1<<3,
+	Fullmask=1<<4,
+};
+struct	Memdrawparam
+{
+	Memimage *dst;
+	Rectangle	r;
+	Memimage *src;
+	Rectangle sr;
+	Memimage *mask;
+	Rectangle mr;
+	int op;
+
+	u32int state;
+	u32int mval;	/* if Simplemask, the mask pixel in mask format */
+	u32int mrgba;	/* mval in rgba */
+	u32int sval;	/* if Simplesrc, the source pixel in src format */
+	u32int srgba;	/* sval in rgba */
+	u32int sdval;	/* sval in dst format */
+};
+
+/*
+ * Memimage management
+ */
+
+extern Memimage*	allocmemimage(Rectangle, u32int);
+extern Memimage*	allocmemimaged(Rectangle, u32int, Memdata*, void*);
+extern Memimage*	readmemimage(int);
+extern Memimage*	creadmemimage(int);
+extern int		writememimage(int, Memimage*);
+extern void		freememimage(Memimage*);
+extern int		loadmemimage(Memimage*, Rectangle, uchar*, int);
+extern int		cloadmemimage(Memimage*, Rectangle, uchar*, int);
+extern int		unloadmemimage(Memimage*, Rectangle, uchar*, int);
+extern u32int*		wordaddr(Memimage*, Point);
+extern uchar*		byteaddr(Memimage*, Point);
+extern int		drawclip(Memimage*, Rectangle*, Memimage*, Point*,
+				Memimage*, Point*, Rectangle*, Rectangle*);
+extern void		memfillcolor(Memimage*, u32int);
+extern int		memsetchan(Memimage*, u32int);
+extern u32int		pixelbits(Memimage*, Point);
+
+/*
+ * Graphics
+ */
+extern void	memdraw(Memimage*, Rectangle, Memimage*, Point, 
+			Memimage*, Point, int);
+extern void	memline(Memimage*, Point, Point, int, int, int,
+			Memimage*, Point, int);
+extern void	mempoly(Memimage*, Point*, int, int, int, int,
+			Memimage*, Point, int);
+extern void	memfillpoly(Memimage*, Point*, int, int,
+			Memimage*, Point, int);
+extern void	_memfillpolysc(Memimage*, Point*, int, int,
+			Memimage*, Point, int, int, int, int);
+extern void	memimagedraw(Memimage*, Rectangle, Memimage*, Point,
+			Memimage*, Point, int);
+extern int	hwdraw(Memdrawparam*);
+extern void	memimageline(Memimage*, Point, Point, int, int, int,
+			Memimage*, Point, int);
+extern void	_memimageline(Memimage*, Point, Point, int, int, int,
+			Memimage*, Point, Rectangle, int);
+extern Point	memimagestring(Memimage*, Point, Memimage*, Point,
+			Memsubfont*, char*);
+extern void	memellipse(Memimage*, Point, int, int, int,
+			Memimage*, Point, int);
+extern void	memarc(Memimage*, Point, int, int, int, Memimage*,
+			Point, int, int, int);
+extern Rectangle memlinebbox(Point, Point, int, int, int);
+extern int	memlineendsize(int);
+extern void	_memmkcmap(void);
+extern void	memimageinit(void);
+
+/*
+ * Subfont management
+ */
+extern Memsubfont*	allocmemsubfont(char*, int, int, int, Fontchar*, Memimage*);
+extern Memsubfont*	openmemsubfont(char*);
+extern void		freememsubfont(Memsubfont*);
+extern Point		memsubfontwidth(Memsubfont*, char*);
+extern Memsubfont*	getmemdefont(void);
+
+/*
+ * Predefined 
+ */
+extern	Memimage*	memwhite;
+extern	Memimage*	memblack;
+extern	Memimage*	memopaque;
+extern	Memimage*	memtransparent;
+extern	Memcmap*	memdefcmap;
+
+/*
+ * Kernel interface
+ */
+void			memimagemove(void*, void*);
+
+/*
+ * Kernel cruft
+ */
+extern void		rdb(void);
+extern int		iprint(char*, ...);
+extern int		drawdebug;
+
+/*
+ * For other implementations, like x11.
+ */
+extern void		_memfillcolor(Memimage*, u32int);
+extern Memimage*	_allocmemimage(Rectangle, u32int);
+extern int		_cloadmemimage(Memimage*, Rectangle, uchar*, int);
+extern int		_loadmemimage(Memimage*, Rectangle, uchar*, int);
+extern void		_freememimage(Memimage*);
+extern u32int		_rgbatoimg(Memimage*, u32int);
+extern u32int		_imgtorgba(Memimage*, u32int);
+extern u32int		_pixelbits(Memimage*, Point);
+extern int		_unloadmemimage(Memimage*, Rectangle, uchar*, int);
+extern Memdrawparam*	_memimagedrawsetup(Memimage*,
+				Rectangle, Memimage*, Point, Memimage*,
+				Point, int);
+extern void		_memimagedraw(Memdrawparam*);
+extern void		_drawreplacescreenimage(Memimage*);
blob - /dev/null
blob + 36d87767db6a4a0d1294cdb813854f5d866cafa0 (mode 644)
--- /dev/null
+++ include/memlayer.h
@@ -0,0 +1,48 @@
+typedef struct Memscreen Memscreen;
+typedef void (*Refreshfn)(Memimage*, Rectangle, void*);
+
+struct Memscreen
+{
+	Memimage	*frontmost;	/* frontmost layer on screen */
+	Memimage	*rearmost;	/* rearmost layer on screen */
+	Memimage	*image;		/* upon which all layers are drawn */
+	Memimage	*fill;			/* if non-zero, picture to use when repainting */
+};
+
+struct Memlayer
+{
+	Rectangle		screenr;	/* true position of layer on screen */
+	Point			delta;	/* add delta to go from image coords to screen */
+	Memscreen	*screen;	/* screen this layer belongs to */
+	Memimage	*front;	/* window in front of this one */
+	Memimage	*rear;	/* window behind this one*/
+	int		clear;	/* layer is fully visible */
+	Memimage	*save;	/* save area for obscured parts */
+	Refreshfn	refreshfn;		/* function to call to refresh obscured parts if save==nil */
+	void		*refreshptr;	/* argument to refreshfn */
+};
+
+/*
+ * These functions accept local coordinates
+ */
+int			memload(Memimage*, Rectangle, uchar*, int, int);
+int			memunload(Memimage*, Rectangle, uchar*, int);
+
+/*
+ * All these functions accept screen coordinates, not local ones.
+ */
+void			_memlayerop(void (*fn)(Memimage*, Rectangle, Rectangle, void*, int), Memimage*, Rectangle, Rectangle, void*);
+Memimage*	memlalloc(Memscreen*, Rectangle, Refreshfn, void*, u32int);
+void			memldelete(Memimage*);
+void			memlfree(Memimage*);
+void			memltofront(Memimage*);
+void			memltofrontn(Memimage**, int);
+void			_memltofrontfill(Memimage*, int);
+void			memltorear(Memimage*);
+void			memltorearn(Memimage**, int);
+int			memlsetrefresh(Memimage*, Refreshfn, void*);
+void			memlhide(Memimage*, Rectangle);
+void			memlexpose(Memimage*, Rectangle);
+void			_memlsetclear(Memscreen*);
+int			memlorigin(Memimage*, Point, Point);
+void			memlnorefresh(Memimage*, Rectangle, void*);