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) 1991, 1994, 1996, 1998 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: gdevcp50.c,v 1.7 2005/01/19 00:24:07 dan Exp $*/
18
/* Mitsubishi CP50 color printer driver */
19
#include "gdevprn.h"
20
#define ppdev ((gx_device_printer *)pdev)
21
 
22
/***
23
 *** Note: this driver was contributed by a user.  Please contact
24
 ***       Michael Hu (michael@ximage.com) if you have questions.
25
 ***/
26
 
27
/* The value of X_PIXEL and Y_PIXEL is gained by experiment */
28
#define X_PIXEL   474
29
#define Y_PIXEL   800
30
 
31
/* The value of FIRST_LINE and LAST_LINE is gained by experiment */
32
/* Note: LAST-LINE - FIRST_LINE + 1 should close to Y_PIXEL */
33
#define FIRST_LINE 140
34
#define LAST_LINE  933
35
 
36
/* The value of FIRST is gained by experiment */
37
/* There are 60 pixel(RGB) in the right clipped margin */
38
#define FIRST_COLUMN    180
39
 
40
/* The value of X_DPI and Y_DPI is gained by experiment */
41
#define X_DPI 154		/* pixels per inch */ 
42
#define Y_DPI 187		/* pixels per inch */
43
 
44
/* The device descriptor */
45
private dev_proc_print_page(cp50_print_page);
46
private dev_proc_output_page(cp50_output_page);
47
 
48
private dev_proc_map_rgb_color(cp50_rgb_color);
49
private dev_proc_map_color_rgb(cp50_color_rgb);
50
 
51
private gx_device_procs cp50_procs =
52
  prn_color_procs(gdev_prn_open, cp50_output_page, gdev_prn_close,
53
    cp50_rgb_color, cp50_color_rgb);
54
 
55
const gx_device_printer far_data gs_cp50_device =
56
  prn_device(cp50_procs, "cp50",
57
	39,				/* width_10ths, 100mm */
58
	59,				/* height_10ths,150mm  */
59
	X_DPI, Y_DPI,
60
	0.39, 0.91, 0.43, 0.75,		/* margins */
61
	24, cp50_print_page);
62
 
63
int copies;
64
 
65
/* ------ Internal routines ------ */
66
 
67
 
