72 #define SWAP_BALCK_WHEN_WHITE
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;
int plParseDrvOpts(DrvOpt *acc_opt)
int cdSetEdgeWidth(cdImagePtr im, int edwidth)
void(* plD_line_fp)(struct PLStream_struct *, short, short, short, short)
void(* plD_eop_fp)(struct PLStream_struct *)
void(* plD_state_fp)(struct PLStream_struct *, PLINT)
void(* plD_tidy_fp)(struct PLStream_struct *)
int cdSetLineType(cdImagePtr im, int lntype)
void plOpenFile(PLStream *pls)
void plCloseFile(PLStream *pls)
int cdImageCgm(cdImagePtr im, FILE *out)
void plGetFam(PLStream *pls)
void plcol_interp(PLStream *pls, PLColor *newcolor, int i, int ncol)
static void fill_polygon(PLStream *pls)
int cdSetLineColor(cdImagePtr im, int lncolor)
int cdRectangle(cdImagePtr im, int x1, int y1, int x2, int y2)
int cdSetEdgeColor(cdImagePtr im, int edcolor)
void plFamInit(PLStream *pls)
void(* plD_polyline_fp)(struct PLStream_struct *, short *, short *, PLINT)
void(* plD_esc_fp)(struct PLStream_struct *, PLINT, void *)
void(* plD_bop_fp)(struct PLStream_struct *)
int cdSetEdgeVis(cdImagePtr im, int edvis)
int cdImageDestroy(cdImagePtr im)
int cdPolyLine(cdImagePtr im, cdPointPtr p, int n)
int cdSetLineWidth(cdImagePtr im, int lnwidth)
int cdCgmNewPic(cdImagePtr im, int sticky)
int cdLine(cdImagePtr im, int x1, int y1, int x2, int y2)
void plP_setpxl(PLFLT xpmm, PLFLT ypmm)
int cdSetFillStyle(cdImagePtr im, int instyle)
#define PLDLLIMPEXP_DRIVER
void plP_setphy(PLINT xmin, PLINT xmax, PLINT ymin, PLINT ymax)
int cdImageColorAllocate(cdImagePtr im, int r, int g, int b)
int cdPolygon(cdImagePtr im, cdPointPtr p, int n)
PLDLLIMPEXP_DRIVER void plD_dispatch_init_cgm(PLDispatchTable *pdt)
void plwarn(const char *errormsg)
int cdImageColorClear(cdImagePtr im)
int cdSetFillColor(cdImagePtr im, int incolor)
cdImagePtr cdImageCreate(int sx, int sy)
plD_polyline_fp pl_polyline
void(* plD_init_fp)(struct PLStream_struct *)
void plexit(const char *errormsg)