Annotation of researchv10no/cmd/postscript/common/bbox.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *
        !             3:  * Boundingbox code for PostScript translators. The boundingbox for each page
        !             4:  * is accumulated in bbox - the one for the whole document goes in docbbox. A
        !             5:  * call to writebbox() puts out an appropriate comment, updates docbbox, and
        !             6:  * resets bbox for the next page. The assumption made at the end of writebbox()
        !             7:  * is that we're really printing the current page only if output is now going
        !             8:  * to stdout - a valid assumption for all supplied translators. Needs the math
        !             9:  * library.
        !            10:  *
        !            11:  */
        !            12: 
        !            13: #include <stdio.h>
        !            14: #include <ctype.h>
        !            15: #include <fcntl.h>
        !            16: #include <math.h>
        !            17: 
        !            18: #include "comments.h"                  /* PostScript file structuring comments */
        !            19: #include "gen.h"                       /* a few general purpose definitions */
        !            20: #include "ext.h"                       /* external variable declarations */
        !            21: 
        !            22: typedef struct bbox {
        !            23:        int     set;
        !            24:        double  llx, lly;
        !            25:        double  urx, ury;
        !            26: } Bbox;
        !            27: 
        !            28: Bbox   bbox = {FALSE, 0.0, 0.0, 0.0, 0.0};
        !            29: Bbox   docbbox = {FALSE, 0.0, 0.0, 0.0, 0.0};
        !            30: 
        !            31: double ctm[6] = {1.0, 0.0, 0.0, 1.0, 0.0, 0.0};
        !            32: double matrix1[6], matrix2[6];
        !            33: 
        !            34: /*****************************************************************************/
        !            35: 
        !            36: cover(x, y)
        !            37: 
        !            38:     double     x, y;
        !            39: 
        !            40: {
        !            41: 
        !            42: /*
        !            43:  *
        !            44:  * Adds point (x, y) to bbox. Coordinates are in user space - the transformation
        !            45:  * to default coordinates happens in writebbox().
        !            46:  *
        !            47:  */
        !            48: 
        !            49:     if ( bbox.set == FALSE ) {
        !            50:        bbox.llx = bbox.urx = x;
        !            51:        bbox.lly = bbox.ury = y;
        !            52:        bbox.set = TRUE;
        !            53:     } else {
        !            54:        if ( x < bbox.llx )
        !            55:            bbox.llx = x;
        !            56:        if ( y < bbox.lly )
        !            57:            bbox.lly = y;
        !            58:        if ( x > bbox.urx )
        !            59:            bbox.urx = x;
        !            60:        if ( y > bbox.ury )
        !            61:            bbox.ury = y;
        !            62:     }  /* End else */
        !            63: 
        !            64: }   /* End of cover */
        !            65: 
        !            66: /*****************************************************************************/
        !            67: 
        !            68: writebbox(fp, keyword, slop)
        !            69: 
        !            70:     FILE       *fp;                    /* the comment is written here */
        !            71:     char       *keyword;               /* the boundingbox comment string */
        !            72:     int                slop;                   /* expand (or contract?) the box a bit */
        !            73: 
        !            74: {
        !            75: 
        !            76:     Bbox       ubbox;                  /* user space bounding box */
        !            77:     double     x, y;
        !            78: 
        !            79: /*
        !            80:  *
        !            81:  * Transforms the numbers in the bbox[] using ctm[], adjusts the corners a bit
        !            82:  * (depending on slop) and then writes comment. If *keyword is BoundingBox use
        !            83:  * whatever's been saved in docbbox, otherwise assume the comment is just for
        !            84:  * the current page.
        !            85:  *
        !            86:  */
        !            87: 
        !            88:     if ( strcmp(keyword, BOUNDINGBOX) == 0 )
        !            89:        bbox = docbbox;
        !            90: 
        !            91:     if ( bbox.set == TRUE ) {
        !            92:        ubbox = bbox;
        !            93:        bbox.set = FALSE;               /* so cover() works properly */
        !            94:        x = ctm[0] * ubbox.llx + ctm[2] * ubbox.lly + ctm[4];
        !            95:        y = ctm[1] * ubbox.llx + ctm[3] * ubbox.lly + ctm[5];
        !            96:        cover(x, y);
        !            97:        x = ctm[0] * ubbox.llx + ctm[2] * ubbox.ury + ctm[4];
        !            98:        y = ctm[1] * ubbox.llx + ctm[3] * ubbox.ury + ctm[5];
        !            99:        cover(x, y);
        !           100:        x = ctm[0] * ubbox.urx + ctm[2] * ubbox.ury + ctm[4];
        !           101:        y = ctm[1] * ubbox.urx + ctm[3] * ubbox.ury + ctm[5];
        !           102:        cover(x, y);
        !           103:        x = ctm[0] * ubbox.urx + ctm[2] * ubbox.lly + ctm[4];
        !           104:        y = ctm[1] * ubbox.urx + ctm[3] * ubbox.lly + ctm[5];
        !           105:        cover(x, y);
        !           106:        bbox.llx -= slop + 0.5;
        !           107:        bbox.lly -= slop + 0.5;
        !           108:        bbox.urx += slop + 0.5;
        !           109:        bbox.ury += slop + 0.5;
        !           110:        fprintf(fp, "%s %d %d %d %d\n", keyword, (int)bbox.llx, (int)bbox.lly,(int)bbox.urx, (int)bbox.ury);
        !           111:        bbox = ubbox;
        !           112:     }  /* End if */
        !           113: 
        !           114:     resetbbox((fp == stdout) ? TRUE : FALSE);
        !           115: 
        !           116: }   /* End of writebbox */
        !           117: 
        !           118: /*****************************************************************************/
        !           119: 
        !           120: resetbbox(output)
        !           121: 
        !           122:     int                output;
        !           123: 
        !           124: {
        !           125: 
        !           126: /*
        !           127:  *
        !           128:  * Adds bbox to docbbox and resets bbox for the next page. Only update docbbox
        !           129:  * if we really did output on the last page.
        !           130:  *
        !           131:  */
        !           132: 
        !           133:     if ( docbbox.set == TRUE ) {
        !           134:        cover(docbbox.llx, docbbox.lly);
        !           135:        cover(docbbox.urx, docbbox.ury);
        !           136:     }  /* End if */
        !           137: 
        !           138:     if ( output == TRUE ) {
        !           139:        docbbox = bbox;
        !           140:        docbbox.set = TRUE;
        !           141:     }  /* End if */
        !           142: 
        !           143:     bbox.set = FALSE;
        !           144: 
        !           145: }   /* End of resetbbox */
        !           146: 
        !           147: /*****************************************************************************/
        !           148: 
        !           149: scale(sx, sy)
        !           150: 
        !           151:     double     sx, sy;
        !           152: 
        !           153: {
        !           154: 
        !           155: /*
        !           156:  *
        !           157:  * Scales the default matrix.
        !           158:  *
        !           159:  */
        !           160: 
        !           161:     matrix1[0] = sx;
        !           162:     matrix1[1] = 0;
        !           163:     matrix1[2] = 0;
        !           164:     matrix1[3] = sy;
        !           165:     matrix1[4] = 0;
        !           166:     matrix1[5] = 0;
        !           167: 
        !           168:     concat(matrix1);
        !           169: 
        !           170: }   /* End of scale */
        !           171: 
        !           172: /*****************************************************************************/
        !           173: 
        !           174: translate(tx, ty)
        !           175: 
        !           176:     double     tx, ty;
        !           177: 
        !           178: {
        !           179: 
        !           180: /*
        !           181:  *
        !           182:  * Translates the default matrix.
        !           183:  *
        !           184:  */
        !           185: 
        !           186:     matrix1[0] = 1.0;
        !           187:     matrix1[1] = 0.0;
        !           188:     matrix1[2] = 0.0;
        !           189:     matrix1[3] = 1.0;
        !           190:     matrix1[4] = tx;
        !           191:     matrix1[5] = ty;
        !           192: 
        !           193:     concat(matrix1);
        !           194: 
        !           195: }   /* End of translate */
        !           196: 
        !           197: /*****************************************************************************/
        !           198: 
        !           199: rotate(angle)
        !           200: 
        !           201:     double     angle;
        !           202: 
        !           203: {
        !           204: 
        !           205: /*
        !           206:  *
        !           207:  * Rotates by angle degrees.
        !           208:  *
        !           209:  */
        !           210: 
        !           211:     angle *= 3.1416 / 180;
        !           212: 
        !           213:     matrix1[0] = matrix1[3] = cos(angle);
        !           214:     matrix1[1] = sin(angle);
        !           215:     matrix1[2] = -matrix1[1];
        !           216:     matrix1[4] = 0.0;
        !           217:     matrix1[5] = 0.0;
        !           218: 
        !           219:     concat(matrix1);
        !           220: 
        !           221: }   /* End of rotate */
        !           222: 
        !           223: /*****************************************************************************/
        !           224: 
        !           225: concat(m1)
        !           226: 
        !           227:     double     m1[];
        !           228: 
        !           229: {
        !           230: 
        !           231:     double     m2[6];
        !           232: 
        !           233: /*
        !           234:  *
        !           235:  * Replaces the ctm[] by the result of the matrix multiplication m1[] x ctm[].
        !           236:  *
        !           237:  */
        !           238: 
        !           239:     m2[0] = ctm[0];
        !           240:     m2[1] = ctm[1];
        !           241:     m2[2] = ctm[2];
        !           242:     m2[3] = ctm[3];
        !           243:     m2[4] = ctm[4];
        !           244:     m2[5] = ctm[5];
        !           245: 
        !           246:     ctm[0] = m1[0] * m2[0] + m1[1] * m2[2];
        !           247:     ctm[1] = m1[0] * m2[1] + m1[1] * m2[3];
        !           248:     ctm[2] = m1[2] * m2[0] + m1[3] * m2[2];
        !           249:     ctm[3] = m1[2] * m2[1] + m1[3] * m2[3];
        !           250:     ctm[4] = m1[4] * m2[0] + m1[5] * m2[2] + m2[4];
        !           251:     ctm[5] = m1[4] * m2[1] + m1[5] * m2[3] + m2[5];
        !           252: 
        !           253: }   /* End of concat */
        !           254: 
        !           255: /*****************************************************************************/
        !           256: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.