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