static void plhrsh2(PLINT ch, PLINT x, PLINT y) { PLINT cx, cy, k, penup, style; signed char *vxygrid = 0; PLFLT scale, xscale, yscale; PLINT llx[STLEN], lly[STLEN], l = 0; penup = 1; scale = 0.05 * plsc->symht; if ( ! plcvec(ch, &vxygrid)) { plP_movphy(x, y); return; } /* Line style must be continuous */ style = plsc->nms; plsc->nms = 0; /* Compute how many physical pixels correspond to a character pixel */ xscale = scale * plsc->xpmm; yscale = scale * plsc->ypmm; k = 4; for (;;) { cx = vxygrid[k++]; cy = vxygrid[k++]; if (cx == 64 && cy == 64) { if (l) { plP_draphy_poly(llx, lly, l); l = 0; } plP_movphy(x, y); plsc->nms = style; return; } else if (cx == 64 && cy == 0) penup = 1; else { if (penup == 1) { if (l) { plP_draphy_poly(llx, lly, l); l = 0; } llx[l] = ROUND(x+ xscale * cx); lly[l++] = ROUND(y + yscale * cy); plP_movphy(llx[l-1], lly[l-1]); penup = 0; } else { llx[l] = ROUND(x+ xscale * cx); lly[l++] = ROUND(y + yscale * cy); } } } }
/* * Plot an individual vector */ static void plP_plotvect(PLFLT x, PLFLT y, PLFLT u, PLFLT v, PLFLT scale) { PLFLT uu, vv, px0, py0, dpx, dpy; PLINT *a_x, *a_y; int j; uu = scale*u; vv = scale*v; if(uu == 0.0 && vv == 0.0) return; if (((a_x = (PLINT *)malloc(sizeof(PLINT)*(plsc->arrow_npts)))==NULL)|| ((a_y = (PLINT *)malloc(sizeof(PLINT)*(plsc->arrow_npts)))==NULL)) { plexit("plP_plotvect: Insufficient memory"); } px0 = plP_wcpcx(x); py0 = plP_wcpcy(y); pldebug("plP_plotvect", "%f %f %d %d\n",x,y,px0,py0); dpx = plP_wcpcx(x + 0.5*uu) - px0; dpy = plP_wcpcy(y + 0.5*vv) - py0; /* transform arrow -> a */ for (j = 0; j < plsc->arrow_npts; j++) { a_x[j] = (PLINT)(plsc->arrow_x[j] * dpx - plsc->arrow_y[j] * dpy + px0); a_y[j] = (PLINT)(plsc->arrow_x[j] * dpy + plsc->arrow_y[j] * dpx + py0); } /* draw the arrow */ plP_draphy_poly(a_x,a_y,plsc->arrow_npts); if (plsc->arrow_fill) { plP_plfclp(a_x, a_y, plsc->arrow_npts, plsc->clpxmi, plsc->clpxma, plsc->clpymi, plsc->clpyma, plP_fill); } free((void *)a_x); free((void *)a_y); }
static void plchar(signed char *vxygrid, PLFLT *xform, PLINT base, PLINT oline, PLINT uline, PLINT refx, PLINT refy, PLFLT scale, PLFLT xpmm, PLFLT ypmm, PLFLT *p_xorg, PLFLT *p_yorg, PLFLT *p_width) { PLINT xbase, ybase, ydisp, lx, ly, cx, cy; PLINT k, penup; PLFLT x, y; PLINT llx[STLEN], lly[STLEN], l = 0; xbase = vxygrid[2]; *p_width = vxygrid[3] - xbase; if (base == 0) { ybase = 0; ydisp = vxygrid[0]; } else { ybase = vxygrid[0]; ydisp = 0; } k = 4; penup = 1; for (;;) { cx = vxygrid[k++]; cy = vxygrid[k++]; if (cx == 64 && cy == 64) { if (l) { plP_draphy_poly(llx, lly, l); l = 0; } break; } if (cx == 64 && cy == 0) { if (l) { plP_draphy_poly(llx, lly, l); l = 0; } penup = 1; } else { x = *p_xorg + (cx - xbase) * scale; y = *p_yorg + (cy - ybase) * scale; lx = refx + ROUND(xpmm * (xform[0] * x + xform[1] * y)); ly = refy + ROUND(ypmm * (xform[2] * x + xform[3] * y)); if (penup == 1) { if (l) { plP_draphy_poly(llx, lly, l); l = 0; } llx[l] = lx; lly[l++] = ly; /* store 1st point ! */ plP_movphy(lx, ly); penup = 0; } else { llx[l] = lx; lly[l++] = ly; } } } if (oline) { x = *p_xorg; y = *p_yorg + (30 + ydisp) * scale; lx = refx + ROUND(xpmm * (xform[0] * x + xform[1] * y)); ly = refy + ROUND(ypmm * (xform[2] * x + xform[3] * y)); plP_movphy(lx, ly); x = *p_xorg + *p_width * scale; lx = refx + ROUND(xpmm * (xform[0] * x + xform[1] * y)); ly = refy + ROUND(ypmm * (xform[2] * x + xform[3] * y)); plP_draphy(lx, ly); } if (uline) { x = *p_xorg; y = *p_yorg + (-5 + ydisp) * scale; lx = refx + ROUND(xpmm * (xform[0] * x + xform[1] * y)); ly = refy + ROUND(ypmm * (xform[2] * x + xform[3] * y)); plP_movphy(lx, ly); x = *p_xorg + *p_width * scale; lx = refx + ROUND(xpmm * (xform[0] * x + xform[1] * y)); ly = refy + ROUND(ypmm * (xform[2] * x + xform[3] * y)); plP_draphy(lx, ly); } *p_xorg = *p_xorg + *p_width * scale; }