From 807d62154b1b5d67bce73e19e964891eeb8e0433 Mon Sep 17 00:00:00 2001 From: Simon Barner Date: Fri, 10 Jun 2005 17:10:07 +0000 Subject: - Fix build on 4-stable when PCL3 driver is enabled [1] - Update MASTER_SITES for MD2K driver - Add DMPRT driver - Add patches necessary for building cups-pstoraster - Add KRGB support patch for IJS driver Submitted by: KATO Tsuguru Tested by: Jose M Rodriguez Pointy hat to: barner [1] Reported by: kris via pointyhat [1] --- print/ghostscript-gpl/files/e-patch-src-gdevdmpr.c | 63 ++ print/ghostscript-gpl/files/patch-lib-gs_setpd.ps | 98 +++ print/ghostscript-gpl/files/patch-lib:gs_init.ps | 18 +- .../files/patch-pcl3_eprn_eprnrend.c | 80 +-- print/ghostscript-gpl/files/patch-src-dmp_site.ps | 10 + print/ghostscript-gpl/files/patch-src-dviprlib.c | 135 +++++ print/ghostscript-gpl/files/patch-src-dviprlib.h | 38 ++ print/ghostscript-gpl/files/patch-src-gdevdmpr.c | 64 ++ print/ghostscript-gpl/files/patch-src-gdevdmpr.mak | 21 + print/ghostscript-gpl/files/patch-src-gdevijs.c | 659 +++++++++++++++++++++ 10 files changed, 1147 insertions(+), 39 deletions(-) create mode 100644 print/ghostscript-gpl/files/e-patch-src-gdevdmpr.c create mode 100644 print/ghostscript-gpl/files/patch-lib-gs_setpd.ps create mode 100644 print/ghostscript-gpl/files/patch-src-dmp_site.ps create mode 100644 print/ghostscript-gpl/files/patch-src-dviprlib.c create mode 100644 print/ghostscript-gpl/files/patch-src-dviprlib.h create mode 100644 print/ghostscript-gpl/files/patch-src-gdevdmpr.c create mode 100644 print/ghostscript-gpl/files/patch-src-gdevdmpr.mak create mode 100644 print/ghostscript-gpl/files/patch-src-gdevijs.c (limited to 'print/ghostscript-gpl/files') diff --git a/print/ghostscript-gpl/files/e-patch-src-gdevdmpr.c b/print/ghostscript-gpl/files/e-patch-src-gdevdmpr.c new file mode 100644 index 000000000000..4afb11ef9e51 --- /dev/null +++ b/print/ghostscript-gpl/files/e-patch-src-gdevdmpr.c @@ -0,0 +1,63 @@ +--- src/gdevdmpr.c.orig Tue May 13 20:43:37 1997 ++++ src/gdevdmpr.c Tue May 24 21:41:23 2005 +@@ -41,7 +41,7 @@ + /* include library header. */ + #include "dviprlib.h" + +-extern FILE *lib_fopen(P1(const char *)); ++extern FILE *lib_fopen(const char *); + + #define LOCAL_DEBUG 0 + +@@ -87,12 +87,12 @@ + private dev_proc_close_device(gdev_dmprt_close); + + /* declarations of sub functions to get printer properties. */ +-private void gdev_dmprt_init_printer_props(P1(gx_device_dmprt *)); +-private int gdev_dmprt_get_printer_props(P2(gx_device_dmprt *,char *)); +-private int gdev_dmprt_check_code_props(P2(byte * ,int )); +-private FILE *gdev_dmprt_dviprt_lib_fopen(P2(const char *,char *)); ++private void gdev_dmprt_init_printer_props(gx_device_dmprt *); ++private int gdev_dmprt_get_printer_props(gx_device_dmprt *,char *); ++private int gdev_dmprt_check_code_props(byte * ,int ); ++private FILE *gdev_dmprt_dviprt_lib_fopen(const char *,char *); + +-private int gdev_dmprt_error_no_dviprt_to_gs(P1(int )); ++private int gdev_dmprt_error_no_dviprt_to_gs(int ); + + /* The device descriptor */ + gx_device_procs prn_dmprt_procs = { +@@ -833,6 +833,7 @@ + return code; + } + ++private const char * gp_file_name_concat_string(const char *, unsigned); + private FILE * + gdev_dmprt_dviprt_lib_fopen(const char *fnamebase,char *fname) + { +@@ -845,8 +846,7 @@ + env = getenv("TEXCFG"); + if (env) { + strcpy(fname,env); +- strcat(fname, +- gp_file_name_concat_string(env,strlen(env),fname,strlen(fnamebase))); ++ strcat(fname, gp_file_name_concat_string(env,strlen(env))); + strcat(fname,fnamebase); + fp = fopen(fname,gp_fmode_rb); + } +@@ -867,4 +867,15 @@ + default: + return -1; + } ++} ++ ++/* Answer the string to be used for combining a directory/device prefix */ ++/* with a base file name. The prefix directory/device is examined to */ ++/* determine if a separator is needed and may return an empty string */ ++private const char * ++gp_file_name_concat_string(const char *prefix, unsigned plen) ++{ ++ if (plen > 0 && prefix[plen - 1] == '/') ++ return ""; ++ return "/"; + } diff --git a/print/ghostscript-gpl/files/patch-lib-gs_setpd.ps b/print/ghostscript-gpl/files/patch-lib-gs_setpd.ps new file mode 100644 index 000000000000..2bd645bb99fe --- /dev/null +++ b/print/ghostscript-gpl/files/patch-lib-gs_setpd.ps @@ -0,0 +1,98 @@ +--- lib/gs_setpd.ps.orig Tue Sep 14 07:32:19 2004 ++++ lib/gs_setpd.ps Tue May 24 22:20:49 2005 +@@ -377,21 +377,42 @@ + /MediaPosition { dup //null ne { pop //null } if } bind + .dicttomark readonly def + +-% Define the keys used in input attribute matching. +-/.inputattrkeys [ +- /PageSize /MediaColor /MediaWeight /MediaType /InsertSheet +- % The following are documented in Adobe's supplement for v2017. +- /LeadingEdge /MediaClass +-] readonly def +-% Define other keys used in media selection. +-/.inputselectionkeys [ +- /MediaPosition /Orientation +-] readonly def +- +-% Define the keys used in output attribute matching. +-/.outputattrkeys [ +- /OutputType +-] readonly def ++% M. Sweet, Easy Software Products: ++% ++% Define NOMEDIAATTRS to turn off the default (but unimplementable) media ++% selection policies for setpagedevice. This is used by CUPS to support ++% the standard Adobe media attributes. ++NOMEDIAATTRS { ++ % Define only PageSize for input attribute matching. ++ /.inputattrkeys [ ++ /PageSize ++ ] readonly def ++ % Define no other keys used in media selection. ++ /.inputselectionkeys [ ++ /noInputSelectionsKeys ++ ] readonly def ++ ++ % Define no keys used in output attribute matching. ++ /.outputattrkeys [ ++ /noOutputAttrKeys ++ ] readonly def ++} { ++ % Define the keys used in input attribute matching. ++ /.inputattrkeys [ ++ /PageSize /MediaColor /MediaWeight /MediaType /InsertSheet ++ % The following are documented in Adobe's supplement for v2017. ++ /LeadingEdge /MediaClass ++ ] readonly def ++ % Define other keys used in media selection. ++ /.inputselectionkeys [ ++ /MediaPosition /Orientation ++ ] readonly def ++ ++ % Define the keys used in output attribute matching. ++ /.outputattrkeys [ ++ /OutputType ++ ] readonly def ++} ifelse + + % Define all the parameters that should always be copied to the merged + % dictionary. +@@ -420,7 +441,13 @@ + /PageSize //false % obsolete alias for .MediaSize + /InputAttributes //false + .inputattrkeys +- { dup /PageSize eq ++ % M. Sweet, Easy Software Products: ++ % ++ % Treat LeadingEdge like PageSize so that a common Ghostscript driver ++ % doesn't need the NOMEDIAATTRS definition. ++ % ++ % { dup /PageSize eq ++ { dup dup /PageSize eq exch /LeadingEdge eq or + { pop } + { { 2 index /InputAttributes .knownget { //null eq } { //true } ifelse } } + ifelse +@@ -501,11 +528,22 @@ + % They are expected to consume the top 2 operands. + % NOTE: we currently treat all values other than 0, 1, or 7 (for PageSize) + % the same as 0, i.e., we signal an error. ++% ++% M. Sweet, Easy Software Products: ++% ++% Define NOMEDIAATTRS to turn off the default (but unimplementable) media ++% selection policies for setpagedevice. This is used by CUPS to support ++% the standard Adobe media attributes. + 0 { % Set errorinfo and signal a configurationerror. ++ NOMEDIAATTRS { ++ % NOMEDIAATTRS means that the default policy is 7... ++ pop 2 index exch 7 put ++ } { + pop dup 4 index exch get 2 array astore + $error /errorinfo 3 -1 roll put + cleartomark + /setpagedevice load /configurationerror signalerror ++ } ifelse + } bind + 1 { % Roll back the failed request to its previous status. + SETPDDEBUG { (Rolling back.) = pstack flush } if diff --git a/print/ghostscript-gpl/files/patch-lib:gs_init.ps b/print/ghostscript-gpl/files/patch-lib:gs_init.ps index 70de88245ddc..22d48fd79896 100644 --- a/print/ghostscript-gpl/files/patch-lib:gs_init.ps +++ b/print/ghostscript-gpl/files/patch-lib:gs_init.ps @@ -1,6 +1,14 @@ ---- lib/gs_init.ps.orig Fri Feb 1 12:25:45 2002 -+++ lib/gs_init.ps Sat Feb 9 01:42:10 2002 -@@ -1274,7 +1274,7 @@ +--- lib/gs_init.ps.orig Tue Sep 7 00:40:52 2004 ++++ lib/gs_init.ps Tue May 24 22:19:25 2005 +@@ -122,6 +122,7 @@ + currentdict /DELAYBIND known /DELAYBIND exch def + currentdict /DISKFONTS known /DISKFONTS exch def + currentdict /DOINTERPOLATE .knownget { /INTERPOLATE exch def } if ++currentdict /NOMEDIAATTRS known /NOMEDIAATTRS exch def + currentdict /ESTACKPRINT known /ESTACKPRINT exch def + currentdict /FAKEFONTS known /FAKEFONTS exch def + currentdict /FIXEDMEDIA known /FIXEDMEDIA exch def +@@ -1420,7 +1421,7 @@ % Set the default screen and BG/UCR. /.setdefaultbgucr { systemdict /setblackgeneration known { @@ -9,8 +17,8 @@ } if } bind def /.useloresscreen { % - .useloresscreen -@@ -1874,3 +1874,7 @@ - userdict /AGM_preserve_spots false put +@@ -2199,3 +2200,7 @@ + ifelse % The interpreter will run the initial procedure (start). + diff --git a/print/ghostscript-gpl/files/patch-pcl3_eprn_eprnrend.c b/print/ghostscript-gpl/files/patch-pcl3_eprn_eprnrend.c index d9adf9bbafa2..69dd96167b0c 100644 --- a/print/ghostscript-gpl/files/patch-pcl3_eprn_eprnrend.c +++ b/print/ghostscript-gpl/files/patch-pcl3_eprn_eprnrend.c @@ -1,60 +1,64 @@ --- pcl3/eprn/eprnrend.c.orig 2005-01-19 00:24:24.924311968 +0100 -+++ pcl3/eprn/eprnrend.c 2005-01-19 01:24:06.024901928 +0100 -@@ -161,8 +161,10 @@ +--- pcl3/eprn/eprnrend.c.orig Wed Aug 1 14:12:56 2001 ++++ pcl3/eprn/eprnrend.c Tue May 24 20:19:18 2005 +@@ -161,8 +161,11 @@ ******************************************************************************/ gx_color_index eprn_map_rgb_color_for_RGB(gx_device *device, - gx_color_value red, gx_color_value green, gx_color_value blue) + const gx_color_value cv[]) { -+ gx_color_value red, green, blue; -+ red = cv[0]; green = cv[1]; blue = cv[2]; ++ gx_color_value red = cv[0]; ++ gx_color_value green = cv[1]; ++ gx_color_value blue = cv[2]; static const gx_color_value half = gx_max_color_value/2; gx_color_index value = 0; const eprn_Device *dev = (eprn_Device *)device; -@@ -197,8 +199,10 @@ +@@ -197,8 +200,11 @@ ******************************************************************************/ gx_color_index eprn_map_rgb_color_for_CMY_or_K(gx_device *device, - gx_color_value red, gx_color_value green, gx_color_value blue) + const gx_color_value cv[]) { -+ gx_color_value red, green, blue; -+ red = cv[0]; green = cv[1]; blue = cv[2]; ++ gx_color_value red = cv[0]; ++ gx_color_value green = cv[1]; ++ gx_color_value blue = cv[2]; static const gx_color_value half = gx_max_color_value/2; gx_color_index value = (CYAN_BIT | MAGENTA_BIT | YELLOW_BIT); const eprn_Device *dev = (eprn_Device *)device; -@@ -240,8 +244,10 @@ +@@ -240,8 +246,11 @@ ******************************************************************************/ gx_color_index eprn_map_rgb_color_for_RGB_flex(gx_device *device, - gx_color_value red, gx_color_value green, gx_color_value blue) + const gx_color_value cv[]) { -+ gx_color_value red, green, blue; -+ red = cv[0]; green = cv[1]; blue = cv[2]; ++ gx_color_value red = cv[0]; ++ gx_color_value green = cv[1]; ++ gx_color_value blue = cv[2]; gx_color_index value = 0; gx_color_value step; unsigned int level; -@@ -284,8 +290,10 @@ +@@ -284,8 +293,12 @@ ******************************************************************************/ gx_color_index eprn_map_rgb_color_for_CMY_or_K_flex(gx_device *device, - gx_color_value red, gx_color_value green, gx_color_value blue) + const gx_color_value cv[]) { -+ gx_color_value red, green, blue; -+ red = cv[0]; green = cv[1]; blue = cv[2]; ++ gx_color_value red = cv[0]; ++ gx_color_value green = cv[1]; ++ gx_color_value blue = cv[2]; ++ gx_color_value tmpcv[4]; const eprn_Device *dev = (eprn_Device *)device; #ifdef EPRN_TRACE -@@ -298,11 +306,18 @@ +@@ -298,11 +311,17 @@ /* Treat pure grey levels differently if we have black. This implies that for CMY+K only "true" grey shades will be printed with black ink, all others will be mixed from CMY. */ - if (dev->eprn.colour_model != eprn_DeviceCMY && red == green && green == blue) - return eprn_map_cmyk_color_flex(device, 0, 0, 0, gx_max_color_value - red); -+ gx_color_value tmpcv[4]; + if (dev->eprn.colour_model != eprn_DeviceCMY && red == green && green == blue) { + tmpcv[0] = 0; tmpcv[1] = 0; tmpcv[2] = 0; + tmpcv[3] = gx_max_color_value - red; @@ -71,38 +75,40 @@ } /****************************************************************************** -@@ -315,8 +330,10 @@ +@@ -315,8 +334,11 @@ ******************************************************************************/ gx_color_index eprn_map_rgb_color_for_RGB_max(gx_device *device, - gx_color_value red, gx_color_value green, gx_color_value blue) + const gx_color_value cv[]) { -+ gx_color_value red, green, blue; -+ red = cv[0]; green = cv[1]; blue = cv[2]; ++ gx_color_value red = cv[0]; ++ gx_color_value green = cv[1]; ++ gx_color_value blue = cv[2]; gx_color_index value; #ifdef EPRN_TRACE -@@ -345,8 +362,10 @@ +@@ -345,8 +367,12 @@ ******************************************************************************/ gx_color_index eprn_map_rgb_color_for_CMY_or_K_max(gx_device *device, - gx_color_value red, gx_color_value green, gx_color_value blue) + const gx_color_value cv[]) { -+ gx_color_value red, green, blue; -+ red = cv[0]; green = cv[1]; blue = cv[2]; ++ gx_color_value red = cv[0]; ++ gx_color_value green = cv[1]; ++ gx_color_value blue = cv[2]; ++ gx_color_value tmpcv[4]; const eprn_Device *dev = (eprn_Device *)device; #ifdef EPRN_TRACE -@@ -356,13 +375,19 @@ +@@ -356,13 +382,18 @@ red, green, blue); #endif - if (dev->eprn.colour_model == eprn_DeviceGray) - return eprn_map_cmyk_color_max(device, 0, 0, 0, gx_max_color_value - red); - -+ gx_color_value tmpcv[4]; + if (dev->eprn.colour_model == eprn_DeviceGray) { + tmpcv[0] = 0; tmpcv[1] = 0; tmpcv[2] = 0; + tmpcv[3] = gx_max_color_value - red; @@ -120,7 +126,7 @@ } /****************************************************************************** -@@ -389,7 +414,7 @@ +@@ -389,7 +420,7 @@ ******************************************************************************/ int eprn_map_color_rgb(gx_device *device, gx_color_index color, @@ -129,7 +135,7 @@ { #ifdef EPRN_TRACE if_debug1(EPRN_TRACE_CHAR, -@@ -415,9 +440,10 @@ +@@ -415,9 +446,12 @@ ******************************************************************************/ gx_color_index eprn_map_cmyk_color(gx_device *device, @@ -137,12 +143,14 @@ - gx_color_value black) + const gx_color_value cv[]) { -+ gx_color_value cyan, magenta, yellow, black; -+ cyan = cv[0]; magenta = cv[1]; yellow = cv[2]; black = cv[3]; ++ gx_color_value cyan = cv[0]; ++ gx_color_value magenta = cv[1]; ++ gx_color_value yellow = cv[2]; ++ gx_color_value black = cv[3]; gx_color_index value = 0; static const gx_color_value threshold = gx_max_color_value/2; -@@ -449,9 +475,10 @@ +@@ -449,9 +483,12 @@ ******************************************************************************/ gx_color_index eprn_map_cmyk_color_flex(gx_device *device, @@ -150,12 +158,14 @@ - gx_color_value black) + const gx_color_value cv[]) { -+ gx_color_value cyan, magenta, yellow, black; -+ cyan = cv[0]; magenta = cv[1]; yellow = cv[2]; black = cv[3]; ++ gx_color_value cyan = cv[0]; ++ gx_color_value magenta = cv[1]; ++ gx_color_value yellow = cv[2]; ++ gx_color_value black = cv[3]; gx_color_index value = 0; gx_color_value step; unsigned int level; -@@ -530,9 +557,10 @@ +@@ -530,9 +567,12 @@ ******************************************************************************/ gx_color_index eprn_map_cmyk_color_max(gx_device *device, @@ -163,8 +173,10 @@ - gx_color_value black) + const gx_color_value cv[]) { -+ gx_color_value cyan, magenta, yellow, black; -+ cyan = cv[0]; magenta = cv[1]; yellow = cv[2]; black = cv[3]; ++ gx_color_value cyan = cv[0]; ++ gx_color_value magenta = cv[1]; ++ gx_color_value yellow = cv[2]; ++ gx_color_value black = cv[3]; gx_color_index value; #ifdef EPRN_TRACE diff --git a/print/ghostscript-gpl/files/patch-src-dmp_site.ps b/print/ghostscript-gpl/files/patch-src-dmp_site.ps new file mode 100644 index 000000000000..ee1a5717d641 --- /dev/null +++ b/print/ghostscript-gpl/files/patch-src-dmp_site.ps @@ -0,0 +1,10 @@ +--- src/dmp_site.ps.orig Tue May 27 09:57:00 1997 ++++ src/dmp_site.ps Tue Apr 2 23:05:45 2002 +@@ -1,6 +1,6 @@ + BeginConfig + %%%%%%%%%%%%%%%%%%%%%% Standard user cusomizations %%%%%%%%%%%%%%%%%%%%% +-/printer (epsimage.src) ++/printer (%%DATADIR%%/%%GS_VERSION%%/lib/escp_24.src) + % horizontal / vertical + % /resolution [ 160.0 180.0 ] + % horizontal / vertical diff --git a/print/ghostscript-gpl/files/patch-src-dviprlib.c b/print/ghostscript-gpl/files/patch-src-dviprlib.c new file mode 100644 index 000000000000..5bee5e72645d --- /dev/null +++ b/print/ghostscript-gpl/files/patch-src-dviprlib.c @@ -0,0 +1,135 @@ +--- src/dviprlib.c.orig Tue May 13 16:14:09 1997 ++++ src/dviprlib.c Tue May 24 21:41:09 2005 +@@ -39,8 +39,8 @@ + + + /*--- forward declarations ---*/ +-private int dviprt_read_S_cfg(P2(dviprt_cfg_t *,dviprt_cfg_i *)); +-private int dviprt_read_QR_cfg(P2(dviprt_cfg_t *,dviprt_cfg_i *)); ++private int dviprt_read_S_cfg(dviprt_cfg_t *,dviprt_cfg_i *); ++private int dviprt_read_QR_cfg(dviprt_cfg_t *,dviprt_cfg_i *); + + /*--- library functions ---*/ + int +@@ -429,21 +429,21 @@ + + /*--- forward declarations ---*/ + private int dviprt_set_select +- (P4(dviprt_cfg_item_t *,uchar **,dviprt_cfg_t *,dviprt_cfg_i *)); ++ (dviprt_cfg_item_t *,uchar **,dviprt_cfg_t *,dviprt_cfg_i *); + private int dviprt_set_integer +- (P4(dviprt_cfg_item_t *, uchar *, dviprt_cfg_t *,dviprt_cfg_i *)); ++ (dviprt_cfg_item_t *, uchar *, dviprt_cfg_t *,dviprt_cfg_i *); + private int dviprt_set_strings +- (P4(dviprt_cfg_item_t *,uchar *,dviprt_cfg_t *,dviprt_cfg_i *)); ++ (dviprt_cfg_item_t *,uchar *,dviprt_cfg_t *,dviprt_cfg_i *); + private int dviprt_set_rpexpr +- (P6(dviprt_cfg_item_t *,uchar *,int , dviprt_cfg_t *,dviprt_cfg_i *,int)); ++ (dviprt_cfg_item_t *,uchar *,int , dviprt_cfg_t *,dviprt_cfg_i *,int); + private int dviprt_set_code +- (P4(dviprt_cfg_item_t *,uchar *,dviprt_cfg_t *,dviprt_cfg_i *)); ++ (dviprt_cfg_item_t *,uchar *,dviprt_cfg_t *,dviprt_cfg_i *); + +-private long dviprt_oct2long(P3(uchar *,uchar *,uchar **)); +-private long dviprt_dec2long(P3(uchar *,uchar *,uchar **)); +-private long dviprt_hex2long(P3(uchar *,uchar *,uchar **)); ++private long dviprt_oct2long(uchar *,uchar *,uchar **); ++private long dviprt_dec2long(uchar *,uchar *,uchar **); ++private long dviprt_hex2long(uchar *,uchar *,uchar **); + +-private int dviprt_printtokenerror(P4(dviprt_cfg_i *,char *,int ,int)); ++private int dviprt_printtokenerror(dviprt_cfg_i *,char *,int ,int); + + /*--- macros ---*/ + #define strlcmp(tmplt,str,len) \ +@@ -1433,7 +1433,11 @@ + char *dviprt_prtcodename[] = { CFG_PRTCODE_NAME, NULL }; + char *dviprt_encodename[] = { CFG_ENCODE_NAME, NULL }; + ++#if 0 + private FILE *dviprt_messagestream = stderr; ++#else /* patch for glibc 2.1.x by Shin Fukui */ ++private FILE *dviprt_messagestream; ++#endif + + /*--- library functions ---*/ + int +@@ -1568,16 +1572,16 @@ + + + /*--- forward declarations ---*/ +-private int dviprt_getmaximalwidth(P1(dviprt_print *)); +-private int dviprt_flush_buffer(P2(dviprt_print *,uchar far *)); +-private int dviprt_output_transpose(P3(dviprt_print *,uchar far *,uint )); +-private int dviprt_output_nontranspose(P3(dviprt_print *,uchar far *,uint )); +-private int dviprt_output_nontranspose_reverse(P3(dviprt_print *,uchar far *,uint )); +-private int dviprt_reverse_bits(P2(uchar far *,uint)); +-private int dviprt_transpose8x8(P4(uchar far *,uint, uchar far *,uint)); +-private int dviprt_output_expr(P4(dviprt_print *,int,uint,uint)); +-private int dviprt_default_outputproc(P3(uchar far *,long ,void *)); +-private long dviprt_getbuffersize(P1(dviprt_print *)); ++private int dviprt_getmaximalwidth(dviprt_print *); ++private int dviprt_flush_buffer(dviprt_print *,uchar far *); ++private int dviprt_output_transpose(dviprt_print *,uchar far *,uint); ++private int dviprt_output_nontranspose(dviprt_print *,uchar far *,uint); ++private int dviprt_output_nontranspose_reverse(dviprt_print *,uchar far *,uint); ++private int dviprt_reverse_bits(uchar far *,uint); ++private int dviprt_transpose8x8(uchar far *,uint, uchar far *,uint); ++private int dviprt_output_expr(dviprt_print *,int,uint,uint); ++private int dviprt_default_outputproc(uchar far *,long ,void *); ++private long dviprt_getbuffersize(dviprt_print *); + + /*--- library functions ---*/ + long +@@ -1618,7 +1622,7 @@ + int + dviprt_setstream + #ifdef __PROTOTYPES__ +- (dviprt_print *pprint,int (*func)(P3(uchar far *,long ,void*)),void *pstream) ++ (dviprt_print *pprint,int (*func)(uchar far *,long ,void*),void *pstream) + #else + (pprint,func,pstream) + dviprt_print *pprint; +@@ -2264,19 +2268,19 @@ + #define DVIPRT_SUPPORT_PCL 1 + + /*--- forward declarations ---*/ +-private long dviprt_null_getworksize(P2(dviprt_print *,long )); +-private long dviprt_null_encode(P3(dviprt_print *,long ,int )); +-private long dviprt_hex_getworksize(P2(dviprt_print *,long )); +-private long dviprt_hex_encode(P3(dviprt_print *,long ,int )); ++private long dviprt_null_getworksize(dviprt_print *,long ); ++private long dviprt_null_encode(dviprt_print *,long ,int ); ++private long dviprt_hex_getworksize(dviprt_print *,long ); ++private long dviprt_hex_encode(dviprt_print *,long ,int ); + #if DVIPRT_SUPPORT_FAX +-private long dviprt_fax_getworksize(P2(dviprt_print *,long )); +-private long dviprt_fax_encode(P3(dviprt_print *,long ,int )); ++private long dviprt_fax_getworksize(dviprt_print *,long ); ++private long dviprt_fax_encode(dviprt_print *,long ,int ); + #endif + #if DVIPRT_SUPPORT_PCL +-private long dviprt_pcl1_getworksize(P2(dviprt_print *,long )); +-private long dviprt_pcl1_encode(P3(dviprt_print *,long ,int )); +-private long dviprt_pcl2_getworksize(P2(dviprt_print *,long )); +-private long dviprt_pcl2_encode(P3(dviprt_print *,long ,int )); ++private long dviprt_pcl1_getworksize(dviprt_print *,long ); ++private long dviprt_pcl1_encode(dviprt_print *,long ,int ); ++private long dviprt_pcl2_getworksize(dviprt_print *,long ); ++private long dviprt_pcl2_encode(dviprt_print *,long ,int ); + #endif + + private dviprt_encoder dviprt_encoder_list[] = { +@@ -2468,9 +2472,9 @@ + int o_count; + int o_bufcount; + } FaxEncodeInfo; +-private int dviprt_fax_set_white(P2(int,FaxEncodeInfo *)); +-private int dviprt_fax_set_black(P2(int,FaxEncodeInfo *)); +-private int dviprt_fax_set_bitcount(P2(FaxEncode_t *,FaxEncodeInfo *)); ++private int dviprt_fax_set_white(int,FaxEncodeInfo *); ++private int dviprt_fax_set_black(int,FaxEncodeInfo *); ++private int dviprt_fax_set_bitcount(FaxEncode_t *,FaxEncodeInfo *); + + private long + dviprt_fax_encode(dviprt_print *pprint,long s,int f) diff --git a/print/ghostscript-gpl/files/patch-src-dviprlib.h b/print/ghostscript-gpl/files/patch-src-dviprlib.h new file mode 100644 index 000000000000..d7fce3138d0a --- /dev/null +++ b/print/ghostscript-gpl/files/patch-src-dviprlib.h @@ -0,0 +1,38 @@ +--- src/dviprlib.h.orig Tue May 13 16:10:34 1997 ++++ src/dviprlib.h Tue May 24 21:41:14 2005 +@@ -337,23 +337,23 @@ + #ifdef dviprlib_implementation + typedef struct { + int no; +- long (*getworksize)(P2(dviprt_print *,long )); +- long (*encode)(P3(dviprt_print *,long,int)); ++ long (*getworksize)(dviprt_print *,long); ++ long (*encode)(dviprt_print *,long,int); + } dviprt_encoder; + + #define liblocal private + +-liblocal dviprt_encoder *dviprt_getencoder_(P1(int )); +-liblocal int dviprt_setcfgbuffer_(P3(dviprt_cfg_i *,int ,int )); +-liblocal int dviprt_resetcfgbuffer_(P1(dviprt_cfg_i *)); +-liblocal int dviprt_initcfg_(P2(dviprt_cfg_t *,dviprt_cfg_i *)); +-liblocal int dviprt_printmessage(P2(char *,int )); +-liblocal int dviprt_printerror(P2(char *,int )); +-liblocal int dviprt_printwarning(P2(char *,int )); +-liblocal int dviprt_printcfgerror(P3(dviprt_cfg_i *,char *,int )); +-liblocal int dviprt_printcfgwarning(P3(dviprt_cfg_i *,char *,int )); ++liblocal dviprt_encoder *dviprt_getencoder_(int); ++liblocal int dviprt_setcfgbuffer_(dviprt_cfg_i *,int ,int); ++liblocal int dviprt_resetcfgbuffer_(dviprt_cfg_i *); ++liblocal int dviprt_initcfg_(dviprt_cfg_t *,dviprt_cfg_i *); ++liblocal int dviprt_printmessage(char *,int); ++liblocal int dviprt_printerror(char *,int); ++liblocal int dviprt_printwarning(char *,int); ++liblocal int dviprt_printcfgerror(dviprt_cfg_i *,char *,int); ++liblocal int dviprt_printcfgwarning(dviprt_cfg_i *,char *,int); + +-extern int dviprt_print_headercomment_(P4(char *,char *,char *,FILE *)); ++extern int dviprt_print_headercomment_(char *,char *,char *,FILE *); + extern char dviprt_message_buffer[]; + #endif dviprlib_implementation + diff --git a/print/ghostscript-gpl/files/patch-src-gdevdmpr.c b/print/ghostscript-gpl/files/patch-src-gdevdmpr.c new file mode 100644 index 000000000000..2da080e7d34e --- /dev/null +++ b/print/ghostscript-gpl/files/patch-src-gdevdmpr.c @@ -0,0 +1,64 @@ +--- src/gdevdmpr.c.orig Tue May 13 20:43:37 1997 ++++ src/gdevdmpr.c Thu Jun 9 02:52:25 2005 +@@ -41,7 +41,7 @@ + /* include library header. */ + #include "dviprlib.h" + +-extern FILE *lib_fopen(P1(const char *)); ++extern FILE *lib_fopen(const char *); + + #define LOCAL_DEBUG 0 + +@@ -87,12 +87,12 @@ + private dev_proc_close_device(gdev_dmprt_close); + + /* declarations of sub functions to get printer properties. */ +-private void gdev_dmprt_init_printer_props(P1(gx_device_dmprt *)); +-private int gdev_dmprt_get_printer_props(P2(gx_device_dmprt *,char *)); +-private int gdev_dmprt_check_code_props(P2(byte * ,int )); +-private FILE *gdev_dmprt_dviprt_lib_fopen(P2(const char *,char *)); ++private void gdev_dmprt_init_printer_props(gx_device_dmprt *); ++private int gdev_dmprt_get_printer_props(gx_device_dmprt *,char *); ++private int gdev_dmprt_check_code_props(byte * ,int ); ++private FILE *gdev_dmprt_dviprt_lib_fopen(const char *,char *); + +-private int gdev_dmprt_error_no_dviprt_to_gs(P1(int )); ++private int gdev_dmprt_error_no_dviprt_to_gs(int ); + + /* The device descriptor */ + gx_device_procs prn_dmprt_procs = { +@@ -833,6 +833,7 @@ + return code; + } + ++private const char * gp_file_name_concat_string(const char *, unsigned); + private FILE * + gdev_dmprt_dviprt_lib_fopen(const char *fnamebase,char *fname) + { +@@ -845,9 +846,7 @@ + env = getenv("TEXCFG"); + if (env) { + strcpy(fname,env); +- strcat(fname, +- gp_file_name_concat_string(env,strlen(env),fname,strlen(fnamebase))); +- strcat(fname,fnamebase); ++ strcat(fname, gp_file_name_concat_string(env,strlen(env))); + fp = fopen(fname,gp_fmode_rb); + } + } +@@ -867,4 +866,15 @@ + default: + return -1; + } ++} ++ ++/* Answer the string to be used for combining a directory/device prefix */ ++/* with a base file name. The prefix directory/device is examined to */ ++/* determine if a separator is needed and may return an empty string */ ++private const char * ++gp_file_name_concat_string(const char *prefix, unsigned plen) ++{ ++ if (plen > 0 && prefix[plen - 1] == '/') ++ return ""; ++ return "/"; + } diff --git a/print/ghostscript-gpl/files/patch-src-gdevdmpr.mak b/print/ghostscript-gpl/files/patch-src-gdevdmpr.mak new file mode 100644 index 000000000000..9136172873fa --- /dev/null +++ b/print/ghostscript-gpl/files/patch-src-gdevdmpr.mak @@ -0,0 +1,21 @@ +--- src/gdevdmpr.mak.orig Mon May 1 20:24:43 2000 ++++ src/gdevdmpr.mak Mon May 1 20:26:23 2000 +@@ -1,8 +1,12 @@ + ### ---------------- Dot matrix printer device ---------------- ### +-dmprt_=gdevdmpr.$(OBJ) dviprlib.$(OBJ) gdevprn.$(OBJ) ++dmprt_=$(GLOBJ)gdevdmpr.$(OBJ) $(GLOBJ)dviprlib.$(OBJ) $(GLOBJ)gdevprn.$(OBJ) + +-dmprt.dev: $(dmprt_) +- $(SETDEV) dmprt $(dmprt_) +- $(ADDMOD) dmprt -ps dmp_init +-gdevdmpr.$(OBJ): gdevdmpr.c dviprlib.h $(PDEVH) +-dviprlib.$(OBJ): dviprlib.c dviprlib.h ++$(DD)dmprt.dev: $(dmprt_) ++ $(SETDEV) $(DD)dmprt $(dmprt_) ++ $(ADDMOD) $(DD)dmprt -ps dmp_init ++ ++$(GLOBJ)gdevdmpr.$(OBJ): $(GLSRC)gdevdmpr.c $(GLSRC)dviprlib.h $(PDEVH) ++ $(GLCC) $(GLO_)gdevdmpr.$(OBJ) $(C_) $(GLSRC)gdevdmpr.c ++ ++$(GLOBJ)dviprlib.$(OBJ): $(GLSRC)dviprlib.c $(GLSRC)dviprlib.h ++ $(GLCC) $(GLO_)dviprlib.$(OBJ) $(C_) $(GLSRC)dviprlib.c diff --git a/print/ghostscript-gpl/files/patch-src-gdevijs.c b/print/ghostscript-gpl/files/patch-src-gdevijs.c new file mode 100644 index 000000000000..b9e8a47b5aff --- /dev/null +++ b/print/ghostscript-gpl/files/patch-src-gdevijs.c @@ -0,0 +1,659 @@ +--- src/gdevijs.c.orig Wed Mar 24 17:38:53 2004 ++++ src/gdevijs.c Thu May 26 01:23:29 2005 +@@ -27,15 +27,29 @@ + * which is a security risk, since any program can be run. + * You should use -dSAFER which sets .LockSafetyParams to true + * before opening this device. ++ * ++ * 11/26/03 David Suffield ++ * (c) 2003-2004 Copyright Hewlett-Packard Development Company, LP ++ * ++ * 1. Removed hpijs 1.0-1.0.2 workarounds, use hpijs 1.0.3 or higher. ++ * 2. Added krgb support. ++ * ++ * 02/21/05 David Suffield ++ * 1. Fixed segfault issue with 1-bit color space. ++ * 2. Fixed z-order issue with colored text on black rectangle. ++ * + */ + + #include "unistd_.h" /* for dup() */ + #include ++#include + #include "gdevprn.h" + #include "gp.h" + #include "ijs.h" + #include "ijs_client.h" + ++/*#define KRGB_DEBUG*/ ++ + /* This should go into gdevprn.h, or, better yet, gdevprn should + acquire an API for changing resolution. */ + int gdev_prn_maybe_realloc_memory(gx_device_printer *pdev, +@@ -51,6 +65,14 @@ + private dev_proc_get_params(gsijs_get_params); + private dev_proc_put_params(gsijs_put_params); + ++/* Following definitions are for krgb support. */ ++private dev_proc_create_buf_device(gsijs_create_buf_device); ++private dev_proc_fill_rectangle(gsijs_fill_rectangle); ++private dev_proc_copy_mono(gsijs_copy_mono); ++private dev_proc_fill_mask(gsijs_fill_mask); ++private dev_proc_fill_path(gsijs_fill_path); ++private dev_proc_stroke_path(gsijs_stroke_path); ++ + private const gx_device_procs gsijs_procs = + prn_color_params_procs(gsijs_open, gsijs_output_page, gsijs_close, + gx_default_rgb_map_rgb_color, gx_default_rgb_map_color_rgb, +@@ -83,6 +105,14 @@ + + IjsClientCtx *ctx; + int ijs_version; ++ ++ /* Additional parameters for krgb support. */ ++ int krgb_mode; /* 0=false, 1=true */ ++ int k_path; /* k plane path, 0=false, 1=true */ ++ int k_width; /* k plane width in pixels */ ++ int k_band_size; /* k plane buffer size in bytes, byte aligned */ ++ unsigned char *k_band; /* k plane buffer */ ++ gx_device_procs prn_procs; /* banding playback procedures */ + }; + + #define DEFAULT_DPI 74 /* See gsijs_set_resolution() below. */ +@@ -110,7 +140,12 @@ + FALSE, /* Tumble_set */ + + NULL, /* IjsClient *ctx */ +- 0 /* ijs_version */ ++ 0, /* ijs_version */ ++ 0, /* krgb_mode */ ++ 0, /* k_path */ ++ 0, /* k_width */ ++ 0, /* k_band_size */ ++ NULL /* k_band buffer */ + }; + + +@@ -126,12 +161,254 @@ + + /**************************************************************************/ + +-/* ------ Private definitions ------ */ ++/* ---------------- Low-level graphic procedures ---------------- */ ++ ++static unsigned char xmask[] = ++{ ++ 0x80, /* x=0 */ ++ 0x40, /* 1 */ ++ 0x20, /* 2 */ ++ 0x10, /* 3 */ ++ 0x08, /* 4 */ ++ 0x04, /* 5 */ ++ 0x02, /* 6 */ ++ 0x01 /* 7 */ ++}; ++ ++private int gsijs_fill_rectangle(gx_device * dev, int x, int y, int w, int h, ++ gx_color_index color) ++{ ++ gx_device_ijs *ijsdev = (gx_device_ijs *)((gx_device_forward *)dev)->target; ++ ++ if (ijsdev->krgb_mode && ijsdev->k_path && y >= 0 && x >= 0) ++ { ++ int raster = (ijsdev->k_width+7) >> 3; ++ register unsigned char *dest=ijsdev->k_band+(raster*y)+(x >> 3); ++ int dest_start_bit = x & 7; ++ int i,j,w1; ++ ++ if (h <= 0 || w <= 0) ++ return 0; ++ ++ if ((x+w) > ijsdev->k_width) ++ w1 = ijsdev->k_width - x; ++ else ++ w1 = w; ++ ++ /* Note x,y orgin 0,0 is stored first byte 0 left to right. */ ++ ++ if (color==0x0) ++ { ++ /* Color is black, store in k plane band instead of regular band. */ ++ for (j=0; j>3] |= xmask[(dest_start_bit+i)&7]; ++ dest+=raster; ++ } ++ return 0; ++ } ++ else ++ { ++ /* Color is not black, remove any k plane bits for z-order dependencies, store in regular band. */ ++ for (j=0; j>3] &= ~xmask[(dest_start_bit+i)&7]; ++ dest+=raster; ++ } ++ } ++ } ++ ++ return (*ijsdev->prn_procs.fill_rectangle)(dev, x, y, w, h, color); ++} ++ ++private int gsijs_copy_mono(gx_device * dev, const byte * data, ++ int dx, int draster, gx_bitmap_id id, ++ int x, int y, int w, int height, gx_color_index zero, gx_color_index one) ++{ ++ gx_device_ijs *ijsdev = (gx_device_ijs *)((gx_device_forward *)dev)->target; ++ ++ /* if (ijsdev->krgb_mode && ijsdev->k_path && one==0x0) */ ++ if (ijsdev->krgb_mode && ijsdev->k_path) ++ { ++ /* Store in k plane band instead of regular band. */ ++ int raster = (ijsdev->k_width+7) >> 3; /* raster width in bytes, byte aligned */ ++ register unsigned char *dest=ijsdev->k_band+(raster*y)+(x >> 3); ++ register const unsigned char *scan=data+(dx >> 3); ++ int dest_start_bit = x & 7; ++ int scan_start_bit = dx & 7; ++ int i, h=height; ++ ++ if (h <= 0 || w <= 0) ++ return 0; ++ ++ if (one==0x0) ++ { ++ /* Color is black, store in k plane band instead of regular band. */ ++ while (h-- > 0) ++ { ++ for (i=0; i>3] & xmask[(scan_start_bit+i)&7]) ++ dest[(dest_start_bit+i)>>3] |= xmask[(dest_start_bit+i)&7]; ++ } ++ scan+=draster; ++ dest+=raster; ++ } ++ return 0; ++ } ++ else ++ { ++ /* Color is not black, remove any k plane bits for z-order dependencies, store in regular band. */ ++ while (h-- > 0) ++ { ++ for (i=0; i>3] & xmask[(scan_start_bit+i)&7]) ++ dest[(dest_start_bit+i)>>3] &= ~xmask[(dest_start_bit+i)&7]; ++ } ++ scan+=draster; ++ dest+=raster; ++ } ++ } ++ } ++ ++ return (*ijsdev->prn_procs.copy_mono)(dev, data, dx, draster, id, x, y, w, height, zero, one); ++} ++ ++/* ---------------- High-level graphic procedures ---------------- */ ++ ++private int gsijs_fill_mask(gx_device * dev, ++ const byte * data, int dx, int raster, gx_bitmap_id id, ++ int x, int y, int w, int h, ++ const gx_drawing_color * pdcolor, int depth, ++ gs_logical_operation_t lop, const gx_clip_path * pcpath) ++{ ++ gx_device_ijs *ijsdev = (gx_device_ijs *)((gx_device_forward *)dev)->target; ++ int code; ++ ++ ijsdev->k_path = 1; ++ ++ code = (*ijsdev->prn_procs.fill_mask)(dev, data, dx, raster, id, x, y, w, h, pdcolor, depth, lop, pcpath); ++ ++ ijsdev->k_path = 0; ++ ++ return code; ++} ++ ++private int gsijs_fill_path(gx_device * dev, const gs_imager_state * pis, ++ gx_path * ppath, const gx_fill_params * params, ++ const gx_drawing_color * pdcolor, ++ const gx_clip_path * pcpath) ++{ ++ gx_device_ijs *ijsdev = (gx_device_ijs *)((gx_device_forward *)dev)->target; ++ int code; ++ ++ ijsdev->k_path = 1; ++ ++ code = (*ijsdev->prn_procs.fill_path)(dev, pis, ppath, params, pdcolor, pcpath); ++ ++ ijsdev->k_path = 0; ++ ++ return 0; ++} ++ ++private int gsijs_stroke_path(gx_device * dev, const gs_imager_state * pis, ++ gx_path * ppath, const gx_stroke_params * params, ++ const gx_drawing_color * pdcolor, ++ const gx_clip_path * pcpath) ++{ ++ gx_device_ijs *ijsdev = (gx_device_ijs *)((gx_device_forward *)dev)->target; ++ int code; ++ ++ ijsdev->k_path = 1; + +-/* Versions 1.0 through 1.0.2 of hpijs report IJS version 0.29, and +- require some workarounds. When more up-to-date hpijs versions +- become ubiquitous, all these workarounds should be removed. */ +-#define HPIJS_1_0_VERSION 29 ++ code = (*ijsdev->prn_procs.stroke_path)(dev, pis, ppath, params, pdcolor, pcpath); ++ ++ ijsdev->k_path = 0; ++ ++ return code; ++} ++ ++/* ---------------- krgb banding playback procedures ---------------- */ ++ ++private int gsijs_get_bits(gx_device_printer * pdev, int y, byte * str, byte ** actual_data) ++{ ++ gx_device_ijs *ijsdev = (gx_device_ijs *)pdev; ++ gx_device_clist_common *cdev = (gx_device_clist_common *)pdev; ++ int band_height = cdev->page_info.band_params.BandHeight; ++ int band_number = y/band_height; ++ int raster = (ijsdev->k_width+7) >> 3; /* raster width in bytes, byte aligned */ ++ int y1=raster*(y-(band_height*band_number)); ++ ++ if (y1 == 0) ++ { ++ /* First raster for band, clear k_band. Banding playback occurs on first raster. */ ++ memset(ijsdev->k_band, 0, ijsdev->k_band_size); ++ } ++ ++ return gdev_prn_get_bits(pdev, y, str, actual_data); /* get raster from regular band */ ++} ++ ++private int gsijs_k_get_bits(gx_device_printer * pdev, int y, byte ** actual_data) ++{ ++ gx_device_ijs *ijsdev = (gx_device_ijs *)pdev; ++ gx_device_clist_common *cdev = (gx_device_clist_common *)pdev; ++ int band_height = cdev->page_info.band_params.BandHeight; ++ int band_number = y/band_height; ++ int raster = (ijsdev->k_width+7) >> 3; /* raster width in bytes, byte aligned */ ++ int y1=raster*(y-(band_height*band_number)); ++ ++ *actual_data = ijsdev->k_band+y1; ++ ++ return 0; ++} ++ ++private int gsijs_create_buf_device(gx_device **pbdev, gx_device *target, ++ const gx_render_plane_t *render_plane, gs_memory_t *mem, bool for_band) ++{ ++ gx_device_ijs *ijsdev = (gx_device_ijs *)target; ++ int n_chan = ijsdev->color_info.num_components; ++ int code = gx_default_create_buf_device(pbdev, target, render_plane, mem, for_band); ++ if (code < 0 || n_chan != 3) ++ return code; ++ ++ /* Save buffer (vector) procedures so that we can hook them during banding playback. */ ++ ijsdev->prn_procs = (*pbdev)->procs; ++ ++ /* Replace buffer procedures with krgb procedures. */ ++ set_dev_proc(*pbdev, fill_rectangle, gsijs_fill_rectangle); ++ set_dev_proc(*pbdev, copy_mono, gsijs_copy_mono); ++ set_dev_proc(*pbdev, fill_mask, gsijs_fill_mask); ++ set_dev_proc(*pbdev, fill_path, gsijs_fill_path); ++ set_dev_proc(*pbdev, stroke_path, gsijs_stroke_path); ++ ++ return code; ++} ++ ++/* See if IJS server supports krgb. Return value: 0=false, 1=true. */ ++private int ++gsijs_set_krgb_mode(gx_device_ijs *ijsdev) ++{ ++ char buf[256]; ++ int n_chan = ijsdev->color_info.num_components; ++ int code; ++ ++ if (n_chan != 3) ++ return 0; /* no krgb support, not RGB colorspace */ ++ ++ buf[0] = 0; ++ code = ijs_client_enum_param(ijsdev->ctx, 0, "ColorSpace", buf, sizeof(buf)-1); ++ if (code >= 0) ++ buf[code] = 0; ++ if (strstr(buf, "KRGB") == NULL) ++ return 0; /* no krgb support */ ++ ++ return 1; /* krgb is supported */ ++} ++ ++/* ------ Private definitions ------ */ + + private int + gsijs_parse_wxh (const char *val, int size, double *pw, double *ph) +@@ -169,34 +446,6 @@ + } + + /** +- * gsijs_set_generic_params_hpijs: Set generic IJS parameters. +- * +- * This version is specialized for hpijs 1.0 through 1.0.2, and +- * accommodates a number of quirks. +- **/ +-private int +-gsijs_set_generic_params_hpijs(gx_device_ijs *ijsdev) +-{ +- char buf[256]; +- int code = 0; +- +- /* IjsParams, Duplex, and Tumble get set at this point because +- they may affect margins. */ +- if (ijsdev->IjsParams) { +- code = gsijs_client_set_param(ijsdev, "IjsParams", ijsdev->IjsParams); +- } +- +- if (code == 0 && ijsdev->Duplex_set) { +- int duplex_val; +- +- duplex_val = ijsdev->Duplex ? (ijsdev->IjsTumble ? 1 : 2) : 0; +- sprintf (buf, "%d", duplex_val); +- code = gsijs_client_set_param(ijsdev, "Duplex", buf); +- } +- return code; +-} +- +-/** + * gsijs_set_generic_params: Set generic IJS parameters. + **/ + private int +@@ -207,9 +456,6 @@ + int i, j; + char *value; + +- if (ijsdev->ijs_version == HPIJS_1_0_VERSION) +- return gsijs_set_generic_params_hpijs(ijsdev); +- + /* Split IjsParams into separate parameters and send to ijs server */ + value = NULL; + for (i=0, j=0; (j < ijsdev->IjsParams_size) && (i < sizeof(buf)-1); j++) { +@@ -250,68 +496,6 @@ + } + + /** +- * gsijs_set_margin_params_hpijs: Do margin negotiation with IJS server. +- * +- * This version is specialized for hpijs 1.0 through 1.0.2, and +- * accommodates a number of quirks. +- **/ +-private int +-gsijs_set_margin_params_hpijs(gx_device_ijs *ijsdev) +-{ +- char buf[256]; +- int code = 0; +- +- if (code == 0) { +- sprintf(buf, "%d", ijsdev->width); +- code = gsijs_client_set_param(ijsdev, "Width", buf); +- } +- if (code == 0) { +- sprintf(buf, "%d", ijsdev->height); +- code = gsijs_client_set_param(ijsdev, "Height", buf); +- } +- +- if (code == 0) { +- double printable_width, printable_height; +- double printable_left, printable_top; +- float m[4]; +- +- code = ijs_client_get_param(ijsdev->ctx, 0, "PrintableArea", +- buf, sizeof(buf)); +- if (code == IJS_EUNKPARAM) +- /* IJS server doesn't support margin negotiations. +- That's ok. */ +- return 0; +- else if (code >= 0) { +- code = gsijs_parse_wxh(buf, code, +- &printable_width, &printable_height); +- } +- +- if (code == 0) { +- code = ijs_client_get_param(ijsdev->ctx, 0, "PrintableTopLeft", +- buf, sizeof(buf)); +- if (code == IJS_EUNKPARAM) +- return 0; +- else if (code >= 0) { +- code = gsijs_parse_wxh(buf, code, +- &printable_left, &printable_top); +- } +- } +- +- if (code == 0) { +- m[0] = printable_left; +- m[1] = ijsdev->MediaSize[1] * (1.0 / 72) - +- printable_top - printable_height; +- m[2] = ijsdev->MediaSize[0] * (1.0 / 72) - +- printable_left - printable_width; +- m[3] = printable_top; +- gx_device_set_margins((gx_device *)ijsdev, m, true); +- } +- } +- +- return code; +-} +- +-/** + * gsijs_set_margin_params: Do margin negotiation with IJS server. + **/ + private int +@@ -322,9 +506,6 @@ + int i, j; + char *value; + +- if (ijsdev->ijs_version == HPIJS_1_0_VERSION) +- return gsijs_set_margin_params_hpijs(ijsdev); +- + /* Split IjsParams into separate parameters and send to ijs server */ + value = NULL; + for (i=0, j=0; (j < ijsdev->IjsParams_size) && (i < sizeof(buf)-1); j++) { +@@ -491,12 +672,18 @@ + char buf[256]; + bool use_outputfd; + int fd = -1; ++ long max_bitmap = ijsdev->space_params.MaxBitmap; + + if (strlen(ijsdev->IjsServer) == 0) { + eprintf("ijs server not specified\n"); + return gs_note_error(gs_error_ioerror); + } + ++ ijsdev->space_params.MaxBitmap = 0; /* force banding */ ++ ++ /* Set create_buf_device in printer device, so that we can hook the banding playback procedures. */ ++ ijsdev->printer_procs.buf_procs.create_buf_device = gsijs_create_buf_device; ++ + /* Decide whether to use OutputFile or OutputFD. Note: how to + determine this is a tricky question, so we just allow the + user to set it. +@@ -511,6 +698,8 @@ + if (code < 0) + return code; + ++ ijsdev->space_params.MaxBitmap = max_bitmap; ++ + if (use_outputfd) { + /* Note: dup() may not be portable to all interesting IJS + platforms. In that case, this branch should be #ifdef'ed out. +@@ -570,6 +759,9 @@ + if (code >= 0) + code = gsijs_set_margin_params(ijsdev); + ++ if (code >= 0) ++ ijsdev->krgb_mode = gsijs_set_krgb_mode(ijsdev); ++ + return code; + } + +@@ -629,21 +821,6 @@ + return min(width, end); + } + +-private int ijs_all_white(unsigned char *data, int size) +-{ +- int clean = 1; +- int i; +- for (i = 0; i < size; i++) +- { +- if (data[i] != 0xFF) +- { +- clean = 0; +- break; +- } +- } +- return clean; +-} +- + /* Print a page. Don't use normal printer gdev_prn_output_page + * because it opens the output file. + */ +@@ -654,8 +831,9 @@ + gx_device_printer *pdev = (gx_device_printer *)dev; + int raster = gdev_prn_raster(pdev); + int ijs_width, ijs_height; +- int row_bytes; ++ int row_bytes, k_row_bytes=0; + int n_chan = pdev->color_info.num_components; ++ int krgb_mode = ijsdev->krgb_mode; + unsigned char *data; + char buf[256]; + double xres = pdev->HWResolution[0]; +@@ -671,13 +849,23 @@ + + /* Determine bitmap width and height */ + ijs_height = gdev_prn_print_scan_lines(dev); +- if (ijsdev->ijs_version == HPIJS_1_0_VERSION) { +- ijs_width = pdev->width; +- } else { + ijs_width = gsijs_raster_width(dev); +- } ++ + row_bytes = (ijs_width * pdev->color_info.depth + 7) >> 3; + ++ if (krgb_mode) ++ { ++ gx_device_clist_common *cdev = (gx_device_clist_common *)dev; ++ int band_height = cdev->page_info.band_params.BandHeight; ++ k_row_bytes = (ijs_width + 7) >> 3; ++ ++ /* Create banding buffer for k plane. */ ++ ijsdev->k_width = ijs_width; ++ ijsdev->k_band_size = band_height * k_row_bytes; ++ if ((ijsdev->k_band = gs_malloc(ijsdev->k_band_size, 1, "gsijs_output_page")) == (unsigned char *)NULL) ++ return gs_note_error(gs_error_VMerror); ++ } ++ + /* Required page parameters */ + sprintf(buf, "%d", n_chan); + gsijs_client_set_param(ijsdev, "NumChan", buf); +@@ -686,44 +874,71 @@ + + /* This needs to become more sophisticated for DeviceN. */ + strcpy(buf, (n_chan == 4) ? "DeviceCMYK" : +- ((n_chan == 3) ? "DeviceRGB" : "DeviceGray")); ++ ((n_chan == 3) ? (krgb_mode ? "KRGB" : "DeviceRGB") : "DeviceGray")); + gsijs_client_set_param(ijsdev, "ColorSpace", buf); + +- /* If hpijs 1.0, don't set width and height here, because it +- expects them to be the paper size. */ +- if (ijsdev->ijs_version != HPIJS_1_0_VERSION) { +- sprintf(buf, "%d", ijs_width); +- gsijs_client_set_param(ijsdev, "Width", buf); +- sprintf(buf, "%d", ijs_height); +- gsijs_client_set_param(ijsdev, "Height", buf); +- } ++ sprintf(buf, "%d", ijs_width); ++ gsijs_client_set_param(ijsdev, "Width", buf); ++ sprintf(buf, "%d", ijs_height); ++ gsijs_client_set_param(ijsdev, "Height", buf); + + sprintf(buf, "%gx%g", xres, yres); + gsijs_client_set_param(ijsdev, "Dpi", buf); + ++#ifdef KRGB_DEBUG ++ int kfd, rgbfd; ++ char sz[128]; ++ kfd = open("/tmp/k.pbm", O_CREAT | O_TRUNC | O_RDWR, 0644); ++ rgbfd = open("/tmp/rgb.ppm", O_CREAT | O_TRUNC | O_RDWR, 0644); ++ snprintf(sz, sizeof(sz), "P4\n#gdevijs test\n%d\n%d\n", ijs_width, ijs_height); ++ write(kfd, sz, strlen(sz)); ++ snprintf(sz, sizeof(sz), "P6\n#gdevijs test\n%d\n%d\n255\n", ijs_width, ijs_height); ++ write(rgbfd, sz, strlen(sz)); ++#endif ++ + for (i=0; ictx, IJS_CMD_BEGIN_PAGE); + status = ijs_client_send_cmd_wait(ijsdev->ctx); + + for (y = 0; y < ijs_height; y++) { +- code = gdev_prn_get_bits(pdev, y, data, &actual_data); +- if (code < 0) +- break; ++ if (krgb_mode) ++ code = gsijs_get_bits(pdev, y, data, &actual_data); ++ else ++ code = gdev_prn_get_bits(pdev, y, data, &actual_data); ++ if (code < 0) ++ break; ++#ifdef KRGB_DEBUG ++ write(rgbfd, actual_data, row_bytes); ++#endif ++ status = ijs_client_send_data_wait(ijsdev->ctx, 0, (char *)actual_data, row_bytes); ++ if (status) ++ break; + +- if (ijsdev->ijs_version == HPIJS_1_0_VERSION && +- ijs_all_white(actual_data, row_bytes)) +- status = ijs_client_send_data_wait(ijsdev->ctx, 0, NULL, 0); +- else +- status = ijs_client_send_data_wait(ijsdev->ctx, 0, +- (char *)actual_data, row_bytes); +- if (status) +- break; ++ if (krgb_mode) { ++ code = gsijs_k_get_bits(pdev, y, &actual_data); ++ if (code < 0) ++ break; ++#ifdef KRGB_DEBUG ++ write(kfd, actual_data, k_row_bytes); ++#endif ++ status = ijs_client_send_data_wait(ijsdev->ctx, 0, (char *)actual_data, k_row_bytes); ++ if (status) ++ break; ++ } + } + ijs_client_begin_cmd(ijsdev->ctx, IJS_CMD_END_PAGE); + status = ijs_client_send_cmd_wait(ijsdev->ctx); + } + ++#ifdef KRGB_DEBUG ++ close(kfd); ++ close(rgbfd); ++#endif ++ ++ if(krgb_mode) ++ gs_free(ijsdev->k_band, ijsdev->k_band_size, 1, "gsijs_output_page"); ++ + gs_free_object(pdev->memory, data, "gsijs_output_page"); + + endcode = (pdev->buffer_space && !pdev->is_async_renderer ? +@@ -1027,7 +1242,6 @@ + dprintf2("ijs: Can't set parameter %s=%s\n", key, value); + return code; + } +- + + private int + gsijs_set_color_format(gx_device_ijs *ijsdev) -- cgit v1.2.3