|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <sys/types.h> ! 3: #include <sys/stat.h> ! 4: #include "defines.h" ! 5: #include "piclib.h" ! 6: ! 7: #define XTIMES Times ! 8: #define YTIMES Times ! 9: #define Min(a,b) ((a)>(b)?(b):(a)) ! 10: #define Max(a,b) ((a)<(b)?(b):(a)) ! 11: ! 12: int Xmax, Ymax, Xmin, Ymin; ! 13: int Dither=0, Times=3, Bright=0; ! 14: int Film = 0; ! 15: int Filter = GREEN; ! 16: int Reso = 0; ! 17: int redonly = 0; ! 18: int settimes= 0; ! 19: int setbright=0; ! 20: int xoffset = 0; ! 21: int yoffset = 0; ! 22: ! 23: unsigned char nq[9]; ! 24: char *malloc(); ! 25: unsigned char *rgb; ! 26: int lsize; ! 27: int multiple=1; /* number of exposures */ ! 28: int fad=1, dodub=0; ! 29: ! 30: Usage(str) ! 31: char *str; ! 32: { fprintf(stderr, "qsnap: %s\n", str); ! 33: fprintf(stderr, "usage: qsnap -bdfmnrxFLRXY [N ...] file\n"); ! 34: fprintf(stderr, "b brightness [0-8], defaults to 0 (2k) or 2 (4k)\n"); ! 35: fprintf(stderr, "d dither image +- N [2-255]\n"); ! 36: fprintf(stderr, "f filmtype [0-2], defaults to 0 (custom,lin,pola)\n"); ! 37: fprintf(stderr, "m enlargement [1-N], defaults to 3(2k) or 6(4k)\n"); ! 38: fprintf(stderr, "n TMAX-100 b&w corrected exposure\n"); ! 39: fprintf(stderr, "r expose red only (for multiple red overlays)\n"); ! 40: fprintf(stderr, "x N exposures (not with -L)\n"); ! 41: fprintf(stderr, "F bwfilter [0-3], defaults to 2 (n,r,g,b)\n"); ! 42: fprintf(stderr, "L raw file, no header, bw, line by line (no m,d,x)\n"); ! 43: fprintf(stderr, "R N set resolution to N [N=2 or N=4]\n"); ! 44: fprintf(stderr, "X add x-offset N (eg 480/m, for 35mm camera)\n"); ! 45: fprintf(stderr, "Y add y-offset N\n"); ! 46: exit(1); ! 47: } ! 48: ! 49: main(argc, argv) ! 50: char **argv; ! 51: { ! 52: int i=1, base=2; /* base of option arguments */ ! 53: int linebyline = 0; ! 54: char c; ! 55: ! 56: if (argc > 1 && argv[1][0] == '-') ! 57: { base++; ! 58: while ((c = argv[1][i++]) != '\0') ! 59: switch (c) { ! 60: /* TMAX-100 */ case 'n': dodub = 1; break; ! 61: /* N exps */ case 'x': if (argc >= base) ! 62: { sscanf(argv[base-1], "%d", &multiple); ! 63: base++; ! 64: fad = 0; ! 65: break; ! 66: } else ! 67: Usage("missing argument for `a' flag"); ! 68: /* bright */ case 'b': if (argc >= base) ! 69: { sscanf(argv[base-1], "%d", &Bright); ! 70: base++; ! 71: Bright = Bright%9; ! 72: setbright = 1; ! 73: break; ! 74: } else ! 75: Usage("missing argument for `b' flag"); ! 76: /* dither */ case 'd': if (argc >= base) ! 77: { sscanf(argv[base-1], "%d", &Dither); ! 78: base++; ! 79: if (Dither < 0) Dither = -Dither; ! 80: break; ! 81: } else ! 82: Usage("missing argument for `d' flag"); ! 83: ! 84: /* filmtype */ case 'f': if (argc >= base) ! 85: { sscanf(argv[base-1], "%d", &Film); ! 86: Film = Film%8; ! 87: base++; ! 88: if (Film == 6) ! 89: Usage("unknown film type"); ! 90: break; ! 91: } else ! 92: Usage("missing argument for `f' flag"); ! 93: /* multiply */ case 'm': if (argc >= base) ! 94: { sscanf(argv[base-1], "%d", &Times); ! 95: base++; ! 96: settimes = 1; ! 97: break; ! 98: } else ! 99: Usage("missing argument for `m' flag"); ! 100: /* filter */ case 'F': if (argc >= base) ! 101: { sscanf(argv[base-1], "%d", &Filter); ! 102: Filter = Filter%4; ! 103: base++; ! 104: break; ! 105: } else ! 106: Usage("missing argument for `F' flag"); ! 107: case 'L': if (argc >= base) ! 108: { sscanf(argv[base-1], "%d", &lsize); ! 109: linebyline = 1; ! 110: base++; ! 111: break; ! 112: } else ! 113: Usage("missing argument for `L' flag"); ! 114: case 'R': if (argc >= base) ! 115: { sscanf(argv[base-1], "%d", &Reso); ! 116: base++; ! 117: break; ! 118: } else ! 119: Usage("missing argument for `R' flag"); ! 120: case 'X': if (argc >= base) ! 121: { sscanf(argv[base-1], "%d", &xoffset); ! 122: base++; ! 123: break; ! 124: } else ! 125: Usage("missing argument for `X' flag"); ! 126: case 'Y': if (argc >= base) ! 127: { sscanf(argv[base-1], "%d", &yoffset); ! 128: base++; ! 129: break; ! 130: } else ! 131: Usage("missing argument for `Y' flag"); ! 132: case 'r': redonly = 1; break; ! 133: default : Usage("unknown option"); ! 134: } ! 135: } ! 136: if (dodub == 1 && (setbright || Film)) ! 137: { fprintf(stderr, "warning: -b and -f flags have "); ! 138: fprintf(stderr, "no effect when combined with -n\n"); ! 139: } ! 140: if (base != argc) Usage("bad arglist"); ! 141: ! 142: qreset(); ! 143: getbright(nq); ! 144: if (Reso == 2 || Reso == 4) ! 145: setreso(Reso); ! 146: qpause(); ! 147: Reso = resolution(); ! 148: Xmax = 1024*Reso; ! 149: Ymax = 768*Reso; ! 150: Xmin = -512*Reso; ! 151: Ymin = 384*Reso; ! 152: if (linebyline && lsize > Xmax) ! 153: { fprintf(stderr, "image too wide: %d, max is %d\n", lsize, Xmax); ! 154: exit(1); ! 155: } ! 156: if (dodub && nq[2] != 81) ! 157: { fprintf(stderr, "option -n requires that you first set\n"); ! 158: fprintf(stderr, "\t$ qbright 36 58 81 103 126 148 171 193\n"); ! 159: exit(1); ! 160: } ! 161: if (Reso == 4) ! 162: { if (!settimes) Times = 6; ! 163: if (!setbright) Bright = 2; ! 164: } ! 165: ! 166: qpause(); ! 167: nocalibs(); ! 168: handshake(1); fflush(stdout); ! 169: if (dodub) ! 170: { qpause(); ! 171: customluts(TMAX_100); ! 172: Bright = 2; ! 173: } else ! 174: filmtype(Film); ! 175: qpause(); ! 176: advance(fad); ! 177: qpause(); ! 178: if (fad==0) ! 179: shutter(1); ! 180: fflush(stdout); ! 181: Again: ! 182: qpause(); ! 183: brightness(Bright, Bright, Bright, Bright); ! 184: printf("brightness %d (%d)\n", Bright, nq[Bright]); fflush(stdout); ! 185: if (linebyline) ! 186: znap(argv[base-1]); ! 187: else ! 188: snap(argv[base-1]); ! 189: if (fad==0) ! 190: shutter(0); ! 191: exit(0); ! 192: } ! 193: ! 194: znap(name) ! 195: char *name; ! 196: { ! 197: register i; ! 198: int fd, h, w; ! 199: unsigned char obuf[8192]; ! 200: ! 201: w = lsize; ! 202: h = (lsize>683*Reso)?(683*Reso):lsize; ! 203: /* the maximum for 35mm; for 4x5 it is 768*Reso */ ! 204: ! 205: if ((fd = open(name, 0)) < 0) ! 206: { fprintf(stderr, "cannot open %s\n", name); ! 207: exit(1); ! 208: } ! 209: printf("file: %s\n", name); ! 210: window(Xmin+xoffset, Ymin-yoffset, w, h); ! 211: singlepass(Filter); ! 212: fflush(stdout); ! 213: for (i = 0; i < h; i++) ! 214: { read(fd, obuf, w); ! 215: qwrite(obuf, w); ! 216: } ! 217: close(fd); ! 218: fprintf(stderr, "done\n"); ! 219: } ! 220: ! 221: snap(name) ! 222: char *name; ! 223: { ! 224: int fd, h, w; ! 225: struct pfile image; ! 226: ! 227: if((fd = openf(name, &image)) == -1 || !readf(fd, &image)) ! 228: { fprintf(stderr, "bad image %s\n", name); ! 229: exit(1); ! 230: } ! 231: w = image.r.corner.x - image.r.origin.x; ! 232: if (w*XTIMES > Xmax) ! 233: { fprintf(stderr, "image too wide: %d, max %d\n", w*XTIMES, Xmax); ! 234: exit(1); ! 235: } ! 236: h = image.r.corner.y - image.r.origin.y; ! 237: h = Min(Ymax/YTIMES, h); ! 238: while (multiple-- > 0) ! 239: { printf("file: %s\n", name); ! 240: window(Xmin+xoffset, Ymin-yoffset, w*XTIMES, h*YTIMES); ! 241: fflush(stdout); ! 242: if (image.nchan == 1) ! 243: { singlepass(Filter); ! 244: onechannel(image.pixred, h, w); ! 245: } else ! 246: { threepass(); ! 247: fprintf(stderr, "red\n"); onechannel(image.pixred, h, w); ! 248: if (redonly) goto done; ! 249: fprintf(stderr, "grn\n"); onechannel(image.pixgrn, h, w); ! 250: fprintf(stderr, "blu\n"); onechannel(image.pixblu, h, w); ! 251: } ! 252: sleep(10); ! 253: if (multiple > 0) ! 254: printf("x pass %d\n", multiple); ! 255: } ! 256: close(fd); ! 257: done: fprintf(stderr, "done\n"); ! 258: } ! 259: ! 260: onechannel(from, h, w) ! 261: unsigned char *from; ! 262: { ! 263: fflush(stdout); ! 264: if (Dither) ! 265: { prerand(); ! 266: onedither(from, h, w); ! 267: } else ! 268: straight(from, h, w); ! 269: } ! 270: ! 271: straight(from, h, w) ! 272: unsigned char *from; ! 273: { ! 274: register i, j, k; ! 275: register unsigned char *p, *q; ! 276: unsigned char obuf[8192]; ! 277: int chunk = w*XTIMES; ! 278: ! 279: for (i = 0, p = from; i < h; i++) ! 280: { q = obuf; ! 281: for (j = 0; j < w; j++, p++) ! 282: for (k = 0; k < XTIMES; k++) ! 283: *q++ = *p; ! 284: for (k = 0; k < YTIMES; k++) ! 285: { qwrite(obuf, chunk); ! 286: if (chunk > 2048) qwait(200); ! 287: } } ! 288: } ! 289: ! 290: short Nrand[5000]; ! 291: ! 292: prerand() ! 293: { register int i, D1=Dither, D2=Dither/2; ! 294: ! 295: for (i = 0; i < 5000; i++) ! 296: Nrand[i] = (short) (nrand(D1) - D2); ! 297: } ! 298: ! 299: onedither(from, h, w) ! 300: unsigned char *from; ! 301: { ! 302: register int c, m, kk=0; ! 303: register unsigned char *op, *q; ! 304: unsigned char *p, obuf[8192]; ! 305: int i, j, k; ! 306: int chunk = w*XTIMES; ! 307: ! 308: for (i = 0, p = from; i < h; i++, p = op) ! 309: for (k = 0; k < YTIMES; k++) ! 310: { q = obuf; ! 311: op = p; ! 312: j = w; ! 313: do{ ! 314: m = XTIMES; ! 315: do{ ! 316: c = *op + Nrand[kk]; ! 317: if (++kk >= 5000) kk = 0; ! 318: if(c<0) ! 319: c=0; ! 320: if(c>255) ! 321: c=255; ! 322: *q++ = c; ! 323: }while(--m); ! 324: op++; ! 325: }while(--j); ! 326: qwrite(obuf, chunk); ! 327: } ! 328: } ! 329: ! 330: qwait(n) ! 331: { int i; ! 332: for (i = 0; i < n; i++) ; ! 333: } ! 334: ! 335: dimension(fd) ! 336: { struct stat bam; ! 337: int N; ! 338: extern float fsqrt(); ! 339: ! 340: if (fstat(fd, &bam)==0) ! 341: { N = bam.st_size; ! 342: N = (int) fsqrt((double)N+1.0); ! 343: return N; ! 344: } ! 345: return 0; ! 346: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.