Annotation of researchv9/X11/src/X.V11R1/server/ddx/cfb/cfbpntwin.c, revision 1.1.1.1

1.1       root        1: /***********************************************************
                      2: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
                      3: and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
                      4: 
                      5:                         All Rights Reserved
                      6: 
                      7: Permission to use, copy, modify, and distribute this software and its 
                      8: documentation for any purpose and without fee is hereby granted, 
                      9: provided that the above copyright notice appear in all copies and that
                     10: both that copyright notice and this permission notice appear in 
                     11: supporting documentation, and that the names of Digital or MIT not be
                     12: used in advertising or publicity pertaining to distribution of the
                     13: software without specific, written prior permission.  
                     14: 
                     15: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
                     16: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
                     17: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     18: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
                     19: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
                     20: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
                     21: SOFTWARE.
                     22: 
                     23: ******************************************************************/
                     24: 
                     25: #include "X.h"
                     26: 
                     27: #include "windowstr.h"
                     28: #include "regionstr.h"
                     29: #include "pixmapstr.h"
                     30: #include "scrnintstr.h"
                     31: 
                     32: #include "cfb.h"
                     33: #include "cfbmskbits.h"
                     34: /*
                     35: NOTE
                     36:    PaintArea32() doesn't need to rotate the tile, since
                     37: cfbPositionWIndow() and cfbChangeWIndowAttributes() do it;
                     38: cfbPaintAreaOther(), however, needs to rotate things.
                     39: */
                     40: 
                     41: /* Paint Area None -- just return */
                     42: void
                     43: cfbPaintAreaNone(pWin, pRegion, what)
                     44:     WindowPtr pWin;
                     45:     RegionPtr pRegion;
                     46:     int what;          
                     47: {
                     48:     if ( pWin->drawable.depth != PSZ )
                     49:        FatalError( "cfbPaintAreaNone: invalid depth\n" );
                     50: }
                     51: 
                     52: /* Paint Area Parent Relative -- Find first ancestor which isn't parent
                     53:  * relative and paint as it would, but with this region */ 
                     54: void
                     55: cfbPaintAreaPR(pWin, pRegion, what)
                     56:     WindowPtr pWin;
                     57:     RegionPtr pRegion;
                     58:     int what;          
                     59: {
                     60:     WindowPtr pParent;
                     61: 
                     62:     if ( pWin->drawable.depth != PSZ )
                     63:        FatalError( "cfbPaintAreaPR: invalid depth\n" );
                     64: 
                     65:     pParent = pWin->parent;
                     66:     while(pParent->backgroundTile == (PixmapPtr)ParentRelative)
                     67:        pParent = pParent->parent;
                     68: 
                     69:     if(what == PW_BORDER)
                     70:         (*pParent->PaintWindowBorder)(pParent, pRegion, what);
                     71:     else
                     72:        (*pParent->PaintWindowBackground)(pParent, pRegion, what);
                     73: }
                     74: 
                     75: void
                     76: cfbPaintAreaSolid(pWin, pRegion, what)
                     77:     WindowPtr pWin;
                     78:     RegionPtr pRegion;
                     79:     int what;          
                     80: {
                     81:     int nbox;          /* number of boxes to fill */
                     82:     register BoxPtr pbox;      /* pointer to list of boxes to fill */
                     83:     register int srcpix;/* source pixel of the window */
                     84: 
                     85:     PixmapPtr pPixmap;
                     86:     int nlwScreen;     /* width in longwords of the screen's pixmap */
                     87:     int w;             /* width of current box */
                     88:     register int h;    /* height of current box */
                     89:     int startmask;
                     90:     int endmask;       /* masks for reggedy bits at either end of line */
                     91:     int nlwMiddle;     /* number of longwords between sides of boxes */
                     92:     register int nlwExtra;     
                     93:                        /* to get from right of box to left of next span */
                     94:     register int nlw;  /* loop version of nlwMiddle */
                     95:     register int *p;   /* pointer to bits we're writing */
                     96:     int *pbits;                /* pointer to start of screen */
                     97: 
                     98:     if ( pWin->drawable.depth != PSZ )
                     99:        FatalError( "cfbPaintAreaSolid: invalid depth\n" );
                    100: 
                    101:     if (what == PW_BACKGROUND)
                    102:     {
                    103:         srcpix = PFILL(pWin->backgroundPixel);
                    104:     } 
                    105:     else
                    106:     {
                    107:         srcpix = PFILL(pWin->borderPixel);
                    108:     } 
                    109: 
                    110:     pPixmap = (PixmapPtr)(pWin->drawable.pScreen->devPrivate);
                    111:     pbits = (int *)pPixmap->devPrivate;
                    112:     nlwScreen = (pPixmap->devKind) >> 2;
                    113:     nbox = pRegion->numRects;
                    114:     pbox = pRegion->rects;
                    115: 
                    116:     while (nbox--)
                    117:     {
                    118:        w = pbox->x2 - pbox->x1;
                    119:        h = pbox->y2 - pbox->y1;
                    120:        p = pbits + (pbox->y1 * nlwScreen) + (pbox->x1 >> PWSH);
                    121: 
                    122:        if ( ((pbox->x1 & PIM) + w) < PPW)
                    123:        {
                    124:            maskpartialbits(pbox->x1, w, startmask);
                    125:            nlwExtra = nlwScreen;
                    126:            while (h--)
                    127:            {
                    128:                *p = (*p & ~startmask) | (srcpix & startmask);
                    129:                p += nlwExtra;
                    130:            }
                    131:        }
                    132:        else
                    133:        {
                    134:            maskbits(pbox->x1, w, startmask, endmask, nlwMiddle);
                    135:            nlwExtra = nlwScreen - nlwMiddle;
                    136: 
                    137:            if (startmask && endmask)
                    138:            {
                    139:                nlwExtra -= 1;
                    140:                while (h--)
                    141:                {
                    142:                    nlw = nlwMiddle;
                    143:                    *p = (*p & ~startmask) | (srcpix & startmask);
                    144:                    p++;
                    145:                    while (nlw--)
                    146:                        *p++ = srcpix;
                    147:                    *p = (*p & ~endmask) | (srcpix & endmask);
                    148:                    p += nlwExtra;
                    149:                }
                    150:            }
                    151:            else if (startmask && !endmask)
                    152:            {
                    153:                nlwExtra -= 1;
                    154:                while (h--)
                    155:                {
                    156:                    nlw = nlwMiddle;
                    157:                    *p = (*p & ~startmask) | (srcpix & startmask);
                    158:                    p++;
                    159:                    while (nlw--)
                    160:                        *p++ = srcpix;
                    161:                    p += nlwExtra;
                    162:                }
                    163:            }
                    164:            else if (!startmask && endmask)
                    165:            {
                    166:                while (h--)
                    167:                {
                    168:                    nlw = nlwMiddle;
                    169:                    while (nlw--)
                    170:                        *p++ = srcpix;
                    171:                    *p = (*p & ~endmask) | (srcpix & endmask);
                    172:                    p += nlwExtra;
                    173:                }
                    174:            }
                    175:            else /* no ragged bits at either end */
                    176:            {
                    177:                while (h--)
                    178:                {
                    179:                    nlw = nlwMiddle;
                    180:                    while (nlw--)
                    181:                        *p++ = srcpix;
                    182:                    p += nlwExtra;
                    183:                }
                    184:            }
                    185:        }
                    186:         pbox++;
                    187:     }
                    188: }
                    189: 
                    190: /* Tile area with a 32 bit wide tile */
                    191: void
                    192: cfbPaintArea32(pWin, pRegion, what)
                    193:     WindowPtr pWin;
                    194:     RegionPtr pRegion;
                    195:     int what;          
                    196: {
                    197:     int nbox;          /* number of boxes to fill */
                    198:     register BoxPtr pbox;      /* pointer to list of boxes to fill */
                    199:     int srcpix;        
                    200:     int *psrc;         /* pointer to bits in tile, if needed */
                    201:     int tileHeight;    /* height of the tile */
                    202: 
                    203:     PixmapPtr pPixmap;
                    204:     int nlwScreen;     /* width in longwords of the screen's pixmap */
                    205:     int w;             /* width of current box */
                    206:     register int h;    /* height of current box */
                    207:     int startmask;
                    208:     int endmask;       /* masks for reggedy bits at either end of line */
                    209:     int nlwMiddle;     /* number of longwords between sides of boxes */
                    210:     register int nlwExtra;     
                    211:                        /* to get from right of box to left of next span */
                    212:     
                    213:     register int nlw;  /* loop version of nlwMiddle */
                    214:     register int *p;   /* pointer to bits we're writing */
                    215:     int y;             /* current scan line */
                    216: 
                    217: 
                    218:     int *pbits;                /* pointer to start of screen */
                    219:     cfbPrivWin *pPrivWin;
                    220: 
                    221:     if ( pWin->drawable.depth != PSZ )
                    222:        FatalError( "cfbPaintArea32: invalid depth\n" );
                    223: 
                    224:     pPrivWin = (cfbPrivWin *)(pWin->devPrivate);
                    225: 
                    226:     if (what == PW_BACKGROUND)
                    227:     {
                    228:        tileHeight = pWin->backgroundTile->height;
                    229:        psrc = (int *)(pPrivWin->pRotatedBackground->devPrivate);
                    230:     } 
                    231:     else
                    232:     {
                    233:         tileHeight = pWin->borderTile->height;
                    234:        psrc = (int *)(pPrivWin->pRotatedBorder->devPrivate);
                    235:     } 
                    236: 
                    237:     pPixmap = (PixmapPtr)(pWin->drawable.pScreen->devPrivate);
                    238:     pbits = (int *)pPixmap->devPrivate;
                    239:     nlwScreen = (pPixmap->devKind) >> 2;
                    240:     nbox = pRegion->numRects;
                    241:     pbox = pRegion->rects;
                    242: 
                    243:     while (nbox--)
                    244:     {
                    245:        w = pbox->x2 - pbox->x1;
                    246:        h = pbox->y2 - pbox->y1;
                    247:        y = pbox->y1;
                    248:        p = pbits + (pbox->y1 * nlwScreen) + (pbox->x1 >> PWSH);
                    249: 
                    250:        if ( ((pbox->x1 & PIM) + w) < PPW)
                    251:        {
                    252:            maskpartialbits(pbox->x1, w, startmask);
                    253:            nlwExtra = nlwScreen;
                    254:            while (h--)
                    255:            {
                    256:                if (tileHeight)
                    257:                {
                    258:                    srcpix = psrc[y%tileHeight];
                    259:                    y++;
                    260:                }
                    261:                *p = (*p & ~startmask) | (srcpix & startmask);
                    262:                p += nlwExtra;
                    263:            }
                    264:        }
                    265:        else
                    266:        {
                    267:            maskbits(pbox->x1, w, startmask, endmask, nlwMiddle);
                    268:            nlwExtra = nlwScreen - nlwMiddle;
                    269: 
                    270:            if (startmask && endmask)
                    271:            {
                    272:                nlwExtra -= 1;
                    273:                while (h--)
                    274:                {
                    275:                    if (tileHeight)
                    276:                    {
                    277:                        srcpix = psrc[y%tileHeight];
                    278:                        y++;
                    279:                    }
                    280:                    nlw = nlwMiddle;
                    281:                    *p = (*p & ~startmask) | (srcpix & startmask);
                    282:                    p++;
                    283:                    while (nlw--)
                    284:                        *p++ = srcpix;
                    285:                    *p = (*p & ~endmask) | (srcpix & endmask);
                    286:                    p += nlwExtra;
                    287:                }
                    288:            }
                    289:            else if (startmask && !endmask)
                    290:            {
                    291:                nlwExtra -= 1;
                    292:                while (h--)
                    293:                {
                    294:                    if (tileHeight)
                    295:                    {
                    296:                        srcpix = psrc[y%tileHeight];
                    297:                        y++;
                    298:                    }
                    299:                    nlw = nlwMiddle;
                    300:                    *p = (*p & ~startmask) | (srcpix & startmask);
                    301:                    p++;
                    302:                    while (nlw--)
                    303:                        *p++ = srcpix;
                    304:                    p += nlwExtra;
                    305:                }
                    306:            }
                    307:            else if (!startmask && endmask)
                    308:            {
                    309:                while (h--)
                    310:                {
                    311:                    if (tileHeight)
                    312:                    {
                    313:                        srcpix = psrc[y%tileHeight];
                    314:                        y++;
                    315:                    }
                    316:                    nlw = nlwMiddle;
                    317:                    while (nlw--)
                    318:                        *p++ = srcpix;
                    319:                    *p = (*p & ~endmask) | (srcpix & endmask);
                    320:                    p += nlwExtra;
                    321:                }
                    322:            }
                    323:            else /* no ragged bits at either end */
                    324:            {
                    325:                while (h--)
                    326:                {
                    327:                    if (tileHeight)
                    328:                    {
                    329:                        srcpix = psrc[y%tileHeight];
                    330:                        y++;
                    331:                    }
                    332:                    nlw = nlwMiddle;
                    333:                    while (nlw--)
                    334:                        *p++ = srcpix;
                    335:                    p += nlwExtra;
                    336:                }
                    337:            }
                    338:        }
                    339:         pbox++;
                    340:     }
                    341: }
                    342: 
                    343: void
                    344: cfbPaintAreaOther(pWin, pRegion, what)
                    345:     WindowPtr pWin;
                    346:     RegionPtr pRegion;
                    347:     int what;  
                    348: 
                    349: {
                    350:     int nbox;          /* number of boxes to fill */
                    351:     register BoxPtr pbox;      /* pointer to list of boxes to fill */
                    352:     int tileHeight;    /* height of the tile */
                    353:     int tileWidth;     /* width of the tile */
                    354: 
                    355:     PixmapPtr pPixmap;
                    356:     int w;             /* width of current box */
                    357:     register int h;    /* height of current box */
                    358:     int x, y;          /* current scan line */
                    359:     int        height, width;
                    360: 
                    361:     if ( pWin->drawable.depth != PSZ )
                    362:        FatalError( "cfbPaintAreaOther: invalid depth\n" );
                    363: 
                    364:     if (what == PW_BACKGROUND)
                    365:     {
                    366:        tileHeight = pWin->backgroundTile->height;
                    367:        tileWidth = pWin->backgroundTile->width;
                    368:        pPixmap = pWin->backgroundTile;
                    369:     }
                    370:     else
                    371:     {
                    372:        tileHeight = pWin->borderTile->height;
                    373:        tileWidth = pWin->borderTile->width;
                    374:        pPixmap = pWin->borderTile;
                    375:     } 
                    376: 
                    377:     nbox = pRegion->numRects;
                    378:     pbox = pRegion->rects;
                    379: 
                    380:     while (nbox--)
                    381:     {
                    382:        w = pbox->x2;
                    383:        h = pbox->y2;
                    384: 
                    385:        if (  w - pbox->x1 <= PPW)
                    386:        {
                    387:            y = pbox->y1;
                    388:            x = pbox->x1;
                    389:            width = min(tileWidth, w - x);
                    390:            while ((height = h - y) > 0)
                    391:            {
                    392:                height = min(height, tileHeight);
                    393:                cfbTileOddWin(pPixmap, pWin, width, height, x, y);
                    394:                y += tileHeight;
                    395:            }
                    396:        }
                    397:        else
                    398:        {
                    399:            y = pbox->y1;
                    400:            while((height = h - y) > 0)
                    401:            {
                    402:                height = min(height, tileHeight);
                    403:                x = pbox->x1;
                    404:                while ((width = w - x) > 0)
                    405:                {
                    406:                    width = min(tileWidth, width);
                    407:                    cfbTileOddWin(pPixmap, pWin, width, height, x, y);
                    408:                    x += tileWidth;
                    409:                }
                    410:                y += tileHeight;
                    411:            }
                    412:        }
                    413:         pbox++;
                    414:     }
                    415: }
                    416: 
                    417: 
                    418: 
                    419: cfbTileOddWin(pSrc, pDstWin, tileWidth, tileHeight, x, y)
                    420:     PixmapPtr  pSrc;           /* pointer to src tile */
                    421:     WindowPtr  pDstWin;        /* pointer to dest window */
                    422:     int                tileWidth;      /* width of tile */
                    423:     int                tileHeight;     /* height of tile */
                    424:     int        x;              /* destination x */
                    425:     int        y;              /* destination y */
                    426:     
                    427: {
                    428:     int                *psrcLine, *pdstLine;
                    429:     register int       *pdst, *psrc;
                    430:     register int       nl;
                    431:     register int       tmpSrc;
                    432:     int                        widthSrc, widthDst, nlMiddle, startmask, endmask;
                    433:     PixmapPtr          pDstPixmap;
                    434: 
                    435: 
                    436:     psrcLine = (int *)pSrc->devPrivate;
                    437: 
                    438:     pDstPixmap = (PixmapPtr)pDstWin->drawable.pScreen->devPrivate;
                    439:     widthDst = (int)pDstPixmap->devKind >> 2;
                    440:     pdstLine = (int *)pDstPixmap->devPrivate + (y * widthDst);
                    441:     widthSrc = (int)pSrc->devKind >> 2;
                    442: 
                    443:     if(tileWidth <= PPW)
                    444:     {
                    445:         int dstBit;
                    446: 
                    447:         psrc = psrcLine;
                    448:        pdst = pdstLine + (x / PPW);
                    449:        dstBit = x & PIM;
                    450: 
                    451:        while(tileHeight--)
                    452:        {
                    453:            getbits(psrc, 0, tileWidth, tmpSrc);
                    454: /*XXX*/            putbits(tmpSrc, dstBit, tileWidth, pdst, -1);
                    455:            pdst += widthDst;
                    456:            psrc += widthSrc;
                    457:        }
                    458: 
                    459:     }
                    460:     else
                    461:     {
                    462:        register int xoffSrc;   /* offset (>= 0, < 32) from which to
                    463:                                 * fetch whole longwords fetched in src */
                    464:        int nstart;             /* number of ragged bits at start of dst */
                    465:        int nend;               /* number of regged bits at end of dst */
                    466:        int srcStartOver;       /* pulling nstart bits from src overflows
                    467:                                 * into the next word? */
                    468: 
                    469:        maskbits(x, tileWidth, startmask, endmask, nlMiddle);
                    470:        if (startmask)
                    471:            nstart = PPW - (x & PIM);
                    472:        else
                    473:            nstart = 0;
                    474:        if (endmask)
                    475:            nend = (x + tileWidth) & PIM;
                    476: 
                    477:        xoffSrc = nstart & PIM;
                    478:        srcStartOver = nstart > PLST;
                    479: 
                    480:        pdstLine += (x >> PWSH);
                    481: 
                    482:        while (tileHeight--)
                    483:        {
                    484:            psrc = psrcLine;
                    485:            pdst = pdstLine;
                    486: 
                    487:            if (startmask)
                    488:            {
                    489:                getbits(psrc, 0, nstart, tmpSrc);
                    490: /*XXX*/                putbits(tmpSrc, (x & PIM), nstart, pdst, -1);
                    491:                pdst++;
                    492: #ifdef notdef
                    493: /* XXX - not sure if this is right or not DSHR */
                    494:                if (srcStartOver)
                    495:                    psrc++;
                    496: #endif
                    497:            }
                    498: 
                    499:            nl = nlMiddle;
                    500:            while (nl--)
                    501:            {
                    502:                getbits(psrc, xoffSrc, PPW, tmpSrc);
                    503:                *pdst++ = tmpSrc;
                    504:                psrc++;
                    505:            }
                    506: 
                    507:            if (endmask)
                    508:            {
                    509:                getbits(psrc, xoffSrc, nend, tmpSrc);
                    510: /*XXX*/                putbits(tmpSrc, 0, nend, pdst, -1);
                    511:            }
                    512: 
                    513:            pdstLine += widthDst;
                    514:            psrcLine += widthSrc;
                    515:        }
                    516:     }
                    517: }

unix.superglobalmegacorp.com

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