]> git.ipfire.org Git - thirdparty/cups-filters.git/commitdiff
libppd: Added ppdRasterMatchPPDSize() to match input page size with ppd
authorVikrant <vikrantmalik051@gmail.com>
Thu, 16 Jul 2020 09:58:25 +0000 (15:28 +0530)
committerVikrant <vikrantmalik051@gmail.com>
Thu, 16 Jul 2020 09:58:37 +0000 (15:28 +0530)
filter/pclmtoraster.cxx
filter/pdftoraster.cxx
ppd/ppd.h
ppd/raster-interpret.c

index 99ecf1f218484cb35b702af6ec2eac36bd144585..5d0af4f49c2b3fd18679f827abbc37073442273b 100644 (file)
@@ -575,157 +575,11 @@ static void selectConvertFunc (std::string colorspace, int pgno) {
 
 }
 
-static void selectPageSize (int pgno) {
-  double       paperdimensions[2], margins[4], swap;
-  int          i = 0, landscape = 0;
-  ppd_size_t   *size;          /* Page size */
-  ppd_size_t   *size_matched = NULL;
-
-  memset(paperdimensions, 0, sizeof(paperdimensions));
-  memset(margins, 0, sizeof(margins));
-  if (ppd) {
-    size_matched = NULL;
-    for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++)
-      /* Skip page sizes which conflict with settings of the other options */
-      /* Find size of document's page under the PPD page sizes */
-      if (fabs(header.PageSize[1] - size->length) / size->length < 0.01 &&
-         fabs(header.PageSize[0] - size->width) / size->width < 0.01 &&
-         (size_matched == NULL || !strcasecmp(pageSizeRequested, size->name)))
-       size_matched = size;
-    if (size_matched == NULL)
-      /* Input page size does not fit any of the PPD's sizes, try to fit
-        the input page size into the imageable areas of the PPD's sizes */
-      for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++)
-       if (fabs(header.PageSize[1] - size->top + size->bottom) / size->length < 0.01 &&
-           fabs(header.PageSize[0] - size->right + size->left) / size->width < 0.01 &&
-           (size_matched == NULL || !strcasecmp(pageSizeRequested, size->name))) {
-         fprintf(stderr, "DEBUG: Imageable area fit\n");
-         size_matched = size;
-       }
-    if (size_matched == NULL)
-      /*
-       * No matching portrait size; look for a matching size in
-       * landscape orientation...
-       */
-      for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++)
-       if (fabs(header.PageSize[0] - size->length) / size->length < 0.01 &&
-           fabs(header.PageSize[1] - size->width) / size->width < 0.01 &&
-           (size_matched == NULL || !strcasecmp(pageSizeRequested, size->name))) {
-         size_matched = size;
-         landscape = 1;
-       }
-    if (size_matched == NULL)
-       /* Input page size does not fit any of the PPD's sizes, try to fit
-          the input page size into the imageable areas of the PPD's sizes */
-      for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++)
-       if (fabs(header.PageSize[0] - size->top + size->bottom) / size->length < 0.01 &&
-           fabs(header.PageSize[1] - size->right + size->left) / size->width < 0.01 &&
-           (size_matched == NULL || !strcasecmp(pageSizeRequested, size->name))) {
-         fprintf(stderr, "DEBUG: Imageable area fit\n");
-         size_matched = size;
-       }
-
-    if (size_matched) {
-      if (landscape) {
-       /*
-        * Standard size in landscape orientation...
-        */
-       size = size_matched;
-       fprintf(stderr, "DEBUG: landscape size = %s\n", size->name);
-       paperdimensions[0] = size->width;
-       paperdimensions[1] = size->length;
-       if (pwgraster == 0) {
-         margins[0] = size->left;
-         margins[1] = size->bottom;
-         margins[2] = size->width - size->right;
-         margins[3] = size->length - size->top;
-       }
-       strncpy(header.cupsPageSizeName, size->name, 64);
-      } else {
-       /*
-        * Standard size...
-        */
-       size = size_matched;
-       fprintf(stderr, "DEBUG: size = %s\n", size->name);
-       paperdimensions[0] = size->width;
-       paperdimensions[1] = size->length;
-       if (pwgraster == 0) {
-         margins[0] = size->left;
-         margins[1] = size->bottom;
-         margins[2] = size->width - size->right;
-         margins[3] = size->length - size->top;
-       }
-       strncpy(header.cupsPageSizeName, size->name, 64);
-      }
-    } else {
-      /*
-       * Custom size...
-       */
-      fprintf(stderr, "DEBUG: size = Custom\n");
-      paperdimensions[1] = size->length;
-      for (i = 0; i < 2; i ++)
-        paperdimensions[i] = header.PageSize[i];
-      if (pwgraster == 0)
-        for (i = 0; i < 4; i ++)
-          margins[i] = ppd->custom_margins[i];
-      snprintf(header.cupsPageSizeName, 64, "Custom.%dx%d", header.PageSize[0], header.PageSize[1]);
-    }
-  } else {
-    for (i = 0; i < 2; i ++)
-      paperdimensions[i] = header.PageSize[i];
-    if (header.cupsImagingBBox[3] > 0.0) {
-      /* Set margins if we have a bounding box defined ... */
-      if (pwgraster == 0) {
-       margins[0] = header.cupsImagingBBox[0];
-       margins[1] = header.cupsImagingBBox[1];
-       margins[2] = paperdimensions[0] - header.cupsImagingBBox[2];
-       margins[3] = paperdimensions[1] - header.cupsImagingBBox[3];
-      }
-    } else
-      /* ... otherwise use zero margins */
-      for (i = 0; i < 4; i ++)
-       margins[i] = 0.0;
-  }
-
-  if (header.Duplex && (pgno & 1)) {
-    /* backside: change margin if needed */
-    if (swap_margin_x) {
-      swap = margins[2]; margins[2] = margins[0]; margins[0] = swap;
-    }
-    if (swap_margin_y) {
-      swap = margins[3]; margins[3] = margins[1]; margins[1] = swap;
-    }
-  }
-
-  /* write page header */
-  for (i = 0; i < 2; i ++) {
-    header.cupsPageSize[i] = paperdimensions[i];
-    header.PageSize[i] = (unsigned int)(header.cupsPageSize[i] + 0.5);
-    if (pwgraster == 0)
-      header.Margins[i] = margins[i] + 0.5;
-    else
-      header.Margins[i] = 0;
-  }
-  if (pwgraster == 0) {
-    header.cupsImagingBBox[0] = margins[0];
-    header.cupsImagingBBox[1] = margins[1];
-    header.cupsImagingBBox[2] = paperdimensions[0] - margins[2];
-    header.cupsImagingBBox[3] = paperdimensions[1] - margins[3];
-    for (i = 0; i < 4; i ++)
-      header.ImagingBoundingBox[i] = (unsigned int)(header.cupsImagingBBox[i] + 0.5);
-  } else
-    for (i = 0; i < 4; i ++) {
-      header.cupsImagingBBox[i] = 0.0;
-      header.ImagingBoundingBox[i] = 0;
-    }
-
-}
-
 static void outPage(cups_raster_t *raster, QPDFObjectHandle page, int pgno) {
   long long            rotate = 0,
                        height,
                        width;
-  double               l;
+  double               paperdimensions[2], margins[4], l, swap;
   int                  bufsize = 0, pixel_count = 0,
                        temp = 0;
   float                mediaBox[4];
@@ -764,7 +618,41 @@ static void outPage(cups_raster_t *raster, QPDFObjectHandle page, int pgno) {
   }
 
   // Adjust header page size and margins according to the ppd file.
-  selectPageSize(pgno);
+  ppdRasterMatchPPDSize(&header, ppd, margins, paperdimensions, NULL, NULL);
+  if (pwgraster == 1)
+    memset(margins, 0, sizeof(margins));
+
+  if (header.Duplex && (pgno & 1)) {
+    /* backside: change margin if needed */
+    if (swap_margin_x) {
+      swap = margins[2]; margins[2] = margins[0]; margins[0] = swap;
+    }
+    if (swap_margin_y) {
+      swap = margins[3]; margins[3] = margins[1]; margins[1] = swap;
+    }
+  }
+
+  /* write page header */
+  for (int i = 0; i < 2; i ++) {
+    header.cupsPageSize[i] = paperdimensions[i];
+    header.PageSize[i] = (unsigned int)(header.cupsPageSize[i] + 0.5);
+    if (pwgraster == 0)
+      header.Margins[i] = margins[i] + 0.5;
+    else
+      header.Margins[i] = 0;
+  }
+  if (pwgraster == 0) {
+    header.cupsImagingBBox[0] = margins[0];
+    header.cupsImagingBBox[1] = margins[1];
+    header.cupsImagingBBox[2] = paperdimensions[0] - margins[2];
+    header.cupsImagingBBox[3] = paperdimensions[1] - margins[3];
+    for (int i = 0; i < 4; i ++)
+      header.ImagingBoundingBox[i] = (unsigned int)(header.cupsImagingBBox[i] + 0.5);
+  } else
+    for (int i = 0; i < 4; i ++) {
+      header.cupsImagingBBox[i] = 0.0;
+      header.ImagingBoundingBox[i] = 0;
+    }
 
   header.cupsWidth = 0;
   header.cupsHeight = 0;
index b1f27fe4ab7240a879402ce22588621a2e1d9dc9..9e617619ac64e7434ee1e0267983725b2c71a0ae 100644 (file)
@@ -106,7 +106,6 @@ namespace {
   bool deviceCollate = false;
   cups_page_header2_t header;
   ppd_file_t *ppd = 0;
-  char pageSizeRequested[64];
   unsigned int bitmapoffset[2];
   unsigned int popplerBitsPerPixel;
   unsigned int popplerNumColors;
@@ -446,7 +445,6 @@ static void parseOpts(int argc, char **argv)
     exit(1);
 #endif /* HAVE_CUPS_1_7 */
   }
-  strncpy(pageSizeRequested, header.cupsPageSizeName, 64);
   fprintf(stderr, "DEBUG: Page size requested: %s\n",
          header.cupsPageSizeName);
 }
