|
|
1.1 ! root 1: /* tty.c - display on any terminal */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/others/quipu/photo/RCS/tty.c,v 7.0 89/11/23 22:01:49 mrose Rel $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/others/quipu/photo/RCS/tty.c,v 7.0 89/11/23 22:01:49 mrose Rel $ ! 9: * ! 10: * ! 11: * $Log: tty.c,v $ ! 12: * Revision 7.0 89/11/23 22:01:49 mrose ! 13: * Release 6.0 ! 14: * ! 15: */ ! 16: ! 17: /* ! 18: * NOTICE ! 19: * ! 20: * Acquisition, use, and distribution of this module and related ! 21: * materials are subject to the restrictions of a license agreement. ! 22: * Consult the Preface in the User's Manual for the full terms of ! 23: * this agreement. ! 24: * ! 25: */ ! 26: ! 27: ! 28: ! 29: #include "stdio.h" ! 30: #include "quipu/photo.h" ! 31: ! 32: #define GREYSCALE "#OI&\\*o=_\"-;:,. " ! 33: ! 34: char mapping[16]; ! 35: char * strcpy (); ! 36: ! 37: char buffer[500][500]; ! 38: int lineno = 0, ! 39: pos = 0; ! 40: extern int PIC_LINESIZE; ! 41: extern int NUMLINES; ! 42: int scale = 8; ! 43: int invert = 0; ! 44: int equal = 0; ! 45: int ln = 0; ! 46: int scalediv = 0; ! 47: int edges = 0; ! 48: ! 49: char level[128]; ! 50: char show[128]; ! 51: char display[50][50]; ! 52: ! 53: /* ARGSUSED */ ! 54: photo_start (name) ! 55: char *name; ! 56: { ! 57: char *ptr, ! 58: *getenv (); ! 59: ! 60: ! 61: if ((ptr = getenv ("photo_invert")) != (char *) NULL) ! 62: if (strcmp (ptr, "true") == 0) ! 63: invert = 1; ! 64: ! 65: if ((ptr = getenv ("photo_equal")) != (char *) NULL) { ! 66: if (strcmp (ptr, "true") == 0) ! 67: equal = 1; ! 68: else if (strcmp (ptr, "edge") == 0) { ! 69: int i, ! 70: j; ! 71: ! 72: for (i = 1; i < PIC_LINESIZE; i++) ! 73: for (j = 1; j < NUMLINES; j++) ! 74: buffer[i][j] = 0; ! 75: edges = 1; ! 76: } ! 77: } ! 78: if ((ptr = getenv ("photo_mapping")) != (char *) NULL) ! 79: (void) strcpy (mapping, ptr); ! 80: else ! 81: (void) strcpy (mapping, GREYSCALE); ! 82: ! 83: if ((ptr = getenv ("photo_scale")) != (char *) NULL) { ! 84: if (strcmp (ptr, "large") == 0) ! 85: scale = 1; ! 86: else if (strcmp (ptr, "small") == 0) ! 87: scale = 8; ! 88: else if (strcmp (ptr, "medium") == 0) ! 89: scale = 4; ! 90: } ! 91: scalediv = scale * scale / 8; ! 92: ! 93: (void) printf ("\n"); ! 94: return (0); ! 95: } ! 96: ! 97: /* ARGSUSED */ ! 98: photo_end (name) ! 99: char *name; ! 100: { ! 101: int i, ! 102: j, ! 103: k; ! 104: int numlev; ! 105: int total = 0; ! 106: int totlevel = 0; ! 107: int cnt; ! 108: ! 109: if (equal) { ! 110: numlev = scale * scale * 2; ! 111: for (i = 0; i < numlev; i++) ! 112: level[i] = 0; ! 113: ! 114: for (i = 0; i < ln; i++) ! 115: for (j = 0; j < PIC_LINESIZE / scale; j++) ! 116: level[display[i][j]]++; ! 117: ! 118: for (i = 0; i < numlev; i++) ! 119: totlevel += level[i]; ! 120: ! 121: for (i = 0; i < numlev; i++) { ! 122: total += level[i]; ! 123: show[i] = (total * 16) / totlevel; ! 124: if (show[i] >= 16) ! 125: show[i] = 15; ! 126: } ! 127: ! 128: for (i = 0; i < ln; i++) { ! 129: for (j = 0; j < PIC_LINESIZE / scale; j++) { ! 130: if (invert) ! 131: (void) putc (mapping[show[display[i][j]]],stdout); ! 132: else ! 133: (void) putc (mapping[15 - show[display[i][j]]],stdout); ! 134: } ! 135: (void) printf ("\n"); ! 136: } ! 137: } else if (edges) { ! 138: /* edges by expansion */ ! 139: char ebuf[500][500]; ! 140: ! 141: for (i = 1; i < PIC_LINESIZE; i++) ! 142: for (j = 1; j < NUMLINES; j++) ! 143: ebuf[i][j] = 0; ! 144: ! 145: for (i = 1; i < PIC_LINESIZE; i++) ! 146: for (j = 1; j < NUMLINES; j++) ! 147: if (buffer[i][j] == 1) { ! 148: ebuf[i - 1][j - 1] = 1; ! 149: ebuf[i - 1][j] = 1; ! 150: ebuf[i - 1][j + 1] = 1; ! 151: ebuf[i][j - 1] = 1; ! 152: ebuf[i][j + 1] = 1; ! 153: ebuf[i + 1][j - 1] = 1; ! 154: ebuf[i + 1][j] = 1; ! 155: ebuf[i + 1][j + 1] = 1; ! 156: } ! 157: for (i = 1; i < PIC_LINESIZE; i++) ! 158: for (j = 1; j < NUMLINES; j++) ! 159: if (buffer[i][j] == 1) ! 160: ebuf[i][j] = 0; ! 161: ! 162: for (lineno = 0; lineno < NUMLINES; lineno += (2 * scale)) { ! 163: for (k = 0; k < PIC_LINESIZE; k += scale) { ! 164: cnt = 0; ! 165: for (i = k; i < k + scale; i++) ! 166: for (j = lineno; j < (2 * scale) + lineno; j++) ! 167: cnt += ebuf[i][j]; ! 168: ! 169: /* Need to select a grey level on the strength of the edge ! 170: * ! 171: * cnt *= 4; ! 172: * if (cnt == (scalediv * 16)) ! 173: * cnt = (scalediv * 16) -1; ! 174: * ! 175: * Just set "strong" edge cells "on" for now ... ! 176: */ ! 177: if (cnt > (scalediv * 2) ) ! 178: cnt = (scalediv * 16) -1; ! 179: else ! 180: cnt = 0; ! 181: ! 182: if (invert) ! 183: (void) putc (mapping[(cnt / scalediv)],stdout); ! 184: else ! 185: (void) putc (mapping[15 - (cnt / scalediv)],stdout); ! 186: } ! 187: (void) putc ('\n',stdout); ! 188: } ! 189: ! 190: } ! 191: return (0); ! 192: ! 193: } ! 194: ! 195: photo_black (length) ! 196: int length; ! 197: { ! 198: int i; ! 199: ! 200: if (scale == 1) { ! 201: for (i = pos; i < length + pos; i++) ! 202: if (invert) ! 203: (void) putc (' ',stdout); ! 204: else ! 205: (void) putc ('#',stdout); ! 206: return; ! 207: } ! 208: for (i = pos; i < length + pos; i++) ! 209: buffer[i][lineno] = 1; ! 210: pos += length; ! 211: } ! 212: ! 213: photo_white (length) ! 214: int length; ! 215: { ! 216: int i; ! 217: ! 218: if (scale == 1) { ! 219: for (i = pos; i < length + pos; i++) ! 220: if (invert) ! 221: (void) putc ('#',stdout); ! 222: else ! 223: (void) putc (' ',stdout); ! 224: return; ! 225: } ! 226: for (i = pos; i < length + pos; i++) ! 227: buffer[i][lineno] = 0; ! 228: pos += length; ! 229: } ! 230: ! 231: /* ARGSUSED */ ! 232: photo_line_end (line) ! 233: bit_string *line; ! 234: { ! 235: int i, ! 236: j, ! 237: k, ! 238: cnt; ! 239: ! 240: if (scale == 1) { ! 241: (void) putc ('\n',stdout); ! 242: return; ! 243: } ! 244: lineno++; ! 245: pos = 0; ! 246: ! 247: if (edges) ! 248: return; ! 249: ! 250: if (lineno >= 2 * scale) { ! 251: ln++; ! 252: lineno = 0; ! 253: for (k = 0; k < PIC_LINESIZE; k += scale) { ! 254: cnt = 0; ! 255: for (i = k; i < k + scale; i++) ! 256: for (j = 0; j < 2 * scale; j++) ! 257: cnt += buffer[i][j]; ! 258: ! 259: if (equal) { ! 260: display[ln][k / scale] = cnt; ! 261: continue; ! 262: } ! 263: if (cnt == (scalediv * 16)) ! 264: cnt--; ! 265: ! 266: ! 267: if (invert) ! 268: (void) putc (mapping[cnt / scalediv],stdout); ! 269: else ! 270: (void) putc (mapping[15 - (cnt / scalediv)],stdout); ! 271: } ! 272: ! 273: if (!equal) ! 274: (void) putc ('\n',stdout); ! 275: } ! 276: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.