/*************************************************************************** pnm2ppa.c - program to print PNM input streams to PPA Deskjets ------------------- begin : Thu Jan 13 2000 copyright : (C) 1998-2000 by the pnm2ppa project email : ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include #include #define __PNM2PPA_C__ #include "ppa_syslog.h" #include "global.h" #include "image.h" #include "debug.h" #include "defaults.h" #include "ppa.h" #include "pnm2ppa.h" #include "gamma.h" #include "lang.h" double Gamma_R, Gamma_G, Gamma_B; int adjust_coloffsx, adjust_coloffsy; int print_pnm (FILE * fptr) { char line[1024]; image_t image; int numpages = 0, pagenum ; int res; int image_width; snprintf(syslog_message,message_size,"%s", gMessages[LOG_START]); wrap_syslog (LOG_INFO,"%s",syslog_message); ppa_init_job (&printer); while (initImage (&image, fptr)) { pagenum = numpages + 1; DPRINTF ("Initializing page %d...\n ", pagenum); ppa_init_page (&printer); DPRINTF ("Done!\n"); DPRINTF ("Loading page %d... \n", pagenum); ppa_load_page (&printer); DPRINTF ("Done!\n"); image_width = image.width * 3 * sizeof (int) ; DPRINTF ("image.width * 3 * sizeof(int)) == %d\n", image_width ); gErrVec = malloc (image_width ); if (!gErrVec) { snprintf(syslog_message,message_size,"print_pnm(): %s", gMessages[E_BADMALLOC]); wrap_syslog (LOG_CRIT, "%s",syslog_message); exit (1); } memset (gErrVec, 0x00, image_width ); gErrVec_bw = malloc (image_width ); if (!gErrVec_bw) { snprintf(syslog_message,message_size, "print_pnm(): %s", gMessages[E_BADMALLOC]); wrap_syslog (LOG_CRIT, "%s",syslog_message); exit (1); } memset (gErrVec_bw, 0x00, image_width ); snprintf(syslog_message,message_size, "%s %d (%s)\n", gMessages[LOG_PAGE], pagenum, gFormat); wrap_syslog (LOG_INFO, "%s",syslog_message); if ((res = ppa_print_page (&printer, &image)) != 0) { DPRINTF ("ppa_print_page returned %d!!\n", res); free (gErrVec); return res; } free (gErrVec); free (gErrVec_bw); snprintf(syslog_message,message_size, "%s %d\n", gMessages[LOG_FINISH], pagenum ); wrap_syslog (LOG_INFO, "%s",syslog_message); DPRINTF ("Ejecting page %d... \n", pagenum); ppa_eject_page (&printer); DPRINTF ("Ejected!\n"); /* eat any remaining whitespace */ if (image.version == P1_PBM) fgets (line, 1024, fptr); numpages++; if (gGammaMode) break; } if (numpages == 0) { snprintf(syslog_message,message_size,"%s" , gMessages[LOG_NOPAGES]); wrap_syslog (LOG_INFO, "%s",syslog_message); return 1; } ppa_end_print (&printer); snprintf(syslog_message,message_size,"%s" , gMessages[LOG_SUCCESS]); wrap_syslog (LOG_INFO, "%s",syslog_message); fclose (image.fptr); fclose (printer.fptr); return 0; } /* safe transcription of paths specified in user input */ char * readPath(char *input ) { char File_path[MAXPATHLEN]; char *path = NULL; /* security audit ajv 20001007; be very careful with input strings!*/ if (strlen(input) < MAXPATHLEN ) { if ( strncpy (File_path, input, MAXPATHLEN )) { /* a user-specifed file *File_path may later be opened; should any extra validation of this be performed now ? */ /* remember to free(path) after use! */ path = strdup(File_path); return path; } } else { snprintf(syslog_message,message_size,"%s %d\n", gMessages[E_BAD_PATH], MAXPATHLEN); wrap_syslog (LOG_CRIT,"%s",syslog_message); abort(); } return path; } /* this should be called when you need to set up the printer * object for a particular printer. */ void set_printer_specific_defaults (void) { if (printer.version != NOPRINTER && printer.version != HP7X0 && printer.version != HP820 && printer.version != HP1000) { snprintf(syslog_message,message_size, "set_printer_defaults(): %s", gMessages[E_PPA_UNKNOWN]); wrap_syslog (LOG_CRIT,"%s",syslog_message); exit (1); } printer.ColBwOffsX = gPrinterDefaults[printer.version].ColBwOffsX; printer.ColBwOffsY = gPrinterDefaults[printer.version].ColBwOffsY; printer.x_offset = gPrinterDefaults[printer.version].x_offset; printer.y_offset = gPrinterDefaults[printer.version].y_offset; printer.r2l_col_offset = gPrinterDefaults[printer.version].r2l_col_offset; printer.r2l_bw_offset = gPrinterDefaults[printer.version].r2l_bw_offset; printer.top_margin = gPrinterDefaults[printer.version].top_margin; printer.bottom_margin = gPrinterDefaults[printer.version].bottom_margin; printer.left_margin = gPrinterDefaults[printer.version].left_margin; printer.right_margin = gPrinterDefaults[printer.version].right_margin; printer.marg_diff = gPrinterDefaults[printer.version].marg_diff; printer.bufsize = gPrinterDefaults[printer.version].bufsize; printer.min_pagewidth = gPrinterDefaults[printer.version].min_pagewidth; printer.max_pagewidth = gPrinterDefaults[printer.version].max_pagewidth; printer.min_pageheight = gPrinterDefaults[printer.version].min_pageheight; printer.max_pageheight = gPrinterDefaults[printer.version].max_pageheight;} void show_usage (char *prog) { printf ("usage: %s [ options ] [-i ] [ -o ]] \n\n", prog); printf (" Prints a pnm- or pnmraw-format to HP720/820/1000-format .\n\n"); printf (" -b bottom margin in 1\"/600 (default: 150 = 0.25\")\n"); printf (" --bi forces bidirectional print head sweeps\n"); printf (" -B density of black ink (n = 0,1,2,3 or 4)\n"); printf (" --bw forces black/white output\n"); printf (" -d dumps the configuration to stdout\n"); printf (" --eco Econofast mode (uses less ink)\n"); printf (" --dpi300 Treat input resolution as 300dpi instead of 600dpi\n"); printf (" -f read printer settings from configuration file \n"); printf (" -F read color correction table from file \n"); printf (" --fd use fast dithering mode\n"); printf (" -g print color calibration page. See CALIBRATION.txt\n"); printf (" -h, --help displays this help text.\n"); printf (" -i input from file , \"-i -\" means stdin\n"); printf (" -l left margin in 1\"/600 (default: 150 = 0.25\")\n"); printf (" --noGamma suppresses any color correction\n"); printf (" -o output to file , \"-o -\" means stdout\n"); printf (" -p disable black ink cartridge\n"); printf (" -r right margin in 1\"/600 (default: 150 = 0.25\")\n"); printf (" -s default papersize (a4, legal, letter = us (default))\n"); printf (" -t top margin in 1\"/600 (default: 150 = 0.25\")\n"); printf (" --uni forces unidirectional print head sweeps\n"); printf (" -v set the printer model (710, 712, 720, 722, 820, or 1000)\n"); printf (" --verbose outputs syslog output to stderr as well\n"); printf (" --version Display the version of %s to the syslog\n", prog); printf (" -x vertical offset adjustment in 1\"/600\n"); printf (" -y horizontal offset adjustment in 1\"/600\n\n"); printf (" The -v option resets the margins and offset adjustments to the \n"); printf (" default values for that printer model. and default\n"); printf (" to stdin and stdout. '-' is a synonym for stdin and stdout.\n\n"); printf (" Configuration files specified with the '-f' parameter have the following\n format:\n\n"); printf (" # Comment\n"); printf (" \n"); printf (" \n"); printf (" [etc.]\n\n"); printf (" Valid keys include 'version', 'xoffset', 'yoffset', 'topmargin', 'leftmargin',\n"); printf (" 'rightmargin', 'bottommargin', 'blackness', 'papersize', or any non-null\n"); printf (" truncated version of these words. Valid values are the same as with \n"); printf (" the corresponding command-line parameters.\n"); printf (" Other keys that can be only set in the configuration file include:\n"); printf (" 'silent', 'verbose', 'log_info',\n"); printf (" 'unimode', 'blackshear', 'colorshear',\n"); printf (" 'RedGammaIdx','BlueGammaIdx', 'GreenGammaIdx',\n"); printf (" 'GammaR', 'GammaG', 'GammaB',\n"); printf (" 'ColOffsX', 'ColOffsY',\n"); printf (" 'black_ink', 'color_ink', 'cyan_ink', 'magenta_ink', 'yellow_ink',\n"); printf (" 'compression';\n"); printf (" see documentation in the sample configuration file for their usage.\n\n"); printf (" The order in which parameters are specified is important:\n"); printf (" the file %s, if it exists, is processed as a configuration\n", defaultcfgfile); printf (" file before any command-line parameters are processed.\n"); printf (" If an alternate configuration file is specified on the command line\n"); printf (" with the '-f' parameter, its contents are processed at that point.\n"); printf (" If a parameter is specified more than once, only its last value is used.\n\n"); } void parm_version (char *arg) { if (!strcasecmp (arg, "hp720") || !strcmp (arg, "720") || !strcasecmp (arg, "hp722") || !strcmp (arg, "722") || !strcasecmp (arg, "hp710") || !strcmp (arg, "710") || !strcasecmp (arg, "hp712") || !strcmp (arg, "712")) printer.version = HP7X0; else if (!strcasecmp (arg, "hp820") || !strcmp (arg, "820")) printer.version = HP820; else if (!strcasecmp (arg, "hp1000") || !strcmp (arg, "1000")) printer.version = HP1000; else { snprintf(syslog_message,message_size,"parm_version(): %s", gMessages[E_PPA_UNKNOWN]); wrap_syslog (LOG_CRIT,"%s",syslog_message); exit (1); } set_printer_specific_defaults (); } void parm_iversion (int arg) { switch (arg) { case 0: printer.version = NOPRINTER; break; case 720: case 722: case 710: case 712: printer.version = HP7X0; break; case 820: printer.version = HP820; break; case 1000: printer.version = HP1000; break; default: { snprintf(syslog_message,message_size,"parm_iversion(): %s", gMessages[E_PPA_UNKNOWN]); wrap_syslog (LOG_CRIT,"%s",syslog_message); exit (1); } } set_printer_specific_defaults (); } void dump_config (void) { printf ("pnm2ppa version " VERSION "\n\n"); printf ("Printer: "); switch (printer.version) { case HP7X0: printf ("HP 710c, 712c, 720c or 722c\n\n"); break; case HP820: printf ("HP820\n\n"); break; case HP1000: printf ("HP1000\n\n"); break; case NOPRINTER: default: printf ("unknown printer\n"); exit (1); } printf ("Color Head Offset Adjustments:\n ColOffsX: %d\n ColOffsY: %d\n\n", adjust_coloffsx, adjust_coloffsy); printf ("Offsets:\n xoffset: %d\n yoffset: %d\n\n", printer.x_offset, printer.y_offset); printf ("Shearing corrections for bidirectional printing (right_to_left):\n blackshear: %d\n colorshear: %d\n\n", printer.r2l_bw_offset, printer.r2l_col_offset); printf ("Margins:\n\ttop:\t%d\n\tbottom:\t%d\n", printer.top_margin, printer.bottom_margin); printf ("\tleft:\t%d\n\tright:\t%d\n\n", printer.left_margin, printer.right_margin); printf ("Gamma values:\n\tRed:\t%f\n\tGreen:\t%f\n\tBlue:\t%f\n", Gamma_R, Gamma_G, Gamma_B ); exit (0); } /* only let gSilent be set to switch off syslog from $SYSCONFDIR/etc/pnm2ppa.conf, and not from subsequent readings of config files */ BOOLEAN system_config_file ; void read_config_file (char *fname) { FILE *cfgfile = fopen (fname, "r"); char line[1024], key[14], buf[10]; int len, value, count, lineno = 1; if (!cfgfile) { snprintf(syslog_message,message_size,"read_config_file(): %s", gMessages[E_BADCONFIGFILE] ); wrap_syslog (LOG_CRIT,"%s",syslog_message); exit (1); } while (fgets (line, 1024, cfgfile)) { if (strchr (line, '#')) *strchr (line, '#') = 0; count = sscanf (line, "%13s%9s", key, buf); if (count == 2) { DPRINTF("config file %s: keyword %s value %s\n",fname,key,buf); } switch (count) { case 2: value = atoi (buf); len = strlen (key); if (!strncmp (key, "version", len)) parm_iversion (value); else if (!strncmp (key, "xoffset", len)) printer.x_offset = value; else if (!strncmp (key, "yoffset", len)) printer.y_offset = value; else if (!strncmp (key, "blackshear", len)) printer.r2l_bw_offset = value; else if (!strncmp (key, "colorshear", len)) printer.r2l_col_offset = value; else if (!strncmp (key, "dump", len)) dump_config (); else if (!strncmp (key, "topmargin", len)) printer.top_margin = value; else if (!strncmp (key, "leftmargin", len)) printer.left_margin = value; else if (!strncmp (key, "rightmargin", len)) printer.right_margin = value; else if (!strncmp (key, "bottommargin", len)) printer.bottom_margin = value; else if (!strncmp (key, "GammaR", len)) Gamma_R = atof(buf); else if (!strncmp (key, "GammaG", len)) Gamma_G = atof(buf); else if (!strncmp (key, "GammaB", len)) Gamma_B = atof(buf); else if (!strncmp (key, "RedGammaIdx", len)) Gamma_R = GammaValue(value); else if (!strncmp (key, "GreenGammaIdx", len)) Gamma_G = GammaValue(value); else if (!strncmp (key, "BlueGammaIdx", len)) Gamma_B = GammaValue(value); else if (!strncmp (key, "ColOffsX", len)) adjust_coloffsx = value; else if (!strncmp (key, "ColOffsY", len)) adjust_coloffsy = value; else if (!strncmp (key, "blackness", len)) gBlackness = value; else if (!strncmp (key, "unimode", len)) { if ( value ) gUnimode = true ; else gUnimode = false ; } else if (!strncmp (key, "black_ink", len)) { if ( value ) gBlack = true ; else gBlack = false ; } else if (!strncmp (key, "cyan_ink", len)) { if ( value ) gCyan = true ; else gCyan = false ; } else if (!strncmp (key, "magenta_ink", len)) { if ( value ) gMagenta = true ; else gMagenta = false ; } else if (!strncmp (key, "yellow_ink", len)) { if ( value ) gYellow = true ; else gYellow = false ; } else if (!strncmp (key, "color_ink", len)) { if ( value ) { gCyan = true ; gMagenta = true ; gYellow = true ; } else { gCyan = false ; gMagenta = false ; gYellow = false ; } } else if (!strncmp (key, "silent", len)) { if (system_config_file) { gSilent = true; wrap_closelog(); } } else if (!strncmp (key, "log_info", len)) { if (system_config_file) { if ( value ) gLogInfo = true ; else gLogInfo = false ; } } else if (!strncmp (key, "verbose", len)) { gVerbose = true; if (!(gSilent)) { wrap_closelog (); wrap_openlog ("pnm2ppa", 1); } snprintf(syslog_message,message_size, "pnm2ppa: %s", gMessages[LOG_VERBOSE]); wrap_syslog(LOG_INFO,"%s",syslog_message); } else if (!strncmp (key, "papersize", len)) { if (!strncmp (buf, "us", 2) || !strncmp (buf, "letter", 6)) { gWidth = LETTERWIDTH; gHeight = LETTERHEIGHT; } else if (!strncmp (buf, "legal", 5)) { gWidth = LEGALWIDTH; gHeight = LEGALHEIGHT; } else if (!strncmp (buf, "a4", 2)) { gWidth = A4WIDTH; gHeight = A4HEIGHT; } else { snprintf(syslog_message,message_size,"read_config_file(): %s", gMessages[E_BAD_PAPER] ); wrap_syslog (LOG_CRIT,"%s",syslog_message); exit (1); } } else if (!strncmp (key, "compression", len)) { if ( value ) gCompress = true ; else gCompress = false ; } else { snprintf(syslog_message,message_size,"read_config_file(): %s (%s %d)\n", gMessages[E_BADPARM] , gMessages[LINE],lineno ); wrap_syslog (LOG_CRIT,"%s",syslog_message); show_usage ("pnm2ppa"); exit (1); } case EOF: case 0: break; default: snprintf(syslog_message,message_size, "read_config_file(): %s %s %d\n", gMessages[E_PARSE_CONFIG], gMessages[LINE], lineno); wrap_syslog (LOG_CRIT,"%s",syslog_message); exit (1); } lineno++; } if (feof (cfgfile)) { fclose (cfgfile); return; } snprintf(syslog_message,message_size,"read_config_file(): %s\n", gMessages[E_PARSE_CONFIG]); wrap_syslog (LOG_CRIT,"%s",syslog_message); exit (1); } int main (int argc, char *argv[]) { int i, opt_index; FILE *in = NULL, *out = NULL, *gf = NULL; struct stat tmpstat; int c; BOOLEAN get_Gamma = true; char gammaFile[MAXPATHLEN]; char pnm_inputFile[MAXPATHLEN]; char ppa_outputFile[MAXPATHLEN]; BOOLEAN use_stdin = false; BOOLEAN use_stdout = false; BOOLEAN got_Input = false; BOOLEAN got_Output = false; BOOLEAN got_Gamma = false; gSilent = false; gVerbose = false; system_config_file = true; #ifdef __NO_SYSLOG__ gSilent = true; #endif strncpy(gammaFile,defaultgammafile,MAXPATHLEN); /* activate syslog */ if (!(gSilent)) { #ifdef DEBUG wrap_openlog( "pnm2ppa", 1); #else wrap_openlog( "pnm2ppa", 0); #endif } if (argc < 2) { show_usage (*argv); exit (0); } /* setup the printer object */ printer.version = HP7X0; set_printer_specific_defaults (); /* initialize global variables with default values */ gEcoMode = false; gWidth = LETTERWIDTH; gHeight = LETTERHEIGHT; gBlackness = 2; gPixmapMode = false; gGammaMode = false; gColorMode = true; gFastMode = false; gUnimode = false; g300 = false; gCompress = true; gLogInfo = false; /* no LOG_INFO syslog messages by default */ gBlack = true; gCyan = true; gMagenta = true; gYellow = true; Gamma_R = 1.0; Gamma_G = 1.0; Gamma_B = 1.0; adjust_coloffsx = 0; adjust_coloffsy = 0; if (!stat (defaultcfgfile, &tmpstat)) read_config_file (defaultcfgfile); system_config_file = false; /* read through the optional arguments before tring to find filenames */ while ((c = getopt_long (argc, argv, "F:B:b:df:ghi:l:o:pr:s:t:v:x:y:", long_opts, &opt_index)) != EOF) { switch (c) { case 0: /* long options */ switch (opt_index) { case 0: /* --bw Black & White */ gColorMode = false; #if 0 gEcoMode = false; /*this is not needed here (?) duncan*/ #endif gMaxPass = 1; break; case 1: /* --fd Fast Dither*/ gFastMode = true; gMaxPass = 1; break; case 2: /* --version (output to stderr, not syslog) */ fprintf(stderr,"%s %s %s %s %s\n", *argv, gMessages[LOG_VERSION], VERSION, __DATE__, __TIME__); exit (0); break; case 3: /* --help */ show_usage (*argv); return 0; break; case 4: /* --verbose */ gVerbose = true; if (!(gSilent)) { wrap_closelog (); wrap_openlog ("pnm2ppa", 1); } break; case 5: /* --eco */ gEcoMode = true; break; case 6: /* --noGamma */ get_Gamma = false; break; case 7: /* --uni */ gUnimode = true; break; case 8: /* --bi */ gUnimode=false; break; case 9: /* --dpi300 */ g300=true; break; default: snprintf(syslog_message,message_size,"main (): %s", gMessages[E_UNKNOWN_ARG]); wrap_syslog (LOG_CRIT,"%s",syslog_message); DPRINTF(" unknown longopt switch case should not happen"); return 1; break; } break; case 'b': printer.bottom_margin = atoi (optarg); break; case 'B': gBlackness = atoi(optarg); break; case 'd': dump_config (); break; case 'f': { char *configFile=NULL; configFile = readPath (optarg); if (configFile) { read_config_file (configFile); free(configFile); } } break; case 'F': { char *path=NULL; path = readPath (optarg); if (path) { strncpy(gammaFile,path,MAXPATHLEN); free(path); } } break; case 'g': gGammaMode = true; break; case 'h': show_usage (*argv); return 0; break; case 'i': if (strncmp (optarg, "-", MAXPATHLEN) == 0) { use_stdin = true; got_Input = true; } else { char *path=NULL; path = readPath (optarg); if (path) { strncpy(pnm_inputFile,path,MAXPATHLEN); free(path); use_stdin = false; got_Input = true; } } break; case 'l': printer.left_margin = atoi (optarg); break; case 'o': if (strncmp (optarg, "-", MAXPATHLEN) == 0) { use_stdout = true; got_Output = true; } else { char *path=NULL; path = readPath(optarg); if (path) { strncpy(ppa_outputFile,path,MAXPATHLEN); free(path); use_stdout = false ; got_Output = true; } } break; case 'p': gPixmapMode = true; break; case 'r': printer.right_margin = atoi (optarg); break; case 's': /* paper size stuffer (only used in -g mode ) */ if (!strncmp (optarg, "us", 2) || !strncmp (optarg, "letter", 6)) { gWidth = LETTERWIDTH; gHeight = LETTERHEIGHT; } else if (!strncmp (optarg, "legal", 5)) { gWidth = LEGALWIDTH; gHeight = LEGALHEIGHT; } else if (!strncmp (optarg, "a4", 2)) { gWidth = A4WIDTH; gHeight = A4HEIGHT; } else { snprintf(syslog_message,message_size,"main(): %s ", gMessages[E_BAD_PAPER] ); wrap_syslog (LOG_CRIT,"%s",syslog_message); return 1; } break; case 't': printer.top_margin = atoi (optarg); break; case 'v': parm_version (optarg); break; case 'x': printer.x_offset = atoi (optarg); break; case 'y': printer.y_offset = atoi (optarg); break; default: snprintf(syslog_message,message_size,"main(): %s", gMessages[E_UNKNOWN_ARG]); wrap_syslog (LOG_CRIT,"%s",syslog_message); return 1; break; } } /* open input stream, if already specified */ if (got_Input) { if (use_stdin) in = stdin; else { if ((in = fopen (pnm_inputFile, "rb")) == NULL) { snprintf(syslog_message,message_size,"main(): %s", gMessages[E_BAD_INPUT]); wrap_syslog (LOG_CRIT,"%s",syslog_message); return 1; } } } /* open output stream, if already specified */ if (got_Output) { if (use_stdout) out = stdout; else { if ((out = fopen (ppa_outputFile, "wb")) == NULL) { snprintf(syslog_message,message_size,"main(): %s", gMessages[E_BAD_OUTPUT] ); wrap_syslog (LOG_CRIT,"%s",syslog_message); return 1; } } } /* move on to the list argument*/ argc -= optind; argv += optind; /* if the user hasn't yet specified -i or -o, we see if there are any remaining arguments. Only allows both arguments to work here. This is a legacy option style used by pbm2ppa */ if (argc == 2 && !in && !out) { if (strncmp (argv[1], "-", MAXPATHLEN) == 0) { in = stdin; } else { if ((in = fopen (argv[0], "rb")) == NULL) { snprintf(syslog_message,message_size,"main(): %s", gMessages[E_BAD_INPUT]); wrap_syslog (LOG_CRIT,"%s",syslog_message); return 1; } } if (strncmp (argv[1], "-", MAXPATHLEN) == 0) { out = stdout; } else { if ((out = fopen (argv[1], "wb")) == NULL) { snprintf(syslog_message,message_size,"main(): %s", gMessages[E_BAD_OUTPUT]); wrap_syslog (LOG_CRIT,"%s",syslog_message); return 1; } } } /* if no input is specified, we terminate */ /* if the user doesn't specify output file, we make like a pipe*/ if (in == NULL) exit(0); if (out == NULL) out = stdout; printer.fptr = out; /* set minimum and maximum paper sizes for the printer (the DeskJet 1000C has different limits from other models ) */ gminWidth = printer.min_pagewidth ; gmaxWidth = printer.max_pagewidth ; gminHeight = printer.min_pageheight ; gmaxHeight = printer.max_pageheight ; /* set gMaxPass (number of sweeps for Floyd-Steenberg dithered color printing) */ gMaxPass = 1; if ( gColorMode && !(gEcoMode) ) gMaxPass = 4; /* adjust color/bw offsets (alignment corrections) */ printer.ColBwOffsY += adjust_coloffsy; printer.ColBwOffsX += adjust_coloffsx; /* initialize color correction curve (used in Floyd-Steenberg dithered color) */ /* initialize for no color correction */ for (i = 0; i < 256; i++) { gEnh_curve_r[i] = i; gEnh_curve_g[i] = i; gEnh_curve_b[i] = i; } /* if color correction is used */ if (get_Gamma) { gf = fopen (gammaFile, "rb"); if (gf == NULL) { DPRINTF ("Can't open gamma correction curve file %s!\n", gammaFile); } else { int num_read=0; got_Gamma = true ; /* read the gamma correction curve from gammaFile */ DPRINTF("main(): reading color correction curve from %s\n",gammaFile); num_read = fread (gEnh_curve_r, sizeof (int), 256, gf) ; DPRINTF(" num_read= %d\n",num_read); if ( num_read != 256 ) got_Gamma = false ; if (got_Gamma) { num_read = fread (gEnh_curve_g, sizeof (int), 256, gf); DPRINTF(" num_read= %d\n",num_read); if ( num_read != 256 ) got_Gamma = false ; } if (got_Gamma) { num_read = fread (gEnh_curve_b, sizeof (int), 256, gf) ; DPRINTF(" num_read= %d\n",num_read); if ( num_read != 256 ) got_Gamma = false ; } fclose (gf); if (!(got_Gamma)) { DPRINTF ("main(): Gamma curve data from %s is truncated.\n", gammaFile ); snprintf(syslog_message,message_size,"main(): %s", gMessages[E_BAD_GAMMAFILE]); wrap_syslog (LOG_CRIT,"%s",syslog_message); return 1; } } if ( !(got_Gamma) ) { /* use the empirical color correction curve parametrized by Gamma_R ,Gamma_G, Gamma_B */ DPRINTF("main(): using empirical color correction curve\n"); Make_GammaCurve ( Gamma_R, Gamma_G, Gamma_B); } } /* if printer version is set to NOPRINTER in pnm2ppa.conf */ if (printer.version == NOPRINTER) { snprintf(syslog_message,message_size,"pnm2ppa.conf: version 0; %s", gMessages[E_PPA_UNKNOWN]); wrap_syslog (LOG_CRIT,"%s",syslog_message); exit (1); } /* now do the work! */ return print_pnm (in); }