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

1.1       root        1: /************************************************************
                      2: Copyright 1987 by Sun Microsystems, Inc. Mountain View, CA.
                      3: 
                      4:                     All Rights Reserved
                      5: 
                      6: Permission  to  use,  copy,  modify,  and  distribute   this
                      7: software  and  its documentation for any purpose and without
                      8: fee is hereby granted, provided that the above copyright no-
                      9: tice  appear  in all copies and that both that copyright no-
                     10: tice and this permission notice appear in  supporting  docu-
                     11: mentation,  and  that the names of Sun or MIT not be used in
                     12: advertising or publicity pertaining to distribution  of  the
                     13: software  without specific prior written permission. Sun and
                     14: M.I.T. make no representations about the suitability of this
                     15: software for any purpose. It is provided "as is" without any
                     16: express or implied warranty.
                     17: 
                     18: SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
                     19: INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
                     20: NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
                     21: ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     22: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
                     23: PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
                     24: OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
                     25: THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     26: 
                     27: ********************************************************/
                     28: 
                     29: 
                     30: /***********************************************************
                     31: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
                     32: and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
                     33: 
                     34:                         All Rights Reserved
                     35: 
                     36: Permission to use, copy, modify, and distribute this software and its 
                     37: documentation for any purpose and without fee is hereby granted, 
                     38: provided that the above copyright notice appear in all copies and that
                     39: both that copyright notice and this permission notice appear in 
                     40: supporting documentation, and that the names of Digital or MIT not be
                     41: used in advertising or publicity pertaining to distribution of the
                     42: software without specific, written prior permission.  
                     43: 
                     44: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
                     45: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
                     46: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     47: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
                     48: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
                     49: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
                     50: SOFTWARE.
                     51: 
                     52: ******************************************************************/
                     53: 
                     54: #include "X.h"
                     55: #include "Xprotostr.h"
                     56: 
                     57: #include "miscstruct.h"
                     58: #include "regionstr.h"
                     59: #include "gcstruct.h"
                     60: #include "windowstr.h"
                     61: #include "pixmapstr.h"
                     62: #include "scrnintstr.h"
                     63: 
                     64: #include "cfb.h"
                     65: #include "cfbmskbits.h"
                     66: 
                     67: 
                     68: /* CopyArea and CopyPlane for a monchrome frame buffer
                     69: 
                     70: 
                     71:     clip the source rectangle to the source's available bits.  (this
                     72: avoids copying unnecessary pieces that will just get exposed anyway.)
                     73: this becomes the new shape of the destination.
                     74:     clip the destination region to the composite clip in the
                     75: GC.  this requires translating the destination region to (dstx, dsty).
                     76:     build a list of source points, one for each rectangle in the
                     77: destination.  this is a simple translation.
                     78:     go do the multiple rectangle copies
                     79:     do graphics exposures
                     80: */
                     81: 
                     82: /* macro for bitblt to avoid a switch on the alu per scanline 
                     83:    comments are in the real code in cfbDoBitblt.
                     84:    we need tmpDst for things less than 1 word wide becuase
                     85: the destination may cross a word boundary, and we need to read
                     86: it all at once to do the rasterop.  (this perhaps argues for
                     87: sub-casing narrow things that don't cross a word boundary.)
                     88: */
                     89: #define DOBITBLT(ALU) \
                     90: while (nbox--) \
                     91: { \
                     92:     w = pbox->x2 - pbox->x1; \
                     93:     h = pbox->y2 - pbox->y1; \
                     94:     if (ydir == -1) \
                     95:     { \
                     96:         psrcLine = psrcBase + ((pptSrc->y+h-1) * -widthSrc); \
                     97:         pdstLine = pdstBase + ((pbox->y2-1) * -widthDst); \
                     98:     } \
                     99:     else \
                    100:     { \
                    101:         psrcLine = psrcBase + (pptSrc->y * widthSrc); \
                    102:         pdstLine = pdstBase + (pbox->y1 * widthDst); \
                    103:     } \
                    104:     if (w <= PPW) \
                    105:     { \
                    106:        int tmpDst; \
                    107:         int srcBit, dstBit; \
                    108:         pdstLine += (pbox->x1 >> PWSH); \
                    109:         psrcLine += (pptSrc->x >> PWSH); \
                    110:         psrc = psrcLine; \
                    111:         pdst = pdstLine; \
                    112:         srcBit = pptSrc->x & PIM; \
                    113:         dstBit = pbox->x1 & PIM; \
                    114:         while(h--) \
                    115:         { \
                    116:            getbits(psrc, srcBit, w, tmpSrc) \
                    117:            getbits(pdst, dstBit, w, tmpDst) \
                    118:            tmpSrc = ALU(tmpSrc, tmpDst); \
                    119: /*XXX*/            putbits(tmpSrc, dstBit, w, pdst, -1) \
                    120:            pdst += widthDst; \
                    121:            psrc += widthSrc; \
                    122:         } \
                    123:     } \
                    124:     else \
                    125:     { \
                    126:         register int xoffSrc; \
                    127:         int nstart; \
                    128:         int nend; \
                    129:         int srcStartOver; \
                    130:         maskbits(pbox->x1, w, startmask, endmask, nlMiddle) \
                    131:         if (startmask) \
                    132:            nstart = PPW - (pbox->x1 & PIM); \
                    133:         else \
                    134:            nstart = 0; \
                    135:         if (endmask) \
                    136:             nend = pbox->x2 & PIM; \
                    137:         else \
                    138:            nend = 0; \
                    139:         xoffSrc = ((pptSrc->x & PIM) + nstart) & PIM; \
                    140:         srcStartOver = ((pptSrc->x & PIM) + nstart) > PLST; \
                    141:         if (xdir == 1) \
                    142:         { \
                    143:             pdstLine += (pbox->x1 >> PWSH); \
                    144:             psrcLine += (pptSrc->x >> PWSH); \
                    145:            while (h--) \
                    146:            { \
                    147:                psrc = psrcLine; \
                    148:                pdst = pdstLine; \
                    149:                if (startmask) \
                    150:                { \
                    151:                    getbits(psrc, (pptSrc->x & PIM), nstart, tmpSrc) \
                    152:                    tmpSrc = ALU(tmpSrc, *pdst); \
                    153: /*XXX*/                    putbits(tmpSrc, (pbox->x1 & PIM), nstart, pdst, -1) \
                    154:                    pdst++; \
                    155:                    if (srcStartOver) \
                    156:                        psrc++; \
                    157:                } \
                    158:                nl = nlMiddle; \
                    159:                while (nl--) \
                    160:                { \
                    161:                    getbits(psrc, xoffSrc, PPW, tmpSrc) \
                    162:                    *pdst = ALU(tmpSrc, *pdst); \
                    163:                    pdst++; \
                    164:                    psrc++; \
                    165:                } \
                    166:                if (endmask) \
                    167:                { \
                    168:                    getbits(psrc, xoffSrc, nend, tmpSrc) \
                    169:                    tmpSrc = ALU(tmpSrc, *pdst); \
                    170: /*XXX*/                    putbits(tmpSrc, 0, nend, pdst, -1) \
                    171:                } \
                    172:                pdstLine += widthDst; \
                    173:                psrcLine += widthSrc; \
                    174:            } \
                    175:         } \
                    176:         else  \
                    177:         { \
                    178:             pdstLine += (pbox->x2 >> PWSH); \
                    179:             psrcLine += (pptSrc->x+w >> PWSH); \
                    180:            if (xoffSrc + nend >= PPW) \
                    181:                --psrcLine; \
                    182:            while (h--) \
                    183:            { \
                    184:                psrc = psrcLine; \
                    185:                pdst = pdstLine; \
                    186:                if (endmask) \
                    187:                { \
                    188:                    getbits(psrc, xoffSrc, nend, tmpSrc) \
                    189:                    tmpSrc = ALU(tmpSrc, *pdst); \
                    190: /*XXX*/                    putbits(tmpSrc, 0, nend, pdst, -1) \
                    191:                } \
                    192:                nl = nlMiddle; \
                    193:                while (nl--) \
                    194:                { \
                    195:                    --psrc; \
                    196:                    getbits(psrc, xoffSrc, PPW, tmpSrc) \
                    197:                    --pdst; \
                    198:                    *pdst = ALU(tmpSrc, *pdst); \
                    199:                } \
                    200:                if (startmask) \
                    201:                { \
                    202:                    if (srcStartOver) \
                    203:                        --psrc; \
                    204:                    --pdst; \
                    205:                    getbits(psrc, (pptSrc->x & PIM), nstart, tmpSrc) \
                    206:                    tmpSrc = ALU(tmpSrc, *pdst); \
                    207: /*XXX*/                    putbits(tmpSrc, (pbox->x1 & PIM), nstart, pdst, -1) \
                    208:                } \
                    209:                pdstLine += widthDst; \
                    210:                psrcLine += widthSrc; \
                    211:            } \
                    212:         } \
                    213:     } \
                    214:     pbox++; \
                    215:     pptSrc++; \
                    216: }
                    217: 
                    218: 
                    219: /* DoBitblt() does multiple rectangle moves into the rectangles
                    220:    DISCLAIMER:
                    221:    this code can be made much faster; this implementation is
                    222: designed to be independent of byte/bit order, processor
                    223: instruction set, and the like.  it could probably be done
                    224: in a similarly device independent way using mask tables instead
                    225: of the getbits/putbits macros.  the narrow case (w<32) can be
                    226: subdivided into a case that crosses word boundaries and one that
                    227: doesn't.
                    228: 
                    229:    we have to cope with the dircetion on a per band basis,
                    230: rather than a per rectangle basis.  moving bottom to top
                    231: means we have to invert the order of the bands; moving right
                    232: to left requires reversing the order of the rectangles in
                    233: each band.
                    234: 
                    235:    if src or dst is a window, the points have already been
                    236: translated.
                    237: */
                    238: 
                    239: cfbDoBitblt(pSrcDrawable, pDstDrawable, alu, prgnDst, pptSrc)
                    240: DrawablePtr pSrcDrawable;
                    241: DrawablePtr pDstDrawable;
                    242: int alu;
                    243: RegionPtr prgnDst;
                    244: DDXPointPtr pptSrc;
                    245: {
                    246:     int *psrcBase, *pdstBase;  /* start of src and dst bitmaps */
                    247:     int widthSrc, widthDst;    /* add to get to same position in next line */
                    248: 
                    249:     register BoxPtr pbox;
                    250:     int nbox;
                    251: 
                    252:     BoxPtr pboxTmp, pboxNext, pboxBase, pboxNew;
                    253:                                /* temporaries for shuffling rectangles */
                    254:     DDXPointPtr pptTmp, pptNew;        /* shuffling boxes entails shuffling the
                    255:                                   source points too */
                    256:     int w, h;
                    257:     int xdir;                  /* 1 = left right, -1 = right left/ */
                    258:     int ydir;                  /* 1 = top down, -1 = bottom up */
                    259: 
                    260:     int *psrcLine, *pdstLine;  /* pointers to line with current src and dst */
                    261:     register int *psrc;                /* pointer to current src longword */
                    262:     register int *pdst;                /* pointer to current dst longword */
                    263: 
                    264:                                /* following used for looping through a line */
                    265:     int startmask, endmask;    /* masks for writing ends of dst */
                    266:     int nlMiddle;              /* whole longwords in dst */
                    267:     register int nl;           /* temp copy of nlMiddle */
                    268:     register int tmpSrc;       /* place to store full source word */
                    269: 
                    270:     if (pSrcDrawable->type == DRAWABLE_WINDOW)
                    271:     {
                    272:        psrcBase = (int *)
                    273:                (((PixmapPtr)(pSrcDrawable->pScreen->devPrivate))->devPrivate);
                    274:        widthSrc = (int)
                    275:                   ((PixmapPtr)(pSrcDrawable->pScreen->devPrivate))->devKind
                    276:                    >> 2;
                    277:     }
                    278:     else
                    279:     {
                    280:        psrcBase = (int *)(((PixmapPtr)pSrcDrawable)->devPrivate);
                    281:        widthSrc = (int)(((PixmapPtr)pSrcDrawable)->devKind) >> 2;
                    282:     }
                    283: 
                    284:     if (pDstDrawable->type == DRAWABLE_WINDOW)
                    285:     {
                    286:        pdstBase = (int *)
                    287:                (((PixmapPtr)(pDstDrawable->pScreen->devPrivate))->devPrivate);
                    288:        widthDst = (int)
                    289:                   ((PixmapPtr)(pDstDrawable->pScreen->devPrivate))->devKind
                    290:                    >> 2;
                    291:     }
                    292:     else
                    293:     {
                    294:        pdstBase = (int *)(((PixmapPtr)pDstDrawable)->devPrivate);
                    295:        widthDst = (int)(((PixmapPtr)pDstDrawable)->devKind) >> 2;
                    296:     }
                    297: 
                    298:     pbox = prgnDst->rects;
                    299:     nbox = prgnDst->numRects;
                    300: 
                    301:     pboxNew = 0;
                    302:     pptNew = 0;
                    303:     if (pptSrc->y < pbox->y1) 
                    304:     {
                    305:         /* walk source botttom to top */
                    306:        ydir = -1;
                    307:        widthSrc = -widthSrc;
                    308:        widthDst = -widthDst;
                    309: 
                    310:        if (nbox > 1)
                    311:        {
                    312:            /* keep ordering in each band, reverse order of bands */
                    313:            pboxNew = (BoxPtr)ALLOCATE_LOCAL(sizeof(BoxRec) * nbox);
                    314:            pptNew = (DDXPointPtr)ALLOCATE_LOCAL(sizeof(DDXPointRec) * nbox);
                    315:            if(!pboxNew || !pptNew)
                    316:            {
                    317:                DEALLOCATE_LOCAL(pptNew);
                    318:                DEALLOCATE_LOCAL(pboxNew);
                    319:                return;
                    320:            }
                    321:            pboxBase = pboxNext = pbox+nbox-1;
                    322:            while (pboxBase >= pbox)
                    323:            {
                    324:                while ((pboxNext >= pbox) && 
                    325:                       (pboxBase->y1 == pboxNext->y1))
                    326:                    pboxNext--;
                    327:                pboxTmp = pboxNext+1;
                    328:                pptTmp = pptSrc + (pboxTmp - pbox);
                    329:                while (pboxTmp <= pboxBase)
                    330:                {
                    331:                    *pboxNew++ = *pboxTmp++;
                    332:                    *pptNew++ = *pptTmp++;
                    333:                }
                    334:                pboxBase = pboxNext;
                    335:            }
                    336:            pboxNew -= nbox;
                    337:            pbox = pboxNew;
                    338:            pptNew -= nbox;
                    339:            pptSrc = pptNew;
                    340:         }
                    341:     }
                    342:     else
                    343:     {
                    344:        /* walk source top to bottom */
                    345:        ydir = 1;
                    346:     }
                    347: 
                    348:     if (pptSrc->x < pbox->x1)
                    349:     {
                    350:        /* walk source right to left */
                    351:         xdir = -1;
                    352: 
                    353:        if (nbox > 1)
                    354:        {
                    355:            /* reverse order of rects ineach band */
                    356:            pboxNew = (BoxPtr)ALLOCATE_LOCAL(sizeof(BoxRec) * nbox);
                    357:            pptNew = (DDXPointPtr)ALLOCATE_LOCAL(sizeof(DDXPointRec) * nbox);
                    358:            pboxBase = pboxNext = pbox;
                    359:            if(!pboxNew || !pptNew)
                    360:            {
                    361:                DEALLOCATE_LOCAL(pptNew);
                    362:                DEALLOCATE_LOCAL(pboxNew);
                    363:                return;
                    364:            }
                    365:            while (pboxBase < pbox+nbox)
                    366:            {
                    367:                while ((pboxNext < pbox+nbox) &&
                    368:                       (pboxNext->y1 == pboxBase->y1))
                    369:                    pboxNext++;
                    370:                pboxTmp = pboxNext;
                    371:                pptTmp = pptSrc + (pboxTmp - pbox);
                    372:                while (pboxTmp != pboxBase)
                    373:                {
                    374:                    *pboxNew++ = *--pboxTmp;
                    375:                    *pptNew++ = *--pptTmp;
                    376:                }
                    377:                pboxBase = pboxNext;
                    378:            }
                    379:            pboxNew -= nbox;
                    380:            pbox = pboxNew;
                    381:            pptNew -= nbox;
                    382:            pptSrc = pptNew;
                    383:        }
                    384:     }
                    385:     else
                    386:     {
                    387:        /* walk source left to right */
                    388:         xdir = 1;
                    389:     }
                    390: 
                    391: 
                    392:     /* special case copy, to avoid some redundant moves into temporaries */
                    393:     if (alu == GXcopy)
                    394:     {
                    395:         while (nbox--)
                    396:         {
                    397:            w = pbox->x2 - pbox->x1;
                    398:            h = pbox->y2 - pbox->y1;
                    399: 
                    400:            if (ydir == -1) /* start at last scanline of rectangle */
                    401:            {
                    402:                psrcLine = psrcBase + ((pptSrc->y+h-1) * -widthSrc);
                    403:                pdstLine = pdstBase + ((pbox->y2-1) * -widthDst);
                    404:            }
                    405:            else /* start at first scanline */
                    406:            {
                    407:                psrcLine = psrcBase + (pptSrc->y * widthSrc);
                    408:                pdstLine = pdstBase + (pbox->y1 * widthDst);
                    409:            }
                    410: 
                    411:            /* x direction doesn't matter for < 1 longword */
                    412:            if (w <= PPW)
                    413:            {
                    414:                int srcBit, dstBit;     /* bit offset of src and dst */
                    415: 
                    416:                pdstLine += (pbox->x1 >> PWSH);
                    417:                psrcLine += (pptSrc->x >> PWSH);
                    418:                psrc = psrcLine;
                    419:                pdst = pdstLine;
                    420: 
                    421:                srcBit = pptSrc->x & PIM;
                    422:                dstBit = pbox->x1 & PIM;
                    423: 
                    424:                while(h--)
                    425:                {
                    426:                    getbits(psrc, srcBit, w, tmpSrc)
                    427: /*XXX*/                    putbits(tmpSrc, dstBit, w, pdst, -1)
                    428:                    pdst += widthDst;
                    429:                    psrc += widthSrc;
                    430:                }
                    431:            }
                    432:            else
                    433:            {
                    434:                register int xoffSrc;   /* offset (>= 0, < 32) from which to
                    435:                                           fetch whole longwords fetched 
                    436:                                           in src */
                    437:                int nstart;             /* number of ragged bits 
                    438:                                           at start of dst */
                    439:                int nend;               /* number of ragged bits at end 
                    440:                                           of dst */
                    441:                int srcStartOver;       /* pulling nstart bits from src
                    442:                                           overflows into the next word? */
                    443: 
                    444:                maskbits(pbox->x1, w, startmask, endmask, nlMiddle)
                    445:                if (startmask)
                    446:                    nstart = PPW - (pbox->x1 & PIM);
                    447:                else
                    448:                    nstart = 0;
                    449:                if (endmask)
                    450:                    nend = pbox->x2 & PIM;
                    451:                else
                    452:                    nend = 0;
                    453: 
                    454:                xoffSrc = ((pptSrc->x & PIM) + nstart) & PIM;
                    455:                srcStartOver = ((pptSrc->x & PIM) + nstart) > PLST;
                    456: 
                    457:                if (xdir == 1) /* move left to right */
                    458:                {
                    459:                    pdstLine += (pbox->x1 >> PWSH);
                    460:                    psrcLine += (pptSrc->x >> PWSH);
                    461: 
                    462:                    while (h--)
                    463:                    {
                    464:                        psrc = psrcLine;
                    465:                        pdst = pdstLine;
                    466: 
                    467:                        if (startmask)
                    468:                        {
                    469:                            getbits(psrc, (pptSrc->x & PIM), nstart, tmpSrc)
                    470: /*XXX*/                            putbits(tmpSrc, (pbox->x1 & PIM), nstart, pdst, 
                    471:                                -1)
                    472:                            pdst++;
                    473:                            if (srcStartOver)
                    474:                                psrc++;
                    475:                        }
                    476: 
                    477:                        nl = nlMiddle;
                    478:                        while (nl--)
                    479:                        {
                    480:                            getbits(psrc, xoffSrc, PPW, tmpSrc)
                    481:                            *pdst++ = tmpSrc;
                    482:                            psrc++;
                    483:                        }
                    484: 
                    485:                        if (endmask)
                    486:                        {
                    487:                            getbits(psrc, xoffSrc, nend, tmpSrc)
                    488: /*XXX*/                            putbits(tmpSrc, 0, nend, pdst, -1)
                    489:                        }
                    490: 
                    491:                        pdstLine += widthDst;
                    492:                        psrcLine += widthSrc;
                    493:                    }
                    494:                }
                    495:                else /* move right to left */
                    496:                {
                    497:                    pdstLine += (pbox->x2 >> PWSH);
                    498:                    psrcLine += (pptSrc->x+w >> PWSH);
                    499:                    /* if fetch of last partial bits from source crosses
                    500:                       a longword boundary, start at the previous longword
                    501:                    */
                    502:                    if (xoffSrc + nend >= PPW)
                    503:                        --psrcLine;
                    504: 
                    505:                    while (h--)
                    506:                    {
                    507:                        psrc = psrcLine;
                    508:                        pdst = pdstLine;
                    509: 
                    510:                        if (endmask)
                    511:                        {
                    512:                            getbits(psrc, xoffSrc, nend, tmpSrc)
                    513: /*XXX*/                            putbits(tmpSrc, 0, nend, pdst, -1)
                    514:                        }
                    515: 
                    516:                        nl = nlMiddle;
                    517:                        while (nl--)
                    518:                        {
                    519:                            --psrc;
                    520:                            getbits(psrc, xoffSrc, PPW, tmpSrc)
                    521:                            *--pdst = tmpSrc;
                    522:                        }
                    523: 
                    524:                        if (startmask)
                    525:                        {
                    526:                            if (srcStartOver)
                    527:                                --psrc;
                    528:                            --pdst;
                    529:                            getbits(psrc, (pptSrc->x & PIM), nstart, tmpSrc)
                    530: /*XXX*/                            putbits(tmpSrc, (pbox->x1 & PIM), nstart, pdst, 
                    531:                            -1)
                    532:                        }
                    533: 
                    534:                        pdstLine += widthDst;
                    535:                        psrcLine += widthSrc;
                    536:                    }
                    537:                } /* move right to left */
                    538:            }
                    539:            pbox++;
                    540:            pptSrc++;
                    541:         } /* while (nbox--) */
                    542:     }
                    543:     else
                    544:     {
                    545:           if (alu == GXclear)
                    546:            DOBITBLT(fnCLEAR)
                    547:           else if (alu ==GXand)
                    548:            DOBITBLT(fnAND)
                    549:           else if (alu == GXandReverse)
                    550:            DOBITBLT(fnANDREVERSE)
                    551:           else if (alu == GXcopy)
                    552:            DOBITBLT(fnCOPY)
                    553:           else if (alu == GXandInverted)
                    554:            DOBITBLT(fnANDINVERTED)
                    555: /*
                    556:           else if (alu == GXnoop)
                    557: */
                    558:           else if (alu == GXxor)
                    559:            DOBITBLT(fnXOR)
                    560:           else if (alu == GXor)
                    561:            DOBITBLT(fnOR)
                    562:           else if (alu == GXnor)
                    563:            DOBITBLT(fnNOR)
                    564:           else if (alu == GXequiv)
                    565:            DOBITBLT(fnEQUIV)
                    566:           else if (alu == GXinvert)
                    567:            DOBITBLT(fnINVERT)
                    568:           else if (alu == GXorReverse)
                    569:            DOBITBLT(fnORREVERSE)
                    570:           else if (alu == GXcopyInverted)
                    571:            DOBITBLT(fnCOPYINVERTED)
                    572:           else if (alu == GXorInverted)
                    573:            DOBITBLT(fnORINVERTED)
                    574:           else if (alu == GXnand)
                    575:            DOBITBLT(fnNAND)
                    576:           else if (alu == GXset)
                    577:            DOBITBLT(fnSET)
                    578:     }
                    579: 
                    580:     if (pptNew)
                    581:     {
                    582:        DEALLOCATE_LOCAL(pptNew);
                    583:     }
                    584:     if (pboxNew)
                    585:     {
                    586:        DEALLOCATE_LOCAL(pboxNew);
                    587:     }
                    588: }

unix.superglobalmegacorp.com

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