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