Annotation of researchv9/X11/src/X.V11R1/server/ddx/mfb/mfbpntwin.c, revision 1.1.1.1

1.1       root        1: /* $Header: mfbpntwin.c,v 1.1 87/09/02 00:29:09 toddb Exp $ */
                      2: /***********************************************************
                      3: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
                      4: and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
                      5: 
                      6:                         All Rights Reserved
                      7: 
                      8: Permission to use, copy, modify, and distribute this software and its 
                      9: documentation for any purpose and without fee is hereby granted, 
                     10: provided that the above copyright notice appear in all copies and that
                     11: both that copyright notice and this permission notice appear in 
                     12: supporting documentation, and that the names of Digital or MIT not be
                     13: used in advertising or publicity pertaining to distribution of the
                     14: software without specific, written prior permission.  
                     15: 
                     16: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
                     17: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
                     18: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     19: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
                     20: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
                     21: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
                     22: SOFTWARE.
                     23: 
                     24: ******************************************************************/
                     25: 
                     26: #include "X.h"
                     27: 
                     28: #include "windowstr.h"
                     29: #include "regionstr.h"
                     30: #include "pixmapstr.h"
                     31: #include "scrnintstr.h"
                     32: 
                     33: #include "mfb.h"
                     34: #include "maskbits.h"
                     35: /*
                     36: NOTE
                     37:    PaintArea32() doesn't need to rotate the tile, since
                     38: mfbPositionWIndow() and mfbChangeWIndowAttributes() do it.
                     39: */
                     40: 
                     41: /* Paint Window None -- just return */
                     42: void
                     43: mfbPaintWindowNone(pWin, pRegion, what)
                     44:     WindowPtr pWin;
                     45:     RegionPtr pRegion;
                     46:     int what;          
                     47: {
                     48: }
                     49: 
                     50: /* Paint Window Parent Relative -- Find first ancestor which isn't parent
                     51:  * relative and paint as it would, but with this region */ 
                     52: void
                     53: mfbPaintWindowPR(pWin, pRegion, what)
                     54:     WindowPtr pWin;
                     55:     RegionPtr pRegion;
                     56:     int what;          
                     57: {
                     58:     WindowPtr pParent;
                     59: 
                     60:     pParent = pWin->parent;
                     61:     while(pParent->backgroundTile == (PixmapPtr)ParentRelative)
                     62:        pParent = pParent->parent;
                     63: 
                     64:     if(what == PW_BORDER)
                     65:         (*pParent->PaintWindowBorder)(pParent, pRegion, what);
                     66:     else
                     67:        (*pParent->PaintWindowBackground)(pParent, pRegion, what);
                     68: }
                     69: 
                     70: void
                     71: mfbPaintWindowSolid(pWin, pRegion, what)
                     72:     WindowPtr pWin;
                     73:     RegionPtr pRegion;
                     74:     int what;          
                     75: {
                     76:     if (what == PW_BACKGROUND)
                     77:     {
                     78:        if (pWin->backgroundPixel)
                     79:            mfbSolidWhiteArea(pWin, pRegion->numRects, pRegion->rects,
                     80:                              GXset, NullPixmap);
                     81:        else
                     82:            mfbSolidBlackArea(pWin, pRegion->numRects, pRegion->rects,
                     83:                              GXclear, NullPixmap);
                     84:     } 
                     85:     else
                     86:     {
                     87:        if (pWin->borderPixel)
                     88:            mfbSolidWhiteArea(pWin, pRegion->numRects, pRegion->rects,
                     89:                              GXset, NullPixmap);
                     90:        else
                     91:            mfbSolidBlackArea(pWin, pRegion->numRects, pRegion->rects,
                     92:                              GXclear, NullPixmap);
                     93:     }
                     94: }
                     95: 
                     96: 
                     97: /* Tile Window with a 32 bit wide tile 
                     98:    this could call mfbTileArea32, but that has to do a switch on the
                     99: rasterop, which seems expensive.
                    100: */
                    101: void
                    102: mfbPaintWindow32(pWin, pRegion, what)
                    103:     WindowPtr pWin;
                    104:     RegionPtr pRegion;
                    105:     int what;          
                    106: {
                    107:     int nbox;          /* number of boxes to fill */
                    108:     register BoxPtr pbox;      /* pointer to list of boxes to fill */
                    109:     int *psrc;         /* pointer to bits in tile */
                    110:     int tileHeight;    /* height of the tile */
                    111:     register int srcpix;       /* current row from tile */
                    112: 
                    113:     PixmapPtr pPixmap;
                    114:     int nlwScreen;     /* width in longwords of the screen's pixmap */
                    115:     int w;             /* width of current box */
                    116:     register int h;    /* height of current box */
                    117:     register int startmask;
                    118:     int endmask;       /* masks for reggedy bits at either end of line */
                    119:     int nlwMiddle;     /* number of longwords between sides of boxes */
                    120:     int nlwExtra;      /* to get from right of box to left of next span */
                    121:     
                    122:     register int nlw;  /* loop version of nlwMiddle */
                    123:     register unsigned int *p;  /* pointer to bits we're writing */
                    124:     int y;             /* current scan line */
                    125: 
                    126:     unsigned int *pbits;       /* pointer to start of screen */
                    127:     mfbPrivWin *pPrivWin;
                    128: 
                    129:     pPrivWin = (mfbPrivWin *)(pWin->devPrivate);
                    130: 
                    131:     if (what == PW_BACKGROUND)
                    132:     {
                    133:        tileHeight = pWin->backgroundTile->height;
                    134:        psrc = (int *)(pPrivWin->pRotatedBackground->devPrivate);
                    135:     } 
                    136:     else
                    137:     {
                    138:         tileHeight = pWin->borderTile->height;
                    139:        psrc = (int *)(pPrivWin->pRotatedBorder->devPrivate);
                    140:     } 
                    141: 
                    142:     pPixmap = (PixmapPtr)(pWin->drawable.pScreen->devPrivate);
                    143:     pbits = (unsigned int *)pPixmap->devPrivate;
                    144:     nlwScreen = (pPixmap->devKind) >> 2;
                    145:     nbox = pRegion->numRects;
                    146:     pbox = pRegion->rects;
                    147: 
                    148:     while (nbox--)
                    149:     {
                    150:        w = pbox->x2 - pbox->x1;
                    151:        h = pbox->y2 - pbox->y1;
                    152:        y = pbox->y1;
                    153:        p = pbits + (pbox->y1 * nlwScreen) + (pbox->x1 >> 5);
                    154: 
                    155:        if ( ((pbox->x1 & 0x1f) + w) < 32)
                    156:        {
                    157:            maskpartialbits(pbox->x1, w, startmask);
                    158:            nlwExtra = nlwScreen;
                    159:            while (h--)
                    160:            {
                    161:                srcpix = psrc[y%tileHeight];
                    162:                y++;
                    163:                *p = (*p & ~startmask) | (srcpix & startmask);
                    164:                p += nlwExtra;
                    165:            }
                    166:        }
                    167:        else
                    168:        {
                    169:            maskbits(pbox->x1, w, startmask, endmask, nlwMiddle);
                    170:            nlwExtra = nlwScreen - nlwMiddle;
                    171: 
                    172:            if (startmask && endmask)
                    173:            {
                    174:                nlwExtra -= 1;
                    175:                while (h--)
                    176:                {
                    177:                    srcpix = psrc[y%tileHeight];
                    178:                    y++;
                    179:                    nlw = nlwMiddle;
                    180:                    *p = (*p & ~startmask) | (srcpix & startmask);
                    181:                    p++;
                    182:                    while (nlw--)
                    183:                        *p++ = srcpix;
                    184:                    *p = (*p & ~endmask) | (srcpix & endmask);
                    185:                    p += nlwExtra;
                    186:                }
                    187:            }
                    188:            else if (startmask && !endmask)
                    189:            {
                    190:                nlwExtra -= 1;
                    191:                while (h--)
                    192:                {
                    193:                    srcpix = psrc[y%tileHeight];
                    194:                    y++;
                    195:                    nlw = nlwMiddle;
                    196:                    *p = (*p & ~startmask) | (srcpix & startmask);
                    197:                    p++;
                    198:                    while (nlw--)
                    199:                        *p++ = srcpix;
                    200:                    p += nlwExtra;
                    201:                }
                    202:            }
                    203:            else if (!startmask && endmask)
                    204:            {
                    205:                while (h--)
                    206:                {
                    207:                    srcpix = psrc[y%tileHeight];
                    208:                    y++;
                    209:                    nlw = nlwMiddle;
                    210:                    while (nlw--)
                    211:                        *p++ = srcpix;
                    212:                    *p = (*p & ~endmask) | (srcpix & endmask);
                    213:                    p += nlwExtra;
                    214:                }
                    215:            }
                    216:            else /* no ragged bits at either end */
                    217:            {
                    218:                while (h--)
                    219:                {
                    220:                    srcpix = psrc[y%tileHeight];
                    221:                    y++;
                    222:                    nlw = nlwMiddle;
                    223:                    while (nlw--)
                    224:                        *p++ = srcpix;
                    225:                    p += nlwExtra;
                    226:                }
                    227:            }
                    228:        }
                    229:         pbox++;
                    230:     }
                    231: }

unix.superglobalmegacorp.com

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