/* pbmtoescp2.c - read a portable bitmap and produce Epson ESC/P2 raster ** graphics output data for Epson Stylus printers ** ** Copyright (C) 2003 by Ulrich Walcher (u.walcher@gmx.de) ** and Jef Poskanzer. ** ** 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. */ /* I used the Epson ESC/P Reference Manual (1997) in writing this. */ #include #include "pm_c_util.h" #include "pbm.h" #include "shhopt.h" static char const esc = 033; struct cmdlineInfo { const char * inputFileName; unsigned int resolution; unsigned int compress; }; static void parseCommandLine(int argc, char ** argv, struct cmdlineInfo *cmdlineP) { optStruct3 opt; unsigned int option_def_index = 0; optEntry *option_def = malloc(100*sizeof(optEntry)); unsigned int compressSpec, resolutionSpec; opt.opt_table = option_def; opt.short_allowed = FALSE; opt.allowNegNum = FALSE; OPTENT3(0, "compress", OPT_UINT, &cmdlineP->compress, &compressSpec, 0); OPTENT3(0, "resolution", OPT_UINT, &cmdlineP->resolution, &resolutionSpec, 0); optParseOptions3(&argc, argv, opt, sizeof(opt), 0); if (argc-1 > 1) pm_error("Too many arguments: %d. " "Only argument is the filename", argc-1); if (compressSpec) { if (cmdlineP->compress != 0 && cmdlineP->compress != 1) pm_error("Invalid -compress value: %u. Only 0 and 1 are valid.", cmdlineP->compress); } else cmdlineP->compress = 1; if (resolutionSpec) { if (cmdlineP->resolution != 360 && cmdlineP->resolution != 180) pm_error("Invalid -resolution value: %u. " "Only 180 and 360 are valid.", cmdlineP->resolution); } else cmdlineP->resolution = 360; if (argc-1 == 1) cmdlineP->inputFileName = argv[1]; else cmdlineP->inputFileName = "-"; } static unsigned int enc_epson_rle(unsigned int const l, const unsigned char * const src, unsigned char * const dest) { /*---------------------------------------------------------------------------- compress l data bytes from src to dest and return the compressed length -----------------------------------------------------------------------------*/ unsigned int i; /* index */ unsigned int state; /* run state */ unsigned int pos; /* source position */ unsigned int dpos; /* destination position */ pos = dpos = state = 0; while ( pos < l ) { for (i=0; i<128 && pos+i= 24) putchar('\n'); } free(bytes); free(cprbytes); pm_close(ifP); /* Reset printer. */ printf("%c%c", esc, '@'); return 0; }