}
-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];
}
// 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;
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;
exit(1);
#endif /* HAVE_CUPS_1_7 */
}
- strncpy(pageSizeRequested, header.cupsPageSizeName, 64);
fprintf(stderr, "DEBUG: Page size requested: %s\n",
header.cupsPageSizeName);
}
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];
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);
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.