/*-------------------------------------------------------------------------- * void common_init( PLStream *pls ) * * Basic initialization for all devices. *--------------------------------------------------------------------------*/ wxPLDevBase* common_init( PLStream *pls ) { // Log_Verbose( "common_init()" ); wxPLDevBase* dev; /* default options */ static PLINT freetype=-1; static PLINT smooth_text=1; static PLINT text=-1; static PLINT hrshsym = 0; /* default backend uses wxGraphicsContext, if not available the agg library will be used, if not available the basic backend will be used. */ static PLINT backend=wxBACKEND_DC; #if wxUSE_GRAPHICS_CONTEXT backend=wxBACKEND_GC; #else #ifdef HAVE_AGG backend=wxBACKEND_AGG; #endif #endif DrvOpt wx_options[] = { #ifdef HAVE_FREETYPE {"freetype", DRV_INT, &freetype, "Use FreeType library"}, {"smooth", DRV_INT, &smooth_text, "Turn text smoothing on (1) or off (0)"}, #endif {"hrshsym", DRV_INT, &hrshsym, "Use Hershey symbol set (hrshsym=0|1)"}, {"backend", DRV_INT, &backend, "Choose backend: (0) standard, (1) using AGG library, (2) using wxGraphicsContext"}, {"text", DRV_INT, &text, "Use own text routines (text=0|1)"}, {NULL, DRV_INT, NULL, NULL} }; /* Check for and set up driver options */ plParseDrvOpts( wx_options ); /* allocate memory for the device storage */ switch( backend ) { case wxBACKEND_GC: /* in case wxGraphicsContext isn't available, the next backend (agg if available) in this list will be used */ #if wxUSE_GRAPHICS_CONTEXT dev = new wxPLDevGC; /* by default the own text routines are used for wxGC */ if(text==-1) text=1; freetype = 0; /* this backend is vector oriented and doesn't know pixels */ break; #endif case wxBACKEND_AGG: /* in case the agg library isn't available, the standard backend will be used */ #ifdef HAVE_AGG dev = new wxPLDevAGG; /* by default the freetype text routines are used for wxAGG */ text = 0; /* text processing doesn't work yet for the AGG backend */ if(freetype==-1) freetype=1; break; #endif default: dev = new wxPLDevDC; /* by default the own text routines are used for wxDC */ if(text==-1) if(freetype!=1) text=1; else text=0; if(freetype==-1) freetype=0; break; } if( dev == NULL) { plexit( "Insufficient memory" ); } pls->dev = (void*)dev; /* be verbose and write out debug messages */ #ifdef _DEBUG pls->verbose = 1; pls->debug = 1; #else pls->verbose = 0; pls->debug = 0; #endif pls->color = 1; /* Is a color device */ pls->dev_fill0 = 1; /* Can handle solid fills */ pls->dev_fill1 = 0; /* Can't handle pattern fills */ pls->dev_dash = 0; pls->dev_clear = 1; /* driver supports clear */ if( text ) { pls->dev_text = 1; /* want to draw text */ pls->dev_unicode = 1; /* want unicode */ if( hrshsym ) pls->dev_hrshsym = 1; } #ifdef HAVE_FREETYPE /* own text routines have higher priority over freetype if text and freetype option are set to 1 */ if( !text) { dev->smooth_text=smooth_text; dev->freetype=freetype; } if( dev->freetype ) { pls->dev_text = 1; /* want to draw text */ pls->dev_unicode = 1; /* want unicode */ if( hrshsym ) pls->dev_hrshsym = 1; init_freetype_lv1( pls ); FT_Data* FT=(FT_Data *)pls->FT; FT->want_smooth_text=smooth_text; } #endif /* initialize frame size and position */ if( pls->xlength <= 0 || pls->ylength <=0 ) plspage( 0.0, 0.0, (PLINT)(CANVAS_WIDTH*DEVICE_PIXELS_PER_IN), (PLINT)(CANVAS_HEIGHT*DEVICE_PIXELS_PER_IN), 0, 0 ); dev->width=pls->xlength; dev->height=pls->ylength; dev->clipminx=pls->xlength; dev->clipminy=pls->ylength; if( pls->xoffset!=0 || pls->yoffset!=0) { dev->xpos = (int)(pls->xoffset); dev->ypos = (int)(pls->yoffset); } /* If portrait mode, apply a rotation and set freeaspect */ if( pls->portrait ) { plsdiori( (PLFLT)(4 - ORIENTATION) ); pls->freeaspect = 1; } /* Set the number of pixels per mm */ plP_setpxl( (PLFLT)VIRTUAL_PIXELS_PER_MM, (PLFLT)VIRTUAL_PIXELS_PER_MM ); /* Set up physical limits of plotting device (in drawing units) */ plP_setphy( (PLINT)0, (PLINT)(CANVAS_WIDTH*VIRTUAL_PIXELS_PER_IN), (PLINT)0, (PLINT)(CANVAS_HEIGHT*VIRTUAL_PIXELS_PER_IN) ); /* get physical device limits coordinates */ plP_gphy( &dev->xmin, &dev->xmax, &dev->ymin, &dev->ymax ); /* setting scale factors */ dev->scalex=(PLFLT)(dev->xmax-dev->xmin)/(dev->width); dev->scaley=(PLFLT)(dev->ymax-dev->ymin)/(dev->height); /* set dpi */ plspage(VIRTUAL_PIXELS_PER_IN/dev->scalex, VIRTUAL_PIXELS_PER_IN/dev->scaley, 0, 0, 0, 0); #ifdef HAVE_FREETYPE if( dev->freetype ) init_freetype_lv2( pls ); #endif /* find out what file drivers are available */ plgFileDevs( &dev->devDesc, &dev->devName, &dev->ndev ); return dev; }
void c_plaxes(PLFLT x0, PLFLT y0, const char *xopt, PLFLT xtick, PLINT nxsub, const char *yopt, PLFLT ytick, PLINT nysub) { PLINT lax, lbx, lcx, lgx, lix, llx, lsx, ltx; PLINT lay, lby, lcy, lgy, liy, lly, lsy, lty; PLINT xmajor, xminor, ymajor, yminor; PLINT i, i1x, i2x, i3x, i4x, i1y, i2y, i3y, i4y; PLINT nxsub1, nysub1; PLINT lxmin, lxmax, lymin, lymax; PLINT pxmin, pxmax, pymin, pymax; PLINT vppxmi, vppxma, vppymi, vppyma; PLFLT xtick1, ytick1, vpwxmi, vpwxma, vpwymi, vpwyma; PLFLT vpwxmin, vpwxmax, vpwymin, vpwymax; PLFLT xp0, yp0, tn, tp, temp; if (plsc->level < 3) { plabort("plbox: Please set up window first"); return; } /* Open the clip limits to the subpage limits */ plP_gclp(&lxmin, &lxmax, &lymin, &lymax); plP_gphy(&pxmin, &pxmax, &pymin, &pymax); plP_sclp(pxmin, pxmax, pymin, pymax); vppxmi = plsc->vppxmi; vppxma = plsc->vppxma; vppymi = plsc->vppymi; vppyma = plsc->vppyma; /* Convert world coordinates to physical */ xp0 = plP_wcpcx(x0); yp0 = plP_wcpcy(y0); /* Set plot options from input */ lax = plP_stsearch(xopt, 'a'); lbx = plP_stsearch(xopt, 'b'); lcx = plP_stsearch(xopt, 'c'); lgx = plP_stsearch(xopt, 'g'); lix = plP_stsearch(xopt, 'i'); llx = plP_stsearch(xopt, 'l'); lsx = plP_stsearch(xopt, 's'); ltx = plP_stsearch(xopt, 't'); lay = plP_stsearch(yopt, 'a'); lby = plP_stsearch(yopt, 'b'); lcy = plP_stsearch(yopt, 'c'); lgy = plP_stsearch(yopt, 'g'); liy = plP_stsearch(yopt, 'i'); lly = plP_stsearch(yopt, 'l'); lsy = plP_stsearch(yopt, 's'); lty = plP_stsearch(yopt, 't'); /* Tick and subtick sizes in device coords */ xmajor = MAX(ROUND(plsc->majht * plsc->ypmm), 1); ymajor = MAX(ROUND(plsc->majht * plsc->xpmm), 1); xminor = MAX(ROUND(plsc->minht * plsc->ypmm), 1); yminor = MAX(ROUND(plsc->minht * plsc->xpmm), 1); nxsub1 = nxsub; nysub1 = nysub; xtick1 = llx ? 1.0 : xtick; ytick1 = lly ? 1.0 : ytick; plgvpw(&vpwxmin, &vpwxmax, &vpwymin, &vpwymax); /* n.b. large change; vpwxmi always numerically less than vpwxma, and * similarly for vpwymi */ vpwxmi = (vpwxmax > vpwxmin) ? vpwxmin : vpwxmax; vpwxma = (vpwxmax > vpwxmin) ? vpwxmax : vpwxmin; vpwymi = (vpwymax > vpwymin) ? vpwymin : vpwymax; vpwyma = (vpwymax > vpwymin) ? vpwymax : vpwymin; lax = lax && vpwymi < y0 && y0 < vpwyma ; lay = lay && vpwxmi < x0 && x0 < vpwxma ; /* Calculate tick spacing */ if (ltx || lgx) pldtik(vpwxmi, vpwxma, &xtick1, &nxsub1); if (lty || lgy) pldtik(vpwymi, vpwyma, &ytick1, &nysub1); /* n.b. large change; xtick1, nxsub1, ytick1, nysub1 always positive. */ /* Set up tick variables */ if (lix) { i1x = xminor; i2x = 0; i3x = xmajor; i4x = 0; } else { i1x = 0; i2x = xminor; i3x = 0; i4x = xmajor; } if (liy) { i1y = yminor; i2y = 0; i3y = ymajor; i4y = 0; } else { i1y = 0; i2y = yminor; i3y = 0; i4y = ymajor; } /* Draw the bottom edge of the box */ if (lbx) { plP_movphy(vppxmi, vppymi); if (ltx) { tp = xtick1 * floor(vpwxmi / xtick1); for (;;) { tn = tp + xtick1; if (lsx) { if (llx) { for (i = 0; i <= 7; i++) { temp = tp + xlog[i]; if (BETW(temp, vpwxmi, vpwxma)) plxtik(plP_wcpcx(temp), vppymi, i1x, i2x); } } else { for (i = 1; i <= nxsub1 - 1; i++) { temp = tp + i * xtick1 / nxsub1; if (BETW(temp, vpwxmi, vpwxma)) plxtik(plP_wcpcx(temp), vppymi, i1x, i2x); } } } if (!BETW(tn, vpwxmi, vpwxma)) break; plxtik(plP_wcpcx(tn), vppymi, i3x, i4x); tp = tn; } } plP_draphy(vppxma, vppymi); } /* Draw right-hand edge of box */ if (lcy) { plP_movphy(vppxma, vppymi); if (lty) { tp = ytick1 * floor(vpwymi / ytick1); for (;;) { tn = tp + ytick1; if (lsy) { if (lly) { for (i = 0; i <= 7; i++) { temp = tp + xlog[i]; if (BETW(temp, vpwymi, vpwyma)) plytik(vppxma, plP_wcpcy(temp), i2y, i1y); } } else { for (i = 1; i <= nysub1 - 1; i++) { temp = tp + i * ytick1 / nysub1; if (BETW(temp, vpwymi, vpwyma)) plytik(vppxma, plP_wcpcy(temp), i2y, i1y); } } } if (!BETW(tn, vpwymi, vpwyma)) break; plytik(vppxma, plP_wcpcy(tn), i4y, i3y); tp = tn; } } plP_draphy(vppxma, vppyma); } /* Draw the top edge of the box */ if (lcx) { plP_movphy(vppxma, vppyma); if (ltx) { tp = xtick1 * (floor(vpwxma / xtick1) + 1); for (;;) { tn = tp - xtick1; if (lsx) { if (llx) { for (i = 7; i >= 0; i--) { temp = tn + xlog[i]; if (BETW(temp, vpwxmi, vpwxma)) plxtik(plP_wcpcx(temp), vppyma, i2x, i1x); } } else { for (i = nxsub1 - 1; i >= 1; i--) { temp = tn + i * xtick1 / nxsub1; if (BETW(temp, vpwxmi, vpwxma)) plxtik(plP_wcpcx(temp), vppyma, i2x, i1x); } } } if (!BETW(tn, vpwxmi, vpwxma)) break; plxtik(plP_wcpcx(tn), vppyma, i4x, i3x); tp = tn; } } plP_draphy(vppxmi, vppyma); } /* Draw left-hand edge of box */ if (lby) { plP_movphy(vppxmi, vppyma); if (lty) { tp = ytick1 * (floor(vpwyma / ytick1) + 1); for (;;) { tn = tp - ytick1; if (lsy) { if (lly) { for (i = 7; i >= 0; i--) { temp = tn + xlog[i]; if (BETW(temp, vpwymi, vpwyma)) plytik(vppxmi, plP_wcpcy(temp), i1y, i2y); } } else { for (i = nysub1 - 1; i >= 1; i--) { temp = tn + i * ytick1 / nysub1; if (BETW(temp, vpwymi, vpwyma)) plytik(vppxmi, plP_wcpcy(temp), i1y, i2y); } } } if (!BETW(tn, vpwymi, vpwyma)) break; plytik(vppxmi, plP_wcpcy(tn), i3y, i4y); tp = tn; } } plP_draphy(vppxmi, vppymi); } /* Draw the horizontal axis */ if (lax) { plP_movphy(vppxmi, yp0); if (ltx) { tp = xtick1 * floor(vpwxmi / xtick1); for (;;) { tn = tp + xtick1; if (lsx) { if (llx) { for (i = 0; i <= 7; i++) { temp = tp + xlog[i]; if (BETW(temp, vpwxmi, vpwxma)) plxtik(plP_wcpcx(temp), yp0, xminor, xminor); } } else { for (i = 1; i <= nxsub1 - 1; i++) { temp = tp + i * xtick1 / nxsub1; if (BETW(temp, vpwxmi, vpwxma)) plxtik(plP_wcpcx(temp), yp0, xminor, xminor); } } } if (!BETW(tn, vpwxmi, vpwxma)) break; plxtik(plP_wcpcx(tn), yp0, xmajor, xmajor); tp = tn; } } plP_draphy(vppxma, yp0); } /* Draw the vertical axis */ if (lay) { plP_movphy(xp0, vppymi); if (lty) { tp = ytick1 * floor(vpwymi / ytick1); for (;;) { tn = tp + ytick1; if (lsy) { if (lly) { for (i = 0; i <= 7; i++) { temp = tp + xlog[i]; if (BETW(temp, vpwymi, vpwyma)) plytik(xp0, plP_wcpcy(temp), yminor, yminor); } } else { for (i = 1; i <= nysub1 - 1; i++) { temp = tp + i * ytick1 / nysub1; if (BETW(temp, vpwymi, vpwyma)) plytik(xp0, plP_wcpcy(temp), yminor, yminor); } } } if (!BETW(tn, vpwymi, vpwyma)) break; plytik(xp0, plP_wcpcy(tn), ymajor, ymajor); tp = tn; } } plP_draphy(xp0, vppyma); } /* Draw grids */ grid_box(xopt, xtick1, nxsub1, yopt, ytick1, nysub1); /* Write labels */ label_box(xopt, xtick1, yopt, ytick1); /* Restore the clip limits to viewport edge */ plP_sclp(lxmin, lxmax, lymin, lymax); }