From 073e58a9fb9a1b6a76961413d01f03407f37c4a6 Mon Sep 17 00:00:00 2001 From: Michael Sweet Date: Wed, 14 Dec 2016 09:01:18 -0500 Subject: Fix asymmetric resolution bug, address unit test issues. --- filter/raster.c | 21 ++++++++++++++++----- filter/testraster.c | 16 ++++++++++++++++ 2 files changed, 32 insertions(+), 5 deletions(-) (limited to 'filter') diff --git a/filter/raster.c b/filter/raster.c index 8db783027..febc0400b 100644 --- a/filter/raster.c +++ b/filter/raster.c @@ -36,7 +36,8 @@ struct _cups_raster_s /**** Raster stream data ****/ cups_raster_iocb_t iocb; /* IO callback */ cups_mode_t mode; /* Read/write mode */ cups_page_header2_t header; /* Raster header for current page */ - unsigned count, /* Current row run-length count */ + unsigned rowheight, /* Row height in lines */ + count, /* Current row run-length count */ remaining, /* Remaining rows in page image */ bpp; /* Bytes per pixel/color */ unsigned char *pixels, /* Pixels for current row */ @@ -1008,7 +1009,7 @@ cupsRasterWriteHeader( * 'cupsRasterWriteHeader2()' - Write a raster page header from a version 2 * page header structure. * - * The page header can be initialized using @link cupsRasterInterpretPPD@. + * The page header can be initialized using @link cupsRasterInitPWGHeader@. * * @since CUPS 1.2/macOS 10.5@ */ @@ -1031,6 +1032,16 @@ cupsRasterWriteHeader2( if (!cups_raster_update(r)) return (0); + if (r->mode == CUPS_RASTER_WRITE_APPLE) + { + r->rowheight = h->HWResolution[0] / h->HWResolution[1]; + + if (h->HWResolution[0] != (r->rowheight * h->HWResolution[1])) + return (0); + } + else + r->rowheight = 1; + /* * Write the raster header... */ @@ -1277,7 +1288,7 @@ cupsRasterWritePixels(cups_raster_t *r, /* I - Raster stream */ * Increase the repeat count... */ - r->count ++; + r->count += r->rowheight; r->pcurrent = r->pixels; /* @@ -1293,7 +1304,7 @@ cupsRasterWritePixels(cups_raster_t *r, /* I - Raster stream */ else return (len); } - else if (r->count == 256) + else if (r->count > (256 - r->rowheight)) { if (cups_raster_write(r, r->pixels) <= 0) return (0); @@ -1322,7 +1333,7 @@ cupsRasterWritePixels(cups_raster_t *r, /* I - Raster stream */ * Increase the repeat count... */ - r->count ++; + r->count += r->rowheight; r->pcurrent = r->pixels; /* diff --git a/filter/testraster.c b/filter/testraster.c index 112876d98..d3482186d 100644 --- a/filter/testraster.c +++ b/filter/testraster.c @@ -553,6 +553,12 @@ do_raster_tests(cups_mode_t mode) /* O - Write mode */ header.cupsWidth = 256; header.cupsHeight = 256; header.cupsBytesPerLine = 256; + header.HWResolution[0] = 64; + header.HWResolution[1] = 64; + header.PageSize[0] = 288; + header.PageSize[1] = 288; + header.cupsPageSize[0] = 288.0f; + header.cupsPageSize[1] = 288.0f; if (page & 1) { @@ -679,6 +685,16 @@ do_raster_tests(cups_mode_t mode) /* O - Write mode */ expected.cupsWidth = 256; expected.cupsHeight = 256; expected.cupsBytesPerLine = 256; + expected.HWResolution[0] = 64; + expected.HWResolution[1] = 64; + expected.PageSize[0] = 288; + expected.PageSize[1] = 288; + + if (mode != CUPS_RASTER_WRITE_PWG) + { + expected.cupsPageSize[0] = 288.0f; + expected.cupsPageSize[1] = 288.0f; + } if (mode >= CUPS_RASTER_WRITE_PWG) { -- cgit v1.2.1