15
15
#define sgi_prn_device(procs, dev_name, num_comp, depth, max_gray, max_color, print_page)\
16
16
{prn_device_body(gx_device_printer, procs, dev_name, \
17
DEFAULT_WIDTH_10THS, DEFAULT_HEIGHT_10THS, X_DPI, Y_DPI, \
19
num_comp, depth, max_gray, max_color, max_gray+1, max_color+1, \
17
DEFAULT_WIDTH_10THS, DEFAULT_HEIGHT_10THS, X_DPI, Y_DPI, \
19
num_comp, depth, max_gray, max_color, max_gray+1, max_color+1, \
22
22
static dev_proc_map_rgb_color(sgi_map_rgb_color);
23
23
static dev_proc_map_color_rgb(sgi_map_color_rgb);
39
39
red = cv[0]; green = cv[1]; blue = cv[2];
41
41
return ((red*max_value / gx_max_color_value) << (bitspercolor * 2)) +
42
((green*max_value / gx_max_color_value) << bitspercolor) +
43
(blue*max_value / gx_max_color_value);
42
((green*max_value / gx_max_color_value) << bitspercolor) +
43
(blue*max_value / gx_max_color_value);
47
47
sgi_map_color_rgb(gx_device *dev, gx_color_index color, ushort prgb[3])
48
48
{ ushort bitspercolor = dev->color_info.depth / 3;
49
ushort colormask = (1 << bitspercolor) - 1;
49
ushort colormask = (1 << bitspercolor) - 1;
51
prgb[0] = (ushort)(((color >> (bitspercolor * 2)) & colormask) *
52
(ulong)gx_max_color_value / colormask);
53
prgb[1] = (ushort)(((color >> bitspercolor) & colormask) *
54
(ulong)gx_max_color_value / colormask);
55
prgb[2] = (ushort)((color & colormask) *
56
(ulong)gx_max_color_value / colormask);
51
prgb[0] = (ushort)(((color >> (bitspercolor * 2)) & colormask) *
52
(ulong)gx_max_color_value / colormask);
53
prgb[1] = (ushort)(((color >> bitspercolor) & colormask) *
54
(ulong)gx_max_color_value / colormask);
55
prgb[2] = (ushort)((color & colormask) *
56
(ulong)gx_max_color_value / colormask);
60
60
typedef struct sgi_cursor_s {
68
68
/* write a short int to disk as big-endean */
69
69
static int putshort(unsigned int val, FILE *outf)
75
return fwrite(buf,2,1,outf);
75
return fwrite(buf,2,1,outf);
78
78
/* write an int to disk as big-endean */
79
79
static int putint(unsigned int val, FILE *outf)
87
return fwrite(buf,4,1,outf);
87
return fwrite(buf,4,1,outf);
90
90
/* write the header field by field in big-endian */
91
91
static void putheader(IMAGE *header, FILE *outf)
96
putshort(header->imagic, outf);
97
fputc(1, outf); /* RLE */
98
fputc(1, outf); /* bpp */
99
putshort(header->dim, outf);
100
putshort(header->xsize, outf);
101
putshort(header->ysize, outf);
102
putshort(header->zsize, outf);
104
putint(header->min_color, outf);
105
putint(header->max_color, outf);
106
putint(header->wastebytes, outf);
108
fwrite(header->name,80,1,outf);
110
putint(header->colormap, outf);
96
putshort(header->imagic, outf);
97
fputc(1, outf); /* RLE */
98
fputc(1, outf); /* bpp */
99
putshort(header->dim, outf);
100
putshort(header->xsize, outf);
101
putshort(header->ysize, outf);
102
putshort(header->zsize, outf);
104
putint(header->min_color, outf);
105
putint(header->max_color, outf);
106
putint(header->wastebytes, outf);
108
fwrite(header->name,80,1,outf);
110
putint(header->colormap, outf);
112
112
/* put the filler for the rest */
113
113
for (i=0; i<404; i++)
182
182
if (pdev->PageCount >= 1 && !pdev->file_is_new)
183
return_error(gs_error_rangecheck); /* support single page only, can't happen */
183
return_error(gs_error_rangecheck); /* support single page only, can't happen */
185
185
#define aref2(a,b) (a)*bdev->height+(b)
186
rowsizes=(int*)gs_malloc(pdev->memory, sizeof(int),3*bdev->height,"sgi_print_page");
186
rowsizes=(int*)gs_malloc(pdev->memory, sizeof(int),3*bdev->height,"sgi_print_page");
187
187
edata = (byte*)gs_malloc(pdev->memory, cur.line_size, 1, "sgi_begin_page");
189
189
if((code<0)||(rowsizes==(int*)NULL)||(edata==(byte*)NULL)) {
194
194
lastval = 512+4*6*bdev->height; /* skip offset table */
195
195
fseek(pstream,lastval,0);
196
196
for (separation=0; separation < 3; separation++)
198
cur.lnum = cur.dev->height-1;
202
while ( !(code=sgi_next_row(&cur)))
206
byte *curcol=cur.data;
207
byte *startcol=edata;
210
byte *iptr, *sptr, *optr, *ibufend;
211
for (bp = cur.data, x=0, shift = 8 - cur.bpp;
216
switch (cur.bpp >> 3)
218
case 3: pixel = (uint)*bp << 16; bp++;
219
case 2: pixel += (uint)*bp << 8; bp++;
220
case 1: pixel += *bp; bp++; break;
221
case 0: pixel = *bp >> shift;
222
if ((shift-=cur.bpp) < 0)
223
bp++, shift += 8; break;
226
b = pixel & mask; pixel >>= bpe;
227
g = pixel & mask; pixel >>= bpe;
231
case 0: *curcol++=r; break;
232
case 1: *curcol++=g; break;
233
case 2: *curcol++=b; break;
239
while(iptr<ibufend) {
242
while((iptr<ibufend)&&((iptr[-2]!=iptr[-1])||(iptr[-1]!=iptr[0])))
247
todo = count>126 ? 126:count;
255
while( (iptr<ibufend) && (*iptr == cc) )
259
todo = count>126 ? 126:count;
198
cur.lnum = cur.dev->height-1;
202
while ( !(code=sgi_next_row(&cur)))
206
byte *curcol=cur.data;
207
byte *startcol=edata;
210
byte *iptr, *sptr, *optr, *ibufend;
211
for (bp = cur.data, x=0, shift = 8 - cur.bpp;
216
switch (cur.bpp >> 3)
218
case 3: pixel = (uint)*bp << 16; bp++;
219
case 2: pixel += (uint)*bp << 8; bp++;
220
case 1: pixel += *bp; bp++; break;
221
case 0: pixel = *bp >> shift;
222
if ((shift-=cur.bpp) < 0)
223
bp++, shift += 8; break;
226
b = pixel & mask; pixel >>= bpe;
227
g = pixel & mask; pixel >>= bpe;
231
case 0: *curcol++=r; break;
232
case 1: *curcol++=g; break;
233
case 2: *curcol++=b; break;
239
while(iptr<ibufend) {
242
while((iptr<ibufend)&&((iptr[-2]!=iptr[-1])||(iptr[-1]!=iptr[0])))
247
todo = count>126 ? 126:count;
255
while( (iptr<ibufend) && (*iptr == cc) )
259
todo = count>126 ? 126:count;
266
rowsizes[aref2(separation,rownumber++)] = optr-startcol;
267
if (fwrite(startcol,1,optr-startcol,pstream) != optr-startcol) {
266
rowsizes[aref2(separation,rownumber++)] = optr-startcol;
267
if (fwrite(startcol,1,optr-startcol,pstream) != optr-startcol) {
268
268
code = gs_note_error(gs_error_ioerror);
273
273
fseek(pstream,512L,0);
274
274
for(separation=0; separation<3; separation++)
275
for(rownumber=0; rownumber<bdev->height; rownumber++)
276
{putint(lastval,pstream);
277
lastval+=rowsizes[aref2(separation,rownumber)];}
275
for(rownumber=0; rownumber<bdev->height; rownumber++)
276
{putint(lastval,pstream);
277
lastval+=rowsizes[aref2(separation,rownumber)];}
278
278
for(separation=0; separation<3; separation++)
279
for(rownumber=0; rownumber<bdev->height; rownumber++)
280
{lastval=rowsizes[aref2(separation,rownumber)];
281
putint(lastval,pstream);}
279
for(rownumber=0; rownumber<bdev->height; rownumber++)
280
{lastval=rowsizes[aref2(separation,rownumber)];
281
putint(lastval,pstream);}
283
283
gs_free(pdev->memory, (char*)cur.data, cur.line_size, 1,
284
"sgi_print_page(done)");
284
"sgi_print_page(done)");
285
285
gs_free(pdev->memory, (char*)edata, cur.line_size, 1, "sgi_print_page(done)");
286
286
gs_free(pdev->memory, (char*)rowsizes,4,3*bdev->height,"sgi_print_page(done)");
287
287
return (code < 0 ? code : 0);