summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'devices/gdevlbp8.c')
-rw-r--r--devices/gdevlbp8.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/devices/gdevlbp8.c b/devices/gdevlbp8.c
index b99e219b..3136772a 100644
--- a/devices/gdevlbp8.c
+++ b/devices/gdevlbp8.c
@@ -40,7 +40,6 @@ problems
#define X_DPI 300
#define Y_DPI 300
-#define LINE_SIZE ((X_DPI * 85 / 10 + 7) / 8) /* bytes per line */
/* The device descriptors */
static dev_proc_print_page(lbp8_print_page);
@@ -105,22 +104,31 @@ static int
can_print_page(gx_device_printer *pdev, gp_file *prn_stream,
const char *init, int init_size, const char *end, int end_size)
{
- char data[LINE_SIZE*2];
+ char *data;
char *out_data;
int last_line_nro = 0;
+ int line_size = gdev_mem_bytes_per_scan_line((gx_device *)pdev);
+ int code = 0;
+
+ data = (char *)gs_alloc_bytes(pdev->memory,
+ line_size*2,
+ "lbp8_line_buffer");
+ if (data == NULL)
+ return_error(gs_error_VMerror);
gp_fwrite(init, init_size, 1, prn_stream); /* initialize */
/* Send each scan line in turn */
{
int lnum;
- int line_size = gdev_mem_bytes_per_scan_line((gx_device *)pdev);
byte rmask = (byte)(0xff << (-pdev->width & 7));
for ( lnum = 0; lnum < pdev->height; lnum++ ) {
- char *end_data = data + LINE_SIZE;
- gdev_prn_copy_scan_lines(pdev, lnum,
- (byte *)data, line_size);
+ char *end_data = data + line_size;
+ code = gdev_prn_copy_scan_lines(pdev, lnum,
+ (byte *)data, line_size);
+ if (code < 0)
+ goto xit;
/* Mask off 1-bits beyond the line width. */
end_data[-1] &= rmask;
/* Remove trailing 0s. */
@@ -194,7 +202,10 @@ can_print_page(gx_device_printer *pdev, gp_file *prn_stream,
if (end != NULL)
(void)gp_fwrite(end, end_size, 1, prn_stream);
- return 0;
+xit:
+ gs_free_object(pdev->memory, data, "lbp8_line_buffer");
+
+ return code;
}
/* Print an LBP-8 page. */