1
/* Copyright (C) 2001-2006 Artifex Software, Inc.
4
This software is provided AS-IS with no warranty, either express or
7
This software is distributed under license and may not be copied, modified
8
or distributed except as expressly authorized under the terms of that
9
license. Refer to licensing information at http://www.artifex.com/
10
or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
11
San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
14
/* $Id: gdevsunr.c 8250 2007-09-25 13:31:24Z giles $ */
15
/* Sun raster file driver */
19
* Currently, the only variety of this format supported in this file is
20
* Harlequin's 1-bit "SUN_RAS" with no colormap and odd "};\n" at tail.
23
#define RAS_MAGIC 0x59a66a95
24
#define RT_STANDARD 1 /* Raw pixrect image in 68000 byte order */
25
#define RMT_NONE 0 /* ras_maplength is expected to be 0 */
26
typedef struct sun_rasterfile_s {
27
int ras_magic; /* magic number */
28
int ras_width; /* width (pixels) of image */
29
int ras_height; /* height (pixels) of image */
30
int ras_depth; /* depth (1, 8, or 24 bits) of pixel */
31
int ras_length; /* length (bytes) of image */
32
int ras_type; /* type of file; see RT_* below */
33
int ras_maptype; /* type of colormap; see RMT_* below */
34
int ras_maplength; /* length (bytes) of following map */
44
static dev_proc_print_page(sunhmono_print_page);
46
const gx_device_printer gs_sunhmono_device =
47
prn_device(prn_std_procs, "sunhmono",
48
DEFAULT_WIDTH_10THS, DEFAULT_HEIGHT_10THS,
50
0, 0, 0, 0, /* margins */
51
1, sunhmono_print_page);
54
sunhmono_print_page(gx_device_printer * pdev, FILE * prn_stream)
56
int gsLineBytes = gdev_mem_bytes_per_scan_line((gx_device *) pdev);
57
/* Output bytes have to be padded to 16 bits. */
58
int rasLineBytes = ROUND_UP(gsLineBytes, 2);
60
char *lineStorage; /* Allocated for passing storage to gdev_prn_get_bits() */
66
errprintf("pdev->width:%d (%d/%d) gsLineBytes:%d rasLineBytes:%d\n",
67
pdev->width, pdev->width/8, pdev->width%8,gsLineBytes,rasLineBytes);
69
lineStorage = gs_malloc(pdev->memory, gsLineBytes, 1, "rasterfile_print_page(in)");
70
if (lineStorage == 0) {
71
code = gs_note_error(gs_error_VMerror);
74
/* Setup values in header */
75
ras.ras_magic = RAS_MAGIC;
76
ras.ras_width = pdev->width;
77
ras.ras_height = pdev->height;
79
ras.ras_length = (rasLineBytes * pdev->height);
80
ras.ras_type = RT_STANDARD;
81
ras.ras_maptype = RMT_NONE;
82
ras.ras_maplength = 0;
84
fwrite(&ras, 1, sizeof(ras), prn_stream);
85
/* For each raster line */
86
for (lineCnt = 0; lineCnt < pdev->height; ++lineCnt) {
87
gdev_prn_get_bits(pdev, lineCnt, lineStorage, &data);
88
fwrite(data, 1, gsLineBytes, prn_stream);
90
fputc(0, prn_stream); /* pad to even # of bytes with a 0 */
92
/* The weird file terminator */
93
fwrite("};\n", 1, 3, prn_stream);
96
gs_free(pdev->memory, lineStorage, gsLineBytes, 1, "rasterfile_print_page(in)");