17dd7cddfSDavid du Colombier /* Copyright (C) 1995, 1996 Aladdin Enterprises. All rights reserved. 27dd7cddfSDavid du Colombier 3*593dc095SDavid du Colombier This software is provided AS-IS with no warranty, either express or 4*593dc095SDavid du Colombier implied. 57dd7cddfSDavid du Colombier 6*593dc095SDavid du Colombier This software is distributed under license and may not be copied, 7*593dc095SDavid du Colombier modified or distributed except as expressly authorized under the terms 8*593dc095SDavid du Colombier of the license contained in the file LICENSE in this distribution. 97dd7cddfSDavid du Colombier 10*593dc095SDavid du Colombier For more information about licensing, please refer to 11*593dc095SDavid du Colombier http://www.ghostscript.com/licensing/. For information on 12*593dc095SDavid du Colombier commercial licensing, go to http://www.artifex.com/licensing/ or 13*593dc095SDavid du Colombier contact Artifex Software, Inc., 101 Lucas Valley Road #110, 14*593dc095SDavid du Colombier San Rafael, CA 94903, U.S.A., +1(415)492-9861. 157dd7cddfSDavid du Colombier */ 167dd7cddfSDavid du Colombier 17*593dc095SDavid du Colombier /* $Id: gdevstc.h,v 1.5 2002/06/16 07:25:26 lpd Exp $*/ 187dd7cddfSDavid du Colombier /* Epson Stylus-Color Printer-Driver */ 197dd7cddfSDavid du Colombier #ifndef gdevstc_INCLUDED 207dd7cddfSDavid du Colombier # define gdevstc_INCLUDED 217dd7cddfSDavid du Colombier 227dd7cddfSDavid du Colombier /*** 237dd7cddfSDavid du Colombier *** This holds most of the declarations used by gdevstc.c/stcolor. 247dd7cddfSDavid du Colombier *** It should be included by the dithering-routines and should be 257dd7cddfSDavid du Colombier *** modified to include the separately compilable routines. 267dd7cddfSDavid du Colombier ***/ 277dd7cddfSDavid du Colombier 287dd7cddfSDavid du Colombier /*** Ghostscript-Headers ***/ 297dd7cddfSDavid du Colombier 307dd7cddfSDavid du Colombier #include "gdevprn.h" 317dd7cddfSDavid du Colombier #include "gsparam.h" 327dd7cddfSDavid du Colombier #include "gsstate.h" 337dd7cddfSDavid du Colombier 347dd7cddfSDavid du Colombier /*** Private Type for 32Bit-Pixels ***/ 357dd7cddfSDavid du Colombier #if arch_log2_sizeof_int < 2 /* int is too small */ 367dd7cddfSDavid du Colombier typedef unsigned long stc_pixel; 377dd7cddfSDavid du Colombier #else /* int is sufficient */ 387dd7cddfSDavid du Colombier typedef unsigned int stc_pixel; 397dd7cddfSDavid du Colombier #endif /* use int or long ? */ 407dd7cddfSDavid du Colombier 417dd7cddfSDavid du Colombier /*** Auxillary-Device Structure ***/ 427dd7cddfSDavid du Colombier 437dd7cddfSDavid du Colombier typedef struct stc_s { 447dd7cddfSDavid du Colombier long flags; /* some mode-flags */ 457dd7cddfSDavid du Colombier int bits; /* the number of bits per component */ 467dd7cddfSDavid du Colombier const struct stc_dither_s *dither; /* dithering-mode */ 477dd7cddfSDavid du Colombier float *am; /* 3/9/16-E. vector/matrix */ 487dd7cddfSDavid du Colombier 497dd7cddfSDavid du Colombier float *extc[4]; /* Given arrays for stccode */ 507dd7cddfSDavid du Colombier uint sizc[4]; /* Size of extcode-arrays */ 517dd7cddfSDavid du Colombier gx_color_value *code[4]; /* cv -> internal */ 527dd7cddfSDavid du Colombier 537dd7cddfSDavid du Colombier float *extv[4]; /* Given arrays for stcvals */ 547dd7cddfSDavid du Colombier uint sizv[4]; /* Size of extvals-arrays */ 557dd7cddfSDavid du Colombier byte *vals[4]; /* internal -> dithering */ 567dd7cddfSDavid du Colombier 577dd7cddfSDavid du Colombier stc_pixel white_run[3]; /* the white-pattern */ 587dd7cddfSDavid du Colombier stc_pixel white_end[3]; /* the white-Trailer */ 597dd7cddfSDavid du Colombier gs_param_string_array 607dd7cddfSDavid du Colombier algorithms; /* Names of the available algorithms */ 617dd7cddfSDavid du Colombier 627dd7cddfSDavid du Colombier gs_param_string escp_init; /* Initialization-Sequence */ 637dd7cddfSDavid du Colombier gs_param_string escp_release; /* Initialization-Sequence */ 647dd7cddfSDavid du Colombier int escp_width; /* Number of Pixels printed */ 657dd7cddfSDavid du Colombier int escp_height;/* Height send to the Printer */ 667dd7cddfSDavid du Colombier int escp_top; /* Top-Margin, send to the printer */ 677dd7cddfSDavid du Colombier int escp_bottom;/* Bottom-Margin, send to the printer */ 687dd7cddfSDavid du Colombier 697dd7cddfSDavid du Colombier int alg_item; /* Size of the items used by the algorithm */ 707dd7cddfSDavid du Colombier 717dd7cddfSDavid du Colombier int prt_buf; /* Number of buffers */ 727dd7cddfSDavid du Colombier int prt_size; /* Size of the Printer-buffer */ 737dd7cddfSDavid du Colombier int escp_size; /* Size of the ESC/P2-buffer */ 747dd7cddfSDavid du Colombier int seed_size; /* Size of the seed-buffers */ 757dd7cddfSDavid du Colombier 767dd7cddfSDavid du Colombier int escp_u; /* print-resolution (3600 / ydpi )*/ 777dd7cddfSDavid du Colombier int escp_c; /* selected color */ 787dd7cddfSDavid du Colombier int escp_v; /* spacing within band */ 797dd7cddfSDavid du Colombier int escp_h; /* 3600 / xdpi */ 807dd7cddfSDavid du Colombier int escp_m; /* number of heads */ 817dd7cddfSDavid du Colombier int escp_lf; /* linefeed in units */ 827dd7cddfSDavid du Colombier 837dd7cddfSDavid du Colombier int prt_y; /* print-coordinate */ 847dd7cddfSDavid du Colombier int stc_y; /* Next line 2b printed */ 857dd7cddfSDavid du Colombier int buf_y; /* Next line 2b loaded into the buffer */ 867dd7cddfSDavid du Colombier int prt_scans; /* number of lines printed */ 877dd7cddfSDavid du Colombier 887dd7cddfSDavid du Colombier 897dd7cddfSDavid du Colombier int *prt_width; /* Width of buffered lines */ 907dd7cddfSDavid du Colombier byte **prt_data; /* Buffered printer-lines */ 917dd7cddfSDavid du Colombier byte *escp_data; /* Buffer for ESC/P2-Data */ 927dd7cddfSDavid du Colombier byte *seed_row[4];/* Buffer for delta-row compression (prt_size) */ 937dd7cddfSDavid du Colombier 947dd7cddfSDavid du Colombier } stc_t; 957dd7cddfSDavid du Colombier 967dd7cddfSDavid du Colombier /*** Main-Device Structure ***/ 977dd7cddfSDavid du Colombier 987dd7cddfSDavid du Colombier typedef struct stcolor_device_s { 997dd7cddfSDavid du Colombier gx_device_common; 1007dd7cddfSDavid du Colombier gx_prn_device_common; 1017dd7cddfSDavid du Colombier stc_t stc; 1027dd7cddfSDavid du Colombier } stcolor_device; 1037dd7cddfSDavid du Colombier 1047dd7cddfSDavid du Colombier #define STCDFLAG0 0x000001L /* Algorithm-Bit 0 */ 1057dd7cddfSDavid du Colombier #define STCDFLAG1 0x000002L /* Algorithm-Bit 1 */ 1067dd7cddfSDavid du Colombier #define STCDFLAG2 0x000004L /* Algorithm-Bit 2 */ 1077dd7cddfSDavid du Colombier #define STCDFLAG3 0x000008L /* Algorithm-Bit 3 */ 1087dd7cddfSDavid du Colombier #define STCDFLAG4 0x000010L /* Algorithm-Bit 4 */ 1097dd7cddfSDavid du Colombier #define STCCMYK10 0x000020L /* CMYK10-Coding active */ 1107dd7cddfSDavid du Colombier 1117dd7cddfSDavid du Colombier #define STCUNIDIR 0x000040L /* Unidirectional, if set */ 1127dd7cddfSDavid du Colombier #define STCUWEAVE 0x000080L /* Hardware Microweave */ 1137dd7cddfSDavid du Colombier #define STCNWEAVE 0x000100L /* Software Microweave disabled */ 1147dd7cddfSDavid du Colombier 1157dd7cddfSDavid du Colombier #define STCOK4GO 0x000200L /* stc_put_params was o.k. */ 1167dd7cddfSDavid du Colombier 1177dd7cddfSDavid du Colombier #define STCCOMP 0x000C00L /* RLE, Plain (>= 1.18) */ 1187dd7cddfSDavid du Colombier #define STCPLAIN 0x000400L /* No compression */ 1197dd7cddfSDavid du Colombier #define STCDELTA 0x000800L /* Delta-Row */ 1207dd7cddfSDavid du Colombier 1217dd7cddfSDavid du Colombier #define STCMODEL 0x00f000L /* STC, ST800 */ 1227dd7cddfSDavid du Colombier #define STCST800 0x001000L /* Monochrome-Variant */ 1237dd7cddfSDavid du Colombier #define STCSTCII 0x002000L /* Stylus Color II */ 1247dd7cddfSDavid du Colombier 1257dd7cddfSDavid du Colombier #define STCBAND 0x010000L /* Initialization defined */ 1267dd7cddfSDavid du Colombier #define STCHEIGHT 0x020000L /* Page-Length set */ 1277dd7cddfSDavid du Colombier #define STCWIDTH 0x040000L /* Page-Length set */ 1287dd7cddfSDavid du Colombier #define STCTOP 0x080000L /* Top-Margin set */ 1297dd7cddfSDavid du Colombier #define STCBOTTOM 0x100000L /* Bottom-Margin set */ 1307dd7cddfSDavid du Colombier #define STCINIT 0x200000L /* Initialization defined */ 1317dd7cddfSDavid du Colombier #define STCRELEASE 0x400000L /* Release defined */ 1327dd7cddfSDavid du Colombier 1337dd7cddfSDavid du Colombier #define STCPRINT 0x800000L /* Data printed */ 1347dd7cddfSDavid du Colombier 1357dd7cddfSDavid du Colombier /*** Datatype for the array of dithering-Algorithms ***/ 1367dd7cddfSDavid du Colombier 1377dd7cddfSDavid du Colombier #define stc_proc_dither(name) \ 138*593dc095SDavid du Colombier int name(stcolor_device *sdev,int npixel,byte *in,byte *buf,byte *out) 1397dd7cddfSDavid du Colombier 1407dd7cddfSDavid du Colombier typedef struct stc_dither_s { 1417dd7cddfSDavid du Colombier const char *name; /* Mode-Name for Dithering */ 1427dd7cddfSDavid du Colombier stc_proc_dither((*fun)); 1437dd7cddfSDavid du Colombier uint flags; 1447dd7cddfSDavid du Colombier uint bufadd; 1457dd7cddfSDavid du Colombier double minmax[2]; 1467dd7cddfSDavid du Colombier } stc_dither_t; 1477dd7cddfSDavid du Colombier 1487dd7cddfSDavid du Colombier /* 1497dd7cddfSDavid du Colombier * Color-Values for the output 1507dd7cddfSDavid du Colombier */ 1517dd7cddfSDavid du Colombier #define BLACK 1 /* in monochrome-Mode as well as in CMYK-Mode */ 1527dd7cddfSDavid du Colombier #define RED 4 /* in RGB-Mode */ 1537dd7cddfSDavid du Colombier #define GREEN 2 1547dd7cddfSDavid du Colombier #define BLUE 1 1557dd7cddfSDavid du Colombier #define CYAN 8 /* in CMYK-Mode */ 1567dd7cddfSDavid du Colombier #define MAGENTA 4 1577dd7cddfSDavid du Colombier #define YELLOW 2 1587dd7cddfSDavid du Colombier 1597dd7cddfSDavid du Colombier /*** A Macro to ease Type-depending things with the stc_p-union ***/ 1607dd7cddfSDavid du Colombier 1617dd7cddfSDavid du Colombier #define STC_TYPESWITCH(Dither,Action) \ 1627dd7cddfSDavid du Colombier switch((Dither)->flags & STC_TYPE) { \ 1637dd7cddfSDavid du Colombier case STC_BYTE: Action(byte); break; \ 1647dd7cddfSDavid du Colombier case STC_LONG: Action(long); break; \ 1657dd7cddfSDavid du Colombier default: Action(float); break;} 1667dd7cddfSDavid du Colombier 1677dd7cddfSDavid du Colombier /*** 1687dd7cddfSDavid du Colombier *** MODIFY HERE to include your routine: 1697dd7cddfSDavid du Colombier *** 1707dd7cddfSDavid du Colombier *** 1. Declare it here 1717dd7cddfSDavid du Colombier *** 2. Add it to the definition of STC_MODI 1727dd7cddfSDavid du Colombier *** 3. Add your file to the dependency-list in the Makefile & devices.mak 1737dd7cddfSDavid du Colombier ***/ 1747dd7cddfSDavid du Colombier 1757dd7cddfSDavid du Colombier /* Step 1. */ 1767dd7cddfSDavid du Colombier stc_proc_dither(stc_gsmono); /* resides in gdevstc1.c */ 1777dd7cddfSDavid du Colombier stc_proc_dither(stc_fs); /* resides in gdevstc2.c */ 1787dd7cddfSDavid du Colombier stc_proc_dither(stc_fscmyk); /* resides in gdevstc2.c too */ 1797dd7cddfSDavid du Colombier stc_proc_dither(stc_gsrgb); /* resides in gdevstc3.c */ 1807dd7cddfSDavid du Colombier stc_proc_dither(stc_fs2); /* resides in gdevstc4.c */ 1817dd7cddfSDavid du Colombier 1827dd7cddfSDavid du Colombier 1837dd7cddfSDavid du Colombier /* Values used to assemble flags */ 1847dd7cddfSDavid du Colombier #define DeviceGray 1 /* ProcessColorModel = DeviceGray */ 1857dd7cddfSDavid du Colombier #define DeviceRGB 3 /* ProcessColorModel = DeviceRGB */ 1867dd7cddfSDavid du Colombier #define DeviceCMYK 4 /* ProcessColorModel = DeviceCMYK */ 1877dd7cddfSDavid du Colombier 1887dd7cddfSDavid du Colombier #define STC_BYTE 8 /* Pass Bytes to the Dithering-Routine */ 1897dd7cddfSDavid du Colombier #define STC_LONG 16 /* Pass Longs to the Dithering-Routine */ 1907dd7cddfSDavid du Colombier #define STC_FLOAT 24 /* Pass Floats to the Dithering-Routine */ 1917dd7cddfSDavid du Colombier #define STC_TYPE 24 /* all the type-bits */ 1927dd7cddfSDavid du Colombier 1937dd7cddfSDavid du Colombier #define STC_CMYK10 32 /* Special 32-Bit CMYK-Coding */ 1947dd7cddfSDavid du Colombier #define STC_DIRECT 64 /* Suppress conversion of Scanlines */ 1957dd7cddfSDavid du Colombier #define STC_WHITE 128 /* Call Algorithm for white lines too (out == NULL) */ 1967dd7cddfSDavid du Colombier #define STC_SCAN 256 /* multiply by number of scanlines in buffer */ 1977dd7cddfSDavid du Colombier 1987dd7cddfSDavid du Colombier /* Step 2. */ 1997dd7cddfSDavid du Colombier /* Items: 1. Name to activate it 2007dd7cddfSDavid du Colombier 2. Name of the dithering-function 2017dd7cddfSDavid du Colombier 3. Several flags ored together, including # of buffered scanlines 2027dd7cddfSDavid du Colombier 4. Additional buffer-space (bytes/longs/floats) 2037dd7cddfSDavid du Colombier 5. Array of double with minimum and maximum-value 2047dd7cddfSDavid du Colombier Keep the last line as it is. 2057dd7cddfSDavid du Colombier */ 2067dd7cddfSDavid du Colombier 2077dd7cddfSDavid du Colombier #define STC_MODI \ 2087dd7cddfSDavid du Colombier {"gsmono", stc_gsmono, DeviceGray|STC_BYTE,0,{0.0,1.0}},\ 2097dd7cddfSDavid du Colombier {"gsrgb" , stc_gsrgb , DeviceRGB |STC_BYTE,0,{0.0,1.0}},\ 2107dd7cddfSDavid du Colombier {"fsmono", stc_fs, \ 2117dd7cddfSDavid du Colombier DeviceGray|STC_LONG|1*STC_SCAN,3+3*1,{0.0,16777215.0}},\ 2127dd7cddfSDavid du Colombier {"fsrgb", stc_fs, \ 2137dd7cddfSDavid du Colombier DeviceRGB |STC_LONG|1*STC_SCAN,3+3*3,{0.0,16777215.0}},\ 2147dd7cddfSDavid du Colombier {"fsx4", stc_fs, \ 2157dd7cddfSDavid du Colombier DeviceCMYK|STC_LONG|1*STC_SCAN,3+3*4,{0.0,16777215.0}},\ 2167dd7cddfSDavid du Colombier {"fscmyk", stc_fscmyk, \ 2177dd7cddfSDavid du Colombier DeviceCMYK|STC_LONG|1*STC_SCAN,3+3*4,{0.0,16777215.0}},\ 2187dd7cddfSDavid du Colombier {"fs2", stc_fs2, \ 2197dd7cddfSDavid du Colombier DeviceRGB |STC_BYTE|STC_WHITE|1*STC_SCAN,0,{0.0,255.0}}, 2207dd7cddfSDavid du Colombier 2217dd7cddfSDavid du Colombier 2227dd7cddfSDavid du Colombier #ifndef X_DPI 2237dd7cddfSDavid du Colombier #define X_DPI 360 2247dd7cddfSDavid du Colombier #endif /* X_DPI */ 2257dd7cddfSDavid du Colombier #ifndef Y_DPI 2267dd7cddfSDavid du Colombier #define Y_DPI 360 2277dd7cddfSDavid du Colombier #endif /* Y_DPI */ 2287dd7cddfSDavid du Colombier 2297dd7cddfSDavid du Colombier #ifndef STC_L_MARGIN 2307dd7cddfSDavid du Colombier # define STC_L_MARGIN 0.125 /* yields 45 Pixel@360DpI */ 2317dd7cddfSDavid du Colombier #endif /* STC_L_MARGIN */ 2327dd7cddfSDavid du Colombier #ifndef STC_B_MARGIN 2337dd7cddfSDavid du Colombier # define STC_B_MARGIN 0.555 /* yields 198 Pixel@#60DpI (looses 1mm) */ 2347dd7cddfSDavid du Colombier #endif /* STC_B_MARGIN */ 2357dd7cddfSDavid du Colombier /* 2367dd7cddfSDavid du Colombier * Right-Margin: Should match maximum print-width of 8". 2377dd7cddfSDavid du Colombier */ 2387dd7cddfSDavid du Colombier 2397dd7cddfSDavid du Colombier #ifndef STC_R_MARGIN 2407dd7cddfSDavid du Colombier # ifdef A4 2417dd7cddfSDavid du Colombier # define STC_R_MARGIN 0.175 /* Yields 63 Pixel@360DpI */ 2427dd7cddfSDavid du Colombier # else 2437dd7cddfSDavid du Colombier # define STC_R_MARGIN 0.375 /* 135 Pixel */ 2447dd7cddfSDavid du Colombier # endif 2457dd7cddfSDavid du Colombier #endif /* STC_R_MARGIN */ 2467dd7cddfSDavid du Colombier #ifndef STC_T_MARGIN 2477dd7cddfSDavid du Colombier # define STC_T_MARGIN 0.125 2487dd7cddfSDavid du Colombier #endif /* STC_T_MARGIN */ 2497dd7cddfSDavid du Colombier 2507dd7cddfSDavid du Colombier #endif 251