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); }
void c_plmtex(const char *side, PLFLT disp, PLFLT pos, PLFLT just, const char *text) { PLINT clpxmi, clpxma, clpymi, clpyma; PLINT vert, refx, refy, x, y; PLFLT xdv, ydv, xmm, ymm, refxmm, refymm, shift, xform[4]; PLFLT chrdef, chrht; PLFLT dispx, dispy; if (plsc->level < 2) { plabort("plmtex: Please set up viewport first"); return; } /* Open clip limits to subpage limits */ plP_gclp(&clpxmi, &clpxma, &clpymi, &clpyma); /* get and store current clip limits */ plP_sclp(plsc->sppxmi, plsc->sppxma, plsc->sppymi, plsc->sppyma); if (plP_stindex(side, "BV") != -1 || plP_stindex(side, "bv") != -1) { vert = 1; xdv = plsc->vpdxmi + (plsc->vpdxma - plsc->vpdxmi) * pos; ydv = plsc->vpdymi; dispx = 0; dispy = -disp; } else if (plP_stindex(side, "TV") != -1 || plP_stindex(side, "tv") != -1) { vert = 1; xdv = plsc->vpdxmi + (plsc->vpdxma - plsc->vpdxmi) * pos; ydv = plsc->vpdyma; dispx = 0; dispy = disp; } else if (plP_stsearch(side, 'b')) { vert = 0; xdv = plsc->vpdxmi + (plsc->vpdxma - plsc->vpdxmi) * pos; ydv = plsc->vpdymi; dispx = 0; dispy = -disp; } else if (plP_stsearch(side, 't')) { vert = 0; xdv = plsc->vpdxmi + (plsc->vpdxma - plsc->vpdxmi) * pos; ydv = plsc->vpdyma; dispx = 0; dispy = disp; } else if (plP_stindex(side, "LV") != -1 || plP_stindex(side, "lv") != -1) { vert = 0; xdv = plsc->vpdxmi; ydv = plsc->vpdymi + (plsc->vpdyma - plsc->vpdymi) * pos; dispx = -disp; dispy = 0; } else if (plP_stindex(side, "RV") != -1 || plP_stindex(side, "rv") != -1) { vert = 0; xdv = plsc->vpdxma; ydv = plsc->vpdymi + (plsc->vpdyma - plsc->vpdymi) * pos; dispx = disp; dispy = 0; } else if (plP_stsearch(side, 'l')) { vert = 1; xdv = plsc->vpdxmi; ydv = plsc->vpdymi + (plsc->vpdyma - plsc->vpdymi) * pos; dispx = -disp; dispy = 0; } else if (plP_stsearch(side, 'r')) { vert = 1; xdv = plsc->vpdxma; ydv = plsc->vpdymi + (plsc->vpdyma - plsc->vpdymi) * pos; dispx = disp; dispy = 0; } else { plP_sclp(clpxmi, clpxma, clpymi, clpyma); /* restore initial clip limits */ return; } /* Transformation matrix */ if (vert != 0) { xform[0] = 0.0; xform[1] = -1.0; xform[2] = 1.0; xform[3] = 0.0; } else { xform[0] = 1.0; xform[1] = 0.0; xform[2] = 0.0; xform[3] = 1.0; } /* Convert to physical units (mm) and compute shifts */ plgchr(&chrdef, &chrht); shift = (just == 0.0) ? 0.0 : plstrl(text) * just; xmm = plP_dcmmx(xdv) + dispx * chrht; ymm = plP_dcmmy(ydv) + dispy * chrht; refxmm = xmm - shift * xform[0]; refymm = ymm - shift * xform[2]; /* Convert to device units (pixels) and call text plotter */ x = plP_mmpcx(xmm); y = plP_mmpcy(ymm); refx = plP_mmpcx(refxmm); refy = plP_mmpcy(refymm); plP_text(0, just, xform, x, y, refx, refy, text); plP_sclp(clpxmi, clpxma, clpymi, clpyma); /* restore clip limits */ }