|
|
1.1 root 1: #include <stdio.h>
2: #include <fb.h>
3: #include "pico.h"
4:
5: extern struct SRC src[MANY];
6: extern short CUROLD, CURSCRATCH;
7: extern int DEF_LL, DEF_NL;
8:
9: gettd(into)
10: struct SRC *into;
11: {
12: unsigned char *r = into->pixred + (into->sy)*DEF_LL + (into->sx);
13: unsigned char *g = into->pixgrn + (into->sy)*DEF_LL + (into->sx);
14: unsigned char *b = into->pixblu + (into->sy)*DEF_LL + (into->sx);
15: PICFILE *tmp = picopen(into->fname);
16: int nc = into->nchan;
17: int w = into->ex - into->sx;
18: int d = into->ey - into->sy;
19: unsigned char *z = (unsigned char *) Emalloc(w*nc*sizeof(unsigned char));
20: int i;
21:
22: for (i = 0; i < d; i++)
23: { if (readpic(tmp, z) == -1)
24: { fprintf(stderr, "unexpected eof\n");
25: break;
26: }
27: if (i < into->oy) continue;
28: unwind(z+nc*into->ox, r, g, b, w, nc);
29: r += DEF_LL; g += DEF_LL; b += DEF_LL;
30: }
31: closepic(tmp);
32: free(z);
33: }
34:
35: unwind(p, R, G, B, w, nc)
36: unsigned char *p, *R, *G, *B;
37: {
38: register unsigned char *r = R, *g = G, *b = B;
39: register unsigned char *z = p;
40: register int i;
41:
42: switch (nc) {
43: default: whoops("unwind: bad number of channels");
44: case 4: for(i=0; i<w; i++){ *r++=*z++; *g++=*z++; *b++=*z++; z++; } break;
45: case 3: for(i=0; i<w; i++){ *r++=*z++; *g++=*z++; *b++=*z++; } break;
46: case 2: for(i=0; i<w; i++){ *r++=*z++; *g++=*z++; } break;
47: case 1: for(i=0; i<w; i++){ *r++=*z++; } break;
48: }
49: }
50:
51: puttd(fd, x, y, w, d)
52: {
53: register unsigned char *r = Old->pixred + y*DEF_LL + x;
54: register unsigned char *g = Old->pixgrn + y*DEF_LL + x;
55: register unsigned char *b = Old->pixblu + y*DEF_LL + x;
56: register int i, j, nc = Old->nchan;
57: char *zz, *tmp = (char *) Emalloc(w*nc*sizeof(char));
58:
59: for (i = 0; i < d; i++)
60: { switch (nc) {
61: default: for (j = 0, zz = tmp; j < w; j++)
62: { *zz++ = *r++, *zz++ = *g++, *zz++ = *b++;
63: zz += nc - 3;
64: }
65: break;
66: case 3: for (j = 0, zz = tmp; j < w; j++)
67: { *zz++ = *r++, *zz++ = *g++, *zz++ = *b++; }
68: break;
69: case 2: for (j = 0, zz = tmp; j < w; j++)
70: { *zz++ = *r++, *zz++ = *g++; }
71: break;
72: case 1: for (j = 0, zz = tmp; j < w; j++) *zz++ = *r++;
73: break;
74: }
75:
76: if (!ewrite(fd, tmp, w*nc))
77: break;
78:
79: r += DEF_LL-w, g += DEF_LL-w, b += DEF_LL-w;
80: }
81: free(tmp);
82: }
83:
84: tdheader(fd, n, a, b, c, d)
85: { char line[128];
86:
87: sprintf(line, "TYPE=dump\nWINDOW=%d %d %d %d\nNCHAN=%d\n\n", a,b,c,d,n);
88: write(fd, line, strlen(line));
89: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.