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 @@ -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$". */