|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <sys/types.h> ! 3: #include <sys/stat.h> ! 4: #include "pico.h" ! 5: ! 6: extern struct SRC src[MANY]; ! 7: extern short CURSCRATCH, CUROLD; ! 8: extern int nsrc, DEF_LL, DEF_NL; ! 9: extern char frameb, usedold, metheus; ! 10: ! 11: prepare(infile) ! 12: char *infile; ! 13: { ! 14: struct SRC *into = &src[nsrc]; ! 15: int from; ! 16: ! 17: into->ex = into->ll = DEF_LL; ! 18: into->ey = into->nl = DEF_NL; ! 19: into->nchan = DEF_CH; ! 20: into->sx = into->sy = 0; ! 21: ! 22: if ((from = whatarray(infile)) != -1) ! 23: { fprintf(stderr, "sorry: base name clash of %s with %s\n", ! 24: infile, src[from].fname); ! 25: return 0; ! 26: } ! 27: strcpy(into->fname, infile); ! 28: if ((from = eopen(infile)) > 0 && readheader(into, from)) ! 29: { into->fd = from; ! 30: into->used = 0; ! 31: into->pixred = (unsigned char *) Emalloc(DEF_LL*DEF_NL); ! 32: if (into->nchan >= 3) ! 33: { into->pixgrn = (unsigned char *) Emalloc(DEF_LL*DEF_NL); ! 34: into->pixblu = (unsigned char *) Emalloc(DEF_LL*DEF_NL); ! 35: } else ! 36: { into->pixgrn = into->pixblu = into->pixred; ! 37: } ! 38: into->incore = 1; ! 39: nsrc++; ! 40: return nsrc-1; ! 41: } else ! 42: { into->fname[0] = '\0'; ! 43: into->fd = -1; ! 44: into->incore = into->used = 0; ! 45: return 0; ! 46: } ! 47: } ! 48: ! 49: interpret(infile) ! 50: char *infile; ! 51: { ! 52: struct SRC *into = &src[nsrc]; ! 53: int from, hh; ! 54: ! 55: into->ex = into->ll = DEF_LL; ! 56: into->ey = into->nl = DEF_NL; ! 57: into->nchan = DEF_CH; ! 58: into->sx = into->sy = 0; ! 59: ! 60: if ((from = eopen(infile)) > 0 && (hh = rawheader(into, from))) ! 61: { fprintf(stderr, "%s: ", &infile[findbase(infile)]); ! 62: if (hh == 2) ! 63: { hh = less(from); ! 64: fprintf(stderr, "headerless file, "); ! 65: fprintf(stderr, "ll %d nl %d, ", into->ll, into->nl); ! 66: fprintf(stderr, "(%d = %dx512 bytes)\n", hh, hh/512); ! 67: } else ! 68: { fprintf(stderr, "%s ", (into->nchan == 1)?"b&w ":"color"); ! 69: tpfile(into->type); ! 70: fprintf(stderr, "ll %d nl %d ", into->ll, into->nl); ! 71: wsize(into->sx, into->sy, into->ex, into->ey); ! 72: } ! 73: close(from); ! 74: } ! 75: into->fd = -1; ! 76: into->incore = into->used = 0; ! 77: } ! 78: ! 79: tpfile(n) ! 80: { ! 81: switch (n) { ! 82: case PICO: fprintf(stderr, "pico-format "); break; ! 83: case DUMP: fprintf(stderr, "dump-format "); break; ! 84: case RUNCODE: fprintf(stderr, "runcode-format "); break; ! 85: } ! 86: } ! 87: ! 88: less(fd) ! 89: { struct stat bam; ! 90: if (fstat(fd, &bam)==0) ! 91: return bam.st_size; ! 92: return 0; ! 93: } ! 94: ! 95: nopix(into) ! 96: struct SRC *into; ! 97: { ! 98: into->pixred = (unsigned char *) Emalloc(DEF_LL*DEF_NL); ! 99: /* ! 100: into->pixgrn = (unsigned char *) Emalloc(DEF_LL*DEF_NL); ! 101: into->pixblu = (unsigned char *) Emalloc(DEF_LL*DEF_NL); ! 102: */ ! 103: into->pixgrn = (unsigned char *) 0; ! 104: into->pixblu = (unsigned char *) 0; ! 105: into->ex = into->ll = DEF_LL; ! 106: into->ey = into->nl = DEF_NL; ! 107: into->nchan = DEF_CH; ! 108: into->sx = into->sy = 0; ! 109: into->ox = into->oy = 0; ! 110: strcpy(into->fname, "_workspace_"); ! 111: into->incore = 1; ! 112: } ! 113: ! 114: checkpix(into) ! 115: struct SRC *into; ! 116: { ! 117: if (!into->pixgrn) ! 118: into->pixgrn = (unsigned char *) Emalloc(DEF_LL*DEF_NL); ! 119: if (!into->pixblu) ! 120: into->pixblu = (unsigned char *) Emalloc(DEF_LL*DEF_NL); ! 121: } ! 122: ! 123: discard(s) ! 124: char *s; ! 125: { int nr; ! 126: ! 127: if ((nr = ungetpix(s)) < 2) ! 128: return 0; ! 129: ! 130: close(src[nr].fd); ! 131: src[nr].fd = -1; ! 132: src[nr].sx = src[nr].sy = src[nr].nchan = 0; ! 133: src[nr].ex = src[nr].ey = src[nr].ll = 0; ! 134: strcpy(src[nr].fname, " empty"); ! 135: src[nr].used = 0; ! 136: ! 137: return nr; ! 138: } ! 139: ! 140: ungetpix(s) ! 141: char *s; ! 142: { int nr; ! 143: ! 144: if ((nr = whatarray(s)) < 2) ! 145: { fprintf(stderr, "unknown file %s\n", s); ! 146: return 0; ! 147: } ! 148: ! 149: if (src[nr].incore == 0) ! 150: return nr; ! 151: ! 152: free(src[nr].pixred); ! 153: if (src[nr].nchan >= 3) ! 154: { free(src[nr].pixgrn); ! 155: free(src[nr].pixblu); ! 156: } ! 157: src[nr].incore = 0; ! 158: lseek(src[nr].fd, src[nr].sop, 0); ! 159: ! 160: return nr; ! 161: } ! 162: ! 163: newscreen(infile) ! 164: char *infile; ! 165: { ! 166: if ((Old->fd = eopen(infile)) > 0 && readheader(Old, Old->fd)) ! 167: { getpix(Old, infile); ! 168: putscreen(CUROLD); ! 169: setscratch(Old, Scratch); ! 170: return 1; ! 171: } /* else reset */ ! 172: Old->ex = Old->ll = DEF_LL; ! 173: Old->ey = Old->nl = DEF_NL; ! 174: Old->nchan = DEF_CH; ! 175: Old->sx = Old->sy = 0; ! 176: return 0; ! 177: } ! 178: ! 179: readheader(into, from) ! 180: struct SRC *into; ! 181: { ! 182: int i, ret = rawheader(into, from); ! 183: int a = into->sx, b = into->sy; ! 184: int c = into->ex, d = into->ey; ! 185: int n = into->nchan; ! 186: ! 187: if (a > c) i = a, a = c, c = i; /* flip */ ! 188: if (b > d) i = b, b = d, d = i; ! 189: if (a < 0) c -= a, a = 0; /* normalize */ ! 190: if (b < 0) d -= b, b = 0; ! 191: into->ll = c-a; into->nl = d-b; /* scan ll,nl */ ! 192: ! 193: a = min(DEF_LL, a); c = min(DEF_LL, c); /* clip */ ! 194: b = min(DEF_NL, b); d = min(DEF_NL, d); ! 195: ! 196: into->sx = a; into->sy = b; ! 197: into->ex = c; into->ey = d; ! 198: into->ox = 0; into->oy = 0; ! 199: ! 200: if (ret == 0) return 0; ! 201: ! 202: if (a >= c || b >= d) ! 203: { fprintf(stderr, "pico: file window is outside screen area\n"); ! 204: return 0; ! 205: } ! 206: if (n < 1 || n > 4) ! 207: { fprintf(stderr, "pico: bad nr of channels (%d)\n", n); ! 208: return 0; ! 209: } ! 210: ! 211: return ret; ! 212: } ! 213: ! 214: rawheader(into, from) ! 215: struct SRC *into; ! 216: { char line[512]; ! 217: int i, j, a, b, c, d, N, sawtype=0; ! 218: extern double sqrt(); ! 219: ! 220: into->type = PICO; /* default */ ! 221: for (j = 0;;) ! 222: { for (i = 0; i < 127; i++, j++) ! 223: { read(from, &line[i], 1); ! 224: if (line[i] == '\n') ! 225: { line[i] = '\0'; ! 226: break; ! 227: } } ! 228: if (i == 0) /* saw end of header */ ! 229: { if (sawtype) ! 230: { into->sop = j; ! 231: return 1; ! 232: } else ! 233: i = 127; ! 234: } ! 235: if (i == 127) /* no header */ ! 236: { into->nchan = 1; /* assume b&w, square image */ ! 237: N = (int) sqrt((double)less(from)+1.0); ! 238: into->ex = into->ey = N; ! 239: into->ll = into->nl = N; ! 240: lseek(from, 0L, 0); ! 241: into->sop = 0; ! 242: return 2; ! 243: } ! 244: if (sscanf(line, "WINDOW=%d %d %d %d", &a, &b, &c, &d) == 4) ! 245: { into->sx = a; into->sy = b; ! 246: into->ex = c; into->ey = d; ! 247: into->ll = c-a; into->nl = d-b; ! 248: } else if (sscanf(line, "NCHAN=%d", &a) == 1) ! 249: into->nchan = a; ! 250: else if (strcmp(line, "TYPE=dump") == 0) ! 251: { into->type = DUMP; sawtype = 1; ! 252: } else if (strcmp(line, "TYPE=runcode") == 0) ! 253: { into->type = RUNCODE; sawtype = 1; ! 254: } else if (strcmp(line, "TYPE=pico") == 0) ! 255: { into->type = PICO; sawtype = 1; ! 256: } else if (strncmp(line, "TYPE", 4) == 0) ! 257: { fprintf(stderr, "pico: unknown format: %s..\n", line); ! 258: return 0; ! 259: } ! 260: } ! 261: } ! 262: ! 263: putheader(where, n, a, b, c, d) ! 264: { char line[128]; ! 265: ! 266: sprintf(line, "TYPE=pico\nWINDOW=%d %d %d %d\nNCHAN=%d\n\n", a,b,c,d,n); ! 267: write(where, line, strlen(line)); ! 268: } ! 269: ! 270: putdpix(which, how) ! 271: char *which; ! 272: { ! 273: int fd, a, b, c, d; ! 274: ! 275: a = Old->sx; b = Old->sy; ! 276: c = Old->ex; d = Old->ey; ! 277: ! 278: checkit(); /* make sure we have screen incore */ ! 279: if ((fd = creat(which, 0666)) <= 0) ! 280: yyerror("cannot create file %s", which); ! 281: ! 282: if (!how) ! 283: putwindow(fd, Old->pixred, a, b, c-a, d-b); ! 284: else ! 285: { if (Old->nchan != 1 || c-a != d-b) ! 286: putheader(fd, min(3, Old->nchan), a, b, c, d); ! 287: putfile(fd, a, b, c-a, d-b); ! 288: } ! 289: close(fd); ! 290: } ! 291: ! 292: putfile(where, x, y, w, d) ! 293: { ! 294: putwindow(where, Old->pixred, x, y, w, d); ! 295: if (Old->nchan >= 3) ! 296: { putwindow(where, Old->pixgrn, x, y, w, d); ! 297: putwindow(where, Old->pixblu, x, y, w, d); ! 298: } ! 299: close(where); ! 300: } ! 301: ! 302: checkit() ! 303: { register int i; ! 304: ! 305: if (usedold && src[CUROLD].incore != 2 && (frameb || metheus)) ! 306: fprintf(stderr, "warning: picture on screen wasn't read\n"); ! 307: ! 308: for (i = 2; i < nsrc; i++) ! 309: if (src[i].used && src[i].incore != 2) ! 310: { src[i].used = 0; ! 311: getpix(&src[i], src[i].fname); ! 312: } ! 313: } ! 314: ! 315: setscratch(from, to) ! 316: struct SRC *from, *to; ! 317: { ! 318: register unsigned char *qr = from->pixred, *pr = to->pixred; ! 319: register unsigned char *qg = from->pixgrn, *pg = to->pixgrn; ! 320: register unsigned char *qb = from->pixblu, *pb = to->pixblu; ! 321: memcpy(pr, qr, DEF_NL*DEF_LL); ! 322: if (pg && qg) memcpy(pg, qg, DEF_NL*DEF_LL); ! 323: if (pb && qb) memcpy(pb, qb, DEF_NL*DEF_LL); ! 324: } ! 325: ! 326: getter(n) ! 327: { ! 328: if (n <= 0) ! 329: return; ! 330: if (n > 1) ! 331: { if (src[n].incore != 2) ! 332: getpix(&src[n], src[n].fname); ! 333: setscratch(&src[n], Old); ! 334: } ! 335: putscreen(CUROLD); ! 336: if (n > 1) ! 337: setscratch(Old, Scratch); ! 338: RESIDENT; ! 339: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.