Annotation of 43BSDTahoe/new/X/libapollo/tile.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char *rcsid_tile_c = "$Header: tile.c,v 10.1 86/11/29 13:53:11 jg Rel $";
        !             3: #endif lint
        !             4:     /*
        !             5: 
        !             6:     Copyright 1986 by the University of Utah
        !             7: 
        !             8:     Permission to use, copy, modify, and distribute this
        !             9:     software and its documentation for any purpose and without
        !            10:     fee is hereby granted, provided that the above copyright
        !            11:     notice appear in all copies and that both that copyright
        !            12:     notice and this permission notice appear in supporting
        !            13:     documentation, and that the name of the University of Utah
        !            14:     not be used in advertising or publicity pertaining to 
        !            15:     distribution of the software without specific, written 
        !            16:     prior permission. The University of Utah makes no
        !            17:     representations about the suitability of this software for
        !            18:     any purpose.  It is provided "as is" without express or
        !            19:     implied warranty.
        !            20: 
        !            21:     */
        !            22: 
        !            23: /* tile.c      Perform a raster operation involving a pattern
        !            24:  *
        !            25:  *     TileFill        Patterns a portion of the screen
        !            26:  *     DrawFilled      Draw a filled generalized line/polygon/combination
        !            27:  *
        !            28:  */
        !            29: 
        !            30: /*
        !            31:  *     ToDo:
        !            32:  *             Implement tile fill with xymap
        !            33:  */
        !            34: 
        !            35: #include "Xapollo.h"
        !            36: 
        !            37: extern boolean borrow_flag;
        !            38: extern gpr_$bitmap_desc_t TileBM;
        !            39: extern int old_op;
        !            40: 
        !            41: status_$t status;
        !            42: 
        !            43: static
        !            44: tilefill(tile, xymask, dstx, dsty, width, height, op, clips, clipcount, xoff, yoff)
        !            45:     PIXMAP *tile;
        !            46:     BITMAP *xymask;
        !            47:     int dstx, dsty, width, height;
        !            48:     unsigned op;
        !            49:     CLIP *clips;
        !            50:     int        clipcount;
        !            51:     int xoff, yoff;
        !            52: {
        !            53:     gpr_$position_t dstorg;
        !            54:     gpr_$window_t cwindow;
        !            55:     gpr_$window_t srcwin;
        !            56:     int twidth = tile->width,
        !            57:         theight = tile->height;  
        !            58:     int zmask, i, j;
        !            59: 
        !            60:     if (xymask == NULL) {
        !            61:         cache_tile(tile, &theight, &twidth);
        !            62:         zmask = (1 << Screen.depth) - 1;
        !            63:        set_zmask(zmask);
        !            64:        set_op( 3 );
        !            65:         gpr_$set_fill_value((gpr_$pixel_value_t)1, status);
        !            66:         gpr_$set_fill_background_value((gpr_$pixel_value_t)0, status);
        !            67:         gpr_$set_fill_pattern( TileBM, (short)1, status);
        !            68:         srcwin.x_coord = dstx;
        !            69:         srcwin.x_size = width;
        !            70:         srcwin.y_coord = dsty;
        !            71:         srcwin.y_size = height;
        !            72:         do {
        !            73: 
        !            74:           GetNextClip(clips, cwindow);
        !            75: /*        CheckCursor(cwindow.x_coord, cwindow.y_coord,
        !            76:                       cwindow.x_size, cwindow.y_size);
        !            77:  */
        !            78:          CheckCursor(dstx, dsty, width, height);
        !            79:           gpr_$set_clip_window( cwindow, status);
        !            80:         /* optimize only absolute case */
        !            81:          if ((xoff == 0) && (yoff == 0))
        !            82:              gpr_$rectangle( srcwin, status);
        !            83:          else {
        !            84:              gpr_$position_t dstorg;
        !            85: 
        !            86:              srcwin.x_coord = 0;
        !            87:              srcwin.y_coord = 0;
        !            88:              srcwin.x_size = twidth;
        !            89:              srcwin.y_size = theight;
        !            90:              dstorg.x_coord = dstx;
        !            91:              for (i=0; i< width; i += twidth) {
        !            92:                  dstorg.y_coord = dsty;
        !            93:                  if ((dstorg.x_coord <=
        !            94:                      (cwindow.x_coord + cwindow.x_size)) &&
        !            95:                      ((dstorg.x_coord + twidth) >=
        !            96:                       cwindow.x_coord))
        !            97:                    for (j=0; j<height; j += theight) {
        !            98:                      if ((dstorg.y_coord <=
        !            99:                           (cwindow.y_coord + cwindow.y_size)) &&
        !           100:                          ((dstorg.y_coord + theight) >= 
        !           101:                           cwindow.y_coord))
        !           102:                        gpr_$pixel_blt(TileBM, srcwin, dstorg, status);
        !           103:                      dstorg.y_coord += theight;
        !           104:                    }
        !           105:                  dstorg.x_coord += twidth;
        !           106:                }
        !           107:            }
        !           108:        } while (--clipcount > 0);
        !           109:        gpr_$set_fill_pattern( gpr_$nil_bitmap_desc, (short)1, status);
        !           110:        return;
        !           111:       }
        !           112:     else {
        !           113:        /* xymask not implemented yet */
        !           114:       }
        !           115:     RestoreCursor();                    
        !           116:     if (!borrow_flag) gpr_$release_display(status);
        !           117: }
        !           118: 
        !           119: static
        !           120: constfill(tile, xymask, dstx, dsty, width, height, op, clips, clipcount)
        !           121:     PIXMAP *tile;
        !           122:     BITMAP *xymask;
        !           123:     int dstx, dsty, width, height;
        !           124:     unsigned op;
        !           125:     CLIP *clips;
        !           126:     int        clipcount;                                                    
        !           127: {
        !           128:     gpr_$window_t cwindow,
        !           129:                   dstwin;
        !           130:     int i;
        !           131:     int data = (int)tile->data;
        !           132: 
        !           133:     /*  set drawing color based on invert flag ^ tiling value */
        !           134:     data ^= PINVERT(tile);
        !           135:     gpr_$set_plane_mask((gpr_$mask_t) Screen.plane_mask, status);
        !           136:     gpr_$set_fill_value((gpr_$pixel_value_t)data, status);
        !           137:     set_op( op );
        !           138:     dstwin.x_coord = dstx;
        !           139:     dstwin.x_size = width;
        !           140:     dstwin.y_coord = dsty;
        !           141:     dstwin.y_size = height;
        !           142:     if (xymask == NULL) {
        !           143:        do {
        !           144:         GetNextClip(clips, cwindow);
        !           145:         CheckCursor(dstx, dsty, width, height);
        !           146: /*     CheckCursor(cwindow.x_coord, cwindow.y_coord,
        !           147:                     cwindow.x_size, cwindow.y_size);
        !           148:  */
        !           149:         gpr_$set_clip_window( cwindow, status);
        !           150:         gpr_$rectangle( dstwin, status );
        !           151:        } while (--clipcount > 0);
        !           152:     }
        !           153:     else {
        !           154:         /* xymask not implemented yet */
        !           155:     }
        !           156:     RestoreCursor();
        !           157: }
        !           158: 
        !           159: 
        !           160: /*ARGSUSED*/
        !           161: TileFill (tile, xoff, yoff, xymask, dstx, dsty, width, height,
        !           162:          clips, clipcount, func, zmask)
        !           163:        PIXMAP *tile;
        !           164:        BITMAP *xymask;
        !           165:        int xoff, yoff, dstx, dsty, width, height, zmask;
        !           166:        register int func;
        !           167:        CLIP *clips;
        !           168: {
        !           169: 
        !           170:     if ((Screen.depth == 1) && !(zmask & 1))
        !           171:        return;
        !           172: 
        !           173:     switch (PTYPE(tile)) {
        !           174:     case BitmapPixmap:
        !           175:       tilefill(tile, xymask, dstx, dsty, width, height, func, clips, clipcount, xoff, yoff);
        !           176:       break;
        !           177:     case ConstantPixmap:
        !           178:       constfill(tile, xymask, dstx, dsty, width, height, func, clips, clipcount);
        !           179:       break;
        !           180:     case XYColorPixmap:
        !           181:       /* Not yet implemented */
        !           182:       break;
        !           183:     case ZColorPixmap:
        !           184:       /* Not yet implemented */
        !           185:       fprintf(stderr, "TileFill: ZColorPixmap\n");
        !           186:       break;
        !           187:     }
        !           188: }
        !           189: 
        !           190: /*ARGSUSED*/
        !           191: DrawFilled (verts, vertcount, xbase, ybase, srcpix, tile, xoff, yoff,
        !           192:            clips, clipcount, func, zmask)
        !           193:        Vertex *verts;
        !           194:        register PIXMAP *tile;
        !           195:        int vertcount, xbase, ybase, srcpix, xoff, yoff, clipcount, zmask;
        !           196:        register int func;
        !           197:        CLIP *clips;
        !           198: {
        !           199:     gpr_$window_t cwindow;
        !           200:     status_$t status;
        !           201:     short *x, *y, *oldx, *oldy, *savx, *savy;
        !           202: /*    int data = (int)tile->data; */
        !           203:        Vertex *v = verts;
        !           204:     int vc = vertcount;
        !           205: 
        !           206:     x = (short *)malloc(vertcount * 2);
        !           207:     y = (short *)malloc(vertcount * 2);
        !           208:     savx = x;
        !           209:     savy = y;
        !           210:        do {
        !           211:         if (v->flags & VertexRelative) {
        !           212:              *x = v->x + *oldx;
        !           213:              *y = v->y + *oldy;
        !           214:           }
        !           215:            else {
        !           216:           *x = v->x + xbase;
        !           217:           *y = v->y + ybase;
        !           218:           }
        !           219:     /* XXX - ignore VertexCurved for now */
        !           220:     /* XXX - ignore VertexDrawLastPoint for now */
        !           221:         oldx = x;
        !           222:         oldy = y;
        !           223:         x++;
        !           224:         y++;
        !           225:         v++;
        !           226:        } while (--vc > 0);
        !           227: 
        !           228: /*    switch (PTYPE(tile)) {
        !           229:     case BitmapPixmap:
        !           230:         fprintf(stderr,"DrawFilled: BitmapPixmap\n");
        !           231:         return;
        !           232:     case XYColorPixmap:
        !           233:         fprintf(stderr,"DrawFilled: XYColorPixmap\n");
        !           234:         return;
        !           235:     case ZColorPixmap:
        !           236:         fprintf(stderr,"DrawFilled: ZColorPixmap\n");
        !           237:         return;
        !           238:     case ConstantPixmap:
        !           239:         fprintf(stderr,"DrawFilled: ConstantPixmap\n");
        !           240:        break;            
        !           241:     }
        !           242:     /*  set drawing color based on invert flag ^ tiling value */
        !           243:     /*data ^= PINVERT(tile); */
        !           244:     gpr_$set_fill_value((gpr_$pixel_value_t)srcpix, status);
        !           245:     set_zmask( zmask );
        !           246:     do {
        !           247:         x = savx; y = savy;
        !           248:         GetNextClip(clips, cwindow);
        !           249:         CheckCursor(cwindow.x_coord, cwindow.y_coord,
        !           250:                     cwindow.x_size, cwindow.y_size);
        !           251:         gpr_$set_clip_window( cwindow, status);   
        !           252:         gpr_$start_pgon((short)*x, (short)*y, status);
        !           253:         check_status( status, "DrawFilled");
        !           254:         gpr_$pgon_polyline( *x, *y, (short)vertcount, status);
        !           255:         check_status( status, "DrawFilled");
        !           256:         gpr_$close_fill_pgon( status );
        !           257:         check_status( status, "DrawFilled");
        !           258:         } while (--clipcount > 0);
        !           259:     RestoreCursor();   
        !           260:     free(x);
        !           261:     free(y);
        !           262: }
        !           263: 
        !           264: cache_tile(tile, twidth, theight)
        !           265:     PIXMAP *tile;
        !           266:     int *twidth, *theight;
        !           267: {
        !           268:     gpr_$bitmap_desc_t bm;
        !           269:     long ptr;
        !           270:     int line_width;
        !           271:     status_$t status;
        !           272:     boolean flag;
        !           273:     gpr_$window_t srcwin;
        !           274:     gpr_$position_t dstorg;
        !           275: 
        !           276:     flag = gpr_$acquire_display(status);
        !           277:     gpr_$set_bitmap(TileBM, status);
        !           278:     gpr_$set_raster_op( (short)0, (short)3, status);
        !           279:     old_op = -1;
        !           280:     srcwin.x_coord = 0;
        !           281:     srcwin.x_size = *twidth;
        !           282:     srcwin.y_coord = 0;
        !           283:     srcwin.y_size = *theight;
        !           284:     dstorg.y_coord = 0;
        !           285:     dstorg.x_coord = 0;
        !           286:     gpr_$pixel_blt(tile->data->data, srcwin, dstorg, status);
        !           287:     dstorg.x_coord = *twidth;
        !           288:     gpr_$pixel_blt(tile->data->data, srcwin, dstorg, status);
        !           289: 
        !           290:     *twidth = *twidth * 2;
        !           291:     srcwin.x_coord = 0;
        !           292:     srcwin.x_size = *twidth;
        !           293:     srcwin.y_coord = 0;
        !           294:     srcwin.y_size = *theight;
        !           295:     dstorg.y_coord = *theight;
        !           296:     dstorg.x_coord = 0;
        !           297:     gpr_$pixel_blt(TileBM, srcwin, dstorg, status);
        !           298:     gpr_$set_bitmap(Screen.bm, status);
        !           299:     *theight = *theight * 2;
        !           300: }

unix.superglobalmegacorp.com

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