72 #define SWAP_BALCK_WHEN_WHITE
89 static void setcmap(
PLStream *pls );
90 static void plD_init_cgm_Dev(
PLStream *pls );
102 #define use_experimental_hidden_line_hack
104 static int force_edges = 0;
105 static int disable_background = 0;
107 static DrvOpt cgm_options[] = { {
"force_edges",
DRV_INT, &force_edges,
"Force edges to be drawn on filled polygongs (0|1)" },
108 {
"no_paper",
DRV_INT, &disable_background,
"Disable background (0|1)" },
109 { NULL,
DRV_INT, NULL, NULL } };
126 int colour_index[256];
137 int last_line_colour;
139 int last_fill_colour;
146 int disable_background;
150 void plD_line_cgm(
PLStream *,
short,
short,
short,
short );
151 void plD_polyline_cgm(
PLStream *,
short *,
short *,
PLINT );
161 #ifndef ENABLE_DYNDRIVERS
162 pdt->
pl_MenuStr =
"CGM (Computer Graphics metafile) file";
190 if ( pls->
dev != NULL )
191 free( (
void *) pls->
dev );
193 pls->
dev = calloc( 1, (
size_t)
sizeof ( cgm_Dev ) );
194 if ( pls->
dev == NULL )
195 plexit(
"plD_init_cgm_Dev: Out of memory." );
197 dev = (cgm_Dev *) pls->
dev;
202 dev->force_edges = force_edges;
203 dev->disable_background = disable_background;
206 dev->fill_colour = dev->colour;
207 dev->last_fill_colour = -1;
208 dev->last_line_colour = -1;
230 if ( pls->
width < 1 )
240 plD_init_cgm_Dev( pls );
241 dev = (cgm_Dev *) pls->
dev;
247 plspage( 0., 0., 800, 600, 0, 0 );
255 #ifdef use_experimental_hidden_line_hack
257 if ( dev->cgmx > dev->cgmy )
259 dev->scale = (
PIXELS_X - 1 ) / dev->cgmx;
271 if ( pls->
xdpi <= 0 )
274 plspage( 4. * 25.4, 4. * 25.4, 0, 0, 0, 0 );
283 plP_setphy( 0, dev->scale * dev->cgmx, 0, dev->scale * dev->cgmy );
293 plD_line_cgm(
PLStream *pls,
short x1a,
short y1a,
short x2a,
short y2a )
295 cgm_Dev *dev = (cgm_Dev *) pls->
dev;
296 int x1 = x1a / dev->scale, y1 = y1a / dev->scale, x2 = x2a / dev->scale, y2 = y2a / dev->scale;
306 if ( dev->last_line_colour != dev->colour )
309 dev->last_line_colour = dev->colour;
312 cdLine( dev->im_out, x1, y1, x2, y2 );
322 plD_polyline_cgm(
PLStream *pls,
short *xa,
short *ya,
PLINT npts )
324 cgm_Dev *dev = (cgm_Dev *) pls->
dev;
328 if ( ( points = calloc( npts, (
size_t)
sizeof (
cdPoint ) ) ) == NULL )
330 plexit(
"Memory allocation error in \"plD_polyline_cgm\"" );
333 for ( i = 0; i < npts; i++ )
335 points[i].x = xa[i] / dev->scale;
336 points[i].y = ( ya[i] / dev->scale );
345 if ( dev->last_line_colour != dev->colour )
348 dev->last_line_colour = dev->colour;
365 cgm_Dev *dev = (cgm_Dev *) pls->
dev;
373 if ( ( points = calloc( pls->
dev_npts, (
size_t) sizeof (
cdPoint ) ) ) == NULL )
375 plexit(
"Memory allocation error in \"plD_fill_polygon_cgm\"" );
378 for ( i = 0; i < pls->
dev_npts; i++ )
380 points[i].x = pls->
dev_x[i] / dev->scale;
381 points[i].y = ( pls->
dev_y[i] / dev->scale );
392 if ( ( dev->fill_colour != dev->last_fill_colour ) || ( dev->force_edges == 1 ) )
402 if ( dev->force_edges == 1 )
408 dev->last_fill_colour = dev->fill_colour;
413 if ( dev->force_edges == 1 )
428 int i, ncol1 = pls->
ncol1;
429 int ncol0 = pls->
ncol0, total_colours;
431 cgm_Dev *dev = (cgm_Dev *) pls->
dev;
432 PLFLT tmp_colour_pos;
441 plwarn(
"Too many colours in cmap0." );
448 total_colours = ncol0 + ncol1;
453 ncol1 = total_colours - ncol0;
457 plexit(
"Problem setting colourmap in CGM driver." );
470 #ifdef SWAP_BALCK_WHEN_WHITE
484 if ( ( pls->
ncol0 > 15 ) && ( pls->
cmap0[0].
r > 227 ) && ( pls->
cmap0[0].
g > 227 ) && ( pls->
cmap0[0].
b > 227 ) )
486 if ( pls->
hack != 1 )
506 for ( i = 0; i < ncol0; i++ )
513 plwarn(
"Problem setting cmap0 in CGM driver." );
525 for ( i = 0; i < ncol1; i++ )
527 if ( ncol1 < pls->ncol1 )
537 tmp_colour_pos = i > 0 ? pls->
ncol1 * ( (
PLFLT) i / ncol1 ) : 0;
548 cmap1col.
r, cmap1col.
g, cmap1col.
b )
551 plwarn(
"Problem setting cmap1 in CGM driver." );
569 cgm_Dev *dev = (cgm_Dev *) pls->
dev;
570 PLFLT tmp_colour_pos;
579 dev->colour = pls->
icol0;
590 plwarn(
"Problem changing colour in \"PLSTATE_COLOR0\"" );
592 dev->colour = dev->totcol;
595 dev->fill_colour = dev->colour;
603 if ( dev->ncol1 < pls->
ncol1 )
606 dev->colour = pls->
ncol0 + (int) tmp_colour_pos;
611 dev->fill_colour = dev->colour;
668 dev = (cgm_Dev *) pls->
dev;
670 if ( pls->
page == 1 )
674 else if ( pls->
family != 1 )
701 if ( dev->disable_background != 1 )
724 cgm_Dev *dev = (cgm_Dev *) pls->
dev;
744 cgm_Dev *dev = (cgm_Dev *) pls->
dev;
752 dev->colour_index[i] = -1;
754 dev->fill_colour = dev->colour;
755 dev->last_fill_colour = -1;
756 dev->last_line_colour = -1;