ghostscript/ghostscript-gdevcups-segfaults.patch

1813 lines
59 KiB
Diff

diff -up ghostscript-8.71/cups/gdevcups.c.gdevcups-segfaults ghostscript-8.71/cups/gdevcups.c
--- ghostscript-8.71/cups/gdevcups.c.gdevcups-segfaults 2010-10-14 17:05:32.266994174 +0100
+++ ghostscript-8.71/cups/gdevcups.c 2010-10-14 17:05:32.281994345 +0100
@@ -1,5 +1,5 @@
/*
- * "$Id: gdevcups.c 10631 2010-01-22 17:46:02Z till $"
+ * "$Id$"
*
* GNU Ghostscript raster output driver for the Common UNIX Printing
* System (CUPS).
@@ -34,6 +34,8 @@
* cups_close() - Close the output file.
* cups_decode_color() - Decode a color value.
* cups_encode_color() - Encode a color value.
+ * cups_get_color_comp_index()
+ * - Color component to index
* cups_get_color_mapping_procs()
* - Get the list of color mapping procedures.
* cups_get_matrix() - Generate the default page matrix.
@@ -66,7 +68,6 @@
#include "std.h" /* to stop stdlib.h redefining types */
#include "gdevprn.h"
#include "gsparam.h"
-#include "gsexit.h"
#include "arch.h"
#include <stdlib.h>
@@ -78,6 +79,12 @@
#undef private
#define private
+/* This should go into gdevprn.h, or, better yet, gdevprn should
+ acquire an API for changing resolution. */
+int gdev_prn_maybe_realloc_memory(gx_device_printer *pdev,
+ gdev_prn_space_params *old_space,
+ int old_width, int old_height,
+ bool old_page_uses_transparency);
/*
* Check if we are compiling against CUPS 1.2. If so, enable
@@ -95,16 +102,6 @@
/*
- * Newer versions of Ghostscript don't provide gs_exit() function anymore.
- * It has been renamed to gs_to_exit()...
- */
-
-#ifdef dev_t_proc_encode_color
-# define gs_exit gs_to_exit
-#endif /* dev_t_proc_encode_color */
-
-
-/*
* CIE XYZ color constants...
*/
@@ -177,6 +174,7 @@ private cm_map_proc_rgb(cups_map_rgb);
private cm_map_proc_cmyk(cups_map_cmyk);
private dev_proc_decode_color(cups_decode_color);
private dev_proc_encode_color(cups_encode_color);
+private dev_proc_get_color_comp_index(cups_get_color_comp_index);
private dev_proc_get_color_mapping_procs(cups_get_color_mapping_procs);
static const gx_cm_color_map_procs cups_color_mapping_procs =
@@ -204,6 +202,24 @@ typedef struct gx_device_cups_s
cups_raster_t *stream; /* Raster stream */
cups_page_header_t header; /* PostScript page device info */
int landscape; /* Non-zero if this is landscape */
+ int lastpage;
+ int HaveProfile; /* Has a color profile been defined? */
+ char *Profile; /* Current simple color profile string */
+ ppd_file_t *PPD; /* PPD file for this device */
+ unsigned char RevLower1[16]; /* Lower 1-bit reversal table */
+ unsigned char RevUpper1[16]; /* Upper 1-bit reversal table */
+ unsigned char RevLower2[16]; /* Lower 2-bit reversal table */
+ unsigned char RevUpper2[16]; /* Upper 2-bit reversal table */
+#ifdef GX_COLOR_INDEX_TYPE
+ gx_color_value DecodeLUT[65536];/* Output color to RGB value LUT */
+#else
+ gx_color_value DecodeLUT[256]; /* Output color to RGB value LUT */
+#endif /* GX_COLOR_INDEX_TYPE */
+ unsigned short EncodeLUT[gx_max_color_value + 1];/* RGB value to output color LUT */
+ int Density[CUPS_MAX_VALUE + 1];/* Density LUT */
+ int Matrix[3][3][CUPS_MAX_VALUE + 1];/* Color transform matrix LUT */
+
+ /* Used by cups_put_params(): */
} gx_device_cups;
private gx_device_procs cups_procs =
@@ -268,7 +284,7 @@ private gx_device_procs cups_procs =
NULL, /* discard_transparency_layer */
#ifdef dev_t_proc_encode_color
cups_get_color_mapping_procs,
- gx_error_get_color_comp_index, /* Dummy to avoid segfault */
+ cups_get_color_comp_index,
cups_encode_color,
cups_decode_color,
#else
@@ -285,7 +301,9 @@ private gx_device_procs cups_procs =
NULL, /* fill_linear_color_triangle */
NULL, /* update_spot_equivalent_colors */
NULL, /* ret_devn_params */
- NULL /* fillpage */
+ NULL, /* fillpage */
+ NULL, /* push_transparency_state */
+ NULL /* pop_transparency_state */
};
#define prn_device_body_copies(dtype, procs, dname, w10, h10, xdpi, ydpi, lo, to, lm, bm, rm, tm, ncomp, depth, mg, mc, dg, dc, print_pages)\
@@ -381,63 +399,35 @@ gx_device_cups gs_cups_device =
"" /* cupsPageSizeName */
#endif /* CUPS_RASTER_SYNCv1 */
},
- 0 /* landscape */
+ 0, /* landscape */
+ 0, /* lastpage */
+ 0, /* HaveProfile */
+ NULL, /* Profile */
+ NULL, /* PPD */
+ { 0x00, 0x08, 0x04, 0x0c, 0x02, 0x0a, 0x06, 0x0e,
+ 0x01, 0x09, 0x05, 0x0d, 0x03, 0x0b, 0x07, 0x0f },/* RevLower1 */
+ { 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+ 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0 },/* RevUpper1 */
+ { 0x00, 0x04, 0x08, 0x0c, 0x01, 0x05, 0x09, 0x0d,
+ 0x02, 0x06, 0x0a, 0x0e, 0x03, 0x07, 0x0b, 0x0f },/* RevLower2 */
+ { 0x00, 0x40, 0x80, 0xc0, 0x10, 0x50, 0x90, 0xd0,
+ 0x20, 0x60, 0xa0, 0xe0, 0x30, 0x70, 0xb0, 0xf0 },/* RevUpper2 */
+ { }, /* DecodeLUT */
+ { }, /* EncodeLUT */
+ { }, /* Density */
+ { } /* Matrix */
};
/*
- * Globals...
- */
-
-#ifdef GX_COLOR_INDEX_TYPE
-static gx_color_value cupsDecodeLUT[65536];
- /* Output color to RGB value LUT */
-#else
-static gx_color_value cupsDecodeLUT[256];
- /* Output color to RGB value LUT */
-#endif /* GX_COLOR_INDEX_TYPE */
-static unsigned short cupsEncodeLUT[gx_max_color_value + 1];
- /* RGB value to output color LUT */
-
-static ppd_file_t *cupsPPD = 0; /* PPD file for this device */
-static char *cupsProfile = NULL;
- /* Current simple color profile string */
-static int cupsHaveProfile = 0;
- /* Has a color profile been defined? */
-static int cupsMatrix[3][3][CUPS_MAX_VALUE + 1];
- /* Color transform matrix LUT */
-static int cupsDensity[CUPS_MAX_VALUE + 1];
- /* Density LUT */
-static unsigned char cupsRevLower1[16] =
- { /* Lower 1-bit reversal table */
- 0x00, 0x08, 0x04, 0x0c, 0x02, 0x0a, 0x06, 0x0e,
- 0x01, 0x09, 0x05, 0x0d, 0x03, 0x0b, 0x07, 0x0f
- },
- cupsRevUpper1[16] =
- { /* Upper 1-bit reversal table */
- 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
- 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0
- },
- cupsRevLower2[16] =
- { /* Lower 2-bit reversal table */
- 0x00, 0x04, 0x08, 0x0c, 0x01, 0x05, 0x09, 0x0d,
- 0x02, 0x06, 0x0a, 0x0e, 0x03, 0x07, 0x0b, 0x0f
- },
- cupsRevUpper2[16] =
- { /* Upper 2-bit reversal table */
- 0x00, 0x40, 0x80, 0xc0, 0x10, 0x50, 0x90, 0xd0,
- 0x20, 0x60, 0xa0, 0xe0, 0x30, 0x70, 0xb0, 0xf0
- };
-
-/*
* Local functions...
*/
static double cups_map_cielab(double, double);
-static void cups_print_chunked(gx_device_printer *, unsigned char *,
+static int cups_print_chunked(gx_device_printer *, unsigned char *,
unsigned char *, int);
-static void cups_print_banded(gx_device_printer *, unsigned char *,
+static int cups_print_banded(gx_device_printer *, unsigned char *,
unsigned char *, int);
-static void cups_print_planar(gx_device_printer *, unsigned char *,
+static int cups_print_planar(gx_device_printer *, unsigned char *,
unsigned char *, int);
/*static void cups_set_margins(gx_device *);*/
@@ -459,16 +449,16 @@ cups_close(gx_device *pdev) /* I - Devi
}
#if 0 /* Can't do this here because put_params() might close the device */
- if (cupsPPD != NULL)
+ if (cups->PPD != NULL)
{
- ppdClose(cupsPPD);
- cupsPPD = NULL;
+ ppdClose(cups->PPD);
+ cups->PPD = NULL;
}
- if (cupsProfile != NULL)
+ if (cups->Profile != NULL)
{
- free(cupsProfile);
- cupsProfile = NULL;
+ free(cups->Profile);
+ cups->Profile = NULL;
}
#endif /* 0 */
@@ -509,9 +499,9 @@ cups_decode_color(gx_device *pdev,
mask = (1 << shift) - 1;
for (i = cups->color_info.num_components - 1; i > 0; i --, ci >>= shift)
- cv[i] = cupsDecodeLUT[ci & mask];
+ cv[i] = cups->DecodeLUT[ci & mask];
- cv[0] = cupsDecodeLUT[ci & mask];
+ cv[0] = cups->DecodeLUT[ci & mask];
}
return (0);
@@ -539,10 +529,10 @@ cups_encode_color(gx_device *
shift = cups->header.cupsBitsPerColor;
- for (ci = cupsEncodeLUT[cv[0]], i = 1;
+ for (ci = cups->EncodeLUT[cv[0]], i = 1;
i < cups->color_info.num_components;
i ++)
- ci = (ci << shift) | cupsEncodeLUT[cv[i]];
+ ci = (ci << shift) | cups->EncodeLUT[cv[i]];
#ifdef DEBUG
dprintf2("DEBUG2: cv[0]=%d -> %llx\n", cv[0], ci);
@@ -583,6 +573,145 @@ cups_encode_color(gx_device *
return (ci);
}
+/*
+ * 'cups_get_color_comp_index()' - Color component to index
+ */
+
+#define compare_color_names(pname, name_size, name_str) \
+ (name_size == (int)strlen(name_str) && strncasecmp(pname, name_str, name_size) == 0)
+
+int /* O - Index of the named color in
+ the color space */
+cups_get_color_comp_index(gx_device * pdev, const char * pname,
+ int name_size, int component_type)
+{
+ switch (cups->header.cupsColorSpace)
+ {
+ case CUPS_CSPACE_K :
+ if (compare_color_names(pname, name_size, "Black") ||
+ compare_color_names(pname, name_size, "Gray") ||
+ compare_color_names(pname, name_size, "Grey"))
+ return 0;
+ else
+ return -1; /* Indicate that the component name is "unknown" */
+ break;
+ case CUPS_CSPACE_W :
+ case CUPS_CSPACE_WHITE :
+ if (compare_color_names(pname, name_size, "White") ||
+ compare_color_names(pname, name_size, "Luminance") ||
+ compare_color_names(pname, name_size, "Gray") ||
+ compare_color_names(pname, name_size, "Grey"))
+ return 0;
+ else
+ return -1;
+ break;
+ case CUPS_CSPACE_RGBA :
+ if (compare_color_names(pname, name_size, "Alpha") ||
+ compare_color_names(pname, name_size, "Transparent") ||
+ compare_color_names(pname, name_size, "Transparency"))
+ return 3;
+ case CUPS_CSPACE_RGBW :
+ if (compare_color_names(pname, name_size, "White"))
+ return 3;
+ case CUPS_CSPACE_RGB :
+ if (compare_color_names(pname, name_size, "Red"))
+ return 0;
+ if (compare_color_names(pname, name_size, "Green"))
+ return 1;
+ if (compare_color_names(pname, name_size, "Blue"))
+ return 2;
+ else
+ return -1;
+ break;
+ case CUPS_CSPACE_CMYK :
+# ifdef CUPS_RASTER_HAVE_COLORIMETRIC
+ case CUPS_CSPACE_CIEXYZ :
+ case CUPS_CSPACE_CIELab :
+ case CUPS_CSPACE_ICC1 :
+ case CUPS_CSPACE_ICC2 :
+ case CUPS_CSPACE_ICC3 :
+ case CUPS_CSPACE_ICC4 :
+ case CUPS_CSPACE_ICC5 :
+ case CUPS_CSPACE_ICC6 :
+ case CUPS_CSPACE_ICC7 :
+ case CUPS_CSPACE_ICC8 :
+ case CUPS_CSPACE_ICC9 :
+ case CUPS_CSPACE_ICCA :
+ case CUPS_CSPACE_ICCB :
+ case CUPS_CSPACE_ICCC :
+ case CUPS_CSPACE_ICCD :
+ case CUPS_CSPACE_ICCE :
+ case CUPS_CSPACE_ICCF :
+# endif /* CUPS_RASTER_HAVE_COLORIMETRIC */
+ if (compare_color_names(pname, name_size, "Black"))
+ return 3;
+ case CUPS_CSPACE_CMY :
+ if (compare_color_names(pname, name_size, "Cyan"))
+ return 0;
+ if (compare_color_names(pname, name_size, "Magenta"))
+ return 1;
+ if (compare_color_names(pname, name_size, "Yellow"))
+ return 2;
+ else
+ return -1;
+ break;
+ case CUPS_CSPACE_GMCS :
+ if (compare_color_names(pname, name_size, "Silver") ||
+ compare_color_names(pname, name_size, "Silver Foil"))
+ return 3;
+ case CUPS_CSPACE_GMCK :
+ if (compare_color_names(pname, name_size, "Gold") ||
+ compare_color_names(pname, name_size, "Gold Foil"))
+ return 0;
+ case CUPS_CSPACE_YMCK :
+ if (compare_color_names(pname, name_size, "Black"))
+ return 3;
+ case CUPS_CSPACE_YMC :
+ if (compare_color_names(pname, name_size, "Yellow"))
+ return 0;
+ if (compare_color_names(pname, name_size, "Magenta"))
+ return 1;
+ if (compare_color_names(pname, name_size, "Cyan"))
+ return 2;
+ else
+ return -1;
+ break;
+ case CUPS_CSPACE_KCMYcm :
+ if (compare_color_names(pname, name_size, "Light Cyan") ||
+ compare_color_names(pname, name_size, "Photo Cyan"))
+ return 4;
+ if (compare_color_names(pname, name_size, "Light Magenta") ||
+ compare_color_names(pname, name_size, "Photo Magenta"))
+ return 5;
+ case CUPS_CSPACE_KCMY :
+ if (compare_color_names(pname, name_size, "Black"))
+ return 0;
+ if (compare_color_names(pname, name_size, "Cyan"))
+ return 1;
+ if (compare_color_names(pname, name_size, "Magenta"))
+ return 2;
+ if (compare_color_names(pname, name_size, "Yellow"))
+ return 3;
+ else
+ return -1;
+ break;
+ case CUPS_CSPACE_GOLD :
+ if (compare_color_names(pname, name_size, "Gold") ||
+ compare_color_names(pname, name_size, "Gold Foil"))
+ return 0;
+ else
+ return -1;
+ break;
+ case CUPS_CSPACE_SILVER :
+ if (compare_color_names(pname, name_size, "Silver") ||
+ compare_color_names(pname, name_size, "Silver Foil"))
+ return 0;
+ else
+ return -1;
+ break;
+ }
+ return -1;
+}
/*
* 'cups_get_color_mapping_procs()' - Get the list of color mapping procedures.
@@ -658,8 +787,8 @@ cups_get_matrix(gx_device *pdev, /* I -
}
#endif /* CUPS_RASTER_SYNCv1 */
- dprintf2("DEBUG2: width = %d, height = %d\n", cups->width,
- cups->height);
+ dprintf2("DEBUG2: width = %d, height = %d\n", cups->header.cupsWidth,
+ cups->header.cupsHeight);
dprintf4("DEBUG2: PageSize = [ %d %d ], HWResolution = [ %d %d ]\n",
cups->header.PageSize[0], cups->header.PageSize[1],
cups->header.HWResolution[0], cups->header.HWResolution[1]);
@@ -915,7 +1044,8 @@ cups_get_space_params(const gx_device_pr
switch (sscanf(cache_env, "%f%254s", &cache_size, cache_units))
{
case 0 :
- return;
+ cache_size = 8 * 1024 * 1024;
+ break;
case 1 :
cache_size *= 4 * CUPS_TILE_SIZE * CUPS_TILE_SIZE;
break;
@@ -932,15 +1062,12 @@ cups_get_space_params(const gx_device_pr
}
}
else
- return;
-
- if (cache_size == 0)
- return;
+ cache_size = 8 * 1024 * 1024;
dprintf1("DEBUG2: cache_size = %.0f\n", cache_size);
- space_params->MaxBitmap = (int)cache_size;
- space_params->BufferSpace = (int)cache_size;
+ space_params->MaxBitmap = (long)cache_size;
+ space_params->BufferSpace = (long)cache_size / 10;
}
@@ -1003,7 +1130,7 @@ cups_map_cmyk(gx_device *pdev, /* I - D
c0 = 0;
else if (c0 > frac_1)
c0 = frac_1;
- out[0] = frac_1 - (frac)cupsDensity[c0];
+ out[0] = frac_1 - (frac)cups->Density[c0];
break;
case CUPS_CSPACE_RGBA :
@@ -1026,26 +1153,26 @@ cups_map_cmyk(gx_device *pdev, /* I - D
c0 = 0;
else if (c0 > frac_1)
c0 = frac_1;
- out[0] = frac_1 - (frac)cupsDensity[c0];
+ out[0] = frac_1 - (frac)cups->Density[c0];
if (c1 < 0)
c1 = 0;
else if (c1 > frac_1)
c1 = frac_1;
- out[1] = frac_1 - (frac)cupsDensity[c1];
+ out[1] = frac_1 - (frac)cups->Density[c1];
if (c2 < 0)
c2 = 0;
else if (c2 > frac_1)
c2 = frac_1;
- out[2] = frac_1 - (frac)cupsDensity[c2];
+ out[2] = frac_1 - (frac)cups->Density[c2];
if (cups->header.cupsColorSpace == CUPS_CSPACE_RGBW) {
if (c3 < 0)
c3 = 0;
else if (c3 > frac_1)
c3 = frac_1;
- out[3] = frac_1 - (frac)cupsDensity[c3];
+ out[3] = frac_1 - (frac)cups->Density[c3];
}
break;
@@ -1056,9 +1183,9 @@ cups_map_cmyk(gx_device *pdev, /* I - D
if (c0 < 0)
out[0] = 0;
else if (c0 > frac_1)
- out[0] = (frac)cupsDensity[frac_1];
+ out[0] = (frac)cups->Density[frac_1];
else
- out[0] = (frac)cupsDensity[c0];
+ out[0] = (frac)cups->Density[c0];
break;
case CUPS_CSPACE_CMY :
@@ -1069,23 +1196,23 @@ cups_map_cmyk(gx_device *pdev, /* I - D
if (c0 < 0)
out[0] = 0;
else if (c0 > frac_1)
- out[0] = (frac)cupsDensity[frac_1];
+ out[0] = (frac)cups->Density[frac_1];
else
- out[0] = (frac)cupsDensity[c0];
+ out[0] = (frac)cups->Density[c0];
if (c1 < 0)
out[1] = 0;
else if (c1 > frac_1)
- out[1] = (frac)cupsDensity[frac_1];
+ out[1] = (frac)cups->Density[frac_1];
else
- out[1] = (frac)cupsDensity[c1];
+ out[1] = (frac)cups->Density[c1];
if (c2 < 0)
out[2] = 0;
else if (c2 > frac_1)
- out[2] = (frac)cupsDensity[frac_1];
+ out[2] = (frac)cups->Density[frac_1];
else
- out[2] = (frac)cupsDensity[c2];
+ out[2] = (frac)cups->Density[c2];
break;
case CUPS_CSPACE_YMC :
@@ -1096,53 +1223,53 @@ cups_map_cmyk(gx_device *pdev, /* I - D
if (c0 < 0)
out[0] = 0;
else if (c0 > frac_1)
- out[0] = (frac)cupsDensity[frac_1];
+ out[0] = (frac)cups->Density[frac_1];
else
- out[0] = (frac)cupsDensity[c0];
+ out[0] = (frac)cups->Density[c0];
if (c1 < 0)
out[1] = 0;
else if (c1 > frac_1)
- out[1] = (frac)cupsDensity[frac_1];
+ out[1] = (frac)cups->Density[frac_1];
else
- out[1] = (frac)cupsDensity[c1];
+ out[1] = (frac)cups->Density[c1];
if (c2 < 0)
out[2] = 0;
else if (c2 > frac_1)
- out[2] = (frac)cupsDensity[frac_1];
+ out[2] = (frac)cups->Density[frac_1];
else
- out[2] = (frac)cupsDensity[c2];
+ out[2] = (frac)cups->Density[c2];
break;
case CUPS_CSPACE_CMYK :
if (c < 0)
out[0] = 0;
else if (c > frac_1)
- out[0] = (frac)cupsDensity[frac_1];
+ out[0] = (frac)cups->Density[frac_1];
else
- out[0] = (frac)cupsDensity[c];
+ out[0] = (frac)cups->Density[c];
if (m < 0)
out[1] = 0;
else if (m > frac_1)
- out[1] = (frac)cupsDensity[frac_1];
+ out[1] = (frac)cups->Density[frac_1];
else
- out[1] = (frac)cupsDensity[m];
+ out[1] = (frac)cups->Density[m];
if (y < 0)
out[2] = 0;
else if (y > frac_1)
- out[2] = (frac)cupsDensity[frac_1];
+ out[2] = (frac)cups->Density[frac_1];
else
- out[2] = (frac)cupsDensity[y];
+ out[2] = (frac)cups->Density[y];
if (k < 0)
out[3] = 0;
else if (k > frac_1)
- out[3] = (frac)cupsDensity[frac_1];
+ out[3] = (frac)cups->Density[frac_1];
else
- out[3] = (frac)cupsDensity[k];
+ out[3] = (frac)cups->Density[k];
break;
case CUPS_CSPACE_YMCK :
@@ -1151,30 +1278,30 @@ cups_map_cmyk(gx_device *pdev, /* I - D
if (y < 0)
out[0] = 0;
else if (y > frac_1)
- out[0] = (frac)cupsDensity[frac_1];
+ out[0] = (frac)cups->Density[frac_1];
else
- out[0] = (frac)cupsDensity[y];
+ out[0] = (frac)cups->Density[y];
if (m < 0)
out[1] = 0;
else if (m > frac_1)
- out[1] = (frac)cupsDensity[frac_1];
+ out[1] = (frac)cups->Density[frac_1];
else
- out[1] = (frac)cupsDensity[m];
+ out[1] = (frac)cups->Density[m];
if (c < 0)
out[2] = 0;
else if (c > frac_1)
- out[2] = (frac)cupsDensity[frac_1];
+ out[2] = (frac)cups->Density[frac_1];
else
- out[2] = (frac)cupsDensity[c];
+ out[2] = (frac)cups->Density[c];
if (k < 0)
out[3] = 0;
else if (k > frac_1)
- out[3] = (frac)cupsDensity[frac_1];
+ out[3] = (frac)cups->Density[frac_1];
else
- out[3] = (frac)cupsDensity[k];
+ out[3] = (frac)cups->Density[k];
break;
case CUPS_CSPACE_KCMYcm :
@@ -1182,30 +1309,30 @@ cups_map_cmyk(gx_device *pdev, /* I - D
if (k < 0)
out[0] = 0;
else if (k > frac_1)
- out[0] = (frac)cupsDensity[frac_1];
+ out[0] = (frac)cups->Density[frac_1];
else
- out[0] = (frac)cupsDensity[k];
+ out[0] = (frac)cups->Density[k];
if (c < 0)
out[1] = 0;
else if (c > frac_1)
- out[1] = (frac)cupsDensity[frac_1];
+ out[1] = (frac)cups->Density[frac_1];
else
- out[1] = (frac)cupsDensity[c];
+ out[1] = (frac)cups->Density[c];
if (m < 0)
out[2] = 0;
else if (m > frac_1)
- out[2] = (frac)cupsDensity[frac_1];
+ out[2] = (frac)cups->Density[frac_1];
else
- out[2] = (frac)cupsDensity[m];
+ out[2] = (frac)cups->Density[m];
if (y < 0)
out[3] = 0;
else if (y > frac_1)
- out[3] = (frac)cupsDensity[frac_1];
+ out[3] = (frac)cups->Density[frac_1];
else
- out[3] = (frac)cupsDensity[y];
+ out[3] = (frac)cups->Density[y];
break;
# ifdef CUPS_RASTER_HAVE_COLORIMETRIC
@@ -1400,9 +1527,9 @@ cups_map_cmyk(gx_device *pdev, /* I - D
}
}
- out[0] = cupsDecodeLUT[c0];
- out[1] = cupsDecodeLUT[c1];
- out[2] = cupsDecodeLUT[c2];
+ out[0] = cups->DecodeLUT[c0];
+ out[1] = cups->DecodeLUT[c1];
+ out[2] = cups->DecodeLUT[c2];
break;
# endif /* CUPS_RASTER_HAVE_COLORIMETRIC */
}
@@ -1494,21 +1621,21 @@ cups_map_rgb(gx_device *pdev
* Do color correction as needed...
*/
- if (cupsHaveProfile)
+ if (cups->HaveProfile)
{
/*
* Color correct CMY...
*/
- tc = cupsMatrix[0][0][c] +
- cupsMatrix[0][1][m] +
- cupsMatrix[0][2][y];
- tm = cupsMatrix[1][0][c] +
- cupsMatrix[1][1][m] +
- cupsMatrix[1][2][y];
- ty = cupsMatrix[2][0][c] +
- cupsMatrix[2][1][m] +
- cupsMatrix[2][2][y];
+ tc = cups->Matrix[0][0][c] +
+ cups->Matrix[0][1][m] +
+ cups->Matrix[0][2][y];
+ tm = cups->Matrix[1][0][c] +
+ cups->Matrix[1][1][m] +
+ cups->Matrix[1][2][y];
+ ty = cups->Matrix[2][0][c] +
+ cups->Matrix[2][1][m] +
+ cups->Matrix[2][2][y];
if (tc < 0)
c = 0;
@@ -1577,18 +1704,18 @@ cups_map_cmyk_color(gx_device *pdev
* Density correct...
*/
- if (cupsHaveProfile)
+ if (cups->HaveProfile)
{
- c = cupsDensity[c];
- m = cupsDensity[m];
- y = cupsDensity[y];
- k = cupsDensity[k];
+ c = cups->Density[c];
+ m = cups->Density[m];
+ y = cups->Density[y];
+ k = cups->Density[k];
}
- ic = cupsEncodeLUT[c];
- im = cupsEncodeLUT[m];
- iy = cupsEncodeLUT[y];
- ik = cupsEncodeLUT[k];
+ ic = cups->EncodeLUT[c];
+ im = cups->EncodeLUT[m];
+ iy = cups->EncodeLUT[y];
+ ik = cups->EncodeLUT[k];
/*
* Convert the CMYK color to a color index...
@@ -1804,42 +1931,42 @@ cups_map_color_rgb(gx_device *pdev,
case CUPS_CSPACE_SILVER :
prgb[0] =
prgb[1] =
- prgb[2] = cupsDecodeLUT[c3];
+ prgb[2] = cups->DecodeLUT[c3];
break;
case CUPS_CSPACE_W :
prgb[0] =
prgb[1] =
- prgb[2] = cupsDecodeLUT[c3];
+ prgb[2] = cups->DecodeLUT[c3];
break;
case CUPS_CSPACE_RGB :
- prgb[0] = cupsDecodeLUT[c1];
- prgb[1] = cupsDecodeLUT[c2];
- prgb[2] = cupsDecodeLUT[c3];
+ prgb[0] = cups->DecodeLUT[c1];
+ prgb[1] = cups->DecodeLUT[c2];
+ prgb[2] = cups->DecodeLUT[c3];
break;
case CUPS_CSPACE_RGBA :
- prgb[0] = cupsDecodeLUT[c0];
- prgb[1] = cupsDecodeLUT[c1];
- prgb[2] = cupsDecodeLUT[c2];
+ prgb[0] = cups->DecodeLUT[c0];
+ prgb[1] = cups->DecodeLUT[c1];
+ prgb[2] = cups->DecodeLUT[c2];
break;
case CUPS_CSPACE_CMY :
- prgb[0] = cupsDecodeLUT[c1];
- prgb[1] = cupsDecodeLUT[c2];
- prgb[2] = cupsDecodeLUT[c3];
+ prgb[0] = cups->DecodeLUT[c1];
+ prgb[1] = cups->DecodeLUT[c2];
+ prgb[2] = cups->DecodeLUT[c3];
break;
case CUPS_CSPACE_YMC :
- prgb[0] = cupsDecodeLUT[c3];
- prgb[1] = cupsDecodeLUT[c2];
- prgb[2] = cupsDecodeLUT[c1];
+ prgb[0] = cups->DecodeLUT[c3];
+ prgb[1] = cups->DecodeLUT[c2];
+ prgb[2] = cups->DecodeLUT[c1];
break;
case CUPS_CSPACE_KCMY :
case CUPS_CSPACE_KCMYcm :
- k = cupsDecodeLUT[c0];
+ k = cups->DecodeLUT[c0];
divk = gx_max_color_value - k;
if (divk == 0)
{
@@ -1860,13 +1987,13 @@ cups_map_color_rgb(gx_device *pdev,
case CUPS_CSPACE_RGBW :
/*
- * cupsDecodeLUT actually maps to RGBW, not CMYK...
+ * cups->DecodeLUT actually maps to RGBW, not CMYK...
*/
- k = cupsDecodeLUT[c3];
- c = cupsDecodeLUT[c0] + k;
- m = cupsDecodeLUT[c1] + k;
- y = cupsDecodeLUT[c2] + k;
+ k = cups->DecodeLUT[c3];
+ c = cups->DecodeLUT[c0] + k;
+ m = cups->DecodeLUT[c1] + k;
+ y = cups->DecodeLUT[c2] + k;
if (c > gx_max_color_value)
prgb[0] = gx_max_color_value;
@@ -1885,7 +2012,7 @@ cups_map_color_rgb(gx_device *pdev,
break;
case CUPS_CSPACE_CMYK :
- k = cupsDecodeLUT[c3];
+ k = cups->DecodeLUT[c3];
divk = gx_max_color_value - k;
if (divk == 0)
{
@@ -1907,7 +2034,7 @@ cups_map_color_rgb(gx_device *pdev,
case CUPS_CSPACE_YMCK :
case CUPS_CSPACE_GMCK :
case CUPS_CSPACE_GMCS :
- k = cupsDecodeLUT[c3];
+ k = cups->DecodeLUT[c3];
divk = gx_max_color_value - k;
if (divk == 0)
{
@@ -1995,7 +2122,7 @@ cups_map_rgb_color(gx_device *pdev,
* Do color correction as needed...
*/
- if (cupsHaveProfile)
+ if (cups->HaveProfile)
{
/*
* Compute CMYK values...
@@ -2017,17 +2144,17 @@ cups_map_rgb_color(gx_device *pdev,
* Color correct CMY...
*/
- tc = cupsMatrix[0][0][ic] +
- cupsMatrix[0][1][im] +
- cupsMatrix[0][2][iy] +
+ tc = cups->Matrix[0][0][ic] +
+ cups->Matrix[0][1][im] +
+ cups->Matrix[0][2][iy] +
ik;
- tm = cupsMatrix[1][0][ic] +
- cupsMatrix[1][1][im] +
- cupsMatrix[1][2][iy] +
+ tm = cups->Matrix[1][0][ic] +
+ cups->Matrix[1][1][im] +
+ cups->Matrix[1][2][iy] +
ik;
- ty = cupsMatrix[2][0][ic] +
- cupsMatrix[2][1][im] +
- cupsMatrix[2][2][iy] +
+ ty = cups->Matrix[2][0][ic] +
+ cups->Matrix[2][1][im] +
+ cups->Matrix[2][2][iy] +
ik;
/*
@@ -2037,23 +2164,23 @@ cups_map_rgb_color(gx_device *pdev,
if (tc < 0)
r = gx_max_color_value;
else if (tc > gx_max_color_value)
- r = gx_max_color_value - cupsDensity[gx_max_color_value];
+ r = gx_max_color_value - cups->Density[gx_max_color_value];
else
- r = gx_max_color_value - cupsDensity[tc];
+ r = gx_max_color_value - cups->Density[tc];
if (tm < 0)
g = gx_max_color_value;
else if (tm > gx_max_color_value)
- g = gx_max_color_value - cupsDensity[gx_max_color_value];
+ g = gx_max_color_value - cups->Density[gx_max_color_value];
else
- g = gx_max_color_value - cupsDensity[tm];
+ g = gx_max_color_value - cups->Density[tm];
if (ty < 0)
b = gx_max_color_value;
else if (ty > gx_max_color_value)
- b = gx_max_color_value - cupsDensity[gx_max_color_value];
+ b = gx_max_color_value - cups->Density[gx_max_color_value];
else
- b = gx_max_color_value - cupsDensity[ty];
+ b = gx_max_color_value - cups->Density[ty];
}
/*
@@ -2063,13 +2190,13 @@ cups_map_rgb_color(gx_device *pdev,
switch (cups->header.cupsColorSpace)
{
case CUPS_CSPACE_W :
- i = cupsEncodeLUT[(r * 31 + g * 61 + b * 8) / 100];
+ i = cups->EncodeLUT[(r * 31 + g * 61 + b * 8) / 100];
break;
case CUPS_CSPACE_RGB :
- ic = cupsEncodeLUT[r];
- im = cupsEncodeLUT[g];
- iy = cupsEncodeLUT[b];
+ ic = cups->EncodeLUT[r];
+ im = cups->EncodeLUT[g];
+ iy = cups->EncodeLUT[b];
switch (cups->header.cupsBitsPerColor)
{
@@ -2124,9 +2251,9 @@ cups_map_rgb_color(gx_device *pdev,
}
case CUPS_CSPACE_RGBA :
- ic = cupsEncodeLUT[r];
- im = cupsEncodeLUT[g];
- iy = cupsEncodeLUT[b];
+ ic = cups->EncodeLUT[r];
+ im = cups->EncodeLUT[g];
+ iy = cups->EncodeLUT[b];
switch (cups->header.cupsBitsPerColor)
{
@@ -2151,13 +2278,13 @@ cups_map_rgb_color(gx_device *pdev,
break;
default :
- i = cupsEncodeLUT[gx_max_color_value - (r * 31 + g * 61 + b * 8) / 100];
+ i = cups->EncodeLUT[gx_max_color_value - (r * 31 + g * 61 + b * 8) / 100];
break;
case CUPS_CSPACE_CMY :
- ic = cupsEncodeLUT[gx_max_color_value - r];
- im = cupsEncodeLUT[gx_max_color_value - g];
- iy = cupsEncodeLUT[gx_max_color_value - b];
+ ic = cups->EncodeLUT[gx_max_color_value - r];
+ im = cups->EncodeLUT[gx_max_color_value - g];
+ iy = cups->EncodeLUT[gx_max_color_value - b];
switch (cups->header.cupsBitsPerColor)
{
@@ -2182,9 +2309,9 @@ cups_map_rgb_color(gx_device *pdev,
break;
case CUPS_CSPACE_YMC :
- ic = cupsEncodeLUT[gx_max_color_value - r];
- im = cupsEncodeLUT[gx_max_color_value - g];
- iy = cupsEncodeLUT[gx_max_color_value - b];
+ ic = cups->EncodeLUT[gx_max_color_value - r];
+ im = cups->EncodeLUT[gx_max_color_value - g];
+ iy = cups->EncodeLUT[gx_max_color_value - b];
switch (cups->header.cupsBitsPerColor)
{
@@ -2213,10 +2340,10 @@ cups_map_rgb_color(gx_device *pdev,
ik = (int)((float)ik * (float)ik * (float)ik /
((float)mk * (float)mk));
- ic = cupsEncodeLUT[ic - ik];
- im = cupsEncodeLUT[im - ik];
- iy = cupsEncodeLUT[iy - ik];
- ik = cupsEncodeLUT[ik];
+ ic = cups->EncodeLUT[ic - ik];
+ im = cups->EncodeLUT[im - ik];
+ iy = cups->EncodeLUT[iy - ik];
+ ik = cups->EncodeLUT[ik];
switch (cups->header.cupsBitsPerColor)
{
@@ -2257,10 +2384,10 @@ cups_map_rgb_color(gx_device *pdev,
ik = (int)((float)ik * (float)ik * (float)ik /
((float)mk * (float)mk));
- ic = cupsEncodeLUT[ic - ik];
- im = cupsEncodeLUT[im - ik];
- iy = cupsEncodeLUT[iy - ik];
- ik = cupsEncodeLUT[ik];
+ ic = cups->EncodeLUT[ic - ik];
+ im = cups->EncodeLUT[im - ik];
+ iy = cups->EncodeLUT[iy - ik];
+ ik = cups->EncodeLUT[ik];
switch (cups->header.cupsBitsPerColor)
{
@@ -2296,10 +2423,10 @@ cups_map_rgb_color(gx_device *pdev,
ik = (int)((float)ik * (float)ik * (float)ik /
((float)mk * (float)mk));
- ic = cupsEncodeLUT[ic - ik];
- im = cupsEncodeLUT[im - ik];
- iy = cupsEncodeLUT[iy - ik];
- ik = cupsEncodeLUT[ik];
+ ic = cups->EncodeLUT[ic - ik];
+ im = cups->EncodeLUT[im - ik];
+ iy = cups->EncodeLUT[iy - ik];
+ ik = cups->EncodeLUT[ik];
if (ik)
i = 32;
else if (ic && im)
@@ -2329,10 +2456,10 @@ cups_map_rgb_color(gx_device *pdev,
ik = (int)((float)ik * (float)ik * (float)ik /
((float)mk * (float)mk));
- ic = cupsEncodeLUT[ic - ik];
- im = cupsEncodeLUT[im - ik];
- iy = cupsEncodeLUT[iy - ik];
- ik = cupsEncodeLUT[ik];
+ ic = cups->EncodeLUT[ic - ik];
+ im = cups->EncodeLUT[im - ik];
+ iy = cups->EncodeLUT[iy - ik];
+ ik = cups->EncodeLUT[ik];
switch (cups->header.cupsBitsPerColor)
{
@@ -2532,8 +2659,8 @@ cups_open(gx_device *pdev) /* I - Devic
if ((code = gdev_prn_open(pdev)) != 0)
return (code);
- if (cupsPPD == NULL)
- cupsPPD = ppdOpenFile(getenv("PPD"));
+ if (cups->PPD == NULL)
+ cups->PPD = ppdOpenFile(getenv("PPD"));
return (0);
}
@@ -2550,6 +2677,7 @@ cups_print_pages(gx_device_printer *pdev
int num_copies)
/* I - Number of copies */
{
+ int code = 0; /* Error code */
int copy; /* Copy number */
int srcbytes; /* Byte width of scanline */
unsigned char *src, /* Scanline data */
@@ -2604,6 +2732,8 @@ cups_print_pages(gx_device_printer *pdev
if (src == NULL) /* can't allocate input buffer */
return_error(gs_error_VMerror);
+ memset(src, 0, srcbytes);
+
/*
* Need an output buffer, too...
*/
@@ -2614,6 +2744,8 @@ cups_print_pages(gx_device_printer *pdev
if (dst == NULL) /* can't allocate working area */
return_error(gs_error_VMerror);
+ memset(dst, 0, 2 * cups->header.cupsBytesPerLine);
+
/*
* See if the stream has been initialized yet...
*/
@@ -2624,7 +2756,7 @@ cups_print_pages(gx_device_printer *pdev
CUPS_RASTER_WRITE)) == NULL)
{
perror("ERROR: Unable to open raster stream - ");
- gs_exit(gs_lib_ctx_get_non_gc_memory_t(), 0);
+ return_error(gs_error_ioerror);
}
}
@@ -2635,7 +2767,7 @@ cups_print_pages(gx_device_printer *pdev
if (num_copies < 1)
num_copies = 1;
- if (cupsPPD != NULL && !cupsPPD->manual_copies)
+ if (cups->PPD != NULL && !cups->PPD->manual_copies)
{
cups->header.NumCopies = num_copies;
num_copies = 1;
@@ -2650,20 +2782,22 @@ cups_print_pages(gx_device_printer *pdev
cupsRasterWriteHeader(cups->stream, &(cups->header));
if (pdev->color_info.num_components == 1)
- cups_print_chunked(pdev, src, dst, srcbytes);
+ code = cups_print_chunked(pdev, src, dst, srcbytes);
else
switch (cups->header.cupsColorOrder)
{
case CUPS_ORDER_CHUNKED :
- cups_print_chunked(pdev, src, dst, srcbytes);
+ code = cups_print_chunked(pdev, src, dst, srcbytes);
break;
case CUPS_ORDER_BANDED :
- cups_print_banded(pdev, src, dst, srcbytes);
+ code = cups_print_banded(pdev, src, dst, srcbytes);
break;
case CUPS_ORDER_PLANAR :
- cups_print_planar(pdev, src, dst, srcbytes);
+ code = cups_print_planar(pdev, src, dst, srcbytes);
break;
}
+ if (code < 0)
+ break;
}
/*
@@ -2673,6 +2807,9 @@ cups_print_pages(gx_device_printer *pdev
gs_free(gs_lib_ctx_get_non_gc_memory_t(), (char *)src, srcbytes, 1, "cups_print_pages");
gs_free(gs_lib_ctx_get_non_gc_memory_t(), (char *)dst, cups->header.cupsBytesPerLine, 1, "cups_print_pages");
+ if (code < 0)
+ return (code);
+
cups->page ++;
dprintf1("INFO: Processing page %d...\n", cups->page);
@@ -2707,19 +2844,14 @@ cups_put_params(gx_device *pdev, /*
gdev_prn_space_params sp; /* Space parameter data */
int width, /* New width of page */
height, /* New height of page */
- colorspace, /* New color space */
- bitspercolor; /* New bits per color */
- static int width_old = 0, /* Previous width */
- height_old = 0, /* Previous height */
- colorspace_old = 0,/* Previous color space */
- bitspercolor_old = 0;/* Previous bits per color */
+ width_old = 0, /* Previous width of page */
+ height_old = 0; /* Previous height of page */
ppd_attr_t *backside = NULL,
*backsiderequiresflippedmargins = NULL;
float swap;
int xflip = 0,
yflip = 0;
int found = 0;
- static int lastpage = 0;
dprintf2("DEBUG2: cups_put_params(%p, %p)\n", pdev, plist);
@@ -2731,17 +2863,17 @@ cups_put_params(gx_device *pdev, /*
if ((code = param_read_string(plist, sname, &stringval)) < 0) \
{ \
dprintf2("ERROR: Error setting %s to \"%s\"...\n", sname, \
- (char *)stringval.data); \
+ (char *)(stringval.data)); \
param_signal_error(plist, sname, code); \
return (code); \
} \
else if (code == 0) \
{ \
- strncpy(cups->header.name, (const char *)stringval.data, \
+ dprintf2("DEBUG: Setting %s to \"%s\"...\n", sname, \
+ (char *)(stringval.data)); \
+ strncpy(cups->header.name, (const char *)(stringval.data), \
stringval.size); \
cups->header.name[stringval.size] = '\0'; \
- dprintf2("DEBUG: Setting %s to \"%s\"...\n", sname, \
- cups->header.name); \
}
#define intoption(name, sname, type) \
@@ -2821,11 +2953,11 @@ cups_put_params(gx_device *pdev, /*
param_read_int(plist, "cupsBitsPerColor", &intval) == 0;
/* We also recompute page size and margins if we simply get onto a new
page without necessarily having a page size change in the PostScript
- code, as for some printers margins have to flipped on the back sides of
+ code, as for some printers margins have to be flipped on the back sides of
the sheets (even pages) when printing duplex */
- if (cups->page != lastpage) {
+ if (cups->page != cups->lastpage) {
size_set = 1;
- lastpage = cups->page;
+ cups->lastpage = cups->page;
}
stringoption(MediaClass, "MediaClass")
@@ -2899,17 +3031,17 @@ cups_put_params(gx_device *pdev, /*
stringoption(cupsPageSizeName, "cupsPageSizeName");
#endif /* CUPS_RASTER_SYNCv1 */
- if ((code = param_read_string(plist, "cupsProfile", &stringval)) < 0)
+ if ((code = param_read_string(plist, "cups->Profile", &stringval)) < 0)
{
- param_signal_error(plist, "cupsProfile", code);
+ param_signal_error(plist, "cups->Profile", code);
return (code);
}
else if (code == 0)
{
- if (cupsProfile != NULL)
- free(cupsProfile);
+ if (cups->Profile != NULL)
+ free(cups->Profile);
- cupsProfile = strdup((char *)stringval.data);
+ cups->Profile = strdup((char *)stringval.data);
}
cups_set_color_info(pdev);
@@ -2938,22 +3070,22 @@ cups_put_params(gx_device *pdev, /*
cups->landscape = 0;
- if (cupsPPD != NULL)
+ if (cups->PPD != NULL)
{
dprintf1("DEBUG2: cups->header.Duplex = %d\n", cups->header.Duplex);
dprintf1("DEBUG2: cups->header.Tumble = %d\n", cups->header.Tumble);
dprintf1("DEBUG2: cups->page = %d\n", cups->page);
- dprintf1("DEBUG2: cupsPPD = %p\n", cupsPPD);
+ dprintf1("DEBUG2: cups->PPD = %p\n", cups->PPD);
- backside = ppdFindAttr(cupsPPD, "cupsBackSide", NULL);
+ backside = ppdFindAttr(cups->PPD, "cupsBackSide", NULL);
if (backside) {
dprintf1("DEBUG2: cupsBackSide = %s\n", backside->value);
- cupsPPD->flip_duplex = 0;
+ cups->PPD->flip_duplex = 0;
}
- dprintf1("DEBUG2: cupsPPD->flip_duplex = %d\n", cupsPPD->flip_duplex);
+ dprintf1("DEBUG2: cups->PPD->flip_duplex = %d\n", cups->PPD->flip_duplex);
backsiderequiresflippedmargins =
- ppdFindAttr(cupsPPD, "APDuplexRequiresFlippedMargin", NULL);
+ ppdFindAttr(cups->PPD, "APDuplexRequiresFlippedMargin", NULL);
if (backsiderequiresflippedmargins)
dprintf1("DEBUG2: APDuplexRequiresFlippedMargin = %s\n",
backsiderequiresflippedmargins->value);
@@ -2990,7 +3122,7 @@ cups_put_params(gx_device *pdev, /*
}
else if (cups->header.Duplex &&
((!cups->header.Tumble &&
- (cupsPPD->flip_duplex ||
+ (cups->PPD->flip_duplex ||
(backside && !strcasecmp(backside->value, "Rotated")))) ||
(cups->header.Tumble &&
(backside && !strcasecmp(backside->value, "ManualTumble")))) &&
@@ -3020,7 +3152,7 @@ cups_put_params(gx_device *pdev, /*
if (strlen(cups->header.cupsPageSizeName) != 0) {
found = 0;
- for (i = cupsPPD->num_sizes, size = cupsPPD->sizes;
+ for (i = cups->PPD->num_sizes, size = cups->PPD->sizes;
i > 0;
i --, size ++)
if (strcasecmp(cups->header.cupsPageSizeName, size->name) == 0) {
@@ -3036,7 +3168,7 @@ cups_put_params(gx_device *pdev, /*
* Find the matching page size...
*/
- for (i = cupsPPD->num_sizes, size = cupsPPD->sizes;
+ for (i = cups->PPD->num_sizes, size = cups->PPD->sizes;
i > 0;
i --, size ++)
if (fabs(cups->MediaSize[1] - size->length) < 5.0 &&
@@ -3071,6 +3203,8 @@ cups_put_params(gx_device *pdev, /*
gx_device_set_media_size(pdev, size->width, size->length);
+ cups->landscape = 0;
+
margins[0] = size->left / 72.0;
margins[1] = size->bottom / 72.0;
margins[2] = (size->width - size->right) / 72.0;
@@ -3091,7 +3225,7 @@ cups_put_params(gx_device *pdev, /*
* landscape orientation...
*/
- for (i = cupsPPD->num_sizes, size = cupsPPD->sizes;
+ for (i = cups->PPD->num_sizes, size = cups->PPD->sizes;
i > 0;
i --, size ++)
if (fabs(cups->MediaSize[0] - size->length) < 5.0 &&
@@ -3149,8 +3283,10 @@ cups_put_params(gx_device *pdev, /*
dprintf("DEBUG: size = Custom\n");
+ cups->landscape = 0;
+
for (i = 0; i < 4; i ++)
- margins[i] = cupsPPD->custom_margins[i] / 72.0;
+ margins[i] = cups->PPD->custom_margins[i] / 72.0;
if (xflip == 1)
{
swap = margins[0]; margins[0] = margins[2]; margins[2] = swap;
@@ -3174,50 +3310,6 @@ cups_put_params(gx_device *pdev, /*
}
/*
- * Set CUPS raster header values...
- */
-
- cups->header.HWResolution[0] = pdev->HWResolution[0];
- cups->header.HWResolution[1] = pdev->HWResolution[1];
-
-#ifdef CUPS_RASTER_SYNCv1
- cups->header.cupsPageSize[0] = pdev->MediaSize[0];
- cups->header.cupsPageSize[1] = pdev->MediaSize[1];
-
- 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];
-
- if ((sf = cups->header.cupsBorderlessScalingFactor) < 1.0)
- sf = 1.0;
-
- cups->header.Margins[0] = pdev->HWMargins[0] * sf;
- cups->header.Margins[1] = pdev->HWMargins[1] * sf;
-
- cups->header.PageSize[0] = pdev->MediaSize[0] * sf;
- cups->header.PageSize[1] = pdev->MediaSize[1] * sf;
-
- cups->header.ImagingBoundingBox[0] = pdev->HWMargins[0] * sf;
- cups->header.ImagingBoundingBox[1] = pdev->HWMargins[1] * sf;
- cups->header.ImagingBoundingBox[2] = (pdev->MediaSize[0] -
- pdev->HWMargins[2]) * sf;
- cups->header.ImagingBoundingBox[3] = (pdev->MediaSize[1] -
- pdev->HWMargins[3]) * sf;
-#else
- cups->header.Margins[0] = pdev->HWMargins[0];
- cups->header.Margins[1] = pdev->HWMargins[1];
-
- cups->header.PageSize[0] = pdev->MediaSize[0];
- cups->header.PageSize[1] = pdev->MediaSize[1];
-
- cups->header.ImagingBoundingBox[0] = pdev->HWMargins[0];
- cups->header.ImagingBoundingBox[1] = pdev->HWMargins[3];
- cups->header.ImagingBoundingBox[2] = pdev->MediaSize[0] - pdev->HWMargins[2];
- cups->header.ImagingBoundingBox[3] = pdev->MediaSize[1] - pdev->HWMargins[1];
-#endif /* CUPS_RASTER_SYNCv1 */
-
- /*
* Reallocate memory if the size or color depth was changed...
*/
@@ -3228,6 +3320,8 @@ cups_put_params(gx_device *pdev, /*
* does not keep track of the margins in the bitmap size...
*/
+ width_old = pdev->width;
+ height_old = pdev->height;
if (cups->landscape)
{
width = (pdev->MediaSize[1] - pdev->HWMargins[1] - pdev->HWMargins[3]) *
@@ -3250,37 +3344,33 @@ cups_put_params(gx_device *pdev, /*
height *= cups->header.cupsBorderlessScalingFactor;
}
#endif /* CUPS_RASTER_SYNCv1 */
-
- colorspace = cups->header.cupsColorSpace;
- bitspercolor = cups->header.cupsBitsPerColor;
+ pdev->width = width;
+ pdev->height = height;
/*
* Don't reallocate memory unless the device has been opened...
* Also reallocate only if the size has actually changed...
*/
- if (pdev->is_open &&
- (width != width_old || height != height_old ||
- colorspace != colorspace_old || bitspercolor != bitspercolor_old))
+ if (pdev->is_open)
{
- width_old = width;
- height_old = height;
- colorspace_old = colorspace;
- bitspercolor_old = bitspercolor;
-
/*
* Device is open and size has changed, so reallocate...
*/
- dprintf6("DEBUG2: Reallocating memory, [%.0f %.0f] = %dx%d pixels, color space: %d, bits per color: %d...\n",
- pdev->MediaSize[0], pdev->MediaSize[1], width, height,
- colorspace, bitspercolor);
+ dprintf4("DEBUG2: Reallocating memory, [%.0f %.0f] = %dx%d pixels...\n",
+ pdev->MediaSize[0], pdev->MediaSize[1], width, height);
sp = ((gx_device_printer *)pdev)->space_params;
- if ((code = gdev_prn_reallocate_memory(pdev, &sp, width, height)) < 0)
+ if ((code = gdev_prn_maybe_realloc_memory((gx_device_printer *)pdev, &sp,
+ width_old, height_old,
+ cups->page_uses_transparency))
+ < 0)
return (code);
+ dprintf4("DEBUG2: Reallocated memory, [%.0f %.0f] = %dx%d pixels...\n",
+ pdev->MediaSize[0], pdev->MediaSize[1], width, height);
}
else
{
@@ -3296,12 +3386,110 @@ cups_put_params(gx_device *pdev, /*
}
}
- dprintf1("DEBUG2: ppd = %p\n", cupsPPD);
+ /*
+ * Set CUPS raster header values...
+ */
+
+ cups->header.HWResolution[0] = pdev->HWResolution[0];
+ cups->header.HWResolution[1] = pdev->HWResolution[1];
+
+#ifdef CUPS_RASTER_SYNCv1
+
+ if (cups->landscape)
+ {
+ cups->header.cupsPageSize[0] = pdev->MediaSize[1];
+ cups->header.cupsPageSize[1] = pdev->MediaSize[0];
+
+ 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];
+
+ if ((sf = cups->header.cupsBorderlessScalingFactor) < 1.0)
+ sf = 1.0;
+
+ cups->header.Margins[0] = pdev->HWMargins[1] * sf;
+ cups->header.Margins[1] = pdev->HWMargins[2] * sf;
+
+ cups->header.PageSize[0] = pdev->MediaSize[1] * sf;
+ cups->header.PageSize[1] = pdev->MediaSize[0] * sf;
+
+ cups->header.ImagingBoundingBox[0] = pdev->HWMargins[1] * sf;
+ cups->header.ImagingBoundingBox[1] = pdev->HWMargins[2] * sf;
+ cups->header.ImagingBoundingBox[2] = (pdev->MediaSize[1] -
+ pdev->HWMargins[3]) * sf;
+ cups->header.ImagingBoundingBox[3] = (pdev->MediaSize[0] -
+ pdev->HWMargins[0]) * sf;
+ }
+ else
+ {
+ cups->header.cupsPageSize[0] = pdev->MediaSize[0];
+ cups->header.cupsPageSize[1] = pdev->MediaSize[1];
+
+ 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];
+
+ if ((sf = cups->header.cupsBorderlessScalingFactor) < 1.0)
+ sf = 1.0;
+
+ cups->header.Margins[0] = pdev->HWMargins[0] * sf;
+ cups->header.Margins[1] = pdev->HWMargins[1] * sf;
+
+ cups->header.PageSize[0] = pdev->MediaSize[0] * sf;
+ cups->header.PageSize[1] = pdev->MediaSize[1] * sf;
+
+ cups->header.ImagingBoundingBox[0] = pdev->HWMargins[0] * sf;
+ cups->header.ImagingBoundingBox[1] = pdev->HWMargins[1] * sf;
+ cups->header.ImagingBoundingBox[2] = (pdev->MediaSize[0] -
+ pdev->HWMargins[2]) * sf;
+ cups->header.ImagingBoundingBox[3] = (pdev->MediaSize[1] -
+ pdev->HWMargins[3]) * sf;
+ }
+
+#else
+
+ if (cups->landscape)
+ {
+ cups->header.Margins[0] = pdev->HWMargins[1];
+ cups->header.Margins[1] = pdev->HWMargins[2];
+
+ cups->header.PageSize[0] = pdev->MediaSize[1];
+ cups->header.PageSize[1] = pdev->MediaSize[0];
+
+ cups->header.ImagingBoundingBox[0] = pdev->HWMargins[1];
+ cups->header.ImagingBoundingBox[1] = pdev->HWMargins[0];
+ cups->header.ImagingBoundingBox[2] = pdev->MediaSize[1] -
+ pdev->HWMargins[3];
+ cups->header.ImagingBoundingBox[3] = pdev->MediaSize[0] -
+ pdev->HWMargins[2];
+ }
+ else
+ {
+ cups->header.Margins[0] = pdev->HWMargins[0];
+ cups->header.Margins[1] = pdev->HWMargins[1];
+
+ cups->header.PageSize[0] = pdev->MediaSize[0];
+ cups->header.PageSize[1] = pdev->MediaSize[1];
+
+ cups->header.ImagingBoundingBox[0] = pdev->HWMargins[0];
+ cups->header.ImagingBoundingBox[1] = pdev->HWMargins[3];
+ cups->header.ImagingBoundingBox[2] = pdev->MediaSize[0] -
+ pdev->HWMargins[2];
+ cups->header.ImagingBoundingBox[3] = pdev->MediaSize[1] -
+ pdev->HWMargins[1];
+ }
+
+#endif /* CUPS_RASTER_SYNCv1 */
+ cups->header.cupsWidth = cups->width;
+ cups->header.cupsHeight = cups->height;
+
+ dprintf1("DEBUG2: ppd = %p\n", cups->PPD);
dprintf2("DEBUG2: PageSize = [ %.3f %.3f ]\n",
pdev->MediaSize[0], pdev->MediaSize[1]);
- if (size_set)
- dprintf4("DEBUG2: margins = [ %.3f %.3f %.3f %.3f ]\n",
- margins[0], margins[1], margins[2], margins[3]);
+ dprintf4("DEBUG2: margins = [ %.3f %.3f %.3f %.3f ]\n",
+ margins[0], margins[1], margins[2], margins[3]);
dprintf2("DEBUG2: HWResolution = [ %.3f %.3f ]\n",
pdev->HWResolution[0], pdev->HWResolution[1]);
dprintf2("DEBUG2: width = %d, height = %d\n",
@@ -3579,20 +3767,20 @@ cups_set_color_info(gx_device *pdev) /*
j = ((j & 255) << 8) | ((j >> 8) & 255);
#endif /* !ARCH_IS_BIG_ENDIAN */
- cupsEncodeLUT[i] = j;
+ cups->EncodeLUT[i] = j;
#ifdef DEBUG
- if (i == 0 || cupsEncodeLUT[i] != cupsEncodeLUT[i - 1])
- dprintf2("DEBUG2: cupsEncodeLUT[%d] = %d\n", i, (int)cupsEncodeLUT[i]);
+ if (i == 0 || cups->EncodeLUT[i] != cups->EncodeLUT[i - 1])
+ dprintf2("DEBUG2: cups->EncodeLUT[%d] = %d\n", i, (int)cups->EncodeLUT[i]);
#endif /* DEBUG */
}
- dprintf1("DEBUG2: cupsEncodeLUT[0] = %d\n", (int)cupsEncodeLUT[0]);
- dprintf2("DEBUG2: cupsEncodeLUT[%d] = %d\n", gx_max_color_value,
- (int)cupsEncodeLUT[gx_max_color_value]);
+ dprintf1("DEBUG2: cups->EncodeLUT[0] = %d\n", (int)cups->EncodeLUT[0]);
+ dprintf2("DEBUG2: cups->EncodeLUT[%d] = %d\n", gx_max_color_value,
+ (int)cups->EncodeLUT[gx_max_color_value]);
for (i = 0; i < cups->color_info.dither_grays; i ++)
- cupsDecodeLUT[i] = gx_max_color_value * i / max_lut;
+ cups->DecodeLUT[i] = gx_max_color_value * i / max_lut;
dprintf2("DEBUG: num_components = %d, depth = %d\n",
cups->color_info.num_components, cups->color_info.depth);
@@ -3609,24 +3797,24 @@ cups_set_color_info(gx_device *pdev) /*
* Set the color profile as needed...
*/
- cupsHaveProfile = 0;
+ cups->HaveProfile = 0;
#ifdef dev_t_proc_encode_color
- if (cupsProfile)
+ if (cups->Profile)
#else
- if (cupsProfile && cups->header.cupsBitsPerColor == 8)
+ if (cups->Profile && cups->header.cupsBitsPerColor == 8)
#endif /* dev_t_proc_encode_color */
{
- dprintf1("DEBUG: Using user-defined profile \"%s\"...\n", cupsProfile);
+ dprintf1("DEBUG: Using user-defined profile \"%s\"...\n", cups->Profile);
- if (sscanf(cupsProfile, "%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f", &d, &g,
+ if (sscanf(cups->Profile, "%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f", &d, &g,
m[0] + 0, m[0] + 1, m[0] + 2,
m[1] + 0, m[1] + 1, m[1] + 2,
m[2] + 0, m[2] + 1, m[2] + 2) != 11)
dprintf("ERROR: User-defined profile does not contain 11 integers!\n");
else
{
- cupsHaveProfile = 1;
+ cups->HaveProfile = 1;
d *= 0.001f;
g *= 0.001f;
@@ -3642,9 +3830,9 @@ cups_set_color_info(gx_device *pdev) /*
}
}
#ifdef dev_t_proc_encode_color
- else if (cupsPPD)
+ else if (cups->PPD)
#else
- else if (cupsPPD && cups->header.cupsBitsPerColor == 8)
+ else if (cups->PPD && cups->header.cupsBitsPerColor == 8)
#endif /* dev_t_proc_encode_color */
{
/*
@@ -3657,8 +3845,8 @@ cups_set_color_info(gx_device *pdev) /*
else
sprintf(resolution, "%.0fdpi", pdev->HWResolution[0]);
- for (i = 0, profile = cupsPPD->profiles;
- i < cupsPPD->num_profiles;
+ for (i = 0, profile = cups->PPD->profiles;
+ i < cups->PPD->num_profiles;
i ++, profile ++)
if ((strcmp(profile->resolution, resolution) == 0 ||
profile->resolution[0] == '-') &&
@@ -3670,11 +3858,11 @@ cups_set_color_info(gx_device *pdev) /*
* If we found a color profile, use it!
*/
- if (i < cupsPPD->num_profiles)
+ if (i < cups->PPD->num_profiles)
{
dprintf("DEBUG: Using color profile in PPD file!\n");
- cupsHaveProfile = 1;
+ cups->HaveProfile = 1;
d = profile->density;
g = profile->gamma;
@@ -3683,34 +3871,34 @@ cups_set_color_info(gx_device *pdev) /*
}
}
- if (cupsHaveProfile)
+ if (cups->HaveProfile)
{
for (i = 0; i < 3; i ++)
for (j = 0; j < 3; j ++)
for (k = 0; k <= CUPS_MAX_VALUE; k ++)
{
- cupsMatrix[i][j][k] = (int)((float)k * m[i][j] + 0.5);
+ cups->Matrix[i][j][k] = (int)((float)k * m[i][j] + 0.5);
if ((k & 4095) == 0)
- dprintf4("DEBUG2: cupsMatrix[%d][%d][%d] = %d\n",
- i, j, k, cupsMatrix[i][j][k]);
+ dprintf4("DEBUG2: cups->Matrix[%d][%d][%d] = %d\n",
+ i, j, k, cups->Matrix[i][j][k]);
}
for (k = 0; k <= CUPS_MAX_VALUE; k ++)
{
- cupsDensity[k] = (int)((float)CUPS_MAX_VALUE * d *
+ cups->Density[k] = (int)((float)CUPS_MAX_VALUE * d *
pow((float)k / (float)CUPS_MAX_VALUE, g) +
0.5);
if ((k & 4095) == 0)
- dprintf2("DEBUG2: cupsDensity[%d] = %d\n", k, cupsDensity[k]);
+ dprintf2("DEBUG2: cups->Density[%d] = %d\n", k, cups->Density[k]);
}
}
else
{
for (k = 0; k <= CUPS_MAX_VALUE; k ++)
- cupsDensity[k] = k;
+ cups->Density[k] = k;
}
}
@@ -3732,7 +3920,7 @@ cups_sync_output(gx_device *pdev) /* I -
* 'cups_print_chunked()' - Print a page of chunked pixels.
*/
-static void
+static int
cups_print_chunked(gx_device_printer *pdev,
/* I - Printer device */
unsigned char *src,
@@ -3754,18 +3942,18 @@ cups_print_chunked(gx_device_printer *pd
dprintf1("DEBUG2: cups->header.Duplex = %d\n", cups->header.Duplex);
dprintf1("DEBUG2: cups->header.Tumble = %d\n", cups->header.Tumble);
dprintf1("DEBUG2: cups->page = %d\n", cups->page);
- dprintf1("DEBUG2: cupsPPD = %p\n", cupsPPD);
+ dprintf1("DEBUG2: cups->PPD = %p\n", cups->PPD);
- if (cupsPPD) {
- backside = ppdFindAttr(cupsPPD, "cupsBackSide", NULL);
+ if (cups->PPD) {
+ backside = ppdFindAttr(cups->PPD, "cupsBackSide", NULL);
if (backside) {
dprintf1("DEBUG2: cupsBackSide = %s\n", backside->value);
- cupsPPD->flip_duplex = 0;
+ cups->PPD->flip_duplex = 0;
}
}
- if (cups->header.Duplex && cupsPPD &&
+ if (cups->header.Duplex && cups->PPD &&
((!cups->header.Tumble &&
- (cupsPPD->flip_duplex ||
+ (cups->PPD->flip_duplex ||
(backside && !strcasecmp(backside->value, "Rotated")))) ||
(cups->header.Tumble &&
(backside && (!strcasecmp(backside->value, "Flipped") ||
@@ -3774,9 +3962,9 @@ cups_print_chunked(gx_device_printer *pd
xflip = 1;
else
xflip = 0;
- if (cups->header.Duplex && cupsPPD &&
+ if (cups->header.Duplex && cups->PPD &&
((!cups->header.Tumble &&
- (cupsPPD->flip_duplex ||
+ (cups->PPD->flip_duplex ||
(backside && (!strcasecmp(backside->value, "Flipped") ||
!strcasecmp(backside->value, "Rotated"))))) ||
(cups->header.Tumble &&
@@ -3809,7 +3997,7 @@ cups_print_chunked(gx_device_printer *pd
if (gdev_prn_get_bits((gx_device_printer *)pdev, y, src, &srcptr) < 0)
{
dprintf1("ERROR: Unable to get scanline %d!\n", y);
- gs_exit(gs_lib_ctx_get_non_gc_memory_t(), 1);
+ return_error(gs_error_unknownerror);
}
if (xflip)
@@ -3832,8 +4020,8 @@ cups_print_chunked(gx_device_printer *pd
count > 0;
count --, srcptr --, dstptr ++)
{
- *dstptr = cupsRevUpper1[*srcptr & 15] |
- cupsRevLower1[*srcptr >> 4];
+ *dstptr = cups->RevUpper1[*srcptr & 15] |
+ cups->RevLower1[*srcptr >> 4];
}
break;
@@ -3842,8 +4030,8 @@ cups_print_chunked(gx_device_printer *pd
count > 0;
count --, srcptr --, dstptr ++)
{
- *dstptr = cupsRevUpper2[*srcptr & 15] |
- cupsRevLower2[*srcptr >> 4];
+ *dstptr = cups->RevUpper2[*srcptr & 15] |
+ cups->RevLower2[*srcptr >> 4];
}
break;
@@ -3941,6 +4129,7 @@ cups_print_chunked(gx_device_printer *pd
cupsRasterWritePixels(cups->stream, srcptr, cups->header.cupsBytesPerLine);
}
}
+ return (0);
}
@@ -3948,7 +4137,7 @@ cups_print_chunked(gx_device_printer *pd
* 'cups_print_banded()' - Print a page of banded pixels.
*/
-static void
+static int
cups_print_banded(gx_device_printer *pdev,
/* I - Printer device */
unsigned char *src,
@@ -3974,18 +4163,18 @@ cups_print_banded(gx_device_printer *pde
dprintf1("DEBUG2: cups->header.Duplex = %d\n", cups->header.Duplex);
dprintf1("DEBUG2: cups->header.Tumble = %d\n", cups->header.Tumble);
dprintf1("DEBUG2: cups->page = %d\n", cups->page);
- dprintf1("DEBUG2: cupsPPD = %p\n", cupsPPD);
+ dprintf1("DEBUG2: cups->PPD = %p\n", cups->PPD);
- if (cupsPPD) {
- backside = ppdFindAttr(cupsPPD, "cupsBackSide", NULL);
+ if (cups->PPD) {
+ backside = ppdFindAttr(cups->PPD, "cupsBackSide", NULL);
if (backside) {
dprintf1("DEBUG2: cupsBackSide = %s\n", backside->value);
- cupsPPD->flip_duplex = 0;
+ cups->PPD->flip_duplex = 0;
}
}
- if (cups->header.Duplex && cupsPPD &&
+ if (cups->header.Duplex && cups->PPD &&
((!cups->header.Tumble &&
- (cupsPPD->flip_duplex ||
+ (cups->PPD->flip_duplex ||
(backside && !strcasecmp(backside->value, "Rotated")))) ||
(cups->header.Tumble &&
(backside && (!strcasecmp(backside->value, "Flipped") ||
@@ -3994,9 +4183,9 @@ cups_print_banded(gx_device_printer *pde
xflip = 1;
else
xflip = 0;
- if (cups->header.Duplex && cupsPPD &&
+ if (cups->header.Duplex && cups->PPD &&
((!cups->header.Tumble &&
- (cupsPPD->flip_duplex ||
+ (cups->PPD->flip_duplex ||
(backside && (!strcasecmp(backside->value, "Flipped") ||
!strcasecmp(backside->value, "Rotated"))))) ||
(cups->header.Tumble &&
@@ -4040,7 +4229,7 @@ cups_print_banded(gx_device_printer *pde
if (gdev_prn_get_bits((gx_device_printer *)pdev, y, src, &srcptr) < 0)
{
dprintf1("ERROR: Unable to get scanline %d!\n", y);
- gs_exit(gs_lib_ctx_get_non_gc_memory_t(), 1);
+ return_error(gs_error_unknownerror);
}
/*
@@ -4646,6 +4835,7 @@ cups_print_banded(gx_device_printer *pde
cupsRasterWritePixels(cups->stream, dst, cups->header.cupsBytesPerLine);
}
+ return (0);
}
@@ -4653,7 +4843,7 @@ cups_print_banded(gx_device_printer *pde
* 'cups_print_planar()' - Print a page of planar pixels.
*/
-static void
+static int
cups_print_planar(gx_device_printer *pdev,
/* I - Printer device */
unsigned char *src,
@@ -4690,7 +4880,7 @@ cups_print_planar(gx_device_printer *pde
if (gdev_prn_get_bits((gx_device_printer *)pdev, y, src, &srcptr) < 0)
{
dprintf1("ERROR: Unable to get scanline %d!\n", y);
- gs_exit(gs_lib_ctx_get_non_gc_memory_t(), 1);
+ return_error(gs_error_unknownerror);
}
/*
@@ -5017,9 +5207,10 @@ cups_print_planar(gx_device_printer *pde
cupsRasterWritePixels(cups->stream, dst, cups->header.cupsBytesPerLine);
}
+ return (0);
}
/*
- * End of "$Id: gdevcups.c 10631 2010-01-22 17:46:02Z till $".
+ * End of "$Id$".
*/