xref: /plan9-contrib/sys/src/cmd/gs/src/gdevstc.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
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