void c_plcont(PLFLT **f, PLINT nx, PLINT ny, PLINT kx, PLINT lx, PLINT ky, PLINT ly, PLFLT *clevel, PLINT nlevel, void (*pltr) (PLFLT, PLFLT, PLFLT *, PLFLT *, PLPointer), PLPointer pltr_data) { PLfGrid2 grid; grid.f = f; plfcont(plf2eval2, (PLPointer) &grid, nx, ny, kx, lx, ky, ly, clevel, nlevel, pltr, pltr_data); }
void PLCONT7(PLFLT *z, PLINT *nx, PLINT *ny, PLINT *kx, PLINT *lx, PLINT *ky, PLINT *ly, PLFLT *clevel, PLINT *nlevel, PLFLT *ftr) { PLfGrid fgrid; fgrid.nx = *nx; fgrid.ny = *ny; fgrid.f = z; plfcont(plf2evalr, (void *) &fgrid, *nx, *ny, *kx, *lx, *ky, *ly, clevel, *nlevel, pltr, (void *) ftr); }
void PLCON27(PLFLT *z, PLINT *nx, PLINT *ny, PLINT *kx, PLINT *lx, PLINT *ky, PLINT *ly, PLFLT *clevel, PLINT *nlevel, PLFLT *xg, PLFLT *yg) { PLfGrid fgrid; PLcGrid cgrid; fgrid.nx = *nx; fgrid.ny = *ny; fgrid.f = z; cgrid.nx = *nx; cgrid.ny = *ny; cgrid.xg = xg; cgrid.yg = yg; plfcont(plf2evalr, (void *) &fgrid, *nx, *ny, *kx, *lx, *ky, *ly, clevel, *nlevel, pltr2f, (void *) &cgrid); }
void plfshades( PLF2OPS zops, PLPointer zp, PLINT nx, PLINT ny, PLINT ( *defined )( PLFLT, PLFLT ), PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax, const PLFLT *clevel, PLINT nlevel, PLFLT fill_width, PLINT cont_color, PLFLT cont_width, void ( *fill )( PLINT, const PLFLT *, const PLFLT * ), PLINT rectangular, void ( *pltr )( PLFLT, PLFLT, PLFLT *, PLFLT *, PLPointer ), PLPointer pltr_data ) { PLFLT shade_min, shade_max, shade_color; PLINT i, init_color; PLFLT init_width, color_min, color_max, color_range; // Color range to use color_min = plsc->cmap1_min; color_max = plsc->cmap1_max; color_range = color_max - color_min; for ( i = 0; i < nlevel - 1; i++ ) { shade_min = clevel[i]; shade_max = clevel[i + 1]; shade_color = color_min + i / (PLFLT) ( nlevel - 2 ) * color_range; // The constants in order mean // (1) color map1, // (0, 0, 0, 0) all edge effects will be done with plcont rather // than the normal plshade drawing which gets partially blocked // when sequential shading is done as in the present case plfshade1( zops, zp, nx, ny, defined, xmin, xmax, ymin, ymax, shade_min, shade_max, 1, shade_color, fill_width, 0, 0, 0, 0, fill, rectangular, pltr, pltr_data ); } if ( cont_color > 0 && cont_width > 0 ) { init_color = plsc->icol0; init_width = plsc->width; plcol0( cont_color ); plwidth( cont_width ); if ( pltr ) { plfcont( zops->f2eval, zp, nx, ny, 1, nx, 1, ny, clevel, nlevel, pltr, pltr_data ); } else { // For this case use the same interpretation that occurs internally // for plshade. That is set up x and y grids that map from the // index ranges to xmin, xmax, ymin, ymax, and use those grids // for the plcont call. // PLcGrid cgrid1; PLFLT *x, *y; cgrid1.nx = nx; cgrid1.ny = ny; x = (PLFLT *) malloc( (size_t) nx * sizeof ( PLFLT ) ); if ( x == NULL ) plexit( "plfshades: Out of memory for x" ); cgrid1.xg = x; for ( i = 0; i < nx; i++ ) cgrid1.xg[i] = xmin + ( xmax - xmin ) * (float) i / (float) ( nx - 1 ); y = (PLFLT *) malloc( (size_t) ny * sizeof ( PLFLT ) ); if ( y == NULL ) plexit( "plfshades: Out of memory for y" ); cgrid1.yg = y; for ( i = 0; i < ny; i++ ) cgrid1.yg[i] = ymin + ( ymax - ymin ) * (float) i / (float) ( ny - 1 ); plfcont( zops->f2eval, zp, nx, ny, 1, nx, 1, ny, clevel, nlevel, pltr1, (void *) &cgrid1 ); free( x ); free( y ); } plcol0( init_color ); plwidth( init_width ); } }