diff options
Diffstat (limited to 'converter/pbm/pbmto10x.c')
-rw-r--r-- | converter/pbm/pbmto10x.c | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/converter/pbm/pbmto10x.c b/converter/pbm/pbmto10x.c new file mode 100644 index 00000000..f8a38b5d --- /dev/null +++ b/converter/pbm/pbmto10x.c @@ -0,0 +1,169 @@ +/* pbmto10x.c - read a portable bitmap and produce a Gemini 10X printer file +** +** Copyright (C) 1990, 1994 by Ken Yap +** +** 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. +** +** Modified to shorten stripes and eliminate blank stripes. Dec 1994. +*/ + +#include "pbm.h" +#include "mallocvar.h" + +#define LOW_RES_ROWS 8 /* printed per pass */ +#define HIGH_RES_ROWS 16 /* printed per pass */ + +static int highres = 0; +static FILE *ifp; +static int rows, cols, format; + + + +static void +outstripe(char * const stripe, + char * const sP, + int const reschar) { + + int ncols; + + char * p; + + p = sP; /* initial value */ + + /* scan backwards, removing empty columns */ + while (p != stripe) + if (*--p != 0) { + ++p; + break; + } + ncols = p - stripe; + if (ncols > 0) { + printf("\033%c%c%c", reschar, ncols % 256, ncols / 256); + fwrite(stripe, sizeof(char), ncols, stdout); + } + putchar('\n'); /* flush buffer */ +} + + + +static void +res_60x72(void) { + int i, item, npins, row, col; + bit *bitrows[LOW_RES_ROWS], *bP[LOW_RES_ROWS]; + char *stripe, *sP; + + MALLOCARRAY(stripe, cols); + if (stripe == NULL) + pm_error("Unable to allocate %u bytes for a stripe buffer.", + cols * sizeof(stripe[0])); + for (i = 0; i < LOW_RES_ROWS; ++i) + bitrows[i] = pbm_allocrow(cols); + printf("\033A\010"); /* '\n' = 8/72 */ + for (row = 0, sP = stripe; row < rows; row += LOW_RES_ROWS, sP = stripe) { + if (row + LOW_RES_ROWS <= rows) + npins = LOW_RES_ROWS; + else + npins = rows - row; + for (i = 0; i < npins; ++i) + pbm_readpbmrow(ifp, bP[i] = bitrows[i], cols, format); + for (col = 0; col < cols; ++col) { + item = 0; + for (i = 0; i < npins; ++i) + if (*(bP[i]++) == PBM_BLACK) + item |= 1 << (7 - i); + *sP++ = item; + } + outstripe(stripe, sP, 'K'); + } + printf("\033@"); + free(stripe); +} + + + +static void +res_120x144(void) { + int i, pin, item, npins, row, col; + bit *bitrows[HIGH_RES_ROWS], *bP[HIGH_RES_ROWS]; + char *stripe, *sP; + + MALLOCARRAY(stripe, cols); + if (stripe == NULL) + pm_error("Unable to allocate %u bytes for a stripe buffer.", + cols * sizeof(stripe[0])); + for (i = 0; i < HIGH_RES_ROWS; ++i) + bitrows[i] = pbm_allocrow(cols); + printf("\0333\001"); /* \n = 1/144" */ + for (row = 0, sP = stripe; row < rows; row += HIGH_RES_ROWS, sP = stripe) { + if (row + HIGH_RES_ROWS <= rows) + npins = HIGH_RES_ROWS; + else + npins = rows - row; + for (i = 0; i < npins; ++i) + pbm_readpbmrow(ifp, bP[i] = bitrows[i], cols, format); + for (col = 0; col < cols; ++col) { + item = 0; + /* even rows */ + for (pin = i = 0; i < npins; i += 2, ++pin) + if (*(bP[i]++) == PBM_BLACK) + item |= 1 << (7 - pin); + *sP++ = item; + } + outstripe(stripe, sP, 'L'); + sP = stripe; + for (col = 0; col < cols; ++col) { + item = 0; + /* odd rows */ + for (i = 1, pin = 0; i < npins; i += 2, ++pin) + if (*(bP[i]++) == PBM_BLACK) + item |= 1 << (7 - pin); + *sP++ = item; + } + outstripe(stripe, sP, 'L'); + printf("\033J\016"); /* 14/144 down, \n did 1/144 */ + } + printf("\033@"); + free(stripe); +} + + + +int +main(int argc, char * argv[]) { + + const char * fname; + + pbm_init( &argc, argv ); + + if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'h') { + highres = 1; + --argc; + ++argv; + } + if (argc-1 > 1) + pm_error("Too many arguments. Only argument is file name"); + else if (argc-1 == 1) + fname = argv[1]; + else + fname = "-"; + + ifp = pm_openr(fname); + + pbm_readpbminit(ifp, &cols, &rows, &format); + + if (highres) + res_120x144(); + else + res_60x72(); + + pm_close(ifp); + exit(0); +} + + + |