Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37772558
en ru br
Репозитории ALT
S:10.01.1-alt1
5.1: 9.01-alt0.M50P.1
4.1: 8.63-alt0.M41.4
4.0: 8.15.4-alt1.M40.4
+updates:8.15.4-alt1.M40.4
3.0: 7.07.1-alt7
www.altlinux.org/Changes

Группа :: Издательство
Пакет: ghostscript

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: Ubuntu-020220925~387f094.patch
Скачать


--- a/cups/gdevcups.c
+++ b/cups/gdevcups.c
@@ -3509,28 +3509,6 @@
 	yflip = 0;
       }
 
-#ifdef CUPS_RASTER_SYNCv1
-     /*
-      * Chack whether cupsPageSizeName has a valid value
-      */
-
-      if (strlen(cups->header.cupsPageSizeName) != 0) {
-	found = 0;
-	for (i = cups->PPD->num_sizes, size = cups->PPD->sizes;
-	     i > 0;
-	     i --, size ++)
-	  if (strcasecmp(cups->header.cupsPageSizeName, size->name) == 0) {
-	    found = 1;
-	    break;
-	  }
-	if (found == 0) cups->header.cupsPageSizeName[0] = '\0';
-      }
-#ifdef CUPS_DEBUG
-      dmprintf1(pdev->memory, "DEBUG2: cups->header.cupsPageSizeName = %s\n",
-                cups->header.cupsPageSizeName);
-#endif /* CUPS_DEBUG */
-#endif /* CUPS_RASTER_SYNCv1 */
-
      /*
       * Find the matching page size...
       */
@@ -3542,189 +3520,38 @@
 
       best_score = -1;
       best_size = NULL;
