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