1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
#include <u.h>
#include <libc.h>
#include <draw.h>
#include <event.h>
void
eresized(int)
{
if(getwindow(display, Refnone) < 0)
sysfatal("resize failed");
}
/* stolen from mothra */
void
screendump(char *name, int full)
{
Image *b;
int fd;
fd=create(name, OWRITE|OTRUNC, 0666);
if(fd==-1)
sysfatal("can't create file");
if(full){
writeimage(fd, screen, 0);
} else {
if((b=allocimage(display, screen->r, screen->chan, 0, DNofill)) == nil){
close(fd);
sysfatal("can't allocate image");
}
draw(b, b->r, screen, 0, b->r.min);
writeimage(fd, b, 0);
freeimage(b);
}
close(fd);
}
void
main()
{
Event e;
Point last;
int haslast;
char file[128];
haslast = 0;
if(initdraw(0, 0, "paint") < 0){
fprint(2, "paint: initdraw failed: %r\n");
exits("initdraw");
}
einit(Emouse | Ekeyboard);
draw(screen, screen->r, display->white, 0, ZP);
flushimage(display, 1);
while(1){
switch(event(&e)){
case Emouse:
if(e.mouse.buttons & 1){
if(haslast)
line(screen, last, e.mouse.xy, Enddisc, Enddisc, 5, display->black, ZP);
else
fillellipse(screen, e.mouse.xy, 5, 5, display->black, ZP);
last = e.mouse.xy;
haslast = 1;
flushimage(display, 1);
} else
haslast = 0;
if(e.mouse.buttons & 4){
fillellipse(screen, e.mouse.xy, 5, 5, display->white, ZP);
flushimage(display, 1);
}
break;
case Ekeyboard:
if(e.kbdc == 'q')
exits(nil);
if(e.kbdc == 'c')
draw(screen, screen->r, display->white, 0, ZP);
if(e.kbdc == 's'){
snprint(file, sizeof(file), "out.bit");
if(eenter("Save to", file, sizeof(file), &e.mouse) <= 0)
break;
screendump(file, 0);
}
break;
}
}
}
|