68
/* Send the page to the printer. */
69
private int
70
cp50_print_page(gx_device_printer *pdev, FILE *prn_stream)
71
{	
72
	int line_size = gdev_mem_bytes_per_scan_line((gx_device *)pdev);
73
	byte *out = (byte *)gs_malloc(pdev->memory, line_size, 1, "cp50_print_page(out)");
74
    byte *r_plane = (byte *)gs_malloc(pdev->memory, X_PIXEL*Y_PIXEL, 1, "cp50_print_page(r_plane)");
75
    byte *g_plane = (byte *)gs_malloc(pdev->memory, X_PIXEL*Y_PIXEL, 1, "cp50_print_page(g_plane)");
76
    byte *b_plane = (byte *)gs_malloc(pdev->memory, X_PIXEL*Y_PIXEL, 1, "cp50_print_page(b_plane)");
77
    byte *t_plane = (byte *)gs_malloc(pdev->memory, X_PIXEL*Y_PIXEL, 1, "cp50_print_page(t_plane)");
78
	int lnum = FIRST_LINE;
79
	int last = LAST_LINE;
80
    int lines = X_PIXEL;
81
    byte hi_lines, lo_lines;
82
    byte num_copies;
83
    int i,j;
84
 
85
 
86
/*fprintf(prn_stream, "%d,%d,%d,", pdev->width, pdev->height, line_size);*/
87
 
88
	/* Check allocations */
89
	if ( out == 0 || r_plane == 0 || g_plane == 0 || b_plane == 0 || 
90
         t_plane == 0)
91
	{	if ( out )
92
			gs_free(pdev->memory, (char *)out, line_size, 1,
93
				"cp50_print_page(out)");
94
        if (r_plane)
95
            gs_free(pdev->memory, (char *)r_plane, X_PIXEL*Y_PIXEL, 1,
96
                "cp50_print_page(r_plane)");
97
        if (g_plane)  
98
            gs_free(pdev->memory, (char *)g_plane, X_PIXEL*Y_PIXEL, 1, 
99
                "cp50_print_page(g_plane)");
100
        if (b_plane)  
101
            gs_free(pdev->memory, (char *)b_plane, X_PIXEL*Y_PIXEL, 1, 
102
                "cp50_print_page(b_plane)");
103
        if (t_plane)
104
            gs_free(pdev->memory, (char *)t_plane, X_PIXEL*Y_PIXEL, 1, 
105
                "cp50_print_page(t_plane)");
106
		return -1;
107
	}
108
 
109
    /* set each plane as white */
110
    memset(r_plane, -1, X_PIXEL*Y_PIXEL);
111
    memset(g_plane, -1, X_PIXEL*Y_PIXEL);
112
    memset(b_plane, -1, X_PIXEL*Y_PIXEL);
113
    memset(t_plane, -1, X_PIXEL*Y_PIXEL);
114
 
115
	/* Initialize the printer */ /* see programmer manual for CP50 */
116
	fprintf(prn_stream,"\033\101");
117
    fprintf(prn_stream,"\033\106\010\001");
118
    fprintf(prn_stream,"\033\106\010\003");
119
 
120
    /* set number of copies */
121
    fprintf(prn_stream,"\033\116");
122
    num_copies = copies & 0xFF;
123
    fwrite(&num_copies, sizeof(char), 1, prn_stream);
124
 
125
    /* download image */
126
    hi_lines = lines >> 8;
127
    lo_lines = lines & 0xFF;
128
 
129
    fprintf(prn_stream,"\033\123\062");
130
    fwrite(&hi_lines, sizeof(char), 1, prn_stream);
131
    fwrite(&lo_lines, sizeof(char), 1, prn_stream);
132
    fprintf(prn_stream,"\001"); /* dummy */
133
 
134
	/* Print lines of graphics */
135
	while ( lnum <= last )
136
	   {
137
        int i, col;
138
		gdev_prn_copy_scan_lines(pdev, lnum, (byte *)out, line_size);
139
		/*fwrite(out, sizeof(char), line_size, prn_stream);*/
140
        for(i=0; i<X_PIXEL; i++)
141
        {
142
          col = (lnum-FIRST_LINE) * X_PIXEL + i;
143
          r_plane[col] = out[i*3+FIRST_COLUMN];
144
          g_plane[col] = out[i*3+1+FIRST_COLUMN];
145
          b_plane[col] = out[i*3+2+FIRST_COLUMN];
146
        }
147
		lnum ++;
148
	   }
149
 
150
    /* rotate each plane and download it */
151
    for(i=0;i<X_PIXEL;i++)
152
      for(j=Y_PIXEL-1;j>=0;j--)
153
        t_plane[(Y_PIXEL-1-j)+i*Y_PIXEL] = r_plane[i+j*X_PIXEL];
154
    fwrite(t_plane, sizeof(char), X_PIXEL*Y_PIXEL, prn_stream);
155
 
156
    for(i=0;i<X_PIXEL;i++)
157
      for(j=Y_PIXEL-1;j>=0;j--)
158
        t_plane[(Y_PIXEL-1-j)+i*Y_PIXEL] = g_plane[i+j*X_PIXEL]; 
159
    fwrite(t_plane, sizeof(char), X_PIXEL*Y_PIXEL, prn_stream);
160
 
161
    for(i=0;i<X_PIXEL;i++)
162
      for(j=Y_PIXEL-1;j>=0;j--)
163
        t_plane[(Y_PIXEL-1-j)+i*Y_PIXEL] = b_plane[i+j*X_PIXEL]; 
164
    fwrite(t_plane, sizeof(char), X_PIXEL*Y_PIXEL, prn_stream);
165
 
166
 
167
	gs_free(pdev->memory, (char *)out, line_size, 1, "cp50_print_page(out)");
168
    gs_free(pdev->memory, (char *)r_plane, X_PIXEL*Y_PIXEL, 1, "cp50_print_page(r_plane)");
169
    gs_free(pdev->memory, (char *)g_plane, X_PIXEL*Y_PIXEL, 1, "cp50_print_page(g_plane)");
170
    gs_free(pdev->memory, (char *)b_plane, X_PIXEL*Y_PIXEL, 1, "cp50_print_page(b_plane)");
171
    gs_free(pdev->memory, (char *)t_plane, X_PIXEL*Y_PIXEL, 1, "cp50_print_page(t_plane)");
172
 
173
	return 0;
174
}
175
 
176
int private 
177
cp50_output_page(gx_device *pdev, int num_copies, int flush)
178
{   int code, outcode, closecode;
179
 
180
    code = gdev_prn_open_printer(pdev, 1);
181
    if ( code < 0 ) return code;
182
 
183
    copies = num_copies; /* using global variable to pass */
184
 
185
    /* Print the accumulated page description. */
186
    outcode = (*ppdev->printer_procs.print_page)(ppdev, ppdev->file);
187
    if ( code < 0 ) return code;
188
 
189
    closecode = gdev_prn_close_printer(pdev);
190
    if ( code < 0 ) return code;
191
 
192
    if ( ppdev->buffer_space ) /* reinitialize clist for writing */
193
      code = (*gs_clist_device_procs.output_page)(pdev, num_copies, flush);
194
 
195
    if ( outcode < 0 ) return outcode;
196
    if ( closecode < 0 ) return closecode;
197
    if ( code < 0 ) return code;
198
    return gx_finish_output_page(pdev, num_copies, flush);
199
}
200
 
201
 
202
/* 24-bit color mappers (taken from gdevmem2.c). */
203
/* Note that Windows expects RGB values in the order B,G,R. */
204
 
205
/* Map a r-g-b color to a color index. */
206
private gx_color_index
207
cp50_rgb_color(gx_device *dev, const gx_color_value cv[])
208
{   
209
    gx_color_value red, green, blue;
210
 
211
    red = cv[0]; green = cv[1]; blue = cv[2];
212
    return ((ulong)gx_color_value_to_byte(red) << 16)+
213
           ((uint)gx_color_value_to_byte(green) << 8) +
214
           gx_color_value_to_byte(blue);
215
}
216
 
217
/* Map a color index to a r-g-b color. */
218
private int
219
cp50_color_rgb(gx_device *dev, gx_color_index color,
220
  gx_color_value prgb[3])
221
{   prgb[2] = gx_color_value_from_byte(color & 0xff);
222
    prgb[1] = gx_color_value_from_byte((color >> 8) & 0xff);
223
    prgb[0] = gx_color_value_from_byte(color >> 16);
224
    return 0;
225
}