xref: /plan9/sys/src/cmd/gs/src/gdevmiff.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
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