Annotation of 43BSDTahoe/new/X/libapollo/put.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char *rcsid_put_c = "$Header: put.c,v 10.1 86/11/29 13:52:41 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: /* put.c       Perform a raster operation with a source bitmap
                     24:  *
                     25:  *     PixmapPut       Puts a pixmap up on the screen
                     26:  *     PixmapBitsPut   Puts a pixmap up on the screen
                     27:  *     BitmapBitsPut   Puts a pixmap up on the screen
                     28:  *
                     29:  */
                     30: 
                     31: /*
                     32:  *     ToDo:
                     33:  *             masks & XY format Pixmaps
                     34:  */
                     35: 
                     36: #include "Xapollo.h"
                     37: 
                     38: #define GPIXARY_SIZE 2048
                     39: status_$t status;
                     40: long gpixary[GPIXARY_SIZE];
                     41: 
                     42: char *Xalloc();
                     43: 
                     44: PixmapPut (src, srcx, srcy, width, height, dstx, dsty, clips, clipcount,
                     45:           op, zmask)
                     46:      register PIXMAP *src;
                     47:      int srcx, srcy, width, height, dstx, dsty, clipcount, zmask;
                     48:      register int op;
                     49:      CLIP *clips;
                     50: {
                     51:   gpr_$position_t dest;
                     52:   gpr_$window_t sou, cwindow;
                     53:   int  cleft, ctop, cwidth, cheight;
                     54:   int i;
                     55: 
                     56:   set_zmask(zmask);
                     57:   set_op( op );
                     58:   switch (PTYPE(src)) {
                     59:   case BitmapPixmap:
                     60:     {
                     61:       BITMAP     *bm = (BITMAP *) src->data;
                     62:       do {
                     63: 
                     64:        GetNextClip(clips, cwindow);
                     65:        if (OverLap(cwindow, dstx, dsty, width, height))
                     66:          { 
                     67:            CheckCursor(dstx, dsty, width, height);
                     68:            gpr_$set_clip_window( cwindow, status);
                     69:            sou.x_coord = srcx;
                     70:            sou.y_coord = srcy;
                     71:            sou.x_size = width;
                     72:            sou.y_size = height;
                     73:            dest.x_coord = dstx;
                     74:            dest.y_coord = dsty;
                     75:            gpr_$pixel_blt((gpr_$bitmap_desc_t)bm->data, sou, dest, status);
                     76:          } 
                     77:       } while (--clipcount > 0);
                     78:     }
                     79:     break;
                     80:   case ConstantPixmap:
                     81:     do {
                     82:       
                     83:       GetNextClip(clips, cwindow);
                     84:       if (OverLap(cwindow, dstx, dsty, width, height))
                     85:        {
                     86:          CheckCursor(dstx, dsty, width, height);
                     87:          /* Not yet implemented */
                     88:        }
                     89:     } while (--clipcount > 0);
                     90:     break;
                     91:   case ZColorPixmap:
                     92:     gpr_$set_plane_mask((gpr_$mask_t)(zmask & Screen.plane_mask), status);
                     93:     do {
                     94: 
                     95:       GetNextClip(clips, cwindow);      
                     96:       /* Not yet implemented */
                     97: 
                     98:     } while (--clipcount > 0);
                     99:     break;
                    100:   case XYColorPixmap:
                    101:     /* Not yet implemented */
                    102:     break;
                    103:   }
                    104:   RestoreCursor();
                    105: }
                    106: 
                    107: 
                    108: /*ARGSUSED*/
                    109: PixmapBitsPut (width, height, format, data, xymask, dstx, dsty,
                    110:               clips, clipcount, func, zmask)
                    111:        unsigned char *data;
                    112:        int width, height, format, dstx, dsty, clipcount, zmask;
                    113:        BITMAP *xymask;
                    114:        CLIP *clips;
                    115:        int func;
                    116: {
                    117:   if (Screen.depth == 1)
                    118:       BitsPut(width, height, data, 1, 0, xymask, dstx, dsty,
                    119:              clips, clipcount, func, zmask, 1);
                    120:   else if (Screen.depth <= 8)
                    121:       switch (format) {
                    122:       case ZFormat: {
                    123:          gpr_$window_t dstwin;
                    124:          long *pixary, *p, *mask_ary;
                    125:          int i, j, size;
                    126:       
                    127:          dstwin.x_coord = dstx;
                    128:          dstwin.x_size = width;
                    129:          dstwin.y_coord = dsty;
                    130:          dstwin.y_size = height;
                    131:          if ((size = width*height) > GPIXARY_SIZE)
                    132:              pixary = (long *)malloc(size * 4);
                    133:          else
                    134:              pixary = gpixary;
                    135:          if (xymask) {
                    136:              mask_ary = malloc(size*4);
                    137:              gpr_$set_bitmap( xymask->data, status);
                    138:              gpr_$read_pixels( *mask_ary, dstwin, status);
                    139:              gpr_$set_bitmap(Screen.bm, status);
                    140:              gpr_$read_pixels( *pixary, dstwin, status);
                    141:            }
                    142:          p = pixary;
                    143:          for (i=0;i<width;i++) 
                    144:              for (j=0;j<height;j++)
                    145:                if (xymask && !(*mask_ary++))
                    146:                  continue;
                    147:                *p++ = *data++;
                    148:          gpr_$write_pixels(*pixary, dstwin, status);
                    149:          check_status(status, "PixmapBitsput");
                    150:          if (size > GPIXARY_SIZE)
                    151:            free(pixary);
                    152:          break;
                    153:        }
                    154:                    break;
                    155:       case XYFormat:
                    156:          /* Not yet supported */
                    157:          break;
                    158:       }
                    159: 
                    160: }
                    161: 
                    162: BitmapBitsPut (width, height, data, fore, back, xymask, dstx, dsty,
                    163:               clips, clipcount, func, zmask)
                    164:        char *data;
                    165:        int width, height, fore, back, dstx, dsty, clipcount, zmask;
                    166:        register BITMAP *xymask;
                    167:        CLIP *clips;
                    168:        register int func;
                    169: {
                    170:        InvertPixelOrder((short *) data, BitmapSize(width, height) >> 1);
                    171:        BitsPut(width, height, data, fore, back, xymask, dstx, dsty,
                    172:               clips, clipcount, func, zmask, 1);
                    173: }
                    174: 
                    175: static
                    176: BitsPut (width, height, data, fore, back, xymask, dstx, dsty,
                    177:               clips, clipcount, func, zmask, srcdepth)
                    178:      char *data;
                    179:      int width, height, fore, back, dstx, dsty, clipcount, zmask;
                    180:      register BITMAP *xymask;
                    181:      CLIP *clips;
                    182:      register int func;
                    183:      int srcdepth;
                    184: {
                    185:     extern char FBMap[];
                    186:     extern int old_op;
                    187:     gpr_$window_t srcwin, cwindow;
                    188:     gpr_$position_t dstorg;
                    189:     gpr_$plane_t dplane = 0;
                    190:     BITMAP *bm;
                    191:     int op;
                    192: 
                    193:     if ((Screen.depth == 1) && !(zmask & 1))
                    194:        return;          
                    195:     if (fore & 1)
                    196:        func += 0x20;
                    197:     if (back & 1)
                    198:        func += 0x10;
                    199: 
                    200:     srcwin.x_coord = 0;
                    201:     srcwin.y_coord = 0;
                    202:     srcwin.x_size = width;
                    203:     srcwin.y_size = height;
                    204:     dstorg.x_coord = dstx;
                    205:     dstorg.y_coord = dsty;
                    206:     bm = make_bitmap( data, width, height, NULL);
                    207:     func = FBMap[func];
                    208:     CheckCursor(dstx, dsty, dstx+width, dsty+height);
                    209:     if (xymask == NULL) {
                    210:       gpr_$set_raster_op((gpr_$plane_t)0, (gpr_$raster_op_t)func, status);
                    211:       do {
                    212:        GetNextClip(clips, cwindow);
                    213:        gpr_$set_clip_window( cwindow, status);   
                    214:        gpr_$bit_blt(bm->data, srcwin, (gpr_$plane_t)0,
                    215:                     dstorg, (gpr_$plane_t)dplane, status);
                    216:        check_status(status, "BitsPut: ");
                    217:       } while (--clipcount > 0);
                    218:       old_op = func;
                    219:     }
                    220:     else {  
                    221: /* this is slightly bogus and doesn't work correctly, but without it icons are
                    222:  * invisible
                    223:  */
                    224:        int botop = (back == 0 ? 7 : 4);
                    225:        int topop = (fore == 0 ? 7 : 4);
                    226: 
                    227:         do {
                    228:          GetNextClip(clips, cwindow);
                    229:          CheckCursor(cwindow.x_coord, cwindow.y_coord,
                    230:                      cwindow.x_size, cwindow.y_size);
                    231:          gpr_$set_clip_window( cwindow, status);   
                    232:          gpr_$set_raster_op((gpr_$plane_t)0, botop, status);
                    233:          gpr_$bit_blt(xymask->data, srcwin, (gpr_$plane_t)0, dstorg,
                    234:                       dplane, status);
                    235:          gpr_$set_raster_op((gpr_$plane_t)0, (short)3, status);
                    236:          gpr_$bit_blt(bm->data, srcwin, (gpr_$plane_t)0, dstorg,
                    237:                       (gpr_$plane_t)dplane, status);
                    238:        } while (--clipcount);
                    239:        old_op = topop;
                    240:       }
                    241:     FreeBitmap(bm);
                    242:     RestoreCursor();
                    243:     return;
                    244: }
                    245: 

unix.superglobalmegacorp.com

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