Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/* Copyright (C) 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: gdevsunr.c,v 1.7 2004/08/10 13:02:36 stefan Exp $ */
18
/* Sun raster file driver */
19
#include "gdevprn.h"
20
 
21
/*
22
 * Currently, the only variety of this format supported in this file is
23
 * Harlequin's 1-bit "SUN_RAS" with no colormap and odd "};\n" at tail.
24
 */
25
 
26
#define	RAS_MAGIC	0x59a66a95
27
#define RT_STANDARD	1	/* Raw pixrect image in 68000 byte order */
28
#define RMT_NONE	0	/* ras_maplength is expected to be 0 */
29
typedef struct sun_rasterfile_s {
30
	int	ras_magic;		/* magic number */
31
	int	ras_width;		/* width (pixels) of image */
32
	int	ras_height;		/* height (pixels) of image */
33
	int	ras_depth;		/* depth (1, 8, or 24 bits) of pixel */
34
	int	ras_length;		/* length (bytes) of image */
35
	int	ras_type;		/* type of file; see RT_* below */
36
	int	ras_maptype;		/* type of colormap; see RMT_* below */
37
	int	ras_maplength;		/* length (bytes) of following map */
38
} sun_rasterfile_t;
39
 
40
#ifndef X_DPI
41
#  define X_DPI 72
42
#endif
43
#ifndef Y_DPI
44
#  define Y_DPI 72
45
#endif
46
 
47
private dev_proc_print_page(sunhmono_print_page);
48
 
49
const gx_device_printer gs_sunhmono_device =
50
    prn_device(prn_std_procs, "sunhmono",
51
	       DEFAULT_WIDTH_10THS, DEFAULT_HEIGHT_10THS,
52
	       X_DPI, Y_DPI,
53
	       0, 0, 0, 0,	/* margins */
54
	       1, sunhmono_print_page);
55
 
56
private int
57
sunhmono_print_page(gx_device_printer * pdev, FILE * prn_stream)
58
{
59
    int gsLineBytes = gdev_mem_bytes_per_scan_line((gx_device *) pdev);
60
    /* Output bytes have to be padded to 16 bits. */
61
    int rasLineBytes = ROUND_UP(gsLineBytes, 2);
62
    int lineCnt;
63
    char *lineStorage; /* Allocated for passing storage to gdev_prn_get_bits() */
64
    byte *data;
65
    sun_rasterfile_t ras;
66
    int code = 0;
67
 
68
    /*
69
      errprintf("pdev->width:%d (%d/%d) gsLineBytes:%d rasLineBytes:%d\n",
70
      pdev->width, pdev->width/8, pdev->width%8,gsLineBytes,rasLineBytes);
71
    */
72
    lineStorage = gs_malloc(pdev->memory, gsLineBytes, 1, "rasterfile_print_page(in)");
73
    if (lineStorage == 0) {
74
	code = gs_note_error(gs_error_VMerror);
75
	goto out;
76
    }
77
    /* Setup values in header */
78
    ras.ras_magic = RAS_MAGIC;
79
    ras.ras_width = pdev->width;
80
    ras.ras_height = pdev->height;
81
    ras.ras_depth = 1;
82
    ras.ras_length = (rasLineBytes * pdev->height);
83
    ras.ras_type = RT_STANDARD;
84
    ras.ras_maptype = RMT_NONE;
85
    ras.ras_maplength = 0;
86
    /* Write header */
87
    fwrite(&ras, 1, sizeof(ras), prn_stream);
88
    /* For each raster line */
89
    for (lineCnt = 0; lineCnt < pdev->height; ++lineCnt) {
90
	gdev_prn_get_bits(pdev, lineCnt, lineStorage, &data);
91
	fwrite(data, 1, gsLineBytes, prn_stream);
92
	if (gsLineBytes % 2)
93
	    fputc(0, prn_stream); /* pad to even # of bytes with a 0 */
94
    }
95
    /* The weird file terminator */
96
    fwrite("};\n", 1, 3, prn_stream);
97
out:
98
    /* Clean up... */
99
    gs_free(pdev->memory, lineStorage, gsLineBytes, 1, "rasterfile_print_page(in)");
100
    return code;
101
}