[gs-commits] ghostpdl branch, master, updated. jbig2dec-0.14-1602-g3e09ced

[email protected] (Till Kamppeter)
Newsgroups gmane.comp.printing.ghostscript.cvs
Message-ID <[email protected]>
The ghostpdl branch, master has been updated
       via  3e09cede82a3b8c5c7a6e30a5934336f20dfa1f8 (commit)
      from  2d6bb6e69feb0a75be98d03f550258d4b7540aef (commit)

----------------------------------------------------------------------
commit 3e09cede82a3b8c5c7a6e30a5934336f20dfa1f8
Author: Till Kamppeter <[email protected]>
Date:   Sat Aug 24 23:11:10 2019 +0200

    "cups"/"pwgraster" output device: Improved page size matching with PPD
    
    Applied the following improvements for finding the correct page size
    of the PPD file for the input page:
    
    - Do not try to match by page size name, the input files do not
      contain page size names.
    
    - Do not only match the input page size against the actual media sizes
      reported by the PPD but also to the imageable areas. Media size match
      is preferred but if there is no media size match, we accept also
      a match of the imageable area. In case of a match of the imageable
      area we position the input page in the imageable area of the output
      page.
    
    - More debug output.
    
    - In case of a custom page size (no match with PPD sizes) the page
      size name in the CUPS Raster output is a correct "Custom.XXXxYYY"
      and not the default page size name.
    
    This should fix bug #701438.

