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 } 102