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