|
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 |
|