1 /* Copyright (C) 2001-2012 Artifex Software, Inc.
2 All Rights Reserved.
3
4 This software is provided AS-IS with no warranty, either express or
5 implied.
6
7 This software is distributed under license and may not be copied,
8 modified or distributed except as expressly authorized under the terms
9 of the license contained in the file LICENSE in this distribution.
10
11 Refer to licensing information at http://www.artifex.com or contact
12 Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael,
13 CA 94903, U.S.A., +1(415)492-9861, for further information.
14 */
15
16 /* DigiBoard fax device. */
17 /***
18 *** Note: this driver is maintained by a user: please contact
19 *** Rick Richardson (rick@digibd.com) if you have questions.
20 ***/
21 #include "gdevprn.h"
22 #include "strimpl.h"
23 #include "scfx.h"
24 #include "gdevfax.h"
25 #include "gdevtfax.h"
26
27 /* Define the device parameters. */
28 #define X_DPI 204
29 #define Y_DPI 196
30
31 /* The device descriptors */
32
33 static dev_proc_open_device(dfax_prn_open);
34 static dev_proc_print_page(dfax_print_page);
35
36 struct gx_device_dfax_s {
37 gx_device_common;
38 gx_prn_device_common;
39 long pageno;
40 uint iwidth; /* width of image data in pixels */
41 };
42 typedef struct gx_device_dfax_s gx_device_dfax;
43
44 static gx_device_procs dfax_procs =
45 prn_procs(dfax_prn_open, gdev_prn_output_page, gdev_prn_close);
46
47 gx_device_dfax far_data gs_dfaxlow_device =
48 { prn_device_std_body(gx_device_dfax, dfax_procs, "dfaxlow",
49 DEFAULT_WIDTH_10THS, DEFAULT_HEIGHT_10THS,
50 X_DPI, Y_DPI/2,
51 0,0,0,0, /* margins */
52 1, dfax_print_page)
53 };
54
55 gx_device_dfax far_data gs_dfaxhigh_device =
56 { prn_device_std_body(gx_device_dfax, dfax_procs, "dfaxhigh",
57 DEFAULT_WIDTH_10THS, DEFAULT_HEIGHT_10THS,
58 X_DPI, Y_DPI,
59 0,0,0,0, /* margins */
60 1, dfax_print_page)
61 };
62
63 #define dfdev ((gx_device_dfax *)dev)
64
65 /* Open the device, adjusting the paper size. */
66 static int
dfax_prn_open(gx_device * dev)67 dfax_prn_open(gx_device *dev)
68 { dfdev->pageno = 0;
69 return gdev_fax_open(dev);
70 }
71
72 /* Print a DigiFAX page. */
73 static int
dfax_print_page(gx_device_printer * dev,FILE * prn_stream)74 dfax_print_page(gx_device_printer *dev, FILE *prn_stream)
75 { stream_CFE_state state;
76 static char hdr[64] = "\000PC Research, Inc\000\000\000\000\000\000";
77 int code;
78
79 gdev_fax_init_state(&state, (gx_device_fax *)dev);
80 state.EndOfLine = true;
81 state.EncodedByteAlign = true;
82
83 /* Start a page: write the header */
84 hdr[24] = 0; hdr[28] = 1;
85 hdr[26] = ++dfdev->pageno; hdr[27] = dfdev->pageno >> 8;
86 if (dev->y_pixels_per_inch == Y_DPI)
87 { hdr[45] = 0x40; hdr[29] = 1; } /* high res */
88 else
89 { hdr[45] = hdr[29] = 0; } /* low res */
90 fseek(prn_stream, 0, SEEK_END);
91 fwrite(hdr, sizeof(hdr), 1, prn_stream);
92
93 /* Write the page */
94 code = gdev_fax_print_page(dev, prn_stream, &state);
95
96 /* Fixup page count */
97 fseek(prn_stream, 24L, SEEK_SET);
98 hdr[24] = dfdev->pageno; hdr[25] = dfdev->pageno >> 8;
99 fwrite(hdr+24, 2, 1, prn_stream);
100
101 return code;
102 }
103
104 #undef dfdev
105