1 /* Copyright (C) 2001-2012 Artifex Software, Inc.
2    All Rights Reserved.
3 
4    This software is provided AS-IS with no warranty, either express or
5    implied.
6 
7    This software is distributed under license and may not be copied,
8    modified or distributed except as expressly authorized under the terms
9    of the license contained in the file LICENSE in this distribution.
10 
11    Refer to licensing information at http://www.artifex.com or contact
12    Artifex Software, Inc.,  7 Mt. Lassen Drive - Suite A-134, San Rafael,
13    CA  94903, U.S.A., +1(415)492-9861, for further information.
14 */
15 
16 /* MIFF file format driver */
17 #include "gdevprn.h"
18 
19 /* ------ The device descriptor ------ */
20 
21 /*
22  * Default X and Y resolution.
23  */
24 #define X_DPI 72
25 #define Y_DPI 72
26 
27 static dev_proc_print_page(miff24_print_page);
28 
29 static const gx_device_procs miff24_procs =
30 prn_color_procs(gdev_prn_open, gdev_prn_output_page, gdev_prn_close,
31                 gx_default_rgb_map_rgb_color, gx_default_rgb_map_color_rgb);
32 const gx_device_printer gs_miff24_device =
33 prn_device(miff24_procs, "miff24",
34            DEFAULT_WIDTH_10THS, DEFAULT_HEIGHT_10THS,
35            X_DPI, Y_DPI,
36            0, 0, 0, 0,		/* margins */
37            24, miff24_print_page);
38 
39 /* Print one page in 24-bit RLE direct color format. */
40 static int
miff24_print_page(gx_device_printer * pdev,FILE * file)41 miff24_print_page(gx_device_printer * pdev, FILE * file)
42 {
43     int raster = gx_device_raster((gx_device *) pdev, true);
44     byte *line = gs_alloc_bytes(pdev->memory, raster, "miff line buffer");
45     int y;
46     int code = 0;		/* return code */
47 
48     if (line == 0)		/* can't allocate line buffer */
49         return_error(gs_error_VMerror);
50     fputs("id=ImageMagick\n", file);
51     fputs("class=DirectClass\n", file);
52     fprintf(file, "columns=%d\n", pdev->width);
53     fputs("compression=RunlengthEncoded\n", file);
54     fprintf(file, "rows=%d\n", pdev->height);
55     fputs(":\n", file);
56     for (y = 0; y < pdev->height; ++y) {
57         byte *row;
58         byte *end;
59 
60         code = gdev_prn_get_bits(pdev, y, line, &row);
61         if (code < 0)
62             break;
63         end = row + pdev->width * 3;
64         while (row < end) {
65             int count = 0;
66 
67             while (count < 255 && row < end - 3 &&
68                    row[0] == row[3] && row[1] == row[4] &&
69                    row[2] == row[5]
70                 )
71                 ++count, row += 3;
72             putc(row[0], file);
73             putc(row[1], file);
74             putc(row[2], file);
75             putc(count, file);
76             row += 3;
77         }
78     }
79     gs_free_object(pdev->memory, line, "miff line buffer");
80 
81     return code;
82 }
83