xref: /plan9/sys/src/libdraw/poly.c (revision ac57dd0bdfb9d49ce3ebb32937bb07f2cec3da6c)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <draw.h>
47dd7cddfSDavid du Colombier 
57dd7cddfSDavid du Colombier static
67dd7cddfSDavid du Colombier uchar*
addcoord(uchar * p,int oldx,int newx)77dd7cddfSDavid du Colombier addcoord(uchar *p, int oldx, int newx)
87dd7cddfSDavid du Colombier {
97dd7cddfSDavid du Colombier 	int dx;
107dd7cddfSDavid du Colombier 
117dd7cddfSDavid du Colombier 	dx = newx-oldx;
127dd7cddfSDavid du Colombier 	/* does dx fit in 7 signed bits? */
137dd7cddfSDavid du Colombier 	if((unsigned)(dx - -0x40) <= 0x7F)
147dd7cddfSDavid du Colombier 		*p++ = dx&0x7F;
157dd7cddfSDavid du Colombier 	else{
167dd7cddfSDavid du Colombier 		*p++ = 0x80 | (newx&0x7F);
177dd7cddfSDavid du Colombier 		*p++ = newx>>7;
187dd7cddfSDavid du Colombier 		*p++ = newx>>15;
197dd7cddfSDavid du Colombier 	}
207dd7cddfSDavid du Colombier 	return p;
217dd7cddfSDavid du Colombier }
227dd7cddfSDavid du Colombier 
237dd7cddfSDavid du Colombier static
247dd7cddfSDavid du Colombier void
dopoly(int cmd,Image * dst,Point * pp,int np,int end0,int end1,int radius,Image * src,Point * sp,Drawop op)25*ac57dd0bSDavid du Colombier dopoly(int cmd, Image *dst, Point *pp, int np, int end0, int end1, int radius, Image *src, Point *sp, Drawop op)
267dd7cddfSDavid du Colombier {
277dd7cddfSDavid du Colombier 	uchar *a, *t, *u;
287dd7cddfSDavid du Colombier 	int i, ox, oy;
297dd7cddfSDavid du Colombier 
307dd7cddfSDavid du Colombier 	if(np == 0)
317dd7cddfSDavid du Colombier 		return;
327dd7cddfSDavid du Colombier 	t = malloc(np*2*3);
337dd7cddfSDavid du Colombier 	if(t == nil)
347dd7cddfSDavid du Colombier 		return;
357dd7cddfSDavid du Colombier 	u = t;
367dd7cddfSDavid du Colombier 	ox = oy = 0;
377dd7cddfSDavid du Colombier 	for(i=0; i<np; i++){
387dd7cddfSDavid du Colombier 		u = addcoord(u, ox, pp[i].x);
397dd7cddfSDavid du Colombier 		ox = pp[i].x;
407dd7cddfSDavid du Colombier 		u = addcoord(u, oy, pp[i].y);
417dd7cddfSDavid du Colombier 		oy = pp[i].y;
427dd7cddfSDavid du Colombier 	}
43*ac57dd0bSDavid du Colombier 
44*ac57dd0bSDavid du Colombier 	_setdrawop(dst->display, op);
45*ac57dd0bSDavid du Colombier 
467dd7cddfSDavid du Colombier 	a = bufimage(dst->display, 1+4+2+4+4+4+4+2*4+(u-t));
477dd7cddfSDavid du Colombier 	if(a == 0){
487dd7cddfSDavid du Colombier 		free(t);
499a747e4fSDavid du Colombier 		fprint(2, "image poly: %r\n");
507dd7cddfSDavid du Colombier 		return;
517dd7cddfSDavid du Colombier 	}
527dd7cddfSDavid du Colombier 	a[0] = cmd;
537dd7cddfSDavid du Colombier 	BPLONG(a+1, dst->id);
547dd7cddfSDavid du Colombier 	BPSHORT(a+5, np-1);
557dd7cddfSDavid du Colombier 	BPLONG(a+7, end0);
567dd7cddfSDavid du Colombier 	BPLONG(a+11, end1);
577dd7cddfSDavid du Colombier 	BPLONG(a+15, radius);
587dd7cddfSDavid du Colombier 	BPLONG(a+19, src->id);
597dd7cddfSDavid du Colombier 	BPLONG(a+23, sp->x);
607dd7cddfSDavid du Colombier 	BPLONG(a+27, sp->y);
617dd7cddfSDavid du Colombier 	memmove(a+31, t, u-t);
627dd7cddfSDavid du Colombier 	free(t);
637dd7cddfSDavid du Colombier }
647dd7cddfSDavid du Colombier 
657dd7cddfSDavid du Colombier void
poly(Image * dst,Point * p,int np,int end0,int end1,int radius,Image * src,Point sp)667dd7cddfSDavid du Colombier poly(Image *dst, Point *p, int np, int end0, int end1, int radius, Image *src, Point sp)
677dd7cddfSDavid du Colombier {
68*ac57dd0bSDavid du Colombier 	dopoly('p', dst, p, np, end0, end1, radius, src, &sp, SoverD);
69*ac57dd0bSDavid du Colombier }
70*ac57dd0bSDavid du Colombier 
71*ac57dd0bSDavid du Colombier void
polyop(Image * dst,Point * p,int np,int end0,int end1,int radius,Image * src,Point sp,Drawop op)72*ac57dd0bSDavid du Colombier polyop(Image *dst, Point *p, int np, int end0, int end1, int radius, Image *src, Point sp, Drawop op)
73*ac57dd0bSDavid du Colombier {
74*ac57dd0bSDavid du Colombier 	dopoly('p', dst, p, np, end0, end1, radius, src, &sp, op);
757dd7cddfSDavid du Colombier }
767dd7cddfSDavid du Colombier 
777dd7cddfSDavid du Colombier void
fillpoly(Image * dst,Point * p,int np,int wind,Image * src,Point sp)787dd7cddfSDavid du Colombier fillpoly(Image *dst, Point *p, int np, int wind, Image *src, Point sp)
797dd7cddfSDavid du Colombier {
80*ac57dd0bSDavid du Colombier 	dopoly('P', dst, p, np, wind, 0, 0, src, &sp, SoverD);
81*ac57dd0bSDavid du Colombier }
82*ac57dd0bSDavid du Colombier 
83*ac57dd0bSDavid du Colombier void
fillpolyop(Image * dst,Point * p,int np,int wind,Image * src,Point sp,Drawop op)84*ac57dd0bSDavid du Colombier fillpolyop(Image *dst, Point *p, int np, int wind, Image *src, Point sp, Drawop op)
85*ac57dd0bSDavid du Colombier {
86*ac57dd0bSDavid du Colombier 	dopoly('P', dst, p, np, wind, 0, 0, src, &sp, op);
877dd7cddfSDavid du Colombier }
88