/* Copyright (C) 1995, 1996 artofcode LLC. All rights reserved. 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. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA, 02111-1307. */ /*$Id: gdevstc.h,v 1.2.6.1.2.1 2003/01/17 00:49:01 giles Exp $*/ /* Epson Stylus-Color Printer-Driver */ #ifndef gdevstc_INCLUDED # define gdevstc_INCLUDED /*** *** This holds most of the declarations used by gdevstc.c/stcolor. *** It should be included by the dithering-routines and should be *** modified to include the separately compilable routines. ***/ /*** Ghostscript-Headers ***/ #include "gdevprn.h" #include "gsparam.h" #include "gsstate.h" /*** Private Type for 32Bit-Pixels ***/ #if arch_log2_sizeof_int < 2 /* int is too small */ typedef unsigned long stc_pixel; #else /* int is sufficient */ typedef unsigned int stc_pixel; #endif /* use int or long ? */ /*** Auxillary-Device Structure ***/ typedef struct stc_s { long flags; /* some mode-flags */ int bits; /* the number of bits per component */ const struct stc_dither_s *dither; /* dithering-mode */ float *am; /* 3/9/16-E. vector/matrix */ float *extc[4]; /* Given arrays for stccode */ uint sizc[4]; /* Size of extcode-arrays */ gx_color_value *code[4]; /* cv -> internal */ float *extv[4]; /* Given arrays for stcvals */ uint sizv[4]; /* Size of extvals-arrays */ byte *vals[4]; /* internal -> dithering */ stc_pixel white_run[3]; /* the white-pattern */ stc_pixel white_end[3]; /* the white-Trailer */ gs_param_string_array algorithms; /* Names of the available algorithms */ gs_param_string escp_init; /* Initialization-Sequence */ gs_param_string escp_release; /* Initialization-Sequence */ int escp_width; /* Number of Pixels printed */ int escp_height;/* Height send to the Printer */ int escp_top; /* Top-Margin, send to the printer */ int escp_bottom;/* Bottom-Margin, send to the printer */ int alg_item; /* Size of the items used by the algorithm */ int prt_buf; /* Number of buffers */ int prt_size; /* Size of the Printer-buffer */ int escp_size; /* Size of the ESC/P2-buffer */ int seed_size; /* Size of the seed-buffers */ int escp_u; /* print-resolution (3600 / ydpi )*/ int escp_c; /* selected color */ int escp_v; /* spacing within band */ int escp_h; /* 3600 / xdpi */ int escp_m; /* number of heads */ int escp_lf; /* linefeed in units */ int prt_y; /* print-coordinate */ int stc_y; /* Next line 2b printed */ int buf_y; /* Next line 2b loaded into the buffer */ int prt_scans; /* number of lines printed */ int *prt_width; /* Width of buffered lines */ byte **prt_data; /* Buffered printer-lines */ byte *escp_data; /* Buffer for ESC/P2-Data */ byte *seed_row[4];/* Buffer for delta-row compression (prt_size) */ } stc_t; /*** Main-Device Structure ***/ typedef struct stcolor_device_s { gx_device_common; gx_prn_device_common; stc_t stc; } stcolor_device; #define STCDFLAG0 0x000001L /* Algorithm-Bit 0 */ #define STCDFLAG1 0x000002L /* Algorithm-Bit 1 */ #define STCDFLAG2 0x000004L /* Algorithm-Bit 2 */ #define STCDFLAG3 0x000008L /* Algorithm-Bit 3 */ #define STCDFLAG4 0x000010L /* Algorithm-Bit 4 */ #define STCCMYK10 0x000020L /* CMYK10-Coding active */ #define STCUNIDIR 0x000040L /* Unidirectional, if set */ #define STCUWEAVE 0x000080L /* Hardware Microweave */ #define STCNWEAVE 0x000100L /* Software Microweave disabled */ #define STCOK4GO 0x000200L /* stc_put_params was o.k. */ #define STCCOMP 0x000C00L /* RLE, Plain (>= 1.18) */ #define STCPLAIN 0x000400L /* No compression */ #define STCDELTA 0x000800L /* Delta-Row */ #define STCMODEL 0x00f000L /* STC, ST800 */ #define STCST800 0x001000L /* Monochrome-Variant */ #define STCSTCII 0x002000L /* Stylus Color II */ #define STCBAND 0x010000L /* Initialization defined */ #define STCHEIGHT 0x020000L /* Page-Length set */ #define STCWIDTH 0x040000L /* Page-Length set */ #define STCTOP 0x080000L /* Top-Margin set */ #define STCBOTTOM 0x100000L /* Bottom-Margin set */ #define STCINIT 0x200000L /* Initialization defined */ #define STCRELEASE 0x400000L /* Release defined */ #define STCPRINT 0x800000L /* Data printed */ /*** Datatype for the array of dithering-Algorithms ***/ #define stc_proc_dither(name) \ int name(P5(stcolor_device *sdev,int npixel,byte *in,byte *buf,byte *out)) typedef struct stc_dither_s { const char *name; /* Mode-Name for Dithering */ stc_proc_dither((*fun)); uint flags; uint bufadd; double minmax[2]; } stc_dither_t; /* * Color-Values for the output */ #define BLACK 1 /* in monochrome-Mode as well as in CMYK-Mode */ #define RED 4 /* in RGB-Mode */ #define GREEN 2 #define BLUE 1 #define CYAN 8 /* in CMYK-Mode */ #define MAGENTA 4 #define YELLOW 2 /*** A Macro to ease Type-depending things with the stc_p-union ***/ #define STC_TYPESWITCH(Dither,Action) \ switch((Dither)->flags & STC_TYPE) { \ case STC_BYTE: Action(byte); break; \ case STC_LONG: Action(long); break; \ default: Action(float); break;} /*** *** MODIFY HERE to include your routine: *** *** 1. Declare it here *** 2. Add it to the definition of STC_MODI *** 3. Add your file to the dependency-list in the Makefile & devices.mak ***/ /* Step 1. */ stc_proc_dither(stc_gsmono); /* resides in gdevstc1.c */ stc_proc_dither(stc_fs); /* resides in gdevstc2.c */ stc_proc_dither(stc_fscmyk); /* resides in gdevstc2.c too */ stc_proc_dither(stc_gsrgb); /* resides in gdevstc3.c */ stc_proc_dither(stc_fs2); /* resides in gdevstc4.c */ /* Values used to assemble flags */ #define DeviceGray 1 /* ProcessColorModel = DeviceGray */ #define DeviceRGB 3 /* ProcessColorModel = DeviceRGB */ #define DeviceCMYK 4 /* ProcessColorModel = DeviceCMYK */ #define STC_BYTE 8 /* Pass Bytes to the Dithering-Routine */ #define STC_LONG 16 /* Pass Longs to the Dithering-Routine */ #define STC_FLOAT 24 /* Pass Floats to the Dithering-Routine */ #define STC_TYPE 24 /* all the type-bits */ #define STC_CMYK10 32 /* Special 32-Bit CMYK-Coding */ #define STC_DIRECT 64 /* Suppress conversion of Scanlines */ #define STC_WHITE 128 /* Call Algorithm for white lines too (out == NULL) */ #define STC_SCAN 256 /* multiply by number of scanlines in buffer */ /* Step 2. */ /* Items: 1. Name to activate it 2. Name of the dithering-function 3. Several flags ored together, including # of buffered scanlines 4. Additional buffer-space (bytes/longs/floats) 5. Array of double with minimum and maximum-value Keep the last line as it is. */ #define STC_MODI \ {"gsmono", stc_gsmono, DeviceGray|STC_BYTE,0,{0.0,1.0}},\ {"gsrgb" , stc_gsrgb , DeviceRGB |STC_BYTE,0,{0.0,1.0}},\ {"fsmono", stc_fs, \ DeviceGray|STC_LONG|1*STC_SCAN,3+3*1,{0.0,16777215.0}},\ {"fsrgb", stc_fs, \ DeviceRGB |STC_LONG|1*STC_SCAN,3+3*3,{0.0,16777215.0}},\ {"fsx4", stc_fs, \ DeviceCMYK|STC_LONG|1*STC_SCAN,3+3*4,{0.0,16777215.0}},\ {"fscmyk", stc_fscmyk, \ DeviceCMYK|STC_LONG|1*STC_SCAN,3+3*4,{0.0,16777215.0}},\ {"fs2", stc_fs2, \ DeviceRGB |STC_BYTE|STC_WHITE|1*STC_SCAN,0,{0.0,255.0}}, #ifndef X_DPI #define X_DPI 360 #endif /* X_DPI */ #ifndef Y_DPI #define Y_DPI 360 #endif /* Y_DPI */ #ifndef STC_L_MARGIN # define STC_L_MARGIN 0.125 /* yields 45 Pixel@360DpI */ #endif /* STC_L_MARGIN */ #ifndef STC_B_MARGIN # define STC_B_MARGIN 0.555 /* yields 198 Pixel@#60DpI (looses 1mm) */ #endif /* STC_B_MARGIN */ /* * Right-Margin: Should match maximum print-width of 8". */ #ifndef STC_R_MARGIN # ifdef A4 # define STC_R_MARGIN 0.175 /* Yields 63 Pixel@360DpI */ # else # define STC_R_MARGIN 0.375 /* 135 Pixel */ # endif #endif /* STC_R_MARGIN */ #ifndef STC_T_MARGIN # define STC_T_MARGIN 0.125 #endif /* STC_T_MARGIN */ #endif