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