From 61f5c35c9465f0702739b41249a664d409f0482c Mon Sep 17 00:00:00 2001 From: rsc Date: Sat, 15 May 2004 23:55:53 +0000 Subject: more files --- src/cmd/postscript/common/bbox.c | 257 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 257 insertions(+) create mode 100644 src/cmd/postscript/common/bbox.c (limited to 'src/cmd/postscript/common/bbox.c') diff --git a/src/cmd/postscript/common/bbox.c b/src/cmd/postscript/common/bbox.c new file mode 100644 index 00000000..7e1f14a5 --- /dev/null +++ b/src/cmd/postscript/common/bbox.c @@ -0,0 +1,257 @@ +/* + * + * Boundingbox code for PostScript translators. The boundingbox for each page + * is accumulated in bbox - the one for the whole document goes in docbbox. A + * call to writebbox() puts out an appropriate comment, updates docbbox, and + * resets bbox for the next page. The assumption made at the end of writebbox() + * is that we're really printing the current page only if output is now going + * to stdout - a valid assumption for all supplied translators. Needs the math + * library. + * + */ + +#include +#include +#include +#include +#include + +#include "comments.h" /* PostScript file structuring comments */ +#include "gen.h" /* a few general purpose definitions */ +#include "ext.h" /* external variable declarations */ + +typedef struct bbox { + int set; + double llx, lly; + double urx, ury; +} Bbox; + +Bbox bbox = {FALSE, 0.0, 0.0, 0.0, 0.0}; +Bbox docbbox = {FALSE, 0.0, 0.0, 0.0, 0.0}; + +double ctm[6] = {1.0, 0.0, 0.0, 1.0, 0.0, 0.0}; +double matrix1[6], matrix2[6]; + +/*****************************************************************************/ + +cover(x, y) + + double x, y; + +{ + +/* + * + * Adds point (x, y) to bbox. Coordinates are in user space - the transformation + * to default coordinates happens in writebbox(). + * + */ + + if ( bbox.set == FALSE ) { + bbox.llx = bbox.urx = x; + bbox.lly = bbox.ury = y; + bbox.set = TRUE; + } else { + if ( x < bbox.llx ) + bbox.llx = x; + if ( y < bbox.lly ) + bbox.lly = y; + if ( x > bbox.urx ) + bbox.urx = x; + if ( y > bbox.ury ) + bbox.ury = y; + } /* End else */ + +} /* End of cover */ + +/*****************************************************************************/ + +writebbox(fp, keyword, slop) + + FILE *fp; /* the comment is written here */ + char *keyword; /* the boundingbox comment string */ + int slop; /* expand (or contract?) the box a bit */ + +{ + + Bbox ubbox; /* user space bounding box */ + double x, y; + +/* + * + * Transforms the numbers in the bbox[] using ctm[], adjusts the corners a bit + * (depending on slop) and then writes comment. If *keyword is BoundingBox use + * whatever's been saved in docbbox, otherwise assume the comment is just for + * the current page. + * + */ + + if ( strcmp(keyword, BOUNDINGBOX) == 0 ) + bbox = docbbox; + + if ( bbox.set == TRUE ) { + ubbox = bbox; + bbox.set = FALSE; /* so cover() works properly */ + x = ctm[0] * ubbox.llx + ctm[2] * ubbox.lly + ctm[4]; + y = ctm[1] * ubbox.llx + ctm[3] * ubbox.lly + ctm[5]; + cover(x, y); + x = ctm[0] * ubbox.llx + ctm[2] * ubbox.ury + ctm[4]; + y = ctm[1] * ubbox.llx + ctm[3] * ubbox.ury + ctm[5]; + cover(x, y); + x = ctm[0] * ubbox.urx + ctm[2] * ubbox.ury + ctm[4]; + y = ctm[1] * ubbox.urx + ctm[3] * ubbox.ury + ctm[5]; + cover(x, y); + x = ctm[0] * ubbox.urx + ctm[2] * ubbox.lly + ctm[4]; + y = ctm[1] * ubbox.urx + ctm[3] * ubbox.lly + ctm[5]; + cover(x, y); + bbox.llx -= slop + 0.5; + bbox.lly -= slop + 0.5; + bbox.urx += slop + 0.5; + bbox.ury += slop + 0.5; + fprintf(fp, "%s %d %d %d %d\n", keyword, (int)bbox.llx, (int)bbox.lly,(int)bbox.urx, (int)bbox.ury); + bbox = ubbox; + } /* End if */ + + resetbbox((fp == stdout) ? TRUE : FALSE); + +} /* End of writebbox */ + +/*****************************************************************************/ + +resetbbox(output) + + int output; + +{ + +/* + * + * Adds bbox to docbbox and resets bbox for the next page. Only update docbbox + * if we really did output on the last page. + * + */ + + if ( docbbox.set == TRUE ) { + cover(docbbox.llx, docbbox.lly); + cover(docbbox.urx, docbbox.ury); + } /* End if */ + + if ( output == TRUE ) { + docbbox = bbox; + docbbox.set = TRUE; + } /* End if */ + + bbox.set = FALSE; + +} /* End of resetbbox */ + +/*****************************************************************************/ + +scale(sx, sy) + + double sx, sy; + +{ + +/* + * + * Scales the default matrix. + * + */ + + matrix1[0] = sx; + matrix1[1] = 0; + matrix1[2] = 0; + matrix1[3] = sy; + matrix1[4] = 0; + matrix1[5] = 0; + + concat(matrix1); + +} /* End of scale */ + +/*****************************************************************************/ + +translate(tx, ty) + + double tx, ty; + +{ + +/* + * + * Translates the default matrix. + * + */ + + matrix1[0] = 1.0; + matrix1[1] = 0.0; + matrix1[2] = 0.0; + matrix1[3] = 1.0; + matrix1[4] = tx; + matrix1[5] = ty; + + concat(matrix1); + +} /* End of translate */ + +/*****************************************************************************/ + +rotate(angle) + + double angle; + +{ + +/* + * + * Rotates by angle degrees. + * + */ + + angle *= 3.1416 / 180; + + matrix1[0] = matrix1[3] = cos(angle); + matrix1[1] = sin(angle); + matrix1[2] = -matrix1[1]; + matrix1[4] = 0.0; + matrix1[5] = 0.0; + + concat(matrix1); + +} /* End of rotate */ + +/*****************************************************************************/ + +concat(m1) + + double m1[]; + +{ + + double m2[6]; + +/* + * + * Replaces the ctm[] by the result of the matrix multiplication m1[] x ctm[]. + * + */ + + m2[0] = ctm[0]; + m2[1] = ctm[1]; + m2[2] = ctm[2]; + m2[3] = ctm[3]; + m2[4] = ctm[4]; + m2[5] = ctm[5]; + + ctm[0] = m1[0] * m2[0] + m1[1] * m2[2]; + ctm[1] = m1[0] * m2[1] + m1[1] * m2[3]; + ctm[2] = m1[2] * m2[0] + m1[3] * m2[2]; + ctm[3] = m1[2] * m2[1] + m1[3] * m2[3]; + ctm[4] = m1[4] * m2[0] + m1[5] * m2[2] + m2[4]; + ctm[5] = m1[4] * m2[1] + m1[5] * m2[3] + m2[5]; + +} /* End of concat */ + +/*****************************************************************************/ + -- cgit v1.2.3