Warning: Attempt to read property "date" on null in /usr/local/www/websvn.planix.org/blame.php on line 247

Warning: Attempt to read property "msg" on null in /usr/local/www/websvn.planix.org/blame.php on line 247
WebSVN – planix.SVN – Blame – /os/branches/feature-vt/sys/src/libdraw/egetrect.c – Rev 2

Subversion Repositories planix.SVN

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include <u.h>
2
#include <libc.h>
3
#include <draw.h>
4
#include <cursor.h>
5
#include <event.h>
6
 
7
#define	W	Borderwidth
8
 
9
static Image *tmp[4];
10
static Image *red;
11
 
12
static Cursor sweep={
13
	{-7, -7},
14
	{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x07,
15
	 0xE0, 0x07, 0xE0, 0x07, 0xE3, 0xF7, 0xE3, 0xF7,
16
	 0xE3, 0xE7, 0xE3, 0xF7, 0xE3, 0xFF, 0xE3, 0x7F,
17
	 0xE0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,},
18
	{0x00, 0x00, 0x7F, 0xFE, 0x40, 0x02, 0x40, 0x02,
19
	 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x41, 0xE2,
20
	 0x41, 0xC2, 0x41, 0xE2, 0x41, 0x72, 0x40, 0x38,
21
	 0x40, 0x1C, 0x40, 0x0E, 0x7F, 0xE6, 0x00, 0x00,}
22
};
23
 
24
static
25
void
26
brects(Rectangle r, Rectangle rp[4])
27
{
28
	if(Dx(r) < 2*W)
29
		r.max.x = r.min.x+2*W;
30
	if(Dy(r) < 2*W)
31
		r.max.y = r.min.y+2*W;
32
	rp[0] = Rect(r.min.x, r.min.y, r.max.x, r.min.y+W);
33
	rp[1] = Rect(r.min.x, r.max.y-W, r.max.x, r.max.y);
34
	rp[2] = Rect(r.min.x, r.min.y+W, r.min.x+W, r.max.y-W);
35
	rp[3] = Rect(r.max.x-W, r.min.y+W, r.max.x, r.max.y-W);
36
}
37
 
38
Rectangle
39
egetrect(int but, Mouse *m)
40
{
41
	Rectangle r, rc;
42
 
43
	but = 1<<(but-1);
44
	esetcursor(&sweep);
45
	while(m->buttons)
46
		*m = emouse();
47
	while(!(m->buttons & but)){
48
		*m = emouse();
49
		if(m->buttons & (7^but))
50
			goto Return;
51
	}
52
	r.min = m->xy;
53
	r.max = m->xy;
54
	do{
55
		rc = canonrect(r);
56
		edrawgetrect(rc, 1);
57
		*m = emouse();
58
		edrawgetrect(rc, 0);
59
		r.max = m->xy;
60
	}while(m->buttons == but);
61
 
62
    Return:
63
	esetcursor(0);
64
	if(m->buttons & (7^but)){
65
		rc.min.x = rc.max.x = 0;
66
		rc.min.y = rc.max.y = 0;
67
		while(m->buttons)
68
			*m = emouse();
69
	}
70
	return rc;
71
}
72
 
73
static
74
void
75
freetmp(void)
76
{
77
	freeimage(tmp[0]);
78
	freeimage(tmp[1]);
79
	freeimage(tmp[2]);
80
	freeimage(tmp[3]);
81
	freeimage(red);
82
	tmp[0] = tmp[1] = tmp[2] = tmp[3] = red = nil;
83
}
84
 
85
void
86
edrawgetrect(Rectangle rc, int up)
87
{
88
	int i;
89
	Rectangle r, rects[4];
90
 
91
	if(up && tmp[0]!=nil)
92
		if(Dx(tmp[0]->r)<Dx(rc) || Dy(tmp[2]->r)<Dy(rc))
93
			freetmp();
94
 
95
	if(tmp[0] == 0){
96
		r = Rect(0, 0, Dx(screen->r), W);
97
		tmp[0] = allocimage(display, r, screen->chan, 0, -1);
98
		tmp[1] = allocimage(display, r, screen->chan, 0, -1);
99
		r = Rect(0, 0, W, Dy(screen->r));
100
		tmp[2] = allocimage(display, r, screen->chan, 0, -1);
101
		tmp[3] = allocimage(display, r, screen->chan, 0, -1);
102
		red = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DRed);
103
		if(tmp[0]==0 || tmp[1]==0 || tmp[2]==0 || tmp[3]==0 || red==0)
104
			drawerror(display, "getrect: allocimage failed");
105
	}
106
	brects(rc, rects);
107
	if(!up){
108
		for(i=0; i<4; i++)
109
			draw(screen, rects[i], tmp[i], nil, ZP);
110
		return;
111
	}
112
	for(i=0; i<4; i++){
113
		draw(tmp[i], Rect(0, 0, Dx(rects[i]), Dy(rects[i])), screen, nil, rects[i].min);
114
		draw(screen, rects[i], red, nil, ZP);
115
	}
116
}