From 6d26e9b1c38d8c0f0ab4af42c513cb23f3ae1656 Mon Sep 17 00:00:00 2001 From: till Date: Tue, 9 Mar 2010 16:35:06 +0000 Subject: [PATCH] Fixes on CUPS Raster output device: - Fixed memory reallocation on bitmap size change. Reallocation is not only needed when dimendions and margins change, but also when the color depth changes. Fixes bugs #691029 and #691108. - Fixed arrayoption() macro in cups_put_params() function. Array values did not get actually set in cups.header data structure. Bug only showed via a compiler warning. - Silenced compiler warning by presetting c0..c3 in cups_map_cmyk() to zero. git-svn-id: http://svn.ghostscript.com/ghostscript/trunk/gs@10890 a1074d23-0009-0410-80fe-cf8c14f379e6 --- cups/gdevcups.c | 32 +++++++++++++++++++++++--------- 1 files changed, 23 insertions(+), 9 deletions(-) diff --git a/cups/gdevcups.c b/cups/gdevcups.c index 551b806..4000abf 100644 --- a/cups/gdevcups.c +++ b/cups/gdevcups.c @@ -975,7 +975,8 @@ cups_map_cmyk(gx_device *pdev, /* I - Device info */ frac k, /* I - Black value */ frac *out) /* O - Device colors */ { - int c0, c1, c2, c3; /* Temporary color values */ + int c0 = 0, c1 = 0, + c2 = 0, c3 = 0; /* Temporary color values */ float rr, rg, rb, /* Real RGB colors */ ciex, ciey, ciez, /* CIE XYZ colors */ ciey_yn, /* Normalized luminance */ @@ -2703,9 +2704,13 @@ cups_put_params(gx_device *pdev, /* I - Device info */ int color_set; /* Were the color attrs set? */ gdev_prn_space_params sp; /* Space parameter data */ int width, /* New width of page */ - height; /* New height 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 */ + height_old = 0, /* Previous height */ + colorspace_old = 0,/* Previous color space */ + bitspercolor_old = 0;/* Previous bits per color */ ppd_attr_t *backside = NULL, *backsiderequiresflippedmargins = NULL; float swap; @@ -2800,9 +2805,10 @@ cups_put_params(gx_device *pdev, /* I - Device info */ else if (code == 0) \ { \ dprintf1("DEBUG: Setting %s to", sname); \ - for (i = 0; i < count; i ++) \ - dprintf1(" %d", (unsigned)(arrayval.data[i])); \ - cups->header.name[i] = (unsigned)arrayval.data[i]; \ + for (i = 0; i < count; i ++) { \ + dprintf1(" %d", (unsigned)(arrayval.data[i])); \ + cups->header.name[i] = (unsigned)(arrayval.data[i]); \ + } \ dprintf("...\n"); \ } @@ -3243,23 +3249,31 @@ cups_put_params(gx_device *pdev, /* I - Device info */ } #endif /* CUPS_RASTER_SYNCv1 */ + colorspace = cups->header.cupsColorSpace; + bitspercolor = cups->header.cupsBitsPerColor; + /* * 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)) + if (pdev->is_open && + (width != width_old || height != height_old || + colorspace != colorspace_old || bitspercolor != bitspercolor_old)) { width_old = width; height_old = height; + colorspace_old = colorspace; + bitspercolor_old = bitspercolor; /* * Device is open and size has changed, so reallocate... */ - dprintf4("DEBUG2: Reallocating memory, [%.0f %.0f] = %dx%d pixels...\n", - pdev->MediaSize[0], pdev->MediaSize[1], width, height); + 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); sp = ((gx_device_printer *)pdev)->space_params; -- 1.6.6.1