diff --git a/cups/gdevcups.c b/cups/gdevcups.c
index 6b1a69e..5e5f9c7 100644
--- a/cups/gdevcups.c
+++ b/cups/gdevcups.c
@@ -3076,7 +3076,10 @@ cups_put_params(gx_device     *pdev,	/* I - Device info */
                 gs_param_list *plist)	/* I - Parameter list */
 {
   int			i;		/* Looping var */
+  float			mediasize[2];	/* Physical size of print */
   float			margins[4];	/* Physical margins of print */
+  float			cups_mediasize[2]; /* Media size to use in Raster */
+  float			cups_margins[4]; /* Margins to use in Raster */
   ppd_size_t		*size;		/* Page size */
   int			code;		/* Error code */
   int			intval;		/* Integer value */
@@ -3102,9 +3105,9 @@ cups_put_params(gx_device     *pdev,	/* I - Device info */
   long                  best_score = -1,
                         score = 0;
   ppd_size_t            *best_size = NULL;
-  int                   name_matched = 0,
-                        size_matched = 0,
-                        margins_matched = 0;
+  int                   size_matched = 0,
+                        margins_matched = 0,
+                        imageable_area_matched = 0;
   float long_edge_mismatch, short_edge_mismatch;
   gs_param_string icc_pro_dummy;
   int old_cmps = cups->color_info.num_components;
@@ -3472,7 +3475,6 @@ cups_put_params(gx_device     *pdev,	/* I - Device info */
 
 #define LONG_EDGE_LENGTH_MATCH_LIMIT  0.01
 #define SHORT_EDGE_LENGTH_MATCH_LIMIT 0.01
-#define PAGESIZE_SCORE_NAME           3
 #define PAGESIZE_SCORE_SIZE_MARGINS   2
 #define PAGESIZE_SCORE_SIZE           1
 
@@ -3485,21 +3487,16 @@ cups_put_params(gx_device     *pdev,	/* I - Device info */
 	if (size->length == 0 || size->width == 0) continue;
 
 	score = 0;
-	name_matched = 0;
 	size_matched = 0;
 	margins_matched = 0;
-
-#ifdef CUPS_RASTER_SYNCv1
-	/* Match the size requested as default (cupsPageSizeName) */
-	if ((strlen(cups->header.cupsPageSizeName) != 0) &&
-	    (strcasecmp(cups->header.cupsPageSizeName, size->name) == 0))
-	  name_matched = 1;
-#endif
+	imageable_area_matched = 0;
 
 	long_edge_mismatch =
-	  fabs(cups->MediaSize[1] - size->length)/size->length;
+	  fabs(cups->MediaSize[1] - size->length)/size->length +
+	  LONG_EDGE_LENGTH_MATCH_LIMIT / 100;
 	short_edge_mismatch =
-	  fabs(cups->MediaSize[0] - size->width)/size->width;
+	  fabs(cups->MediaSize[0] - size->width)/size->width +
+	  SHORT_EDGE_LENGTH_MATCH_LIMIT / 100;
 	if (size->length < size->width)
 	{
 	  swap = long_edge_mismatch;
@@ -3508,7 +3505,7 @@ cups_put_params(gx_device     *pdev,	/* I - Device info */
 	}
 
 	if (long_edge_mismatch < LONG_EDGE_LENGTH_MATCH_LIMIT &&
-	      short_edge_mismatch < SHORT_EDGE_LENGTH_MATCH_LIMIT)
+	    short_edge_mismatch < SHORT_EDGE_LENGTH_MATCH_LIMIT)
 	{
 	  size_matched = 1;
 	  /* If two sizes match within the limits, take the one with less
@@ -3533,11 +3530,37 @@ cups_put_params(gx_device     *pdev,	/* I - Device info */
 		(fabs(cups->HWMargins[1] - size->length + size->top) < 1.0 &&
 		 fabs(cups->HWMargins[3] - size->bottom) < 1.0))))
 	    margins_matched = 1;
+	} else {
+	  /* Compare the dimensions of the imageable area against the
+	     the input page size */
+	  long_edge_mismatch =
+	    fabs(cups->MediaSize[1] - size->top + size->bottom)/size->length +
+	    LONG_EDGE_LENGTH_MATCH_LIMIT / 100;
+	  short_edge_mismatch =
+	    fabs(cups->MediaSize[0] - size->right + size->left)/size->width +
+	    SHORT_EDGE_LENGTH_MATCH_LIMIT / 100;
+	  if (size->length < size->width)
+	  {
+	    swap = long_edge_mismatch;
+	    long_edge_mismatch = short_edge_mismatch;
+	    short_edge_mismatch = swap;
+	  }
+
+	  if (long_edge_mismatch < LONG_EDGE_LENGTH_MATCH_LIMIT &&
+	      short_edge_mismatch < SHORT_EDGE_LENGTH_MATCH_LIMIT)
+	  {
+	    imageable_area_matched = 1;
+	    /* If two sizes match within the limits, take the one with less
+	       mismatch */
+	    score = (long)(4999.0 -
+			   long_edge_mismatch * short_edge_mismatch * 4999.0 /
+			   LONG_EDGE_LENGTH_MATCH_LIMIT /
+			   SHORT_EDGE_LENGTH_MATCH_LIMIT);
+	    if (score < 0) score = 0;
+	  }
 	}
 
-	if (name_matched && size_matched)
-	  score += PAGESIZE_SCORE_NAME * 10000;
-	else if (margins_matched)
+        if (margins_matched)
 	  score += PAGESIZE_SCORE_SIZE_MARGINS * 10000;
 	else if (size_matched)
 	  score += PAGESIZE_SCORE_SIZE * 10000;
@@ -3549,17 +3572,17 @@ cups_put_params(gx_device     *pdev,	/* I - Device info */
 	    best_size = size;
 	}
 #ifdef CUPS_DEBUG
-	dmprintf1(pdev->memory, "DEBUG2: Checking against PPD page size: %s\n",
+	dmprintf1(pdev->memory, "DEBUG2: Checking against PPD page size (portrait): %s\n",
 		  size->name);
-	dmprintf2(pdev->memory, "DEBUG2:    Width: %8.2f; Height: %8.2f\n",
+	dmprintf2(pdev->memory, "DEBUG2:    Width: %.2f; Height: %.2f\n",
 		  size->width, size->length);
-	dmprintf4(pdev->memory, "DEBUG2:    Margins: Left: %8.2f; Right: %8.2f; Top: %8.2f; Bottom: %8.2f\n",
+	dmprintf4(pdev->memory, "DEBUG2:    Margins: Left: %.2f; Right: %.2f; Top: %.2f; Bottom: %.2f\n",
 		  size->left, size->right, size->top, size->bottom);
-	dmprintf4(pdev->memory, "DEBUG2:    Size mismatch: Long Edge (%8.2f): %8.2f; Short Edge (%8.2f): %8.2f\n",
+	dmprintf4(pdev->memory, "DEBUG2:    Size mismatch: Long Edge (%.3f): %.5f; Short Edge (%.3f): %.5f\n",
 		  LONG_EDGE_LENGTH_MATCH_LIMIT, long_edge_mismatch,
 		  SHORT_EDGE_LENGTH_MATCH_LIMIT, short_edge_mismatch);
-	dmprintf3(pdev->memory, "DEBUG2:    Match: Name: %d; Size: %d; Margins: %d\n",
-		  name_matched, size_matched, margins_matched);
+	dmprintf3(pdev->memory, "DEBUG2:    Match: Size: %d; Margins: %d; Imageable Area: %d\n",
+		  size_matched, margins_matched, imageable_area_matched);
 	dmprintf2(pdev->memory, "DEBUG2:    Score: %ld; Best Score: %ld\n",
 		  score, best_score);
 #endif /* CUPS_DEBUG */
@@ -3575,11 +3598,17 @@ cups_put_params(gx_device     *pdev,	/* I - Device info */
 	dmprintf1(pdev->memory, "DEBUG: size = %s\n", best_size->name);
 #endif /* CUPS_DEBUG */
 
-	gx_device_set_media_size(pdev, best_size->width, best_size->length);
+	mediasize[0] = best_size->width;
+	mediasize[1] = best_size->length;
 
 	cups->landscape = 0;
 
 #ifdef CUPS_RASTER_SYNCv1
+	strncpy(cups->header.cupsPageSizeName, best_size->name,
+		sizeof(cups->header.cupsPageSizeName));
+	cups->header.cupsPageSizeName[sizeof(cups->header.cupsPageSizeName) - 1] =
+	  '\0';
+
 	if (strcasecmp(cups->header.MediaClass, "PwgRaster") != 0)
 	{
 #endif
@@ -3622,21 +3651,16 @@ cups_put_params(gx_device     *pdev,	/* I - Device info */
 	  if (size->length == 0 || size->width == 0) continue;
 
 	  score = 0;
-	  name_matched = 0;
 	  size_matched = 0;
 	  margins_matched = 0;
-
-#ifdef CUPS_RASTER_SYNCv1
-	  /* Match the size requested as default (cupsPageSizeName) */
-	  if ((strlen(cups->header.cupsPageSizeName) != 0) &&
-	      (strcasecmp(cups->header.cupsPageSizeName, size->name) == 0))
-	    name_matched = 1;
-#endif
+	  imageable_area_matched = 0;
 
 	  long_edge_mismatch =
-	    fabs(cups->MediaSize[0] - size->length)/size->length;
+	    fabs(cups->MediaSize[0] - size->length)/size->length +
+	    LONG_EDGE_LENGTH_MATCH_LIMIT / 100;
 	  short_edge_mismatch =
-	    fabs(cups->MediaSize[1] - size->width)/size->width;
+	    fabs(cups->MediaSize[1] - size->width)/size->width +
+	    SHORT_EDGE_LENGTH_MATCH_LIMIT / 100;
 	  if (size->length < size->width)
 	  {
 	    swap = long_edge_mismatch;
@@ -3670,11 +3694,37 @@ cups_put_params(gx_device     *pdev,	/* I - Device info */
 		  (fabs(cups->HWMargins[0] - size->length + size->top) < 1.0 &&
 		   fabs(cups->HWMargins[2] - size->bottom) < 1.0))))
 	      margins_matched = 1;
+	  } else {
+	    /* Compare the dimensions of the imageable area against the
+	       the input page size */
+	    long_edge_mismatch =
+	      fabs(cups->MediaSize[0] - size->top + size->bottom)/size->length +
+	      LONG_EDGE_LENGTH_MATCH_LIMIT / 100;
+	    short_edge_mismatch =
+	      fabs(cups->MediaSize[1] - size->right + size->left)/size->width +
+	      SHORT_EDGE_LENGTH_MATCH_LIMIT / 100;
+	    if (size->length < size->width)
+	    {
+	      swap = long_edge_mismatch;
+	      long_edge_mismatch = short_edge_mismatch;
+	      short_edge_mismatch = swap;
+	    }
+
+	    if (long_edge_mismatch < LONG_EDGE_LENGTH_MATCH_LIMIT &&
+		short_edge_mismatch < SHORT_EDGE_LENGTH_MATCH_LIMIT)
+	    {
+	      imageable_area_matched = 1;
+	      /* If two sizes match within the limits, take the one with less
+		 mismatch */
+	      score = (long)(4999.0 -
+			     long_edge_mismatch * short_edge_mismatch * 4999.0 /
+			     LONG_EDGE_LENGTH_MATCH_LIMIT /
+			     SHORT_EDGE_LENGTH_MATCH_LIMIT);
+	      if (score < 0) score = 0;
+	    }
 	  }
 
-	  if (name_matched && size_matched)
-	    score += PAGESIZE_SCORE_NAME * 10000;
-	  else if (margins_matched)
+	  if (margins_matched)
 	    score += PAGESIZE_SCORE_SIZE_MARGINS * 10000;
 	  else if (size_matched)
 	    score += PAGESIZE_SCORE_SIZE * 10000;
@@ -3686,17 +3736,17 @@ cups_put_params(gx_device     *pdev,	/* I - Device info */
 	      best_size = size;
 	  }
 #ifdef CUPS_DEBUG
-	  dmprintf1(pdev->memory, "DEBUG2: Checking against PPD page size: %s\n",
+	  dmprintf1(pdev->memory, "DEBUG2: Checking against PPD page size (landscape): %s\n",
 		    size->name);
-	  dmprintf2(pdev->memory, "DEBUG2:    Width: %8.2f; Height: %8.2f\n",
+	  dmprintf2(pdev->memory, "DEBUG2:    Width: %.2f; Height: %.2f\n",
 		    size->width, size->length);
-	  dmprintf4(pdev->memory, "DEBUG2:    Margins: Left: %8.2f; Right: %8.2f; Top: %8.2f; Bottom: %8.2f\n",
+	  dmprintf4(pdev->memory, "DEBUG2:    Margins: Left: %.2f; Right: %.2f; Top: %.2f; Bottom: %.2f\n",
 		    size->left, size->right, size->top, size->bottom);
-	  dmprintf4(pdev->memory, "DEBUG2:    Size mismatch: Long Edge (%8.2f): %8.2f; Short Edge (%8.2f): %8.2f\n",
+	  dmprintf4(pdev->memory, "DEBUG2:    Size mismatch: Long Edge (%.3f): %.5f; Short Edge (%.3f): %.5f\n",
 		    LONG_EDGE_LENGTH_MATCH_LIMIT, long_edge_mismatch,
 		    SHORT_EDGE_LENGTH_MATCH_LIMIT, short_edge_mismatch);
-	  dmprintf3(pdev->memory, "DEBUG2:    Match: Name: %d; Size: %d; Margins: %d\n",
-		    name_matched, size_matched, margins_matched);
+	  dmprintf3(pdev->memory, "DEBUG2:    Match: Size: %d; Margins: %d; Imageable Area: %d\n",
+		    size_matched, margins_matched, imageable_area_matched);
 	  dmprintf2(pdev->memory, "DEBUG2:    Score: %ld; Best Score: %ld\n",
 		    score, best_score);
 #endif /* CUPS_DEBUG */
@@ -3712,11 +3762,17 @@ cups_put_params(gx_device     *pdev,	/* I - Device info */
 	  dmprintf1(pdev->memory, "DEBUG: landscape size = %s\n", best_size->name);
 #endif /* CUPS_DEBUG */
 
-	  gx_device_set_media_size(pdev, best_size->length, best_size->width);
+	  mediasize[0] = best_size->length;
+	  mediasize[1] = best_size->width;
 
           cups->landscape = 1;
 
 #ifdef CUPS_RASTER_SYNCv1
+	  strncpy(cups->header.cupsPageSizeName, best_size->name,
+		  sizeof(cups->header.cupsPageSizeName));
+	  cups->header.cupsPageSizeName[sizeof(cups->header.cupsPageSizeName) - 1] =
+	    '\0';
+
 	  if (strcasecmp(cups->header.MediaClass, "PwgRaster") != 0)
 	  {
 #endif
@@ -3753,6 +3809,13 @@ cups_put_params(gx_device     *pdev,	/* I - Device info */
           dmprintf(pdev->memory, "DEBUG: size = Custom\n");
 #endif /* CUPS_DEBUG */
 
+#ifdef CUPS_RASTER_SYNCv1
+	  snprintf(cups->header.cupsPageSizeName,
+		   sizeof(cups->header.cupsPageSizeName),
+		   "Custom.%.2fx%.2f",
+		   cups->MediaSize[0], cups->MediaSize[1]);
+#endif
+
 	  /* Rotate page if it only fits into the printer's dimensions
 	     when rotated */
 	  if (((cups->MediaSize[0] > cups->PPD->custom_max[0]) ||
@@ -3760,8 +3823,8 @@ cups_put_params(gx_device     *pdev,	/* I - Device info */
 	      ((cups->MediaSize[0] <= cups->PPD->custom_max[1]) &&
 	      (cups->MediaSize[1] <= cups->PPD->custom_max[0]))) {
 	    /* Rotate */
-	    gx_device_set_media_size(pdev, cups->MediaSize[1],
-				     cups->MediaSize[0]);
+	    mediasize[0] = cups->MediaSize[1];
+	    mediasize[1] = cups->MediaSize[0];
 
 	    cups->landscape = 1;
 
@@ -3795,6 +3858,9 @@ cups_put_params(gx_device     *pdev,	/* I - Device info */
 	  else
 	  {
 	    /* Do not rotate */
+	    mediasize[0] = cups->MediaSize[0];
+	    mediasize[1] = cups->MediaSize[1];
+
 	    cups->landscape = 0;
 
 #ifdef CUPS_RASTER_SYNCv1
@@ -3832,6 +3898,9 @@ cups_put_params(gx_device     *pdev,	/* I - Device info */
     }
     else
     {
+      /* No PPD file available */
+      mediasize[0] = cups->MediaSize[0];
+      mediasize[1] = cups->MediaSize[1];
 #ifdef CUPS_RASTER_SYNCv1
       if (strcasecmp(cups->header.MediaClass, "PwgRaster") != 0)
       {
@@ -3857,10 +3926,28 @@ cups_put_params(gx_device     *pdev,	/* I - Device info */
     }
 
    /*
-    * Set the margins to update the bitmap size...
+    * Set the media size and margins to update the bitmap size...
     */
 
+    for (i = 0; i < 2; i ++)
+      cups_mediasize[i] = mediasize[i];
+    for (i = 0; i < 4; i ++)
+      cups_margins[i] = margins[i] * 72.0;
+    if (score > 0 && score < 5000) {
+      /* Page size matched by imageable area */
+      for (i = 0; i < 2; i ++)
+	mediasize[i] = cups->MediaSize[i];
+      for (i = 0; i < 4; i ++)
+	margins[i] = 0.0;
+    }
+    gx_device_set_media_size(pdev, mediasize[0], mediasize[1]);
     gx_device_set_margins(pdev, margins, false);
+  } else {
+    /* No size change, use the current size in CUPS Raster header */
+    for (i = 0; i < 2; i ++)
+      cups_mediasize[i] = pdev->MediaSize[i];
+    for (i = 0; i < 4; i ++)
+      cups_margins[i] = pdev->HWMargins[i];
   }
 
  /*
@@ -3960,29 +4047,29 @@ cups_put_params(gx_device     *pdev,	/* I - Device info */
 
   if (cups->landscape)
   {
-    cups->header.cupsPageSize[0] = pdev->MediaSize[1];
-    cups->header.cupsPageSize[1] = pdev->MediaSize[0];
+    cups->header.cupsPageSize[0] = cups_mediasize[1];
+    cups->header.cupsPageSize[1] = cups_mediasize[0];
 
     if ((sf = cups->header.cupsBorderlessScalingFactor) < 1.0)
       sf = 1.0;
 
-    cups->header.PageSize[0] = (pdev->MediaSize[1] * sf) + 0.5;
-    cups->header.PageSize[1] = (pdev->MediaSize[0] * sf) + 0.5;
+    cups->header.PageSize[0] = (cups_mediasize[1] * sf) + 0.5;
+    cups->header.PageSize[1] = (cups_mediasize[0] * sf) + 0.5;
 
     if (strcasecmp(cups->header.MediaClass, "PwgRaster") != 0)
     {
-      cups->header.Margins[0] = (pdev->HWMargins[1] * sf) + 0.5;
-      cups->header.Margins[1] = (pdev->HWMargins[2] * sf) + 0.5;
-      cups->header.ImagingBoundingBox[0] = (pdev->HWMargins[1] * sf) + 0.5;
-      cups->header.ImagingBoundingBox[1] = (pdev->HWMargins[2] * sf) + 0.5;
-      cups->header.ImagingBoundingBox[2] = ((pdev->MediaSize[1] -
-					     pdev->HWMargins[3]) * sf) + 0.5;
-      cups->header.ImagingBoundingBox[3] = ((pdev->MediaSize[0] -
-					     pdev->HWMargins[0]) * sf) + 0.5;
-      cups->header.cupsImagingBBox[0] = pdev->HWMargins[1];
-      cups->header.cupsImagingBBox[1] = pdev->HWMargins[2];
-      cups->header.cupsImagingBBox[2] = pdev->MediaSize[1] - pdev->HWMargins[3];
-      cups->header.cupsImagingBBox[3] = pdev->MediaSize[0] - pdev->HWMargins[0];
+      cups->header.Margins[0] = (cups_margins[1] * sf) + 0.5;
+      cups->header.Margins[1] = (cups_margins[2] * sf) + 0.5;
+      cups->header.ImagingBoundingBox[0] = (cups_margins[1] * sf) + 0.5;
+      cups->header.ImagingBoundingBox[1] = (cups_margins[2] * sf) + 0.5;
+      cups->header.ImagingBoundingBox[2] = ((cups_mediasize[1] -
+					     cups_margins[3]) * sf) + 0.5;
+      cups->header.ImagingBoundingBox[3] = ((cups_mediasize[0] -
+					     cups_margins[0]) * sf) + 0.5;
+      cups->header.cupsImagingBBox[0] = cups_margins[1];
+      cups->header.cupsImagingBBox[1] = cups_margins[2];
+      cups->header.cupsImagingBBox[2] = cups_mediasize[1] - cups_margins[3];
+      cups->header.cupsImagingBBox[3] = cups_mediasize[0] - cups_margins[0];
     }
     else
     {
@@ -3997,29 +4084,29 @@ cups_put_params(gx_device     *pdev,	/* I - Device info */
   }
   else
   {
-    cups->header.cupsPageSize[0] = pdev->MediaSize[0];
-    cups->header.cupsPageSize[1] = pdev->MediaSize[1];
+    cups->header.cupsPageSize[0] = cups_mediasize[0];
+    cups->header.cupsPageSize[1] = cups_mediasize[1];
 
     if ((sf = cups->header.cupsBorderlessScalingFactor) < 1.0)
       sf = 1.0;
 
-    cups->header.PageSize[0] = (pdev->MediaSize[0] * sf) + 0.5;
-    cups->header.PageSize[1] = (pdev->MediaSize[1] * sf) + 0.5;
+    cups->header.PageSize[0] = (cups_mediasize[0] * sf) + 0.5;
+    cups->header.PageSize[1] = (cups_mediasize[1] * sf) + 0.5;
 
     if (strcasecmp(cups->header.MediaClass, "PwgRaster") != 0)
     {
-      cups->header.Margins[0] = (pdev->HWMargins[0] * sf) + 0.5;
-      cups->header.Margins[1] = (pdev->HWMargins[1] * sf) + 0.5;
-      cups->header.ImagingBoundingBox[0] = (pdev->HWMargins[0] * sf) + 0.5;
-      cups->header.ImagingBoundingBox[1] = (pdev->HWMargins[1] * sf) + 0.5;
-      cups->header.ImagingBoundingBox[2] = ((pdev->MediaSize[0] -
-					     pdev->HWMargins[2]) * sf) + 0.5;
-      cups->header.ImagingBoundingBox[3] = ((pdev->MediaSize[1] -
-					     pdev->HWMargins[3]) * sf) + 0.5;
-      cups->header.cupsImagingBBox[0] = pdev->HWMargins[0];
-      cups->header.cupsImagingBBox[1] = pdev->HWMargins[1];
-      cups->header.cupsImagingBBox[2] = pdev->MediaSize[0] - pdev->HWMargins[2];
-      cups->header.cupsImagingBBox[3] = pdev->MediaSize[1] - pdev->HWMargins[3];
+      cups->header.Margins[0] = (cups_margins[0] * sf) + 0.5;
+      cups->header.Margins[1] = (cups_margins[1] * sf) + 0.5;
+      cups->header.ImagingBoundingBox[0] = (cups_margins[0] * sf) + 0.5;
+      cups->header.ImagingBoundingBox[1] = (cups_margins[1] * sf) + 0.5;
+      cups->header.ImagingBoundingBox[2] = ((cups_mediasize[0] -
+					     cups_margins[2]) * sf) + 0.5;
+      cups->header.ImagingBoundingBox[3] = ((cups_mediasize[1] -
+					     cups_margins[3]) * sf) + 0.5;
+      cups->header.cupsImagingBBox[0] = cups_margins[0];
+      cups->header.cupsImagingBBox[1] = cups_margins[1];
+      cups->header.cupsImagingBBox[2] = cups_mediasize[0] - cups_margins[2];
+      cups->header.cupsImagingBBox[3] = cups_mediasize[1] - cups_margins[3];
     }
     else
     {
@@ -4037,19 +4124,19 @@ cups_put_params(gx_device     *pdev,	/* I - Device info */
 
   if (cups->landscape)
   {
-    cups->header.PageSize[0] = pdev->MediaSize[1] + 0.5;
-    cups->header.PageSize[1] = pdev->MediaSize[0] + 0.5;
+    cups->header.PageSize[0] = cups_mediasize[1] + 0.5;
+    cups->header.PageSize[1] = cups_mediasize[0] + 0.5;
 
     if (strcasecmp(cups->header.MediaClass, "PwgRaster") != 0)
     {
-      cups->header.Margins[0] = (pdev->HWMargins[1]) + 0.5;
-      cups->header.Margins[1] = (pdev->HWMargins[2]) + 0.5;
-      cups->header.ImagingBoundingBox[0] = (pdev->HWMargins[1]) + 0.5;
-      cups->header.ImagingBoundingBox[1] = (pdev->HWMargins[0]) + 0.5;
-      cups->header.ImagingBoundingBox[2] = (pdev->MediaSize[1] -
-					    pdev->HWMargins[3]) + 0.5;
-      cups->header.ImagingBoundingBox[3] = (pdev->MediaSize[0] -
-					    pdev->HWMargins[2]) + 0.5;
+      cups->header.Margins[0] = (cups_margins[1]) + 0.5;
+      cups->header.Margins[1] = (cups_margins[2]) + 0.5;
+      cups->header.ImagingBoundingBox[0] = (cups_margins[1]) + 0.5;
+      cups->header.ImagingBoundingBox[1] = (cups_margins[0]) + 0.5;
+      cups->header.ImagingBoundingBox[2] = (cups_mediasize[1] -
+					    cups_margins[3]) + 0.5;
+      cups->header.ImagingBoundingBox[3] = (cups_mediasize[0] -
+					    cups_margins[2]) + 0.5;
     }
     else
     {
@@ -4061,19 +4148,19 @@ cups_put_params(gx_device     *pdev,	/* I - Device info */
   }
   else
   {
-    cups->header.PageSize[0] = pdev->MediaSize[0] + 0.5;
-    cups->header.PageSize[1] = pdev->MediaSize[1] + 0.5;
+    cups->header.PageSize[0] = cups_mediasize[0] + 0.5;
+    cups->header.PageSize[1] = cups_mediasize[1] + 0.5;
 
     if (strcasecmp(cups->header.MediaClass, "PwgRaster") != 0)
     {
-      cups->header.Margins[0] = (pdev->HWMargins[0]) + 0.5;
-      cups->header.Margins[1] = (pdev->HWMargins[1]) + 0.5;
-      cups->header.ImagingBoundingBox[0] = (pdev->HWMargins[0]) + 0.5;
-      cups->header.ImagingBoundingBox[1] = (pdev->HWMargins[3]) + 0.5;
-      cups->header.ImagingBoundingBox[2] = (pdev->MediaSize[0] -
-					    pdev->HWMargins[2]) + 0.5;
-      cups->header.ImagingBoundingBox[3] = (pdev->MediaSize[1] -
-					    pdev->HWMargins[1]) + 0.5;
+      cups->header.Margins[0] = (cups_margins[0]) + 0.5;
+      cups->header.Margins[1] = (cups_margins[1]) + 0.5;
+      cups->header.ImagingBoundingBox[0] = (cups_margins[0]) + 0.5;
+      cups->header.ImagingBoundingBox[1] = (cups_margins[3]) + 0.5;
+      cups->header.ImagingBoundingBox[2] = (cups_mediasize[0] -
+					    cups_margins[2]) + 0.5;
+      cups->header.ImagingBoundingBox[3] = (cups_mediasize[1] -
+					    cups_margins[1]) + 0.5;
     }
     else
     {
@@ -4089,12 +4176,19 @@ cups_put_params(gx_device     *pdev,	/* I - Device info */
   cups->header.cupsHeight = cups->height;
 
 #ifdef CUPS_DEBUG
+  if (size_set) {
+    dmprintf2(pdev->memory, "DEBUG2: mediasize = [ %.3f %.3f ]\n",
+              mediasize[0], mediasize[1]);
+    dmprintf4(pdev->memory, "DEBUG2: margins = [ %.3f %.3f %.3f %.3f ]\n",
+              margins[0], margins[1], margins[2], margins[3]);
+  }
+  dmprintf2(pdev->memory, "DEBUG2: cups_mediasize = [ %.3f %.3f ]\n",
+	    cups_mediasize[0], cups_mediasize[1]);
+  dmprintf4(pdev->memory, "DEBUG2: cups_margins = [ %.3f %.3f %.3f %.3f ]\n",
+	    cups_margins[0], cups_margins[1], cups_margins[2], cups_margins[3]);
   dmprintf1(pdev->memory, "DEBUG2: ppd = %p\n", cups->PPD);
   dmprintf2(pdev->memory, "DEBUG2: PageSize = [ %.3f %.3f ]\n",
             pdev->MediaSize[0], pdev->MediaSize[1]);
-  if (size_set)
-    dmprintf4(pdev->memory, "DEBUG2: margins = [ %.3f %.3f %.3f %.3f ]\n",
-              margins[0], margins[1], margins[2], margins[3]);
   dmprintf2(pdev->memory, "DEBUG2: HWResolution = [ %.3f %.3f ]\n",
             pdev->HWResolution[0], pdev->HWResolution[1]);
   dmprintf2(pdev->memory, "DEBUG2: width = %d, height = %d\n",
@@ -4102,6 +4196,24 @@ cups_put_params(gx_device     *pdev,	/* I - Device info */
   dmprintf4(pdev->memory, "DEBUG2: HWMargins = [ %.3f %.3f %.3f %.3f ]\n",
             pdev->HWMargins[0], pdev->HWMargins[1],
             pdev->HWMargins[2], pdev->HWMargins[3]);
+  dmprintf2(pdev->memory, "DEBUG2: cups->header.cupsWidth = %d, cups->header.cupsHeight = %d\n",
+            cups->header.cupsWidth, cups->header.cupsHeight);
+  dmprintf2(pdev->memory, "DEBUG2: cups->header.PageSize[0] = %d, cups->header.PageSize[1] = %d\n",
+            cups->header.PageSize[0], cups->header.PageSize[1]);
+  dmprintf4(pdev->memory, "DEBUG2: cups->header.ImagingBoundingBox = [ %d %d %d %d ]\n",
+            cups->header.ImagingBoundingBox[0],
+	    cups->header.ImagingBoundingBox[1],
+            cups->header.ImagingBoundingBox[2],
+	    cups->header.ImagingBoundingBox[3]);
+#ifdef CUPS_RASTER_SYNCv1
+  dmprintf2(pdev->memory, "DEBUG2: cups->header.cupsPageSize[0] = %.3f, cups->header.cupsPageSize[1] = %.3f\n",
+            cups->header.cupsPageSize[0], cups->header.cupsPageSize[1]);
+  dmprintf4(pdev->memory, "DEBUG2: cups->header.cupsImagingBBox = [ %.3f %.3f %.3f %.3f ]\n",
+            cups->header.cupsImagingBBox[0], cups->header.cupsImagingBBox[1],
+            cups->header.cupsImagingBBox[2], cups->header.cupsImagingBBox[3]);
+  dmprintf1(pdev->memory, "DEBUG2: cups->header.cupsBorderlessScalingFactor = %.3f\n",
+            cups->header.cupsBorderlessScalingFactor);
+#endif /* CUPS_RASTER_SYNCv1 */
 #endif /* CUPS_DEBUG */
 
 done:


Summary of changes:
 cups/gdevcups.c | 318 ++++++++++++++++++++++++++++++++++++++------------------
 1 file changed, 215 insertions(+), 103 deletions(-)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.