Blame converter/pbm/pbmto10x.c

Packit 78deda
/* pbmto10x.c - read a portable bitmap and produce a Gemini 10X printer file
Packit 78deda
**
Packit 78deda
** Copyright (C) 1990, 1994 by Ken Yap
Packit 78deda
**
Packit 78deda
** Permission to use, copy, modify, and distribute this software and its
Packit 78deda
** documentation for any purpose and without fee is hereby granted, provided
Packit 78deda
** that the above copyright notice appear in all copies and that both that
Packit 78deda
** copyright notice and this permission notice appear in supporting
Packit 78deda
** documentation.  This software is provided "as is" without express or
Packit 78deda
** implied warranty.
Packit 78deda
**
Packit 78deda
** Modified to shorten stripes and eliminate blank stripes. Dec 1994.
Packit 78deda
*/
Packit 78deda
Packit 78deda
#include <stdbool.h>
Packit 78deda
Packit 78deda
#include "pbm.h"
Packit 78deda
#include "mallocvar.h"
Packit 78deda
Packit 78deda
#define LOW_RES_ROWS    8       /* printed per pass */
Packit 78deda
#define HIGH_RES_ROWS   16      /* printed per pass */
Packit 78deda
Packit 78deda
Packit 78deda
Packit 78deda
static void
Packit 78deda
outstripe(char * const stripe, 
Packit 78deda
          char * const sP, 
Packit 78deda
          int    const reschar) {
Packit 78deda
Packit 78deda
    char * p;
Packit 78deda
Packit 78deda
    p = sP;  /* initial value */
Packit 78deda
Packit 78deda
    /* scan backwards, removing empty columns */
Packit 78deda
    while (p != stripe) 
Packit 78deda
        if (*--p != 0) {
Packit 78deda
            ++p;
Packit 78deda
            break;
Packit 78deda
        }
Packit 78deda
Packit 78deda
    {
Packit 78deda
        unsigned int const ncols = p - stripe;
Packit 78deda
Packit 78deda
        if (ncols > 0) {
Packit 78deda
            printf("\033%c%c%c", reschar, ncols % 256, ncols / 256);
Packit 78deda
            fwrite(stripe, sizeof(char), ncols, stdout);
Packit 78deda
        }
Packit 78deda
    }
Packit 78deda
    putchar('\n');          /* flush buffer */
Packit 78deda
}
Packit 78deda
Packit 78deda
Packit 78deda
Packit 78deda
static void
Packit 78deda
res_60x72(FILE * const ifP,
Packit 78deda
          int    const rows,
Packit 78deda
          int    const cols,
Packit 78deda
          int    const format) {
Packit 78deda
Packit 78deda
    int row;
Packit 78deda
    unsigned int i;
Packit 78deda
    bit * bitrows[LOW_RES_ROWS];
Packit 78deda
    char *stripe;
Packit 78deda
    char *sP;
Packit 78deda
Packit 78deda
    MALLOCARRAY(stripe, cols);
Packit 78deda
    if (stripe == NULL)
Packit 78deda
        pm_error("Unable to allocate %u bytes for a stripe buffer.",
Packit 78deda
                 (unsigned)(cols * sizeof(stripe[0])));
Packit 78deda
Packit 78deda
    for (i = 0; i < LOW_RES_ROWS; ++i)
Packit 78deda
        bitrows[i] = pbm_allocrow(cols);
Packit 78deda
Packit 78deda
    printf("\033A\010");        /* '\n' = 8/72 */
Packit 78deda
Packit 78deda
    for (row = 0, sP = stripe; row < rows; row += LOW_RES_ROWS, sP = stripe) {
Packit 78deda
        unsigned int col;
Packit 78deda
        unsigned int i;
Packit 78deda
        unsigned int npins;
Packit 78deda
        bit * bP[LOW_RES_ROWS];
Packit 78deda
Packit 78deda
        if (row + LOW_RES_ROWS <= rows)
Packit 78deda
            npins = LOW_RES_ROWS;
Packit 78deda
        else
Packit 78deda
            npins = rows - row;
Packit 78deda
Packit 78deda
        for (i = 0; i < npins; ++i)
Packit 78deda
            pbm_readpbmrow(ifP, bP[i] = bitrows[i], cols, format);
Packit 78deda
Packit 78deda
        for (col = 0; col < cols; ++col) {
Packit 78deda
            unsigned int item;
Packit 78deda
Packit 78deda
            item = 0;
Packit 78deda
            for (i = 0; i < npins; ++i)
Packit 78deda
                if (*(bP[i]++) == PBM_BLACK)
Packit 78deda
                    item |= 1 << (7 - i);
Packit 78deda
            *sP++ = item;
Packit 78deda
        }
Packit 78deda
        outstripe(stripe, sP, 'K');
Packit 78deda
    }
Packit 78deda
    printf("\033@");
Packit 78deda
Packit 78deda
    for (i = 0; i < LOW_RES_ROWS; ++i)
Packit 78deda
        pbm_freerow(bitrows[i]);
Packit 78deda
Packit 78deda
    free(stripe);
Packit 78deda
}
Packit 78deda
Packit 78deda
Packit 78deda
Packit 78deda
static void
Packit 78deda
res_120x144(FILE * const ifP,
Packit 78deda
            int    const rows,
Packit 78deda
            int    const cols,
Packit 78deda
            int    const format) {
Packit 78deda
Packit 78deda
    unsigned int i;
Packit 78deda
    int row;
Packit 78deda
    char *stripe;
Packit 78deda
    char * sP;
Packit 78deda
    bit * bitrows[HIGH_RES_ROWS];
Packit 78deda
Packit 78deda
    MALLOCARRAY(stripe, cols);
Packit 78deda
    if (stripe == NULL)
Packit 78deda
        pm_error("Unable to allocate %u bytes for a stripe buffer.",
Packit 78deda
                 (unsigned)(cols * sizeof(stripe[0])));
Packit 78deda
Packit 78deda
    for (i = 0; i < HIGH_RES_ROWS; ++i)
Packit 78deda
        bitrows[i] = pbm_allocrow(cols);
Packit 78deda
Packit 78deda
    printf("\0333\001");            /* \n = 1/144" */
Packit 78deda
Packit 78deda
    for (row = 0, sP = stripe; row < rows; row += HIGH_RES_ROWS, sP = stripe) {
Packit 78deda
        unsigned int i;
Packit 78deda
        unsigned int col;
Packit 78deda
        bit * bP[HIGH_RES_ROWS];
Packit 78deda
        unsigned int npins;
Packit 78deda
Packit 78deda
        if (row + HIGH_RES_ROWS <= rows)
Packit 78deda
            npins = HIGH_RES_ROWS;
Packit 78deda
        else
Packit 78deda
            npins = rows - row;
Packit 78deda
        for (i = 0; i < npins; ++i)
Packit 78deda
            pbm_readpbmrow(ifP, bP[i] = bitrows[i], cols, format);
Packit 78deda
        for (col = 0; col < cols; ++col) {
Packit 78deda
            unsigned int pin;
Packit 78deda
            unsigned int item;
Packit 78deda
            item = 0;
Packit 78deda
            /* even rows */
Packit 78deda
            for (pin = i = 0; i < npins; i += 2, ++pin)
Packit 78deda
                if (*(bP[i]++) == PBM_BLACK)
Packit 78deda
                    item |= 1 << (7 - pin);
Packit 78deda
            *sP++ = item;
Packit 78deda
        }
Packit 78deda
        outstripe(stripe, sP, 'L');
Packit 78deda
        for (col = 0, sP = stripe; col < cols; ++col) {
Packit 78deda
            unsigned int pin;
Packit 78deda
            unsigned int item;
Packit 78deda
            item = 0;
Packit 78deda
            /* odd rows */
Packit 78deda
            for (i = 1, pin = 0; i < npins; i += 2, ++pin)
Packit 78deda
                if (*(bP[i]++) == PBM_BLACK)
Packit 78deda
                    item |= 1 << (7 - pin);
Packit 78deda
            *sP++ = item;
Packit 78deda
        }
Packit 78deda
        outstripe(stripe, sP, 'L');
Packit 78deda
        printf("\033J\016");        /* 14/144 down, \n did 1/144 */
Packit 78deda
    }
Packit 78deda
    printf("\033@");
Packit 78deda
Packit 78deda
    for (i = 0; i < LOW_RES_ROWS; ++i)
Packit 78deda
        pbm_freerow(bitrows[i]);
Packit 78deda
Packit 78deda
    free(stripe);
Packit 78deda
}
Packit 78deda
Packit 78deda
Packit 78deda
Packit 78deda
int
Packit 78deda
main(int argc, const char ** argv) {
Packit 78deda
Packit 78deda
    const char * fname;
Packit 78deda
    static FILE * ifP;
Packit 78deda
    int rows, cols, format;
Packit 78deda
Packit 78deda
    bool isHighRes;
Packit 78deda
Packit 78deda
    pm_proginit(&argc, argv);
Packit 78deda
Packit 78deda
    isHighRes = false;  /* initial assumption */
Packit 78deda
    if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'h') {
Packit 78deda
        isHighRes = true;
Packit 78deda
        --argc;
Packit 78deda
        ++argv;
Packit 78deda
    }
Packit 78deda
    if (argc-1 > 1)
Packit 78deda
        pm_error("Too many arguments.  Only argument is file name");
Packit 78deda
    else if (argc-1 == 1)
Packit 78deda
        fname = argv[1];
Packit 78deda
    else
Packit 78deda
        fname = "-";
Packit 78deda
    
Packit 78deda
    ifP = pm_openr(fname);
Packit 78deda
Packit 78deda
    pbm_readpbminit(ifP, &cols, &rows, &format);
Packit 78deda
Packit 78deda
    if (isHighRes)
Packit 78deda
        res_120x144(ifP, rows, cols, format);
Packit 78deda
    else
Packit 78deda
        res_60x72(ifP, rows, cols, format);
Packit 78deda
Packit 78deda
    pm_close(ifP);
Packit 78deda
Packit 78deda
    return 0;
Packit 78deda
}
Packit 78deda
Packit 78deda
Packit 78deda