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