106
106
mgr_begin_page(gx_device_mgr *bdev, FILE *pstream, mgr_cursor *pcur)
107
107
{ struct b_header head;
109
gdev_prn_raster((gx_device_printer *)bdev) + 3;
110
byte *data = (byte *)gs_malloc(bdev->memory, line_size, 1, "mgr_begin_page");
112
return_error(gs_error_VMerror);
114
/* Write the header */
115
B_PUTHDR8(&head, bdev->width, bdev->height, bdev->mgr_depth);
116
fprintf(pstream, "");
117
if ( fwrite(&head, 1, sizeof(head), pstream) < sizeof(head) )
118
return_error(gs_error_ioerror);
121
/* Initialize the cursor. */
123
pcur->bpp = bdev->color_info.depth;
124
pcur->line_size = line_size;
109
gdev_prn_raster((gx_device_printer *)bdev) + 3;
110
byte *data = (byte *)gs_malloc(bdev->memory, line_size, 1, "mgr_begin_page");
112
return_error(gs_error_VMerror);
114
/* Write the header */
115
B_PUTHDR8(&head, bdev->width, bdev->height, bdev->mgr_depth);
116
fprintf(pstream, "");
117
if ( fwrite(&head, 1, sizeof(head), pstream) < sizeof(head) )
118
return_error(gs_error_ioerror);
121
/* Initialize the cursor. */
123
pcur->bpp = bdev->color_info.depth;
124
pcur->line_size = line_size;
130
130
/* Advance to the next row. Return 0 if more, 1 if done. */
132
132
mgr_next_row(mgr_cursor *pcur)
133
133
{ if ( pcur->lnum >= pcur->dev->height )
134
{ gs_free(((gx_device_printer *)pcur->dev)->memory,
135
(char *)pcur->data, pcur->line_size, 1,
136
"mgr_next_row(done)");
139
gdev_prn_copy_scan_lines((gx_device_printer *)pcur->dev,
140
pcur->lnum++, pcur->data, pcur->line_size);
134
{ gs_free(((gx_device_printer *)pcur->dev)->memory,
135
(char *)pcur->data, pcur->line_size, 1,
136
"mgr_next_row(done)");
139
gdev_prn_copy_scan_lines((gx_device_printer *)pcur->dev,
140
pcur->lnum++, pcur->data, pcur->line_size);
144
144
/* ------ Individual page printing routines ------ */
150
150
mgr_print_page(gx_device_printer *pdev, FILE *pstream)
151
151
{ mgr_cursor cur;
153
int code = mgr_begin_page(bdev, pstream, &cur);
154
if ( code < 0 ) return code;
156
mgr_wide = bdev->width;
158
mgr_wide += 8 - (mgr_wide & 7);
160
while ( !(code = mgr_next_row(&cur)) )
161
{ if ( fwrite(cur.data, sizeof(char), mgr_wide / 8, pstream) <
153
int code = mgr_begin_page(bdev, pstream, &cur);
154
if ( code < 0 ) return code;
156
mgr_wide = bdev->width;
158
mgr_wide += 8 - (mgr_wide & 7);
160
while ( !(code = mgr_next_row(&cur)) )
161
{ if ( fwrite(cur.data, sizeof(char), mgr_wide / 8, pstream) <
163
return_error(gs_error_ioerror);
165
return (code < 0 ? code : 0);
163
return_error(gs_error_ioerror);
165
return (code < 0 ? code : 0);
169
168
/* Print a gray-mapped page. */
171
170
mgrN_print_page(gx_device_printer *pdev, FILE *pstream)
172
171
{ mgr_cursor cur;
173
int i = 0, j, k, mgr_wide;
175
byte *bp, *data = NULL, *dp;
176
gx_device_mgr *mgr = (gx_device_mgr *)pdev;
178
int code = mgr_begin_page(bdev, pstream, &cur);
179
if ( code < 0 ) return code;
181
mgr_wide = bdev->width;
182
if ( bdev->mgr_depth == 2 && mgr_wide & 3 )
172
int i = 0, j, k, mgr_wide;
174
byte *bp, *data = NULL, *dp;
175
gx_device_mgr *mgr = (gx_device_mgr *)pdev;
177
int code = mgr_begin_page(bdev, pstream, &cur);
178
if ( code < 0 ) return code;
180
mgr_wide = bdev->width;
181
if ( bdev->mgr_depth == 2 && mgr_wide & 3 )
183
182
mgr_wide += 4 - (mgr_wide & 3);
184
if ( bdev->mgr_depth == 4 && mgr_wide & 1 )
183
if ( bdev->mgr_depth == 4 && mgr_wide & 1 )
186
mgr_line_size = mgr_wide / ( 8 / bdev->mgr_depth );
185
mgr_line_size = mgr_wide / ( 8 / bdev->mgr_depth );
188
if ( bdev->mgr_depth == 4 )
187
if ( bdev->mgr_depth == 4 )
189
188
for ( i = 0; i < 16; i++ ) {
190
mgr->bgreytable[i] = mgrlut[LUT_BGREY][RGB_RED][i];
191
mgr->bgreybacktable[mgr->bgreytable[i]] = i;
189
mgr->bgreytable[i] = mgrlut[LUT_BGREY][RGB_RED][i];
190
mgr->bgreybacktable[mgr->bgreytable[i]] = i;
194
if ( bdev->mgr_depth == 8 ) {
193
if ( bdev->mgr_depth == 8 ) {
195
194
for ( i = 0; i < 16; i++ ) {
196
mgr->bgrey256table[i] = mgrlut[LUT_BGREY][RGB_RED][i] << 4;
197
mgr->bgrey256backtable[mgr->bgrey256table[i]] = i;
195
mgr->bgrey256table[i] = mgrlut[LUT_BGREY][RGB_RED][i] << 4;
196
mgr->bgrey256backtable[mgr->bgrey256table[i]] = i;
199
198
for ( i = 16,j = 0; i < 256; i++ ) {
200
for ( k = 0; k < 16; k++ )
199
for ( k = 0; k < 16; k++ )
201
200
if ( j == mgrlut[LUT_BGREY][RGB_RED][k] << 4 ) {
205
mgr->bgrey256table[i] = j;
206
mgr->bgrey256backtable[j++] = i;
204
mgr->bgrey256table[i] = j;
205
mgr->bgrey256backtable[j++] = i;
210
if ( bdev->mgr_depth != 8 )
211
data = (byte *)gs_malloc(pdev->memory, mgr_line_size, 1, "mgrN_print_page");
213
while ( !(code = mgr_next_row(&cur)) )
215
switch (bdev->mgr_depth) {
217
for (i = 0,dp = data,bp = cur.data; i < mgr_line_size; i++) {
218
*dp = *(bp++) & 0xc0;
219
*dp |= (*(bp++) & 0xc0) >> 2;
220
*dp |= (*(bp++) & 0xc0) >> 4;
209
if ( bdev->mgr_depth != 8 )
210
data = (byte *)gs_malloc(pdev->memory, mgr_line_size, 1, "mgrN_print_page");
212
while ( !(code = mgr_next_row(&cur)) )
214
switch (bdev->mgr_depth) {
216
for (i = 0,dp = data,bp = cur.data; i < mgr_line_size; i++) {
217
*dp = *(bp++) & 0xc0;
218
*dp |= (*(bp++) & 0xc0) >> 2;
219
*dp |= (*(bp++) & 0xc0) >> 4;
221
220
*(dp++) |= (*(bp++) & 0xc0) >> 6;
223
if ( fwrite(data, sizeof(byte), mgr_line_size, pstream) < mgr_line_size )
224
return_error(gs_error_ioerror);
222
if ( fwrite(data, sizeof(byte), mgr_line_size, pstream) < mgr_line_size )
223
return_error(gs_error_ioerror);
228
for (i = 0,dp = data, bp = cur.data; i < mgr_line_size; i++) {
229
*dp = mgr->bgreybacktable[*(bp++) >> 4] << 4;
227
for (i = 0,dp = data, bp = cur.data; i < mgr_line_size; i++) {
228
*dp = mgr->bgreybacktable[*(bp++) >> 4] << 4;
230
229
*(dp++) |= mgr->bgreybacktable[*(bp++) >> 4];
232
if ( fwrite(data, sizeof(byte), mgr_line_size, pstream) < mgr_line_size )
233
return_error(gs_error_ioerror);
237
for (i = 0,bp = cur.data; i < mgr_line_size; i++, bp++)
238
*bp = mgr->bgrey256backtable[*bp];
239
if ( fwrite(cur.data, sizeof(cur.data[0]), mgr_line_size, pstream)
241
return_error(gs_error_ioerror);
245
if (bdev->mgr_depth != 8)
246
gs_free(bdev->memory, (char *)data, mgr_line_size, 1, "mgrN_print_page(done)");
248
if (bdev->mgr_depth == 2) {
231
if ( fwrite(data, sizeof(byte), mgr_line_size, pstream) < mgr_line_size )
232
return_error(gs_error_ioerror);
236
for (i = 0,bp = cur.data; i < mgr_line_size; i++, bp++)
237
*bp = mgr->bgrey256backtable[*bp];
238
if ( fwrite(cur.data, sizeof(cur.data[0]), mgr_line_size, pstream)
240
return_error(gs_error_ioerror);
244
if (bdev->mgr_depth != 8)
245
gs_free(bdev->memory, (char *)data, mgr_line_size, 1, "mgrN_print_page(done)");
247
if (bdev->mgr_depth == 2) {
249
248
for (i = 0; i < 4; i++) {
250
249
mgr->clut[i].colnum = i;
251
250
mgr->clut[i].red = mgr->clut[i].green = mgr->clut[i].blue = clut2mgr(i, 2);
254
if (bdev->mgr_depth == 4) {
253
if (bdev->mgr_depth == 4) {
255
254
for (i = 0; i < 16; i++) {
256
255
mgr->clut[i].colnum = i;
257
256
mgr->clut[i].red = mgr->clut[i].green = mgr->clut[i].blue = clut2mgr(mgr->bgreytable[i], 4);
260
if (bdev->mgr_depth == 8) {
259
if (bdev->mgr_depth == 8) {
261
260
for (i = 0; i < 256; i++) {
262
261
mgr->clut[i].colnum = i;
263
262
mgr->clut[i].red = mgr->clut[i].green = mgr->clut[i].blue = clut2mgr(mgr->bgrey256table[i], 8);
266
265
#if !arch_is_big_endian
267
swap_bwords( (unsigned char *) mgr->clut, sizeof( struct nclut ) * i );
266
swap_bwords( (unsigned char *) mgr->clut, sizeof( struct nclut ) * i );
269
if ( fwrite(&mgr->clut, sizeof(struct nclut), i, pstream) < i )
268
if ( fwrite(&mgr->clut, sizeof(struct nclut), i, pstream) < i )
270
269
return_error(gs_error_ioerror);
271
return (code < 0 ? code : 0);
270
return (code < 0 ? code : 0);
274
273
/* Print a color page. */
276
275
cmgrN_print_page(gx_device_printer *pdev, FILE *pstream)
277
276
{ mgr_cursor cur;
278
int i = 0, j, mgr_wide, r, g, b, colors8 = 0;
280
byte *bp, *data, *dp;
282
unsigned char table[256], backtable[256];
283
gx_device_mgr *mgr = (gx_device_mgr *)pdev;
285
int code = mgr_begin_page(bdev, pstream, &cur);
286
if ( code < 0 ) return code;
288
mgr_wide = bdev->width;
289
if (bdev->mgr_depth == 4 && mgr_wide & 1)
277
int i = 0, j, mgr_wide, r, g, b, colors8 = 0;
279
byte *bp, *data, *dp;
281
unsigned char table[256], backtable[256];
282
gx_device_mgr *mgr = (gx_device_mgr *)pdev;
284
int code = mgr_begin_page(bdev, pstream, &cur);
285
if ( code < 0 ) return code;
287
mgr_wide = bdev->width;
288
if (bdev->mgr_depth == 4 && mgr_wide & 1)
291
mgr_line_size = mgr_wide / (8 / bdev->mgr_depth);
292
data = (byte *)gs_malloc(pdev->memory, mgr_line_size, 1, "cmgrN_print_page");
290
mgr_line_size = mgr_wide / (8 / bdev->mgr_depth);
291
data = (byte *)gs_malloc(pdev->memory, mgr_line_size, 1, "cmgrN_print_page");
294
if ( bdev->mgr_depth == 8 ) {
293
if ( bdev->mgr_depth == 8 ) {
295
294
memset( table, 0, sizeof(table) );
296
295
for ( r = 0; r <= 6; r++ )
297
for ( g = 0; g <= 6; g++ )
298
for ( b = 0; b <= 6; b++ )
299
if ( r == g && g == b )
296
for ( g = 0; g <= 6; g++ )
297
for ( b = 0; b <= 6; b++ )
298
if ( r == g && g == b )
300
299
table[ r + (256-7) ] = 1;
302
301
table[ (r << 5) + (g << 2) + (b >> 1) ] = 1;
303
302
for ( i = j = 0; i < sizeof(table); i++ )
304
if ( table[i] == 1 ) {
303
if ( table[i] == 1 ) {
305
304
backtable[i] = j;
310
while ( !(code = mgr_next_row(&cur)) )
312
switch (bdev->mgr_depth) {
314
for (i = 0,dp = data, bp = cur.data; i < mgr_line_size; i++) {
309
while ( !(code = mgr_next_row(&cur)) )
311
switch (bdev->mgr_depth) {
313
for (i = 0,dp = data, bp = cur.data; i < mgr_line_size; i++) {
316
315
*(dp++) |= *(bp++) & 0x0f;
318
if ( fwrite(data, sizeof(byte), mgr_line_size, pstream) < mgr_line_size )
319
return_error(gs_error_ioerror);
323
for (i = 0,bp = cur.data; i < mgr_line_size; i++, bp++)
324
*bp = backtable[*bp] + MGR_RESERVEDCOLORS;
325
if ( fwrite(cur.data, sizeof(cur.data[0]), mgr_line_size, pstream) < mgr_line_size )
326
return_error(gs_error_ioerror);
330
gs_free(bdev->memory, (char *)data, mgr_line_size, 1, "cmgrN_print_page(done)");
332
if (bdev->mgr_depth == 4) {
317
if ( fwrite(data, sizeof(byte), mgr_line_size, pstream) < mgr_line_size )
318
return_error(gs_error_ioerror);
322
for (i = 0,bp = cur.data; i < mgr_line_size; i++, bp++)
323
*bp = backtable[*bp] + MGR_RESERVEDCOLORS;
324
if ( fwrite(cur.data, sizeof(cur.data[0]), mgr_line_size, pstream) < mgr_line_size )
325
return_error(gs_error_ioerror);
329
gs_free(bdev->memory, (char *)data, mgr_line_size, 1, "cmgrN_print_page(done)");
331
if (bdev->mgr_depth == 4) {
333
332
for (i = 0; i < 16; i++) {
334
333
pc_4bit_map_color_rgb((gx_device *)0, (gx_color_index) i, prgb);
335
334
mgr->clut[i].colnum = i;
336
335
mgr->clut[i].red = clut2mgr(prgb[0], 16);
337
336
mgr->clut[i].green = clut2mgr(prgb[1], 16);
338
337
mgr->clut[i].blue = clut2mgr(prgb[2], 16);
341
if (bdev->mgr_depth == 8) {
340
if (bdev->mgr_depth == 8) {
342
341
for (i = 0; i < colors8; i++) {
343
342
mgr_8bit_map_color_rgb((gx_device *)0, (gx_color_index)