[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