@@ -1411,113 +1409,9 @@ static void outPage(poppler::document *doc, int pageNo,
   memset(paperdimensions, 0, sizeof(paperdimensions));
   memset(margins, 0, sizeof(margins));
   if (ppd) {
-    imageable_area_fit = 0;
-    size_matched = NULL;
-    for (i = ppd->num_sizes, size = ppd->sizes;
-        i > 0;
-        i --, size ++)
-      /* Skip page sizes which conflict with settings of the other options */
-      /* TODO XXX */
-      /* Find size of document's page under the PPD page sizes */
-      if (fabs(header.PageSize[1] - size->length) / size->length < 0.01 &&
-         fabs(header.PageSize[0] - size->width) / size->width < 0.01 &&
-         (size_matched == NULL ||
-          !strcasecmp(pageSizeRequested, size->name)))
-       size_matched = size;
-    if (size_matched == NULL)
-      /* Input page size does not fit any of the PPD's sizes, try to fit
-        the input page size into the imageable areas of the PPD's sizes */
-      for (i = ppd->num_sizes, size = ppd->sizes;
-          i > 0;
-          i --, size ++)
-       if (fabs(header.PageSize[1] - size->top + size->bottom) /
-           size->length < 0.01 &&
-           fabs(header.PageSize[0] - size->right + size->left) /
-           size->width < 0.01 &&
-           (size_matched == NULL ||
-            !strcasecmp(pageSizeRequested, size->name))) {
-         fprintf(stderr, "DEBUG: Imageable area fit\n");
-         imageable_area_fit = 1;
-         size_matched = size;
-       }
-    if (size_matched) {
-      /*
-       * Standard size...
-       */
-      size = size_matched;
-      fprintf(stderr, "DEBUG: size = %s\n", size->name);
-      paperdimensions[0] = size->width;
-      paperdimensions[1] = size->length;
-      if (pwgraster == 0) {
-       margins[0] = size->left;
-       margins[1] = size->bottom;
-       margins[2] = size->width - size->right;
-       margins[3] = size->length - size->top;
-      }
-      strncpy(header.cupsPageSizeName, size->name, 64);
-    } else {
-      /*
-       * No matching portrait size; look for a matching size in
-       * landscape orientation...
-       */
-
-      imageable_area_fit = 0;
-      size_matched = 0;
-      for (i = ppd->num_sizes, size = ppd->sizes;
-          i > 0;
-          i --, size ++)
-       if (fabs(header.PageSize[0] - size->length) / size->length < 0.01 &&
-           fabs(header.PageSize[1] - size->width) / size->width < 0.01 &&
-           (size_matched == NULL ||
-            !strcasecmp(pageSizeRequested, size->name)))
-         size_matched = size;
-      if (size_matched == NULL)
-       /* Input page size does not fit any of the PPD's sizes, try to fit
-          the input page size into the imageable areas of the PPD's sizes */
-       for (i = ppd->num_sizes, size = ppd->sizes;
-            i > 0;
-            i --, size ++)
-         if (fabs(header.PageSize[0] - size->top + size->bottom) /
-             size->length < 0.01 &&
-             fabs(header.PageSize[1] - size->right + size->left) /
-             size->width < 0.01 &&
-             (size_matched == NULL ||
-              !strcasecmp(pageSizeRequested, size->name))) {
-           fprintf(stderr, "DEBUG: Imageable area fit\n");
-           imageable_area_fit = 1;
-           size_matched = size;
-         }
-      if (size_matched) {
-       /*
-        * Standard size in landscape orientation...
-        */
-       size = size_matched;
-       fprintf(stderr, "DEBUG: landscape size = %s\n", size->name);
-       paperdimensions[0] = size->width;
-       paperdimensions[1] = size->length;
-       if (pwgraster == 0) {
-         margins[0] = size->left;
-         margins[1] = size->bottom;
-         margins[2] = size->width - size->right;
-         margins[3] = size->length - size->top;
-       }
-       strncpy(header.cupsPageSizeName, size->name, 64);
-      } else {
-       /*
-        * Custom size...
-        */
-       fprintf(stderr, "DEBUG: size = Custom\n");
-       paperdimensions[1] = size->length;
-       for (i = 0; i < 2; i ++)
-         paperdimensions[i] = header.PageSize[i];
-       if (pwgraster == 0)
-         for (i = 0; i < 4; i ++)
-           margins[i] = ppd->custom_margins[i];
-       snprintf(header.cupsPageSizeName, 64,
-                "Custom.%dx%d",
-                header.PageSize[0], header.PageSize[1]);
-      }
-    }
+    ppdRasterMatchPPDSize(&header, ppd, margins, paperdimensions, &imageable_area_fit, NULL);
+    if (pwgraster == 1)
+      memset(margins, 0, sizeof(margins));
   } else {
     for (i = 0; i < 2; i ++)
       paperdimensions[i] = header.PageSize[i];
index 8a7f2f702b892b1cc48a2d9daab47efb3e6e70d6..32068bf3b2390ba5d878699168dab313f6613163 100644 (file)
--- a/ppd/ppd.h
+++ b/ppd/ppd.h
@@ -574,6 +574,12 @@ extern int         ppdPageSizeLimits(ppd_file_t *ppd,
                                          ppd_size_t *maximum);
 
 /**** New in libppd (cups-filters) ****/
+extern ppd_size_t      *ppdRasterMatchPPDSize(cups_page_header2_t *header,
+                                               ppd_file_t *ppd,
+                                               double margins[4],
+                                               double dimensions[4],
+                                               int *image_fit,
+                                               int *landscape);
 
 /**** New in cups-filters 1.28.0: Renamed functions from original CUPS API ****/
 extern int             ppdMarkOptions(ppd_file_t *ppd, int num_options, cups_option_t *options);
index 88d2b4e502f93f04b0d3412735e863ff37dfd364..1b3144de520aee4d1fd216490c06169b1dba29e2 100644 (file)
@@ -495,6 +495,138 @@ ppdRasterInterpretPPD(
   return (status);
 }
 
+/*
+ * 'ppdRasterMatchPageSize()' - Match PPD page size to header page size.
+ */
+
+ppd_size_t *                           /* O - Matched Size on success, NULL on failure */
+ppdRasterMatchPPDSize(
+    cups_page_header2_t *header,       /* I - Page header to match */
+    ppd_file_t         *ppd,           /* I - PPD file */
+    double             margins[4],     /* O - Margins of media in points */
+    double             dimensions[2],  /* O - Width and Length of media in points */
+    int                *image_fit,     /* O - Imageable Area Fit */
+    int                *landscape)     /* O - Landscape / Portrait Fit */
+{
+  ppd_size_t   *size,                  /* Current size */
+               *size_matched = NULL;   /* Matched size */
+  int          i = 0;                  /* Loop variable */
+  char         pageSizeRequested[64];  /* Requested PageSize */
+
+  strncpy(pageSizeRequested, header->cupsPageSizeName, 64); /* Prefer user-selected page size. */
+  memset(dimensions, 0, sizeof(dimensions));
+  memset(margins, 0, sizeof(margins));
+  size_matched = NULL;
+
+  for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++)
+  {
+    /* Skip page sizes which conflict with settings of the other options */
+    /* Find size of document's page under the PPD page sizes */
+    if (fabs(header->PageSize[1] - size->length) / size->length < 0.01 &&
+       fabs(header->PageSize[0] - size->width) / size->width < 0.01 &&
+       (size_matched == NULL || !strcasecmp(pageSizeRequested, size->name)))
+    {
+      size_matched = size;
+      if (landscape) *landscape = 0;
+      if (image_fit) *image_fit = 0;
+    }
+  }
+
+  if (size_matched == NULL)
+  /* Input page size does not fit any of the PPD's sizes, try to fit
+     the input page size into the imageable areas of the PPD's sizes */
+  for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++)
+  {
+    if (fabs(header->PageSize[1] - size->top + size->bottom) / size->length < 0.01 &&
+       fabs(header->PageSize[0] - size->right + size->left) / size->width < 0.01 &&
+       (size_matched == NULL || !strcasecmp(pageSizeRequested, size->name)))
+    {
+      DEBUG_printf("DEBUG: Imageable area fit\n");
+      size_matched = size;
+      if (landscape) *landscape = 0;
+      if (image_fit) *image_fit = 1;
+    }
+  }
+
+  if (size_matched)
+  {
+    /*
+    * Standard size...
+    */
+    DEBUG_printf(("DEBUG: size = %s\n", size_matched->name));
+    size = size_matched;
+    dimensions[0] = size->width;
+    dimensions[1] = size->length;
+    margins[0] = size->left;
+    margins[1] = size->bottom;
+    margins[2] = size->width - size->right;
+    margins[3] = size->length - size->top;
+    strncpy(header->cupsPageSizeName, size->name, 64);
+  }
+  else
+  {
+    /*
+    * No matching portrait size; look for a matching size in
+    * landscape orientation...
+    */
+    size_matched = 0;
+    for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++)
+    if (fabs(header->PageSize[0] - size->length) / size->length < 0.01 &&
+        fabs(header->PageSize[1] - size->width) / size->width < 0.01 &&
+        (size_matched == NULL || !strcasecmp(pageSizeRequested, size->name)))
+    {
+      size_matched = size;
+      if (landscape) *landscape = 1;
+      if (image_fit) *image_fit = 0;
+    }
+
+    if (size_matched == NULL)
+    /* Input page size does not fit any of the PPD's sizes, try to fit
+       the input page size into the imageable areas of the PPD's sizes */
+    for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++)
+    {
+      if (fabs(header->PageSize[0] - size->top + size->bottom) / size->length < 0.01 &&
+       fabs(header->PageSize[1] - size->right + size->left) / size->width < 0.01 &&
+       (size_matched == NULL || !strcasecmp(pageSizeRequested, size->name)))
+      {
+       DEBUG_printf("DEBUG: Imageable area fit\n");
+       size_matched = size;
+       if (landscape) *landscape = 1;
+       if (image_fit) *image_fit = 1;
+      }
+    }
+  }
+
+  if (size_matched)
+  {
+    /*
+     * Standard size in landscape orientation...
+     */
+    size = size_matched;
+    DEBUG_printf(("DEBUG: landscape size = %s\n", size->name));
+    dimensions[0] = size->width;
+    dimensions[1] = size->length;
+    margins[0] = size->left;
+    margins[1] = size->bottom;
+    margins[2] = size->width - size->right;
+    margins[3] = size->length - size->top;
+    strncpy(header->cupsPageSizeName, size->name, 64);
+  }
+  else
+  {
+    /*
+     * Custom size...
+     */
+    DEBUG_printf("DEBUG: size = Custom\n");
+    for (i = 0; i < 2; i ++)
+      dimensions[i] = header->PageSize[i];
+    for (i = 0; i < 4; i ++)
+      margins[i] = ppd->custom_margins[i];
+    snprintf(header->cupsPageSizeName, 64, "Custom.%dx%d", header->PageSize[0], header->PageSize[1]);
+  }
+
+  return size_matched;
+}
 
 /*
  * 'ppdRasterExecPS()' - Execute PostScript code to initialize a page header.