|
|
1.1 ! root 1: #include <fb.h> ! 2: #include <stdio.h> ! 3: #include <sys/types.h> ! 4: #include <sys/stat.h> ! 5: #include "defines.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, BW=1, 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: int skip = 0; ! 21: ! 22: unsigned char nq[9]; ! 23: char *malloc(); ! 24: unsigned char *rgb; ! 25: ! 26: Usage(str) ! 27: char *str; ! 28: { fprintf(stderr, "qsnap: %s\n", str); ! 29: fprintf(stderr, "usage: qsnap -bcdfmnrRF [N ...] file\n"); ! 30: fprintf(stderr, "b brightness [0-8,9], defaults to 0 (2k) or 2 (4k)\n"); ! 31: fprintf(stderr, "c td format n-channel color image\n"); ! 32: fprintf(stderr, "d dither image +- N [2-255]\n"); ! 33: fprintf(stderr, "f filmtype [0-2], defaults to 0 (custom,lin,pola)\n"); ! 34: fprintf(stderr, "m enlargement [1- ], defaults to 3(2k) or 6(4k)\n"); ! 35: fprintf(stderr, "n headerless square b&w image (default)\n"); ! 36: fprintf(stderr, "r expose red only, when combined with 'c'\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, "s skip the first N pictures\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 x, y; ! 48: char c; ! 49: ! 50: if (argc > 1 && argv[1][0] == '-') ! 51: { base++; ! 52: while ((c = argv[1][i++]) != '\0') ! 53: switch (c) { ! 54: /* neutral */ case 'n': BW = 1; break; ! 55: /* color */ case 'c': BW = 0; break; ! 56: /* bright */ case 'b': if (argc >= base) ! 57: { sscanf(argv[base-1], "%d", &Bright); ! 58: base++; ! 59: Bright = Bright%10; ! 60: setbright = 1; ! 61: break; ! 62: } else ! 63: Usage("missing argument for `b' flag"); ! 64: /* dither */ case 'd': if (argc >= base) ! 65: { sscanf(argv[base-1], "%d", &Dither); ! 66: base++; ! 67: if (Dither < 0) Dither = -Dither; ! 68: break; ! 69: } else ! 70: Usage("missing argument for `d' flag"); ! 71: ! 72: /* filmtype */ case 'f': if (argc >= base) ! 73: { sscanf(argv[base-1], "%d", &Film); ! 74: Film = Film%8; ! 75: base++; ! 76: if (Film == 6) ! 77: Usage("unknown film type"); ! 78: break; ! 79: } else ! 80: Usage("missing argument for `f' flag"); ! 81: /* multiply */ case 'm': if (argc >= base) ! 82: { sscanf(argv[base-1], "%d", &Times); ! 83: base++; ! 84: settimes = 1; ! 85: break; ! 86: } else ! 87: Usage("missing argument for `m' flag"); ! 88: /* filter */ case 'F': if (argc >= base) ! 89: { sscanf(argv[base-1], "%d", &Filter); ! 90: Filter = Filter%4; ! 91: base++; ! 92: break; ! 93: } else ! 94: Usage("missing argument for `F' flag"); ! 95: case 'R': mustrot = 1; break; ! 96: case 'r': redonly = 1; break; ! 97: case 's': if (argc >= base) ! 98: { sscanf(argv[base-1], "%d", &skip); ! 99: base++; ! 100: break; ! 101: } else ! 102: Usage("missing argument for `s' flag"); ! 103: default : Usage("unknown option"); ! 104: } ! 105: } ! 106: if (base > argc) ! 107: Usage("bad arglist"); ! 108: qreset(); ! 109: nocalibs(); ! 110: Reso = resolution(); ! 111: if (Reso == 4) ! 112: { if (!settimes) Times = 6; ! 113: if (!setbright) Bright = 2; ! 114: } ! 115: ! 116: rotate(mustrot); ! 117: filmtype(Film); ! 118: if (Bright != 9) ! 119: { getbright(nq); ! 120: brightness(Bright, Bright, Bright, Bright); ! 121: printf("brightness %d (%d)\n", Bright, nq[Bright]); ! 122: } ! 123: ! 124: handshake(1); ! 125: ! 126: for (x = -512*Reso, y = 384*Reso; base <= argc; base++) ! 127: { if (skip-- > 0) ! 128: continue; ! 129: i = snap(argv[base-1], x, y); ! 130: x += i; ! 131: if (x+i >= 512*Reso) ! 132: { y -= i; ! 133: x = -512*Reso; ! 134: } ! 135: if (y-i < -384*Reso) ! 136: { fprintf(stderr, "picture %s doesn't fit\n", argv[base-1]); ! 137: break; ! 138: } ! 139: qreset(); ! 140: brightness(Bright, Bright, Bright, Bright); ! 141: handshake(1); ! 142: } ! 143: exit(0); ! 144: } ! 145: ! 146: snap(name, Xmin, Ymin) ! 147: char *name; ! 148: { ! 149: PICFILE *f; ! 150: register i, fd; ! 151: register unsigned char *p; ! 152: int h, w, nchan=1; ! 153: int Xmax = 1024*Reso, Ymax = 768*Reso; ! 154: ! 155: if (BW) ! 156: { if ((fd = open(name, 0)) == -1) ! 157: { perror(name); ! 158: exit(1); ! 159: } ! 160: w = dimension(fd); ! 161: if (w*XTIMES > Xmax) ! 162: { fprintf(stderr, "width is too large\n"); ! 163: fprintf(stderr, "you have: %dx%d=%d\n",w,XTIMES,w*XTIMES); ! 164: exit(1); ! 165: } ! 166: h = Min(Ymax/YTIMES, w); ! 167: printf("%s: %dx%d\n", name, w, h); ! 168: if (!(rgb = (unsigned char *) malloc(w*h* sizeof(unsigned char)))) ! 169: { fprintf(stderr, "sorry, not enough memory\n"); ! 170: exit(1); ! 171: } ! 172: read(fd, (char *)rgb, w*h); ! 173: close(fd); ! 174: } else ! 175: { if ((f = openpicr(name)) == NULL) ! 176: { perror(name); ! 177: exit(1); ! 178: } ! 179: w = f->r.co.x-f->r.or.x; ! 180: h = f->r.co.y-f->r.or.y; ! 181: nchan = f->nchan; ! 182: if (w*XTIMES > Xmax) ! 183: { fprintf(stderr, "width too large\n"); ! 184: fprintf(stderr, "you have: %dx%d=%d\n",w,XTIMES,w*XTIMES); ! 185: exit(1); ! 186: } ! 187: h = Min(Ymax/YTIMES, h); ! 188: printf("%s: %dx%d\n", name, w, h); ! 189: if (!(rgb = (unsigned char *) ! 190: malloc(w*h*nchan* sizeof(unsigned char)))) ! 191: { fprintf(stderr, "sorry, not enough memory\n"); ! 192: exit(1); ! 193: } ! 194: for (p = rgb, i = 0; i < h; i++) ! 195: { readpic(f, p); ! 196: p += w*nchan; ! 197: } ! 198: closepic(f); ! 199: } ! 200: window(Xmin, Ymin, w*XTIMES, h*YTIMES); ! 201: ! 202: if (BW) ! 203: { singlepass(Filter); ! 204: onechannel(rgb, h, w, 1); ! 205: } else ! 206: { threepass(); ! 207: printf("red\n"); onechannel(rgb , h, w, nchan); ! 208: if (!redonly) { ! 209: printf("grn\n"); onechannel(rgb+1, h, w, nchan); ! 210: printf("blu\n"); onechannel(rgb+2, h, w, nchan); ! 211: } ! 212: } ! 213: printf("done\n"); ! 214: return w*XTIMES; ! 215: } ! 216: ! 217: onechannel(from, h, w, n) ! 218: unsigned char *from; ! 219: { ! 220: if (Dither) ! 221: { prerand(); ! 222: onedither(from, h, w, n); ! 223: } else ! 224: straight(from, h, w, n); ! 225: } ! 226: ! 227: straight(from, h, w, n) ! 228: unsigned char *from; ! 229: { ! 230: register i, j, k; ! 231: register unsigned char *p, *q; ! 232: unsigned char obuf[8192]; ! 233: int chunk = w*XTIMES; ! 234: ! 235: for (i = 0, p = from; i < h; i++) ! 236: { q = obuf; ! 237: for (j = 0; j < w; j++, p += n) ! 238: for (k = 0; k < XTIMES; k++) ! 239: *q++ = *p; ! 240: for (k = 0; k < YTIMES; k++) ! 241: { qwrite(obuf, chunk); ! 242: if (chunk > 2048) qwait(200); ! 243: } } ! 244: } ! 245: ! 246: short Nrand[5000]; ! 247: ! 248: prerand() ! 249: { register int i, D1=Dither, D2=Dither/2; ! 250: ! 251: for (i = 0; i < 5000; i++) ! 252: Nrand[i] = (short) (nrand(D1) - D2); ! 253: } ! 254: ! 255: /*onedither(from, h, w, n) ! 256: unsigned char *from; ! 257: { ! 258: register short c, m, kk; ! 259: register unsigned char *op, *q; ! 260: register int D1 = Dither; ! 261: unsigned char *p, obuf[8192]; ! 262: int i, j, k; ! 263: int chunk = w*XTIMES; ! 264: ! 265: for (i = 0, p = from; i < h; i++, p = op) ! 266: for (k = 0; k < YTIMES; k++) ! 267: { q = obuf; ! 268: op = p; ! 269: for (j = 0; j < w; j++, op += n) ! 270: for (m = 0; m < XTIMES; m++) ! 271: { c = (short) *op + Nrand[kk]; ! 272: if (++kk >= 5000) kk = 0; ! 273: if(c<0) ! 274: c=0; ! 275: if(c>255) ! 276: c=255; ! 277: *q++ = (unsigned char) c; ! 278: } ! 279: qwrite(obuf, chunk); ! 280: } ! 281: }*/ ! 282: onedither(from, h, w, n) ! 283: unsigned char *from; ! 284: { ! 285: register int c, m, kk=0; ! 286: register unsigned char *op, *q; ! 287: register int D1 = Dither; ! 288: unsigned char *p, obuf[8192]; ! 289: int i, j, k; ! 290: int chunk = w*XTIMES; ! 291: ! 292: if (w <= 0 || XTIMES <= 0) abort(); ! 293: for (i = 0, p = from; i < h; i++, p = op) ! 294: for (k = 0; k < YTIMES; k++) ! 295: { q = obuf; ! 296: op = p; ! 297: j = w; ! 298: do{ ! 299: m = XTIMES; ! 300: do{ ! 301: c = *op + Nrand[kk]; ! 302: if (++kk >= 5000) kk = 0; ! 303: if(c<0) ! 304: c=0; ! 305: if(c>255) ! 306: c=255; ! 307: *q++ = c; ! 308: }while(--m); ! 309: op += n; ! 310: }while(--j); ! 311: qwrite(obuf, chunk); ! 312: } ! 313: } ! 314: ! 315: qwait(n) ! 316: { int i; ! 317: for (i=0; i < n; i++) ; ! 318: } ! 319: ! 320: dimension(fd) ! 321: { struct stat bam; ! 322: int N; ! 323: extern float fsqrt(); ! 324: ! 325: if (fstat(fd, &bam)==0) ! 326: { N = bam.st_size; ! 327: N = (int) fsqrt((double)N+1.0); ! 328: return N; ! 329: } ! 330: return 0; ! 331: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.