xref: /plan9/sys/src/libdraw/draw.c (revision ac57dd0bdfb9d49ce3ebb32937bb07f2cec3da6c)
1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 
5 void
_setdrawop(Display * d,Drawop op)6 _setdrawop(Display *d, Drawop op)
7 {
8 	uchar *a;
9 
10 	if(op != SoverD){
11 		a = bufimage(d, 1+1);
12 		if(a == 0)
13 			return;
14 		a[0] = 'O';
15 		a[1] = op;
16 	}
17 }
18 
19 static void
draw1(Image * dst,Rectangle * r,Image * src,Point * p0,Image * mask,Point * p1,Drawop op)20 draw1(Image *dst, Rectangle *r, Image *src, Point *p0, Image *mask, Point *p1, Drawop op)
21 {
22 	uchar *a;
23 
24 	_setdrawop(dst->display, op);
25 
26 	a = bufimage(dst->display, 1+4+4+4+4*4+2*4+2*4);
27 	if(a == 0)
28 		return;
29 	if(src == nil)
30 		src = dst->display->black;
31 	if(mask == nil)
32 		mask = dst->display->opaque;
33 	a[0] = 'd';
34 	BPLONG(a+1, dst->id);
35 	BPLONG(a+5, src->id);
36 	BPLONG(a+9, mask->id);
37 	BPLONG(a+13, r->min.x);
38 	BPLONG(a+17, r->min.y);
39 	BPLONG(a+21, r->max.x);
40 	BPLONG(a+25, r->max.y);
41 	BPLONG(a+29, p0->x);
42 	BPLONG(a+33, p0->y);
43 	BPLONG(a+37, p1->x);
44 	BPLONG(a+41, p1->y);
45 }
46 
47 void
draw(Image * dst,Rectangle r,Image * src,Image * mask,Point p1)48 draw(Image *dst, Rectangle r, Image *src, Image *mask, Point p1)
49 {
50 	draw1(dst, &r, src, &p1, mask, &p1, SoverD);
51 }
52 
53 void
drawop(Image * dst,Rectangle r,Image * src,Image * mask,Point p1,Drawop op)54 drawop(Image *dst, Rectangle r, Image *src, Image *mask, Point p1, Drawop op)
55 {
56 	draw1(dst, &r, src, &p1, mask, &p1, op);
57 }
58 
59 void
gendraw(Image * dst,Rectangle r,Image * src,Point p0,Image * mask,Point p1)60 gendraw(Image *dst, Rectangle r, Image *src, Point p0, Image *mask, Point p1)
61 {
62 	draw1(dst, &r, src, &p0, mask, &p1, SoverD);
63 }
64 
65 void
gendrawop(Image * dst,Rectangle r,Image * src,Point p0,Image * mask,Point p1,Drawop op)66 gendrawop(Image *dst, Rectangle r, Image *src, Point p0, Image *mask, Point p1, Drawop op)
67 {
68 	draw1(dst, &r, src, &p0, mask, &p1, op);
69 }
70