Annotation of 43BSDTahoe/new/X/libibm/libsrc/tile.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char *rcsid_tile_c = "$Header: tile.c,v 10.1 86/11/19 10:44:34 jg Exp $";
                      3: #endif lint
                      4: /* Copyright 1985 Massachusetts Institute of Technology */
                      5: 
                      6: /* tile.c - Perform a raster operation involving a pattern
                      7:  *
                      8:  *      TileFill        Patterns a portion of the screen
                      9:  *      DrawFilled      Draw a filled generalized line/polygon/combination
                     10:  *     AlignTile       Aligns tile to a given coordinates
                     11:  *
                     12:  *     Changes and modifications by:
                     13:  *
                     14:  *             Scott Bates
                     15:  *             Brown University
                     16:  *             IRIS, Box 1946
                     17:  *             Providence, RI 02912
                     18:  *
                     19:  *
                     20:  *             Copyright (c) 1986 Brown University
                     21:  *
                     22:  * Permission to use, copy, modify and distribute this software and its
                     23:  * documentation for any purpose and without fee is hereby granted, provided
                     24:  * that the above copyright notice appear in all copies, and that both
                     25:  * that copyright notice and this permission notice appear in supporting
                     26:  * documentation, and that the name of Brown University not be used in
                     27:  * advertising or publicity pertaining to distribution of the software
                     28:  * without specific, written prior permission. Brown University makes no
                     29:  * representations about the suitability of this software for any purpose.
                     30:  * It is provided "as-is" without express or implied warranty.
                     31:  */
                     32: 
                     33: #include "private.h"
                     34: #include "bitblt.h"
                     35: 
                     36: /*
                     37:  * Tile area of screen using a mask
                     38:  */
                     39: 
                     40: /*ARGSUSED*/
                     41: TileFill (tile, xoff, yoff, xymask, dstx, dsty, width, height,
                     42:           clips, clipcount, func, zmask)
                     43:         register PIXMAP *tile;
                     44:         register BITMAP *xymask;
                     45:        register width, height;
                     46:         int xoff, yoff, dstx, dsty, zmask;
                     47:         register func;
                     48:         CLIP *clips;
                     49: {
                     50:        u_short *clipmask = NILMASK;
                     51:         register BITMAP *bm = (BITMAP *) tile->data;
                     52:        register u_short *tilepattern;
                     53:        u_short newtilepattern[TILE_SIZE];
                     54: 
                     55: #ifdef TRACE_X
                     56:        fprintf(stderr, "In TileFill\n");
                     57:        fflush(stderr);
                     58: #endif TRACE_X
                     59: 
                     60:        /*
                     61:         * There better be at least one plane
                     62:         */
                     63: 
                     64:         if ((zmask & 1) == 0)
                     65:                return;
                     66: 
                     67:        /*
                     68:          * If pixmap needs to be inverted before being displayed
                     69:          * remap funtion to reflect this change.
                     70:          */
                     71: 
                     72:                func = SSMap[func | (tile->kind & InvertFlag)];
                     73: 
                     74:        /*
                     75:          * Get tile. If pixmap has no associated bitmap then pixmap
                     76:          * struct contains pointer to constant tile. Otherwise, it
                     77:          * contains pointer to bitmap which points to the tile.
                     78:          */
                     79: 
                     80:         if (PTYPE(tile) == ConstantPixmap) {
                     81:                tilepattern = (u_short *) tile->data;
                     82:         } else {
                     83:                tilepattern = (u_short *) bm->data;
                     84: 
                     85:                /*
                     86:                 * Align tile to offset supplied
                     87:                 */
                     88: 
                     89:                if ((xoff | yoff) & 0x0F) {
                     90:                        AlignTile(tilepattern, newtilepattern, xoff, yoff);
                     91:                        tilepattern = newtilepattern;
                     92:                }
                     93:        }
                     94: 
                     95:        /*
                     96:         * Clip xymask and destnation rectangle to minimum size
                     97:         */
                     98: 
                     99:        if(xymask) {
                    100:                width = MIN (xymask->width, width);
                    101:                height = MIN (xymask->height, height);
                    102:                clipmask = (u_short *) xymask->data;
                    103:        }
                    104: 
                    105:        /*
                    106:          * Fill in destination rectangle
                    107:          */
                    108: 
                    109:        FillInRect(dstx, dsty, width, height, &DstRect);
                    110: 
                    111:        /*
                    112:          * Tile area of screen using a mask
                    113:          */
                    114: 
                    115:        CopyBits (tilepattern, NIL, NIL, NILRECT, 
                    116:                  (u_short *) pbm.data, pbm.width, pbm.height, &DstRect,
                    117:                  clipmask, width, height, MAKE_TILE_RULE(func),
                    118:                  clipcount, clips);
                    119: }
                    120: 
                    121: /*
                    122:  * Draw a filled generalized line/polygon/combination
                    123:  */
                    124: 
                    125: /*ARGSUSED*/
                    126: DrawFilled (verts, vertcount, xbase, ybase, srcpix, tile, xoff, yoff,
                    127:             clips, clipcount, func, zmask)
                    128:         Vertex *verts;
                    129:         register PIXMAP *tile;
                    130:         int vertcount, xbase, ybase, srcpix, xoff, yoff, clipcount, zmask;
                    131:         int func;
                    132:         CLIP *clips;
                    133: {
                    134:        BITMAP *xymask;
                    135:        Vertex *newverts;
                    136:        int newvertcount;
                    137: 
                    138: #ifdef TRACE_X
                    139:        fprintf(stderr, "In DrawFilled\n");
                    140:        fflush(stderr);
                    141: #endif TRACE_X
                    142: 
                    143:        /*
                    144:         * Limit draw operation to one plane
                    145:         */
                    146: 
                    147:         if ((zmask & 1) == 0 || vertcount < 2)
                    148:                return;
                    149: 
                    150:        /*
                    151:         * Convert path list to absolute line segments
                    152:         */
                    153: 
                    154:        if(PathListConverter(verts, vertcount, xbase, ybase, &newverts,
                    155:           &newvertcount, FILL_PATH_LIST) == NULL) {
                    156:                DeviceError("DrawCurve failure in PathListConverter()\n");
                    157:                return;
                    158:        }
                    159: 
                    160:        /*
                    161:         * Make mask for polygon fill
                    162:         */
                    163: 
                    164:        if((xymask = MakeMask(newverts, newvertcount)) == NULL) {
                    165:                DeviceError("DrawFilled failure in MakeMask()\n");
                    166:                return;
                    167:        }
                    168: 
                    169:        /*
                    170:         * Fill the polygon
                    171:         */
                    172: 
                    173:        if(tile) {
                    174:                /*
                    175:                 * Tile fill the polygon using the mask
                    176:                 */
                    177: 
                    178:                TileFill(tile, xoff, yoff, xymask, 0, 0, xymask->width,
                    179:                         xymask->height, clips, clipcount, func, zmask);
                    180:        } else  {
                    181:                /*
                    182:                 * Pix fill the polygon using the mask
                    183:                 */
                    184: 
                    185:                PixFill(srcpix, xymask, 0, 0, xymask->width, xymask->height,
                    186:                        clips, clipcount, func, zmask);
                    187:        }
                    188: 
                    189:        /*
                    190:         * Free mask BITMAP and space used by converted vertex list
                    191:         */
                    192: 
                    193:        FreeBitmap(xymask);
                    194:        free((caddr_t)newverts);
                    195: }
                    196: 
                    197: /*
                    198:  * Align tile to offset provided.
                    199:  * Note: tile is in IBM bit order not VAX
                    200:  */
                    201: 
                    202: static
                    203: AlignTile(src, dst, xoff, yoff)
                    204:        register u_short *src, *dst;
                    205:        register int xoff, yoff;
                    206: {
                    207:        register int i;
                    208:        register int shift;
                    209:        u_short mask;
                    210: 
                    211: #ifdef TRACE_X
                    212:        fprintf(stderr, "In Align_Tile\n");
                    213:        fflush(stderr);
                    214: #endif TRACE_X
                    215: 
                    216:        xoff &= 0x0F;
                    217:        yoff = (TILE_HEIGHT - (yoff & 0x0F)) & 0x0F;
                    218:        shift = (TILE_WIDTH - xoff) & 0x0F;
                    219:        mask = (1 << xoff) - 1;
                    220: 
                    221:        for (i = 0; i < TILE_HEIGHT; i++) {
                    222:                dst[i] = (src[yoff] >> xoff) | ((src[yoff] & mask) << shift);
                    223:                yoff++;
                    224:                yoff &= 0x0F;
                    225:        }
                    226: }

unix.superglobalmegacorp.com

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