struct psGfx *psOpen(char *fileName, double userWidth, double userHeight, /* Dimension of image in user's units. */ double ptWidth, double ptHeight, /* Dimension of image in points. */ double ptMargin) /* Image margin in points. */ /* Open up a new postscript file. If ptHeight is 0, it will be * calculated to keep pixels square. */ { struct psGfx *ps; /* Allocate structure and open file. */ AllocVar(ps); ps->f = mustOpen(fileName, "w"); /* Save page dimensions and calculate scaling factors. */ ps->userWidth = userWidth; ps->userHeight = userHeight; ps->ptWidth = ptWidth; ps->xScale = (ptWidth - 2*ptMargin)/userWidth; if (ptHeight != 0.0) { ps->ptHeight = ptHeight; ps->yScale = (ptHeight - 2*ptMargin) / userHeight; } else { ps->yScale = ps->xScale; ptHeight = ps->ptHeight = userHeight * ps->yScale + 2*ptMargin; } /* 0.5, 0.5 is the center of the pixel in upper-left corner which corresponds to (0,0) */ ps->xOff = ptMargin; ps->yOff = ptMargin; ps->fontHeight = 10; /* Cope with fact y coordinates are bottom to top rather * than top to bottom. */ ps->yScale = -ps->yScale; ps->yOff = ps->ptHeight - ps->yOff; psWriteHeader(ps->f, ptWidth, ptHeight); /* adding a gsave here fixes an old ghostview bug with cliprestore */ fprintf(ps->f, "gsave\n"); /* Set initial clipping rectangle. */ psClipRect(ps, 0, 0, ps->userWidth, ps->userHeight); /* Set line width to a single pixel. */ psSetLineWidth(ps,1); return ps; }
void pscmSetClip(struct pscmGfx *pscm, int x, int y, int width, int height) /* Set clipping rectangle. */ { double x2 = x + width; double y2 = y + height; pscm->clipMinX = x; pscm->clipMinY = y; pscm->clipMaxX = x2; /* one beyond actual last pixel */ pscm->clipMaxY = y2; /* adjust to pixel-centered coordinates */ x2 -= 1; y2 -= 1; double x1 = x; double y1 = y; /* pad a half-pixel all the way around the box */ x1 -= 0.5; y1 -= 0.5; x2 += 0.5; y2 += 0.5; psClipRect(pscm->ps, x1, y1, x2-x1, y2-y1); }