diff options
Diffstat (limited to 'converter/pbm/pbmtobbnbg.c')
-rw-r--r-- | converter/pbm/pbmtobbnbg.c | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/converter/pbm/pbmtobbnbg.c b/converter/pbm/pbmtobbnbg.c new file mode 100644 index 00000000..e97ef4f2 --- /dev/null +++ b/converter/pbm/pbmtobbnbg.c @@ -0,0 +1,152 @@ +/* pbmtobg.c - read a portable bitmap and produce BitGraph graphics +** +** Copyright 1989 by Mike Parker. +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, provided +** that the above copyright notice appear in all copies and that both that +** copyright notice and this permission notice appear in supporting +** documentation. This software is provided "as is" without express or +** implied warranty. +*/ + +/* +** Changed to take advantage of negative Packed Pixed Data values and +** supply ANSI-standard string terminator. Paul Milazzo, 28 May 1990. +*/ + +#include "pbm.h" + +static void write16 ARGS(( unsigned int )); + +static int nco; + +int +main(argc,argv) +int argc; +char **argv; +{ + int rows; + int cols; + int format; + bit *bitrow; + int row; + unsigned int sixteen; + int i; + unsigned int mask; + int op; + int x; + int y; + + + pbm_init( &argc, argv ); + + op = 3; + switch (argc) + { case 1: + break; + case 2: + op = atoi(argv[1]); + break; + case 3: + x = atoi(argv[1]); + y = atoi(argv[2]); + printf("\33:%d;%dm",x,y); + break; + case 4: + op = atoi(argv[1]); + x = atoi(argv[2]); + y = atoi(argv[3]); + printf("\33:%d;%dm",x,y); + break; + } + nco = 0; + pbm_readpbminit(stdin,&cols,&rows,&format); + printf("\33P:%d;%d;%ds\n",op,cols,rows); + bitrow = pbm_allocrow(cols); + for (row=0;row<rows;row++) + { pbm_readpbmrow(stdin,bitrow,cols,format); + sixteen = 0; + mask = 0x8000; + for (i=0;i<cols;i++) + { if (bitrow[i]==PBM_BLACK) sixteen |= mask; + mask >>= 1; + if (mask == 0) + { mask = 0x8000; + write16(sixteen); + sixteen = 0; + } + } + if (mask != 0x8000) + { write16(sixteen); + } + } + puts("\033\\"); + exit(0); +} + +#ifdef POSITIVE_VALUES_ONLY +static void +write16(sixteen) +unsigned int sixteen; +{ + if (nco > 75) + { putchar('\n'); + nco = 0; + } + if (sixteen & 0xfc00) + { putchar(0100+(sixteen>>10)); + nco ++; + } + if (sixteen & 0xfff0) + { putchar(0100+((sixteen>>4)&0x3f)); + nco ++; + } + putchar(060+(sixteen&0xf)); + nco ++; +} +#else +/* + * This version of "write16" uses negative Packed Pixel Data values to + * represent numbers in the range 0x7fff--0xffff; negative values will + * require fewer characters as they approach the upper end of that range. + */ +static void +write16 (word) +unsigned int word; +{ + int high; + int mid; + int low; + int signChar; + + if (nco > 75) { + putchar ('\n'); + nco = 0; + } + + if (word > 0x7fff) { + word = (unsigned int) (0x10000L - (long) word); + signChar = ' '; + } + else + signChar = '0'; + + high = (word >> 10) + '@'; + mid = ((word & 0x3f0) >> 4) + '@'; + low = (word & 0xf) + signChar; + + if (high != '@') { + printf ("%c%c%c", high, mid, low); + nco += 3; + } + else if (mid != '@') { + printf ("%c%c", mid, low); + nco += 2; + } + else { + putchar (low); + nco++; + } +} +#endif |