static void genlin(short *x, short *y, PLINT npts) { /* Check for solid line */ if (plsc->nms == 0) { if (npts== 2) plP_line(x, y); else plP_polyline(x, y, npts); } /* Right now dashed lines don't use polyline capability -- this should be improved */ else { PLINT i; /* Call escape sequence to draw dashed lines, only for drivers that have this capability */ if (plsc->dev_dash) { plsc->dev_npts = npts; plsc->dev_x = x; plsc->dev_y = y; plP_esc(PLESC_DASH, NULL); return; } for (i = 0; i < npts - 1; i++) { grdashline(x+i, y+i); } } }
static void rdbuf_line(PLStream *pls) { short xpl[2], ypl[2]; PLINT npts = 2; dbug_enter("rdbuf_line"); fread(xpl, sizeof(short), npts, pls->plbufFile); fread(ypl, sizeof(short), npts, pls->plbufFile); plP_line(xpl, ypl); }
static void grdashline(short *x, short *y) { PLINT nx, ny, nxp, nyp, incr, temp; PLINT modulo, dx, dy, i, xtmp, ytmp; PLINT tstep, pix_distance, j; int loop_x; short xl[2], yl[2]; double nxstep, nystep; /* Check if pattern needs to be restarted */ if (x[0] != lastx || y[0] != lasty) { plsc->curel = 0; plsc->pendn = 1; plsc->timecnt = 0; plsc->alarm = plsc->mark[0]; } lastx = xtmp = x[0]; lasty = ytmp = y[0]; if (x[0] == x[1] && y[0] == y[1]) return; nx = x[1] - x[0]; dx = (nx > 0) ? 1 : -1; nxp = ABS(nx); ny = y[1] - y[0]; dy = (ny > 0) ? 1 : -1; nyp = ABS(ny); if (nyp > nxp) { modulo = nyp; incr = nxp; loop_x = 0; } else { modulo = nxp; incr = nyp; loop_x = 1; } temp = modulo / 2; /* Compute the timer step */ nxstep = nxp * plsc->umx; nystep = nyp * plsc->umy; tstep = sqrt( nxstep * nxstep + nystep * nystep ) / modulo; if (tstep < 1) tstep = 1; /* tstep is distance per pixel moved */ i = 0; while (i < modulo) { pix_distance = (plsc->alarm - plsc->timecnt + tstep - 1) / tstep; i += pix_distance; if (i > modulo) pix_distance -= (i - modulo); plsc->timecnt += pix_distance * tstep; temp += pix_distance * incr; j = temp / modulo; temp = temp % modulo; if (loop_x) { xtmp += pix_distance * dx; ytmp += j * dy; } else { xtmp += j * dx; ytmp += pix_distance * dy; } if (plsc->pendn != 0) { xl[0] = lastx; yl[0] = lasty; xl[1] = xtmp; yl[1] = ytmp; plP_line(xl, yl); } /* Update line style variables when alarm goes off */ while (plsc->timecnt >= plsc->alarm) { if (plsc->pendn != 0) { plsc->pendn = 0; plsc->timecnt -= plsc->alarm; plsc->alarm = plsc->space[plsc->curel]; } else { plsc->pendn = 1; plsc->timecnt -= plsc->alarm; plsc->curel++; if (plsc->curel >= plsc->nms) plsc->curel = 0; plsc->alarm = plsc->mark[plsc->curel]; } } lastx = xtmp; lasty = ytmp; } }