[gs-cvs] rev 7917 - trunk/gs/src
till at ghostscript.com
till at ghostscript.com
Tue May 8 10:43:12 PDT 2007
Author: till
Date: 2007-05-08 10:43:12 -0700 (Tue, 08 May 2007)
New Revision: 7917
Modified:
trunk/gs/src/gdevlj56.c
trunk/gs/src/gdevpx.c
trunk/gs/src/gdevpxut.c
trunk/gs/src/gdevpxut.h
Log:
Added duples support to the PCL-XL ("pxlmono"/"pxlcolor") output devices
Modified: trunk/gs/src/gdevlj56.c
===================================================================
--- trunk/gs/src/gdevlj56.c 2007-05-08 17:41:29 UTC (rev 7916)
+++ trunk/gs/src/gdevlj56.c 2007-05-08 17:43:12 UTC (rev 7917)
@@ -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);
Modified: trunk/gs/src/gdevpx.c
===================================================================
--- trunk/gs/src/gdevpx.c 2007-05-08 17:41:29 UTC (rev 7916)
+++ trunk/gs/src/gdevpx.c 2007-05-08 17:43:12 UTC (rev 7917)
@@ -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;
+ gx_device_pclxl *xdev; /* PCL XL device */
+ int code; /* Error code */
+ int intval; /* Integer value */
+ bool boolval; /* Boolean value */
- 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;
- }
- }
- }
- /* note this handles not opening/closing the device */
- code = gdev_vector_put_params(dev, plist);
- if (code < 0)
- return code;
+ /*
+ * Process PCL-XL driver parameters...
+ */
- 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;
+ 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);
}
Modified: trunk/gs/src/gdevpxut.c
===================================================================
--- trunk/gs/src/gdevpxut.c 2007-05-08 17:41:29 UTC (rev 7916)
+++ trunk/gs/src/gdevpxut.c 2007-05-08 17:43:12 UTC (rev 7917)
@@ -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;
Modified: trunk/gs/src/gdevpxut.h
===================================================================
--- trunk/gs/src/gdevpxut.h 2007-05-08 17:41:29 UTC (rev 7916)
+++ trunk/gs/src/gdevpxut.h 2007-05-08 17:43:12 UTC (rev 7917)
@@ -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 *,
More information about the gs-cvs
mailing list