xref: /plan9/sys/src/libdraw/egetrect.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <draw.h>
47dd7cddfSDavid du Colombier #include <cursor.h>
57dd7cddfSDavid du Colombier #include <event.h>
67dd7cddfSDavid du Colombier 
77dd7cddfSDavid du Colombier #define	W	Borderwidth
87dd7cddfSDavid du Colombier 
97dd7cddfSDavid du Colombier static Image *tmp[4];
107dd7cddfSDavid du Colombier static Image *red;
117dd7cddfSDavid du Colombier 
127dd7cddfSDavid du Colombier static Cursor sweep={
137dd7cddfSDavid du Colombier 	{-7, -7},
147dd7cddfSDavid du Colombier 	{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x07,
157dd7cddfSDavid du Colombier 	 0xE0, 0x07, 0xE0, 0x07, 0xE3, 0xF7, 0xE3, 0xF7,
167dd7cddfSDavid du Colombier 	 0xE3, 0xE7, 0xE3, 0xF7, 0xE3, 0xFF, 0xE3, 0x7F,
177dd7cddfSDavid du Colombier 	 0xE0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,},
187dd7cddfSDavid du Colombier 	{0x00, 0x00, 0x7F, 0xFE, 0x40, 0x02, 0x40, 0x02,
197dd7cddfSDavid du Colombier 	 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x41, 0xE2,
207dd7cddfSDavid du Colombier 	 0x41, 0xC2, 0x41, 0xE2, 0x41, 0x72, 0x40, 0x38,
217dd7cddfSDavid du Colombier 	 0x40, 0x1C, 0x40, 0x0E, 0x7F, 0xE6, 0x00, 0x00,}
227dd7cddfSDavid du Colombier };
237dd7cddfSDavid du Colombier 
247dd7cddfSDavid du Colombier static
257dd7cddfSDavid du Colombier void
brects(Rectangle r,Rectangle rp[4])267dd7cddfSDavid du Colombier brects(Rectangle r, Rectangle rp[4])
277dd7cddfSDavid du Colombier {
287dd7cddfSDavid du Colombier 	if(Dx(r) < 2*W)
297dd7cddfSDavid du Colombier 		r.max.x = r.min.x+2*W;
307dd7cddfSDavid du Colombier 	if(Dy(r) < 2*W)
317dd7cddfSDavid du Colombier 		r.max.y = r.min.y+2*W;
327dd7cddfSDavid du Colombier 	rp[0] = Rect(r.min.x, r.min.y, r.max.x, r.min.y+W);
337dd7cddfSDavid du Colombier 	rp[1] = Rect(r.min.x, r.max.y-W, r.max.x, r.max.y);
347dd7cddfSDavid du Colombier 	rp[2] = Rect(r.min.x, r.min.y+W, r.min.x+W, r.max.y-W);
357dd7cddfSDavid du Colombier 	rp[3] = Rect(r.max.x-W, r.min.y+W, r.max.x, r.max.y-W);
367dd7cddfSDavid du Colombier }
377dd7cddfSDavid du Colombier 
387dd7cddfSDavid du Colombier Rectangle
egetrect(int but,Mouse * m)397dd7cddfSDavid du Colombier egetrect(int but, Mouse *m)
407dd7cddfSDavid du Colombier {
417dd7cddfSDavid du Colombier 	Rectangle r, rc;
427dd7cddfSDavid du Colombier 
437dd7cddfSDavid du Colombier 	but = 1<<(but-1);
447dd7cddfSDavid du Colombier 	esetcursor(&sweep);
457dd7cddfSDavid du Colombier 	while(m->buttons)
467dd7cddfSDavid du Colombier 		*m = emouse();
477dd7cddfSDavid du Colombier 	while(!(m->buttons & but)){
487dd7cddfSDavid du Colombier 		*m = emouse();
497dd7cddfSDavid du Colombier 		if(m->buttons & (7^but))
507dd7cddfSDavid du Colombier 			goto Return;
517dd7cddfSDavid du Colombier 	}
527dd7cddfSDavid du Colombier 	r.min = m->xy;
537dd7cddfSDavid du Colombier 	r.max = m->xy;
547dd7cddfSDavid du Colombier 	do{
557dd7cddfSDavid du Colombier 		rc = canonrect(r);
567dd7cddfSDavid du Colombier 		edrawgetrect(rc, 1);
577dd7cddfSDavid du Colombier 		*m = emouse();
587dd7cddfSDavid du Colombier 		edrawgetrect(rc, 0);
597dd7cddfSDavid du Colombier 		r.max = m->xy;
607dd7cddfSDavid du Colombier 	}while(m->buttons == but);
617dd7cddfSDavid du Colombier 
627dd7cddfSDavid du Colombier     Return:
637dd7cddfSDavid du Colombier 	esetcursor(0);
647dd7cddfSDavid du Colombier 	if(m->buttons & (7^but)){
657dd7cddfSDavid du Colombier 		rc.min.x = rc.max.x = 0;
667dd7cddfSDavid du Colombier 		rc.min.y = rc.max.y = 0;
677dd7cddfSDavid du Colombier 		while(m->buttons)
687dd7cddfSDavid du Colombier 			*m = emouse();
697dd7cddfSDavid du Colombier 	}
707dd7cddfSDavid du Colombier 	return rc;
717dd7cddfSDavid du Colombier }
727dd7cddfSDavid du Colombier 
73*9a747e4fSDavid du Colombier static
74*9a747e4fSDavid du Colombier void
freetmp(void)75*9a747e4fSDavid du Colombier freetmp(void)
76*9a747e4fSDavid du Colombier {
77*9a747e4fSDavid du Colombier 	freeimage(tmp[0]);
78*9a747e4fSDavid du Colombier 	freeimage(tmp[1]);
79*9a747e4fSDavid du Colombier 	freeimage(tmp[2]);
80*9a747e4fSDavid du Colombier 	freeimage(tmp[3]);
81*9a747e4fSDavid du Colombier 	freeimage(red);
82*9a747e4fSDavid du Colombier 	tmp[0] = tmp[1] = tmp[2] = tmp[3] = red = nil;
83*9a747e4fSDavid du Colombier }
84*9a747e4fSDavid du Colombier 
857dd7cddfSDavid du Colombier void
edrawgetrect(Rectangle rc,int up)867dd7cddfSDavid du Colombier edrawgetrect(Rectangle rc, int up)
877dd7cddfSDavid du Colombier {
887dd7cddfSDavid du Colombier 	int i;
897dd7cddfSDavid du Colombier 	Rectangle r, rects[4];
907dd7cddfSDavid du Colombier 
91*9a747e4fSDavid du Colombier 	if(up && tmp[0]!=nil)
92*9a747e4fSDavid du Colombier 		if(Dx(tmp[0]->r)<Dx(rc) || Dy(tmp[2]->r)<Dy(rc))
93*9a747e4fSDavid du Colombier 			freetmp();
94*9a747e4fSDavid du Colombier 
957dd7cddfSDavid du Colombier 	if(tmp[0] == 0){
96*9a747e4fSDavid du Colombier 		r = Rect(0, 0, Dx(screen->r), W);
97*9a747e4fSDavid du Colombier 		tmp[0] = allocimage(display, r, screen->chan, 0, -1);
98*9a747e4fSDavid du Colombier 		tmp[1] = allocimage(display, r, screen->chan, 0, -1);
99*9a747e4fSDavid du Colombier 		r = Rect(0, 0, W, Dy(screen->r));
100*9a747e4fSDavid du Colombier 		tmp[2] = allocimage(display, r, screen->chan, 0, -1);
101*9a747e4fSDavid du Colombier 		tmp[3] = allocimage(display, r, screen->chan, 0, -1);
102*9a747e4fSDavid du Colombier 		red = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DRed);
1037dd7cddfSDavid du Colombier 		if(tmp[0]==0 || tmp[1]==0 || tmp[2]==0 || tmp[3]==0 || red==0)
1047dd7cddfSDavid du Colombier 			drawerror(display, "getrect: allocimage failed");
1057dd7cddfSDavid du Colombier 	}
1067dd7cddfSDavid du Colombier 	brects(rc, rects);
1077dd7cddfSDavid du Colombier 	if(!up){
1087dd7cddfSDavid du Colombier 		for(i=0; i<4; i++)
1097dd7cddfSDavid du Colombier 			draw(screen, rects[i], tmp[i], nil, ZP);
1107dd7cddfSDavid du Colombier 		return;
1117dd7cddfSDavid du Colombier 	}
1127dd7cddfSDavid du Colombier 	for(i=0; i<4; i++){
1137dd7cddfSDavid du Colombier 		draw(tmp[i], Rect(0, 0, Dx(rects[i]), Dy(rects[i])), screen, nil, rects[i].min);
1147dd7cddfSDavid du Colombier 		draw(screen, rects[i], red, nil, ZP);
1157dd7cddfSDavid du Colombier 	}
1167dd7cddfSDavid du Colombier }
117