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