|
|
1.1 root 1: #include <u.h>
2: #include <gnot.h>
3: #include <event.h>
4:
5: Bitmap display;
6: Font *defont;
7: int w,h;
8:
9: main(argc,argv)
10: char *argv[];
11: {
12: Bitmap *b,*m;
13: int fd;
14: ginit();
15: einit();
16: if (argc != 4) {
17: fprint(2,"usage: matte w h file\n");
18: exit(0);
19: }
20: w = atoi(argv[1]);
21: h = atoi(argv[2]);
22: if ((fd = open(argv[3],0)) < 0) {
23: fprint(2,"can't open %s\n",argv[3]);
24: exit(0);
25: }
26: b = balloc(Rect(0,0,w,h),3);
27: m = balloc(Rect(0,0,w,h),1);
28: bitblt(m,m->rect.min,m,m->rect,F);
29: myread(fd,b->base,w*h);
30: close(fd);
31: dispfs(b,m);
32: edit(b,m,argv[3]);
33: }
34:
35: dispfs(b,m)
36: Bitmap *b,*m;
37: {
38: Bitmap *r;
39: r = balloc(b->rect,b->ldepth);
40: bitblt(r,r->rect.min,b,b->rect,S);
41: bitblt(r,r->rect.min,m,m->rect,S&D);
42: fs(r);
43: bitblt(&display,display.rect.min,r,r->rect,S);
44: bfree(r);
45: }
46:
47: char *fsizes[] = {"4", "7", "12", "25", "80", "150", 0};
48: Menu sizes = {fsizes};
49:
50: enum {REMOVE, RESTORE, WRITE, EXIT};
51: char *fmenu[] = {"remove", "restore", "write", "exit", 0};
52: Menu commands = {fmenu};
53:
54: #define DR(n) raddp(Rect(0,0,n,n),display.rect.min)
55:
56: edit(b,m,file)
57: Bitmap *b,*m;
58: char *file;
59: {
60: Event *e;
61: Point p;
62: Bitmap *res,*brush=0;
63: int i,fd,size=25,wannago = 0;
64: int mode=0;
65: while (1) {
66: switch ((e = getevent())->type) {
67: case MOUSE:
68: if (mouse.buttons&1) {
69: p = sub(mouse.xy,Pt(size/2,size/2));
70: docursor(0);
71: bitblt(&display,p,&display,DR(size),F-mode);
72: docursor(size);
73: bitblt(m,sub(p,display.rect.min),m,Rect(0,0,size,size),mode);
74: }
75: else if (mouse.buttons&2) {
76: if ((i = menuhit(&sizes,2)) == -1)
77: break;
78: size = atoi(fsizes[i]);
79: docursor(size);
80: }
81: else if (mouse.buttons&4)
82: switch (menuhit(&commands,3)) {
83: case -1:
84: break;
85: case REMOVE:
86: mode = 0;
87: docursor(0);
88: dispfs(b,m);
89: docursor(size);
90: break;
91: case RESTORE:
92: mode = F;
93: docursor(0);
94: bitblt(&display,display.rect.min,m,m->rect,notS);
95: docursor(size);
96: break;
97: case WRITE:
98: res = balloc(Rect(0,0,w,h),3);
99: /*
100: bitblt(res,Pt(0,0),b,b->rect,S);
101: bitblt(res,Pt(0,0),m,m->rect,S&D);
102: */
103: bitblt(res,Pt(0,0),m,m->rect,S);
104: if ((fd = create("matte",1,0666)) < 0) {
105: fprint("can't create matte file\n");
106: continue;
107: }
108: mywrite(fd,res->base,w*h);
109: close(fd);
110: bfree(res);
111: break;
112: case EXIT:
113: if (wannago)
114: exit(0);
115: else {
116: wannago = 1;
117: continue;
118: }
119: break;
120: }
121: wannago = 0;
122: docursor(size);
123: default:
124: break;
125: }
126: }
127: }
128:
129: docursor(n)
130: {
131: static Point pt;
132: static size;
133: if (size != 0)
134: cursoroff();
135: bitblt(&display,sub(pt,Pt(size/2,size/2)),&display,DR(size),notD);
136: pt = mouse.xy;
137: size = n;
138: bitblt(&display,sub(pt,Pt(size/2,size/2)),&display,DR(size),notD);
139: if (size != 0)
140: cursoron();
141: }
142:
143: ushort prop[1024];
144: uchar bright[] = {192,128,64,0};
145:
146: fs(b)
147: Bitmap *b;
148: {
149: int i,j,w,h,save,next,e,x;
150: uchar *p;
151: ushort *q;
152: w = b->rect.max.x;
153: h = b->rect.max.y;
154: for (i = 0; i < h; i++) {
155: p = (uchar *) addr(b,Pt(0,i));
156: save = next = 0;
157: q = prop;
158: for (j = 0; j < w; j++) {
159: x = *p + *q + next;
160: if (x > 255)
161: x = 255;
162: e = x&0x3f;
163: next = (e + (e<<1))>>3;
164: *q++ = save + next;
165: save = e>>2;
166: *p++ = ~x;
167: }
168: }
169: }
170:
171: myread(fd,buf,n)
172: uchar *buf;
173: {
174: int i;
175: do {
176: i = read(fd,buf,n);
177: if(i<=0)
178: return; /* let it overrun */
179: buf += i;
180: n -= i;
181: } while (n > 0);
182: }
183:
184: mywrite(fd,buf,n)
185: uchar *buf;
186: {
187: int i;
188: do {
189: i = write(fd,buf,(n>4096)?4096:n);
190: if (i<=0) {
191: fprint(2,"bad write of %d\n",n);
192: exit(1);
193: }
194: buf += i;
195: n -= i;
196: } while (n > 0);
197: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.