|
|
1.1 root 1: #include <stdio.h>
2: #include <fb.h>
3: #include "pico.h"
4:
5: extern short CURSCRATCH, CUROLD;
6: extern struct SRC src[MANY];
7: extern char frameb, metheus;
8: extern int DEF_LL, DEF_NL;
9:
10: fbreg G; /* place holder (68 bytes) */
11: fbreg *F = &G; /* initial value */
12: int delay=0;
13:
14: #define Delay delay+=2
15:
16: fbsnore()
17: { int it;
18: if (!frameb) return;
19: if((it=open("/dev/iti0", 2))<0 || ioctl(it, ITIADDR, &fb.addr)<0)
20: { fprintf(stderr, "pico: cannot open framebuffer\n");
21: frameb = 0;
22: } else
23: { fb.fd = it;
24: F=fb.addr;
25: }
26: }
27:
28: closefb()
29: { close(fb.fd);
30: }
31:
32: fbputitall(k)
33: { register fbreg *f=F;
34: register unsigned char *pr, *pg, *pb;
35: struct SRC *from = &src[k];
36: register int j, ex = from->sx + from->ex;
37: int i, offset, delta, sx = from->sx;
38: int sy = from->sy, ey = from->sy + from->ey;
39:
40: if (!frameb) return;
41:
42: offset = sy*DEF_LL + sx;
43: delta = DEF_LL - ex + sx;
44:
45: pr = from->pixred+offset;
46: pg = from->pixgrn+offset;
47: pb = from->pixblu+offset;
48:
49: f->red.csr=f->grn.csr=f->blu.csr=F_IXW;
50:
51: switch (from->nchan)
52: { case 1:
53: for (i = sy; i < ey; i++, pr+=delta)
54: { f->red.x=f->grn.x=f->blu.x=sx;
55: f->red.y=f->grn.y=f->blu.y=i;
56: for (j = sx; j < ex; j++)
57: { f->red.z=f->grn.z=f->blu.z= (*pr++);
58: Delay;
59: }
60: }
61: break;
62: case 4:
63: case 3:
64: for (i = sy; i < ey; i++, pr+=delta, pg+=delta, pb+=delta)
65: { f->red.x=f->grn.x=f->blu.x=sx;
66: f->red.y=f->grn.y=f->blu.y=i;
67: for (j = sx; j < ex; j++)
68: { f->red.z=*pr++; Delay;
69: f->grn.z=*pg++; Delay;
70: f->blu.z=*pb++; Delay;
71: } }
72: break;
73: default:
74: fprintf(stderr, "undefined number of channels\n");
75: break;
76: }
77: }
78:
79: fbgetitall(from)
80: struct SRC *from;
81: {
82: register fbreg *f=F;
83: register unsigned char *pr, *pg, *pb;
84: register int j, ex = from->sx + from->ex;
85: int i, offset, delta, sx = from->sx;
86: int sy = from->sy, ey = from->sy + from->ey;
87:
88: if (!frameb) yyerror("framebuffer is not open");
89:
90: if (from == Old)
91: fprintf(stderr, "reading screen...");
92:
93: offset = sy*DEF_LL + sx;
94: delta = DEF_LL - ex + sx;
95:
96: pr = from->pixred+offset;
97: pg = from->pixgrn+offset;
98: pb = from->pixblu+offset;
99:
100: f->red.csr=f->blu.csr=f->grn.csr=F_IXR;
101:
102: switch (from->nchan)
103: { case 1:
104: for (i = sy; i < ey; i++, pr+=delta, pg+=delta, pb+=delta)
105: { f->red.x=f->grn.x=f->blu.x=sx;
106: f->red.y=f->grn.y=f->blu.y=i;
107: for (j = sx; j < ex; j++)
108: { *pg = *pb = *pr = f->grn.z; Delay;
109: pg++; pb++; pr++;
110: }
111: }
112: break;
113: case 4:
114: case 3:
115: for (i = sy; i < ey; i++, pr+=delta, pg+=delta, pb+=delta)
116: { f->red.x=f->grn.x=f->blu.x=sx;
117: f->red.y=f->grn.y=f->blu.y=i;
118: for (j = sx; j < ex; j++)
119: { *pr++ = f->red.z; Delay;
120: *pg++ = f->grn.z; Delay;
121: *pb++ = f->blu.z; Delay;
122: } }
123: break;
124: default:
125: fprintf(stderr, "undefined number of channels\n");
126: break;
127: }
128: RESIDENT;
129: }
130:
131: fbup()
132: { if (!frameb) yyerror("up: no access to framebuffer");
133: F->red.scroll = F->grn.scroll = F->blu.scroll = 32;
134: }
135:
136: fbdown()
137: { if (!frameb) yyerror("down: no access to framebuffer");
138: F->red.scroll = F->grn.scroll = F->blu.scroll = 0;
139: }
140:
141: fblyank(x, y)
142: { register fbreg *f=F;
143: register int i;
144: register unsigned char *pr, *pg, *pb;
145: extern char faster;
146:
147: if (!faster)
148: { fbyank(x, y);
149: return;
150: } else
151: { if (x != 0)
152: return;
153: }
154: i = (y < 1 || y >= DEF_LL) ? 0 : DEF_LL*(y-1);
155: pr = scratchred+i;
156: pg = scratchgrn+i;
157: pb = scratchblu+i;
158:
159: f->red.y=f->grn.y=f->blu.y=y-1; Delay;
160: for (i = 0; i < DEF_LL; i++)
161: { f->red.x=f->grn.x=f->blu.x=i; Delay;
162: f->red.z = *pr++; Delay;
163: f->grn.z = *pg++; Delay;
164: f->blu.z = *pb++; Delay;
165: }
166: return 1;
167: }
168:
169: fbyank(x, y)
170: { register fbreg *f=F;
171: register int i = DEF_LL*y+x;
172: unsigned char *pr = scratchred+i;
173: unsigned char *pg = scratchgrn+i;
174: unsigned char *pb = scratchblu+i;
175:
176: f->red.x=f->grn.x=f->blu.x=x; Delay;
177: f->red.y=f->grn.y=f->blu.y=y; Delay;
178:
179: f->red.z = *pr; Delay;
180: f->grn.z = *pg; Delay;
181: f->blu.z = *pb; Delay;
182:
183: return *pr;
184: }
185:
186: redcmap(i, z)
187: { if (frameb) fbredcmap(i, z);
188: else if (metheus) metredcmap(i, z);
189: }
190:
191: grncmap(i, z)
192: { if (frameb) fbgrncmap(i, z);
193: else if (metheus) metgrncmap(i, z);
194: }
195:
196: blucmap(i, z)
197: { if (frameb) fbblucmap(i, z);
198: else if (metheus) metblucmap(i, z);
199: }
200:
201: getcmap(i, r,g,b)
202: {
203: if (frameb) return fbgetcmap(i, r,g,b);
204: else if (metheus) return metgetcmap(i, r,g,b);
205: return 0;
206: }
207:
208: fbredcmap(i, z)
209: { F->map.addr = i%256;
210: F->map.sele = 0;
211: F->map.data = z;
212: return z;
213: }
214: fbgrncmap(i, z)
215: { F->map.addr = i%256;
216: F->map.sele = 16;
217: F->map.data = z;
218: return z;
219: }
220: fbblucmap(i, z)
221: { F->map.addr = i%256;
222: F->map.sele = 32;
223: F->map.data = z;
224: return z;
225: }
226:
227: fbgetcmap(i, r,g,b)
228: { fbreg *f=F;
229: int h = 0, k = 0;
230:
231: f->map.addr = i%256;
232: if (r) { h++; f->map.sele = 0; k += f->map.data; }
233: if (g) { h++; f->map.sele = 16; k += f->map.data; }
234: if (b) { h++; f->map.sele = 32; k += f->map.data; }
235: if (h > 1)
236: k /= h;
237: return k;
238: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.