|
|
1.1 root 1: #include <stdio.h>
2: #include <sys/types.h>
3: #include <sys/stat.h>
4: #include "defines.h"
5:
6: #define Min(a,b) ((a)>(b)?(b):(a))
7: #define Max(a,b) ((a)<(b)?(b):(a))
8:
9: int Bright=0;
10: int Film = 0;
11: int Filter = GREEN;
12: int Reso;
13: int setbright=0;
14: int Xmax, Ymax, Xmin, Ymin;
15:
16: unsigned char nq[9];
17:
18: Usage(str)
19: char *str;
20: { fprintf(stderr, "qdump: %s\n", str);
21: fprintf(stderr, "usage: qdump -bfF [N ...] file\n");
22: fprintf(stderr, "b brightness [0-8,9], defaults to 0 (2k) or 2 (4k)\n");
23: fprintf(stderr, "f filmtype [0-2], defaults to 0 (custom,lin,pola)\n");
24: fprintf(stderr, "F bwfilter [0-3], defaults to 2 (n,r,g,b)\n");
25: exit(1);
26: }
27:
28: main(argc, argv)
29: char **argv;
30: {
31: int i=1, base=2; /* base of option arguments */
32: char c;
33:
34: if (argc > 1 && argv[1][0] == '-')
35: { base++;
36: while ((c = argv[1][i++]) != '\0')
37: switch (c) {
38: /* bright */ case 'b': if (argc >= base)
39: { sscanf(argv[base-1], "%d", &Bright);
40: base++;
41: Bright = Bright%10;
42: setbright = 1;
43: break;
44: } else
45: Usage("missing argument for `b' flag");
46: /* filmtype */ case 'f': if (argc >= base)
47: { sscanf(argv[base-1], "%d", &Film);
48: Film = Film%8;
49: base++;
50: if (Film == 6)
51: Usage("unknown film type");
52: break;
53: } else
54: Usage("missing argument for `f' flag");
55: /* filter */ case 'F': if (argc >= base)
56: { sscanf(argv[base-1], "%d", &Filter);
57: Filter = Filter%4;
58: base++;
59: break;
60: } else
61: Usage("missing argument for `F' flag");
62: default : Usage("unknown option");
63: }
64: }
65: if (base != argc)
66: Usage("bad arglist");
67:
68: qreset();
69: nocalibs();
70: Reso = resolution();
71: if (Reso == 4 && !setbright)
72: Bright = 2;
73:
74: Xmax = 1024*Reso; Ymax = 768*Reso;
75: Xmin = -512*Reso; Ymin = 384*Reso;
76:
77: filmtype(Film);
78: if (Bright != 9)
79: { getbright(nq);
80: brightness(Bright, Bright, Bright, Bright);
81: printf("brightness %d (%d)\n", Bright, nq[Bright]);
82: }
83: handshake(1);
84: snap(argv[base-1]);
85: exit(0);
86: }
87:
88: snap(name)
89: char *name;
90: {
91: register i, fd;
92: register unsigned char *p;
93: int h, w;
94:
95: if ((fd = open(name, 0)) == -1)
96: { perror(name);
97: exit(1);
98: }
99: h = w = dimension(fd);
100: printf("%s: %dx%d\n", name, w, h);
101:
102: window(Xmin, Ymin, Min(Xmax, w), Min(Ymax, h));
103: singlepass(Filter);
104: straight(fd, h, w);
105: }
106:
107: straight(fd, h, w)
108: { register int i;
109: unsigned char obuf[4096];
110: int realw = Min(Xmax, w);
111: int realh = Min(Ymax, h);
112: int j;
113:
114: for (i = 0; i < realh; i++)
115: { if (read(fd, obuf, w) != w)
116: { fprintf(stderr, "qdump: unexpected eof\n");
117: exit(1);
118: }
119: qwrite(obuf, realw);
120: }
121: }
122:
123: dimension(fd)
124: { struct stat bam;
125: int N;
126: extern float fsqrt();
127:
128: if (fstat(fd, &bam)==0)
129: { N = bam.st_size;
130: N = (int) fsqrt((double)N+1.0);
131: return N;
132: }
133: return 0;
134: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.