-      for (i = cups->PPD->num_sizes, size = cups->PPD->sizes;
-	   i > 0;
-	   i --, size ++)
-      {
-	if (size->length == 0 || size->width == 0) continue;
-
-	score = 0;
-	size_matched = 0;
-	margins_matched = 0;
-	imageable_area_matched = 0;
-#ifdef CUPS_DEBUG
-	name_requested_matched = 0;
-#endif
-
-	long_edge_mismatch =
-	  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 +
-	  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)
-	{
-	  size_matched = 1;
-	  /* If two sizes match within the limits, take the one with less
-	     mismatch */
-	  score = (long)(9999.0 -
-			 long_edge_mismatch * short_edge_mismatch * 9999.0 /
-			 LONG_EDGE_LENGTH_MATCH_LIMIT /
-			 SHORT_EDGE_LENGTH_MATCH_LIMIT);
-	  if (score < 0) score = 0;
-	  /* We check whether all 4 margins match with the margin info
-	     of the page size in the PPD. Here we check also for swapped
-	     left/right and top/bottom margins as the cups->HWMargins
-	     info can be from the previous page and there the margins
-	     can be swapped due to duplex printing requirements */
-	  if (!margins_set ||
-	      (((fabs(cups->HWMargins[0] - size->left) < 1.0 &&
-		 fabs(cups->HWMargins[2] - size->width + size->right) < 1.0) ||
-		(fabs(cups->HWMargins[0] - size->width + size->right) < 1.0 &&
-		 fabs(cups->HWMargins[2] - size->left) < 1.0)) &&
-	       ((fabs(cups->HWMargins[1] - size->bottom) < 1.0 &&
-		 fabs(cups->HWMargins[3] - size->length + size->top) < 1.0) ||
-		(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 (margins_matched)
-	  score += PAGESIZE_SCORE_SIZE_MARGINS * 10000;
-	else if (size_matched)
-	  score += PAGESIZE_SCORE_SIZE * 10000;
-
-	if (size_matched || imageable_area_matched) {
-	  if (!strcasecmp(cups->pageSizeRequested, size->name))
-          {
-#ifdef CUPS_DEBUG
-	    name_requested_matched = 1;
-#endif
-          }
-	  else
-	    score -= 1000;
-	}
-
-	if (score > best_score)
-	{
-	  best_score = score;
-	  if (score > 0)
-	    best_size = size;
-	}
-#ifdef CUPS_DEBUG
-	dmprintf1(pdev->memory, "DEBUG2: Checking against PPD page size (portrait): %s\n",
-		  size->name);
-	dmprintf2(pdev->memory, "DEBUG2:    Width: %.2f; Height: %.2f\n",
-		  size->width, size->length);
-	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 (%.3f): %.5f; Short Edge (%.3f): %.5f\n",
-		  LONG_EDGE_LENGTH_MATCH_LIMIT, long_edge_mismatch,
-		  SHORT_EDGE_LENGTH_MATCH_LIMIT, short_edge_mismatch);
-	dmprintf4(pdev->memory, "DEBUG2:    Match: Size: %d; Margins: %d; Imageable Area: %d; Name requested: %d\n",
-		  size_matched, margins_matched, imageable_area_matched,
-		  name_requested_matched);
-	dmprintf2(pdev->memory, "DEBUG2:    Score: %ld; Best Score: %ld\n",
-		  score, best_score);
-#endif /* CUPS_DEBUG */
-      }
-
-      if (best_size)
+      /* Match against the PPD's page size only if the page size name does
+	 not suggest that we use a custom page size */
+      if (strncasecmp(cups->header.cupsPageSizeName, "Custom", 6) != 0 ||
+	  (cups->header.cupsPageSizeName[6] != '\0' &&
+	   cups->header.cupsPageSizeName[6] != '.'))
       {
+#ifdef CUPS_RASTER_SYNCv1
        /*
-	* Standard size...
+	* Chack whether cupsPageSizeName has a valid value
 	*/
 
+	if (strlen(cups->header.cupsPageSizeName) != 0) {
+	  found = 0;
+	  for (i = cups->PPD->num_sizes, size = cups->PPD->sizes;
+	       i > 0;
+	       i --, size ++)
+	    if (strcasecmp(cups->header.cupsPageSizeName, size->name) == 0) {
+	      found = 1;
+	      break;
+	    }
+	  if (found == 0) cups->header.cupsPageSizeName[0] = '\0';
+	}
 #ifdef CUPS_DEBUG
-	dmprintf1(pdev->memory, "DEBUG: size = %s\n", best_size->name);
+	dmprintf1(pdev->memory, "DEBUG2: cups->header.cupsPageSizeName = %s\n",
+		  cups->header.cupsPageSizeName);
 #endif /* CUPS_DEBUG */
+#endif /* CUPS_RASTER_SYNCv1 */
 
-	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
-	  margins[0] = best_size->left / 72.0;
-	  margins[1] = best_size->bottom / 72.0;
-	  margins[2] = (best_size->width - best_size->right) / 72.0;
-	  margins[3] = (best_size->length - best_size->top) / 72.0;
-	  if (xflip == 1)
-	  {
-	    swap = margins[0]; margins[0] = margins[2]; margins[2] = swap;
-	  }
-	  if (yflip == 1)
-	  {
-	    swap = margins[1]; margins[1] = margins[3]; margins[3] = swap;
-	  }
-#ifdef CUPS_RASTER_SYNCv1
-	}
-	else
-	{
-	  margins[0] = 0.0;
-	  margins[1] = 0.0;
-	  margins[2] = 0.0;
-	  margins[3] = 0.0;
-	}
-#endif
-      }
-      else
-      {
-       /*
-	* No matching portrait size; look for a matching size in
-	* landscape orientation...
-	*/
-
-	best_score = -1;
-	best_size = NULL;
 	for (i = cups->PPD->num_sizes, size = cups->PPD->sizes;
 	     i > 0;
 	     i --, size ++)
-	{
+        {
 	  if (size->length == 0 || size->width == 0) continue;
 
 	  score = 0;
@@ -3736,10 +3563,10 @@
 #endif
 
 	  long_edge_mismatch =
-	    fabs(cups->MediaSize[0] - size->length)/size->length +
+	    fabs(cups->MediaSize[1] - size->length)/size->length +
 	    LONG_EDGE_LENGTH_MATCH_LIMIT / 100;
 	  short_edge_mismatch =
-	    fabs(cups->MediaSize[1] - size->width)/size->width +
+	    fabs(cups->MediaSize[0] - size->width)/size->width +
 	    SHORT_EDGE_LENGTH_MATCH_LIMIT / 100;
 	  if (size->length < size->width)
 	  {
@@ -3765,23 +3592,23 @@
 	       info can be from the previous page and there the margins
 	       can be swapped due to duplex printing requirements */
 	    if (!margins_set ||
-		(((fabs(cups->HWMargins[1] - size->left) < 1.0 &&
-		   fabs(cups->HWMargins[3] - size->width + size->right) < 1.0)||
-		  (fabs(cups->HWMargins[1] - size->width + size->right) < 1.0 &&
-		   fabs(cups->HWMargins[3] - size->left) < 1.0)) &&
-		 ((fabs(cups->HWMargins[0] - size->bottom) < 1.0 &&
-		   fabs(cups->HWMargins[2] - size->length + size->top) < 1.0) ||
-		  (fabs(cups->HWMargins[0] - size->length + size->top) < 1.0 &&
-		   fabs(cups->HWMargins[2] - size->bottom) < 1.0))))
+		(((fabs(cups->HWMargins[0] - size->left) < 1.0 &&
+		   fabs(cups->HWMargins[2] - size->width + size->right) < 1.0) ||
+		  (fabs(cups->HWMargins[0] - size->width + size->right) < 1.0 &&
+		   fabs(cups->HWMargins[2] - size->left) < 1.0)) &&
+		 ((fabs(cups->HWMargins[1] - size->bottom) < 1.0 &&
+		   fabs(cups->HWMargins[3] - size->length + size->top) < 1.0) ||
+		  (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[0] - size->top + size->bottom)/size->length +
+	      fabs(cups->MediaSize[1] - 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 +
+	      fabs(cups->MediaSize[0] - size->right + size->left)/size->width +
 	      SHORT_EDGE_LENGTH_MATCH_LIMIT / 100;
 	    if (size->length < size->width)
 	    {
@@ -3811,11 +3638,11 @@
 
 	  if (size_matched || imageable_area_matched) {
 	    if (!strcasecmp(cups->pageSizeRequested, size->name))
-            {
+	    {
 #ifdef CUPS_DEBUG
 	      name_requested_matched = 1;
 #endif
-            }
+	    }
 	    else
 	      score -= 1000;
 	  }
@@ -3827,7 +3654,7 @@
 	      best_size = size;
 	  }
 #ifdef CUPS_DEBUG
-	  dmprintf1(pdev->memory, "DEBUG2: Checking against PPD page size (landscape): %s\n",
+	  dmprintf1(pdev->memory, "DEBUG2: Checking against PPD page size (portrait): %s\n",
 		    size->name);
 	  dmprintf2(pdev->memory, "DEBUG2:    Width: %.2f; Height: %.2f\n",
 		    size->width, size->length);
@@ -3847,17 +3674,17 @@
 	if (best_size)
 	{
 	 /*
-	  * Standard size in landscape orientation...
+	  * Standard size...
 	  */
 
 #ifdef CUPS_DEBUG
-	  dmprintf1(pdev->memory, "DEBUG: landscape size = %s\n", best_size->name);
+	  dmprintf1(pdev->memory, "DEBUG: size = %s\n", best_size->name);
 #endif /* CUPS_DEBUG */
 
-	  mediasize[0] = best_size->length;
-	  mediasize[1] = best_size->width;
+	  mediasize[0] = best_size->width;
+	  mediasize[1] = best_size->length;
 
-          cups->landscape = 1;
+	  cups->landscape = 0;
 
 #ifdef CUPS_RASTER_SYNCv1
 	  strncpy(cups->header.cupsPageSizeName, best_size->name,
@@ -3868,17 +3695,17 @@
 	  if (strcasecmp(cups->header.MediaClass, "PwgRaster") != 0)
 	  {
 #endif
-	    margins[0] = (best_size->length - best_size->top) / 72.0;
-	    margins[1] = best_size->left / 72.0;
-	    margins[2] = best_size->bottom / 72.0;
-	    margins[3] = (best_size->width - best_size->right) / 72.0;
+	    margins[0] = best_size->left / 72.0;
+	    margins[1] = best_size->bottom / 72.0;
+	    margins[2] = (best_size->width - best_size->right) / 72.0;
+	    margins[3] = (best_size->length - best_size->top) / 72.0;
 	    if (xflip == 1)
 	    {
-	      swap = margins[1]; margins[1] = margins[3]; margins[3] = swap;
+	      swap = margins[0]; margins[0] = margins[2]; margins[2] = swap;
 	    }
 	    if (yflip == 1)
 	    {
-	      swap = margins[0]; margins[0] = margins[2]; margins[2] = swap;
+	      swap = margins[1]; margins[1] = margins[3]; margins[3] = swap;
 	    }
 #ifdef CUPS_RASTER_SYNCv1
 	  }
@@ -3894,40 +3721,163 @@
 	else
 	{
 	 /*
-	  * Custom size...
+	  * No matching portrait size; look for a matching size in
+	  * landscape orientation...
 	  */
 
+	  best_score = -1;
+	  best_size = NULL;
+	  for (i = cups->PPD->num_sizes, size = cups->PPD->sizes;
+	       i > 0;
+	       i --, size ++)
+	  {
+	    if (size->length == 0 || size->width == 0) continue;
+
+	    score = 0;
+	    size_matched = 0;
+	    margins_matched = 0;
+	    imageable_area_matched = 0;
 #ifdef CUPS_DEBUG
-          dmprintf(pdev->memory, "DEBUG: size = Custom\n");
-#endif /* CUPS_DEBUG */
+	    name_requested_matched = 0;
+#endif
 
-#ifdef CUPS_RASTER_SYNCv1
-	  snprintf(cups->header.cupsPageSizeName,
-		   sizeof(cups->header.cupsPageSizeName),
-		   "Custom.%.2fx%.2f",
-		   cups->MediaSize[0], cups->MediaSize[1]);
+	    long_edge_mismatch =
+	      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 +
+	      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)
+	    {
+	      size_matched = 1;
+	      /* If two sizes match within the limits, take the one with less
+		 mismatch */
+	      score = (long)(9999.0 -
+			     long_edge_mismatch * short_edge_mismatch * 9999.0 /
+			     LONG_EDGE_LENGTH_MATCH_LIMIT /
+			     SHORT_EDGE_LENGTH_MATCH_LIMIT);
+	      if (score < 0) score = 0;
+	      /* We check whether all 4 margins match with the margin info
+		 of the page size in the PPD. Here we check also for swapped
+		 left/right and top/bottom margins as the cups->HWMargins
+		 info can be from the previous page and there the margins
+		 can be swapped due to duplex printing requirements */
+	      if (!margins_set ||
+		  (((fabs(cups->HWMargins[1] - size->left) < 1.0 &&
+		     fabs(cups->HWMargins[3] - size->width + size->right) < 1.0)||
+		    (fabs(cups->HWMargins[1] - size->width + size->right) < 1.0 &&
+		     fabs(cups->HWMargins[3] - size->left) < 1.0)) &&
+		   ((fabs(cups->HWMargins[0] - size->bottom) < 1.0 &&
+		     fabs(cups->HWMargins[2] - size->length + size->top) < 1.0) ||
+		    (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 (margins_matched)
+	      score += PAGESIZE_SCORE_SIZE_MARGINS * 10000;
+	    else if (size_matched)
+	      score += PAGESIZE_SCORE_SIZE * 10000;
+
+	    if (size_matched || imageable_area_matched) {
+	      if (!strcasecmp(cups->pageSizeRequested, size->name))
+	      {
+#ifdef CUPS_DEBUG
+		name_requested_matched = 1;
 #endif
+	      }
+	      else
+		score -= 1000;
+	    }
 
-	  /* Rotate page if it only fits into the printer's dimensions
-	     when rotated */
-	  if (((cups->MediaSize[0] > cups->PPD->custom_max[0]) ||
-	       (cups->MediaSize[1] > cups->PPD->custom_max[1])) &&
-	      ((cups->MediaSize[0] <= cups->PPD->custom_max[1]) &&
-	      (cups->MediaSize[1] <= cups->PPD->custom_max[0]))) {
-	    /* Rotate */
-	    mediasize[0] = cups->MediaSize[1];
-	    mediasize[1] = cups->MediaSize[0];
+	    if (score > best_score)
+	    {
+	      best_score = score;
+	      if (score > 0)
+		best_size = size;
+	    }
+#ifdef CUPS_DEBUG
+	    dmprintf1(pdev->memory, "DEBUG2: Checking against PPD page size (landscape): %s\n",
+		      size->name);
+	    dmprintf2(pdev->memory, "DEBUG2:    Width: %.2f; Height: %.2f\n",
+		      size->width, size->length);
+	    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 (%.3f): %.5f; Short Edge (%.3f): %.5f\n",
+		      LONG_EDGE_LENGTH_MATCH_LIMIT, long_edge_mismatch,
+		      SHORT_EDGE_LENGTH_MATCH_LIMIT, short_edge_mismatch);
+	    dmprintf4(pdev->memory, "DEBUG2:    Match: Size: %d; Margins: %d; Imageable Area: %d; Name requested: %d\n",
+		      size_matched, margins_matched, imageable_area_matched,
+		      name_requested_matched);
+	    dmprintf2(pdev->memory, "DEBUG2:    Score: %ld; Best Score: %ld\n",
+		      score, best_score);
+#endif /* CUPS_DEBUG */
+	  }
+
+	  if (best_size)
+	  {
+	   /*
+	    * Standard size in landscape orientation...
+	    */
+
+#ifdef CUPS_DEBUG
+	    dmprintf1(pdev->memory, "DEBUG: landscape size = %s\n", best_size->name);
+#endif /* CUPS_DEBUG */
+
+	    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
-	      margins[0] = cups->PPD->custom_margins[3] / 72.0;
-	      margins[1] = cups->PPD->custom_margins[0] / 72.0;
-	      margins[2] = cups->PPD->custom_margins[1] / 72.0;
-	      margins[3] = cups->PPD->custom_margins[2] / 72.0;
+	      margins[0] = (best_size->length - best_size->top) / 72.0;
+	      margins[1] = best_size->left / 72.0;
+	      margins[2] = best_size->bottom / 72.0;
+	      margins[3] = (best_size->width - best_size->right) / 72.0;
 	      if (xflip == 1)
 	      {
 		swap = margins[1]; margins[1] = margins[3]; margins[3] = swap;
@@ -3947,39 +3897,97 @@
 	    }
 #endif
 	  }
-	  else
-	  {
-	    /* Do not rotate */
-	    mediasize[0] = cups->MediaSize[0];
-	    mediasize[1] = cups->MediaSize[1];
+	}
+      }
 
-	    cups->landscape = 0;
+      if (!best_size)
+      {
+       /*
+	* Custom size...
+	*/
+
+#ifdef CUPS_DEBUG
+	dmprintf(pdev->memory, "DEBUG: size = Custom\n");
+#endif /* CUPS_DEBUG */
 
 #ifdef CUPS_RASTER_SYNCv1
-	    if (strcasecmp(cups->header.MediaClass, "PwgRaster") != 0)
+	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]) ||
+	     (cups->MediaSize[1] > cups->PPD->custom_max[1])) &&
+	    ((cups->MediaSize[0] <= cups->PPD->custom_max[1]) &&
+	     (cups->MediaSize[1] <= cups->PPD->custom_max[0]))) {
+	  /* Rotate */
+	  mediasize[0] = cups->MediaSize[1];
+	  mediasize[1] = cups->MediaSize[0];
+
+	  cups->landscape = 1;
+
+#ifdef CUPS_RASTER_SYNCv1
+	  if (strcasecmp(cups->header.MediaClass, "PwgRaster") != 0)
+	  {
+#endif
+	    margins[0] = cups->PPD->custom_margins[3] / 72.0;
+	    margins[1] = cups->PPD->custom_margins[0] / 72.0;
+	    margins[2] = cups->PPD->custom_margins[1] / 72.0;
+	    margins[3] = cups->PPD->custom_margins[2] / 72.0;
+	    if (xflip == 1)
 	    {
+	      swap = margins[1]; margins[1] = margins[3]; margins[3] = swap;
+	    }
+	    if (yflip == 1)
+	    {
+	      swap = margins[0]; margins[0] = margins[2]; margins[2] = swap;
+	    }
+#ifdef CUPS_RASTER_SYNCv1
+	  }
+	  else
+	  {
+	    margins[0] = 0.0;
+	    margins[1] = 0.0;
+	    margins[2] = 0.0;
+	    margins[3] = 0.0;
+	  }
 #endif
-	      for (i = 0; i < 4; i ++)
-		margins[i] = cups->PPD->custom_margins[i] / 72.0;
-	      if (xflip == 1)
-	      {
-		swap = margins[0]; margins[0] = margins[2]; margins[2] = swap;
-	      }
-	      if (yflip == 1)
-	      {
-		swap = margins[1]; margins[1] = margins[3]; margins[3] = swap;
-	      }
+	}
+	else
+	{
+	  /* Do not rotate */
+	  mediasize[0] = cups->MediaSize[0];
+	  mediasize[1] = cups->MediaSize[1];
+
+	  cups->landscape = 0;
+
 #ifdef CUPS_RASTER_SYNCv1
+	  if (strcasecmp(cups->header.MediaClass, "PwgRaster") != 0)
+	  {
+#endif
+	    for (i = 0; i < 4; i ++)
+	      margins[i] = cups->PPD->custom_margins[i] / 72.0;
+	    if (xflip == 1)
+	    {
+	      swap = margins[0]; margins[0] = margins[2]; margins[2] = swap;
 	    }
-	    else
+	    if (yflip == 1)
 	    {
-	      margins[0] = 0.0;
-	      margins[1] = 0.0;
-	      margins[2] = 0.0;
-	      margins[3] = 0.0;
+	      swap = margins[1]; margins[1] = margins[3]; margins[3] = swap;
 	    }
-#endif
+#ifdef CUPS_RASTER_SYNCv1
+	  }
+	  else
+	  {
+	    margins[0] = 0.0;
+	    margins[1] = 0.0;
+	    margins[2] = 0.0;
+	    margins[3] = 0.0;
 	  }
+#endif
 	}
       }
 
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin