2011-11-01 00:39:52 +00:00
|
|
|
#include <u.h>
|
|
|
|
#include <libc.h>
|
|
|
|
#include <draw.h>
|
|
|
|
#include <event.h>
|
|
|
|
|
|
|
|
void
|
|
|
|
eresized(int)
|
|
|
|
{
|
|
|
|
if(getwindow(display, Refnone) < 0)
|
|
|
|
sysfatal("resize failed");
|
|
|
|
}
|
|
|
|
|
2012-02-29 00:47:26 +00:00
|
|
|
int
|
2012-02-28 02:15:37 +00:00
|
|
|
loadimg(char *name)
|
|
|
|
{
|
|
|
|
Image *b;
|
|
|
|
int fd;
|
|
|
|
|
2012-02-29 00:47:26 +00:00
|
|
|
if((fd = open(name, OREAD)) < 0)
|
|
|
|
return -1;
|
|
|
|
else {
|
|
|
|
if((b = readimage(display, fd, 0)) == nil){
|
|
|
|
close(fd);
|
|
|
|
return -1;
|
|
|
|
} else {
|
|
|
|
draw(screen, screen->r, b, 0, b->r.min);
|
|
|
|
flushimage(display, 1);
|
|
|
|
freeimage(b);
|
|
|
|
}
|
|
|
|
close(fd);
|
|
|
|
}
|
2012-02-28 02:15:37 +00:00
|
|
|
}
|
|
|
|
|
2012-02-29 00:47:26 +00:00
|
|
|
int
|
|
|
|
saveimg(char *name)
|
2011-11-01 00:39:52 +00:00
|
|
|
{
|
|
|
|
int fd;
|
|
|
|
|
2012-02-29 00:47:26 +00:00
|
|
|
if((fd = create(name, OWRITE|OTRUNC, 0666)) < 0)
|
|
|
|
return -1;
|
|
|
|
writeimage(fd, screen, 0);
|
2011-11-01 00:39:52 +00:00
|
|
|
close(fd);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2012-02-28 02:15:37 +00:00
|
|
|
main(int argc, char *argv[])
|
2011-11-01 00:39:52 +00:00
|
|
|
{
|
|
|
|
Event e;
|
|
|
|
Point last;
|
|
|
|
int haslast;
|
2011-12-10 03:18:20 +00:00
|
|
|
int brushsize = 1;
|
|
|
|
char brush[128];
|
2011-11-01 00:39:52 +00:00
|
|
|
char file[128];
|
|
|
|
|
|
|
|
haslast = 0;
|
2011-12-10 22:01:15 +00:00
|
|
|
if(initdraw(0, 0, "paint") < 0){
|
|
|
|
fprint(2, "paint: initdraw failed: %r\n");
|
|
|
|
exits("initdraw");
|
|
|
|
}
|
2011-11-01 00:39:52 +00:00
|
|
|
einit(Emouse | Ekeyboard);
|
|
|
|
draw(screen, screen->r, display->white, 0, ZP);
|
|
|
|
flushimage(display, 1);
|
2012-02-28 02:15:37 +00:00
|
|
|
|
|
|
|
ARGBEGIN{
|
|
|
|
default:
|
|
|
|
goto Usage;
|
|
|
|
}ARGEND
|
|
|
|
switch(argc){
|
|
|
|
default:
|
|
|
|
Usage:
|
|
|
|
fprint(2, "Usage: [file]\n");
|
|
|
|
exits("usage");
|
|
|
|
case 0:
|
|
|
|
break;
|
|
|
|
case 1:
|
2012-02-29 00:47:26 +00:00
|
|
|
if(loadimg(argv[0]) < 0)
|
|
|
|
sysfatal("%r");
|
2012-02-28 02:15:37 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2011-11-01 00:39:52 +00:00
|
|
|
while(1){
|
|
|
|
switch(event(&e)){
|
|
|
|
case Emouse:
|
|
|
|
if(e.mouse.buttons & 1){
|
|
|
|
if(haslast)
|
2011-12-10 03:18:20 +00:00
|
|
|
line(screen, last, e.mouse.xy, Enddisc, Enddisc, brushsize, display->black, ZP);
|
2011-11-01 00:39:52 +00:00
|
|
|
else
|
2011-12-10 03:18:20 +00:00
|
|
|
fillellipse(screen, e.mouse.xy, brushsize, brushsize, display->black, ZP);
|
2011-11-01 00:39:52 +00:00
|
|
|
|
|
|
|
last = e.mouse.xy;
|
|
|
|
haslast = 1;
|
|
|
|
flushimage(display, 1);
|
|
|
|
} else
|
|
|
|
haslast = 0;
|
|
|
|
if(e.mouse.buttons & 4){
|
2011-12-10 03:18:20 +00:00
|
|
|
fillellipse(screen, e.mouse.xy, brushsize, brushsize, display->white, ZP);
|
2011-11-01 00:39:52 +00:00
|
|
|
flushimage(display, 1);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case Ekeyboard:
|
2011-12-10 03:18:20 +00:00
|
|
|
if(e.kbdc == 'b'){
|
|
|
|
if(eenter("Brush", brush, sizeof(brush), &e.mouse) <= 0)
|
|
|
|
break;
|
|
|
|
brushsize = atoi(brush);
|
|
|
|
}
|
2011-11-01 00:39:52 +00:00
|
|
|
if(e.kbdc == 'c')
|
|
|
|
draw(screen, screen->r, display->white, 0, ZP);
|
2012-02-28 02:15:37 +00:00
|
|
|
if(e.kbdc == 'o'){
|
|
|
|
if(eenter("Open file", file, sizeof(file), &e.mouse) <= 0)
|
|
|
|
break;
|
2012-02-29 00:47:26 +00:00
|
|
|
if(loadimg(file) < 0){
|
|
|
|
rerrstr(file, sizeof(file));
|
|
|
|
eenter(file, 0, 0, &e.mouse);
|
|
|
|
}
|
2012-02-28 02:15:37 +00:00
|
|
|
}
|
2011-12-10 03:18:20 +00:00
|
|
|
if(e.kbdc == 'q')
|
|
|
|
exits(nil);
|
2011-11-01 00:39:52 +00:00
|
|
|
if(e.kbdc == 's'){
|
|
|
|
if(eenter("Save to", file, sizeof(file), &e.mouse) <= 0)
|
|
|
|
break;
|
2012-02-29 00:47:26 +00:00
|
|
|
if(saveimg(file) < 0){
|
|
|
|
rerrstr(file, sizeof(file));
|
|
|
|
eenter(file, 0, 0, &e.mouse);
|
|
|
|
}
|
2011-11-01 00:39:52 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|