diff -uraN gs-orig/src/gdevlj56.c gs-pxl/src/gdevlj56.c --- gs-orig/src/gdevlj56.c 2007-04-24 13:00:22.000000000 +0100 +++ gs-pxl/src/gdevlj56.c 2007-04-27 16:48:02.000000000 +0100 @@ -142,7 +142,7 @@ }; px_write_page_header(s, (gx_device *)pdev); - px_write_select_media(s, (gx_device *)pdev, NULL, NULL); + px_write_select_media(s, (gx_device *)pdev, NULL, NULL, 0, false, false); PX_PUT_LIT(s, page_header); if (pdev->color_info.depth == 1) PX_PUT_LIT(s, mono_header); diff -uraN gs-orig/src/gdevpx.c gs-pxl/src/gdevpx.c --- gs-orig/src/gdevpx.c 2007-04-24 13:00:22.000000000 +0100 +++ gs-pxl/src/gdevpx.c 2007-04-27 16:55:19.000000000 +0100 @@ -54,8 +54,11 @@ pxeMediaSize_t media_size; bool ManualFeed; /* map ps setpage commands to pxl */ bool ManualFeed_set; - int MediaPosition; - int MediaPosition_set; + int MediaPosition; /* MediaPosition attribute */ + int MediaPosition_set; + int page; /* Page number starting at 0 */ + bool Duplex; /* Duplex attribute */ + bool Tumble; /* Tumble attribute */ gx_path_type_t fill_rule; /* ...winding_number or ...even_odd */ gx_path_type_t clip_rule; /* ditto */ pxeColorSpace_t color_space; @@ -780,6 +783,12 @@ stream *s = vdev->strm; byte media_source = eAutoSelect; /* default */ + xdev->page ++; + + errprintf("PAGE: %d %d\n", xdev->page, xdev->NumCopies); + errprintf("INFO: Printing page %d...\n", xdev->page); + errflush(); + px_write_page_header(s, (const gx_device *)vdev); if (xdev->ManualFeed_set && xdev->ManualFeed) @@ -787,7 +796,9 @@ else if (xdev->MediaPosition_set && xdev->MediaPosition >= 0 ) media_source = xdev->MediaPosition; - px_write_select_media(s, (const gx_device *)vdev, &xdev->media_size, &media_source ); + px_write_select_media(s, (const gx_device *)vdev, &xdev->media_size, + &media_source, + xdev->page, xdev->Duplex, xdev->Tumble); spputc(s, pxtBeginPage); return 0; @@ -1126,6 +1137,12 @@ VECTOR_OPEN_FILE_SEQUENTIAL); if (code < 0) return code; + + xdev->page = 0; + xdev->Duplex = false; + xdev->MediaPosition = 0; + xdev->Tumble = false; + pclxl_page_init(xdev); px_write_file_header(vdev->strm, dev); xdev->media_size = pxeMediaSize_next; /* no size selected */ @@ -1610,60 +1627,100 @@ return code; } -/* Get parameters. */ -int -pclxl_get_params(gx_device *dev, gs_param_list *plist) +/* + * 'pclxl_get_params()' - Get pagedevice parameters. + */ + +private int /* O - Error status */ +pclxl_get_params(gx_device *dev, /* I - Device info */ + gs_param_list *plist) /* I - Parameter list */ { - gx_device_pclxl *pdev = (gx_device_pclxl *) dev; - int code = gdev_vector_get_params(dev, plist); + gx_device_pclxl *xdev; /* PCL XL device */ + int code; /* Return code */ - if (code < 0) - return code; - if (code >= 0) - code = param_write_bool(plist, "ManualFeed", &pdev->ManualFeed); - return code; + /* + * First process the "standard" page device parameters... + */ + + if ((code = gdev_vector_get_params(dev, plist)) < 0) + return (code); + + /* + * Then write the PCL-XL parameters... + */ + + xdev = (gx_device_pclxl *)dev; + + if ((code = param_write_bool(plist, "Duplex", &(xdev->Duplex))) < 0) + return (code); + + if ((code = param_write_int(plist, "MediaPosition", + &(xdev->MediaPosition))) < 0) + return (code); + + if ((code = param_write_bool(plist, "Tumble", &(xdev->Tumble))) < 0) + return (code); + + return (0); } -/* Put parameters. */ -int -pclxl_put_params(gx_device * dev, gs_param_list * plist) + +/* + * 'pclxl_put_params()' - Set pagedevice parameters. + */ + +private int /* O - Error status */ +pclxl_put_params(gx_device *dev, /* I - Device info */ + gs_param_list *plist) /* I - Parameter list */ { - gx_device_pclxl *pdev = (gx_device_pclxl *) dev; - int code = 0; - bool ManualFeed; - bool ManualFeed_set = false; - int MediaPosition; - bool MediaPosition_set = false; - - code = param_read_bool(plist, "ManualFeed", &ManualFeed); - if (code == 0) - ManualFeed_set = true; - if (code >= 0) { - code = param_read_int(plist, "%MediaSource", &MediaPosition); - if (code == 0) - MediaPosition_set = true; - else if (code < 0) { - if (param_read_null(plist, "%MediaSource") == 0) { - code = 0; - } - } - } + gx_device_pclxl *xdev; /* PCL XL device */ + int code; /* Error code */ + int intval; /* Integer value */ + bool boolval; /* Boolean value */ - /* note this handles not opening/closing the device */ - code = gdev_vector_put_params(dev, plist); - if (code < 0) - return code; - if (code >= 0) { - if (ManualFeed_set) { - pdev->ManualFeed = ManualFeed; - pdev->ManualFeed_set = true; - } - if (MediaPosition_set) { - pdev->MediaPosition = MediaPosition; - pdev->MediaPosition_set = true; - } - } - return code; + /* + * Process PCL-XL driver parameters... + */ + + xdev = (gx_device_pclxl *)dev; + +#define intoption(name, sname, type) \ + if ((code = param_read_int(plist, sname, &intval)) < 0) \ + { \ + param_signal_error(plist, sname, code); \ + return (code); \ + } \ + else if (code == 0) \ + { \ + xdev->name = (type)intval; \ + } + +#define booloption(name, sname) \ + if ((code = param_read_bool(plist, sname, &boolval)) < 0) \ + { \ + if ((code = param_read_null(plist, sname)) < 0) \ + { \ + param_signal_error(plist, sname, code); \ + return (code); \ + } \ + if (code == 0) \ + xdev->name = false; \ + } \ + else if (code == 0) \ + xdev->name = (bool)boolval; + + booloption(Duplex, "Duplex") + intoption(MediaPosition, "MediaPosition", int) + booloption(Tumble, "Tumble") + + /* + * Then process standard page device parameters... + */ + + if ((code = gdev_vector_put_params(dev, plist)) < 0) + return (code); + + return (0); } diff -uraN gs-orig/src/gdevpxut.c gs-pxl/src/gdevpxut.c --- gs-orig/src/gdevpxut.c 2007-04-24 13:00:22.000000000 +0100 +++ gs-pxl/src/gdevpxut.c 2007-04-27 17:01:27.000000000 +0100 @@ -81,7 +81,8 @@ /* Write the media selection command if needed, updating the media size. */ int px_write_select_media(stream *s, const gx_device *dev, - pxeMediaSize_t *pms, byte *media_source) + pxeMediaSize_t *pms, byte *media_source, + int page, bool Duplex, bool Tumble) { #define MSD(ms, res, w, h)\ { ms, (float)((w) * 1.0 / (res)), (float)((h) * 1.0 / res) }, @@ -115,6 +116,22 @@ if (media_source != NULL) tray = *media_source; px_put_uba(s, tray, pxaMediaSource); + + if (Duplex) + { + if (Tumble) + px_put_uba(s, (byte)eDuplexHorizontalBinding, pxaDuplexPageMode); + else + px_put_uba(s, (byte)eDuplexVerticalBinding, pxaDuplexPageMode); + + if (page & 1) + px_put_uba(s, (byte)eFrontMediaSide, pxaDuplexPageSide); + else + px_put_uba(s, (byte)eBackMediaSide, pxaDuplexPageSide); + } + else + px_put_uba(s, (byte)eSimplexFrontSide, pxaSimplexPageMode); + if (pms) *pms = size; diff -uraN gs-orig/src/gdevpxut.h gs-pxl/src/gdevpxut.h --- gs-orig/src/gdevpxut.h 2007-04-24 13:00:22.000000000 +0100 +++ gs-pxl/src/gdevpxut.h 2007-04-27 16:47:45.000000000 +0100 @@ -29,7 +29,8 @@ /* Write the media selection command if needed, updating the media size. */ int px_write_select_media(stream *s, const gx_device *dev, pxeMediaSize_t *pms, - byte *media_source); + byte *media_source, + int page, bool Duplex, bool Tumble); /* * Write the file trailer. Note that this takes a FILE *, not a stream *,