Annotation of researchv9/X11/src/X.V11R1/server/ddx/mfb/mfbbitblt.c, revision 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: /* $Header: mfbbitblt.c,v 1.42 87/08/09 13:58:52 ham Exp $ */
        !            25: #include "X.h"
        !            26: #include "Xprotostr.h"
        !            27: 
        !            28: #include "miscstruct.h"
        !            29: #include "regionstr.h"
        !            30: #include "gcstruct.h"
        !            31: #include "windowstr.h"
        !            32: #include "pixmapstr.h"
        !            33: #include "scrnintstr.h"
        !            34: 
        !            35: #include "mfb.h"
        !            36: #include "maskbits.h"
        !            37: 
        !            38: 
        !            39: /* CopyArea and CopyPlane for a monchrome frame buffer
        !            40: 
        !            41: 
        !            42:     clip the source rectangle to the source's available bits.  (this
        !            43: avoids copying unnecessary pieces that will just get exposed anyway.)
        !            44: this becomes the new shape of the destination.
        !            45:     clip the destination region to the composite clip in the
        !            46: GC.  this requires translating the destination region to (dstx, dsty).
        !            47:     build a list of source points, one for each rectangle in the
        !            48: destination.  this is a simple translation.
        !            49:     go do the multiple rectangle copies
        !            50:     do graphics exposures
        !            51: */
        !            52: 
        !            53: void 
        !            54: mfbCopyArea(pSrcDrawable, pDstDrawable,
        !            55:            pGC, srcx, srcy, width, height, dstx, dsty)
        !            56: register DrawablePtr pSrcDrawable;
        !            57: register DrawablePtr pDstDrawable;
        !            58: GC *pGC;
        !            59: int srcx, srcy;
        !            60: int width, height;
        !            61: int dstx, dsty;
        !            62: {
        !            63:     BoxRec srcBox;
        !            64:     RegionPtr prgnSrcClip;     /* may be a new region, or just a copy */
        !            65:     int realSrcClip = 0;       /* non-0 if we've created a src clip */
        !            66: 
        !            67:     RegionPtr prgnDst;
        !            68:     DDXPointPtr pptSrc;
        !            69:     register DDXPointPtr ppt;
        !            70:     register BoxPtr pbox;
        !            71:     int i;
        !            72:     register int dx;
        !            73:     register int dy;
        !            74:     xRectangle origSource;
        !            75:     DDXPointRec origDest;
        !            76: 
        !            77:     if (!(pGC->planemask & 1))
        !            78:        return;
        !            79: 
        !            80:     origSource.x = srcx;
        !            81:     origSource.y = srcy;
        !            82:     origSource.width = width;
        !            83:     origSource.height = height;
        !            84:     origDest.x = dstx;
        !            85:     origDest.y = dsty;
        !            86: 
        !            87:     /*
        !            88:        clip the left and top edges of the source
        !            89:     */
        !            90:     if (srcx < 0)
        !            91:     {
        !            92:         width += srcx;
        !            93:         srcx = 0;
        !            94:     }
        !            95:     if (srcy < 0)
        !            96:     {
        !            97:         height += srcy;
        !            98:         srcy = 0;
        !            99:     }
        !           100: 
        !           101:     /* clip the source */
        !           102: 
        !           103:     if (pSrcDrawable->type == DRAWABLE_PIXMAP)
        !           104:     {
        !           105:        BoxRec box;
        !           106: 
        !           107:        box.x1 = 0;
        !           108:        box.y1 = 0;
        !           109:        box.x2 = ((PixmapPtr)pSrcDrawable)->width;
        !           110:        box.y2 = ((PixmapPtr)pSrcDrawable)->height;
        !           111: 
        !           112:        prgnSrcClip = miRegionCreate(&box, 1);
        !           113:        realSrcClip = 1;
        !           114:     }
        !           115:     else
        !           116:     {
        !           117:        srcx += ((WindowPtr)pSrcDrawable)->absCorner.x;
        !           118:        srcy += ((WindowPtr)pSrcDrawable)->absCorner.y;
        !           119:        prgnSrcClip = ((WindowPtr)pSrcDrawable)->clipList;
        !           120:     }
        !           121: 
        !           122:     srcBox.x1 = srcx;
        !           123:     srcBox.y1 = srcy;
        !           124:     srcBox.x2 = srcx + width;
        !           125:     srcBox.y2 = srcy + height;
        !           126: 
        !           127:     prgnDst = miRegionCreate(&srcBox, 1);
        !           128:     miIntersect(prgnDst, prgnDst, prgnSrcClip);
        !           129: 
        !           130:     if (pDstDrawable->type == DRAWABLE_WINDOW)
        !           131:     {
        !           132:        if (!((WindowPtr)pDstDrawable)->realized)
        !           133:        {
        !           134:            miSendNoExpose(pGC);
        !           135:            miRegionDestroy(prgnDst);
        !           136:            if (realSrcClip)
        !           137:                miRegionDestroy(prgnSrcClip);
        !           138:            return;
        !           139:        }
        !           140:        dstx += ((WindowPtr)pDstDrawable)->absCorner.x;
        !           141:        dsty += ((WindowPtr)pDstDrawable)->absCorner.y;
        !           142:     }
        !           143: 
        !           144:     dx = srcx - dstx;
        !           145:     dy = srcy - dsty;
        !           146: 
        !           147:     /* clip the shape of the dst to the destination composite clip */
        !           148:     miTranslateRegion(prgnDst, -dx, -dy);
        !           149:     miIntersect(prgnDst,
        !           150:                prgnDst,
        !           151:                ((mfbPrivGC *)(pGC->devPriv))->pCompositeClip);
        !           152: 
        !           153:     if (!prgnDst->numRects)
        !           154:     {
        !           155:         miSendNoExpose(pGC);
        !           156:        miRegionDestroy(prgnDst);
        !           157:        if (realSrcClip)
        !           158:            miRegionDestroy(prgnSrcClip);
        !           159:        return;
        !           160:     }
        !           161:     if(!(pptSrc = (DDXPointPtr)ALLOCATE_LOCAL( prgnDst->numRects *
        !           162:         sizeof(DDXPointRec))))
        !           163:     {
        !           164:        miRegionDestroy(prgnDst);
        !           165:        if (realSrcClip)
        !           166:            miRegionDestroy(prgnSrcClip);
        !           167:        return;
        !           168:     }
        !           169:     pbox = prgnDst->rects;
        !           170:     ppt = pptSrc;
        !           171:     for (i=0; i<prgnDst->numRects; i++, pbox++, ppt++)
        !           172:     {
        !           173:        ppt->x = pbox->x1 + dx;
        !           174:        ppt->y = pbox->y1 + dy;
        !           175:     }
        !           176: 
        !           177:     mfbDoBitblt(pSrcDrawable, pDstDrawable, pGC->alu, prgnDst, pptSrc);
        !           178: 
        !           179:     if (((mfbPrivGC *)(pGC->devPriv))->fExpose)
        !           180:         miHandleExposures(pSrcDrawable, pDstDrawable, pGC,
        !           181:                          origSource.x, origSource.y,
        !           182:                          origSource.width, origSource.height,
        !           183:                          origDest.x, origDest.y);
        !           184:                
        !           185:     DEALLOCATE_LOCAL(pptSrc);
        !           186:     miRegionDestroy(prgnDst);
        !           187:     if (realSrcClip)
        !           188:        miRegionDestroy(prgnSrcClip);
        !           189: }
        !           190: 
        !           191: /* DoBitblt() does multiple rectangle moves into the rectangles
        !           192:    DISCLAIMER:
        !           193:    this code can be made much faster; this implementation is
        !           194: designed to be independent of byte/bit order, processor
        !           195: instruction set, and the like.  it could probably be done
        !           196: in a similarly device independent way using mask tables instead
        !           197: of the getbits/putbits macros.  the narrow case (w<32) can be
        !           198: subdivided into a case that crosses word boundaries and one that
        !           199: doesn't.
        !           200: 
        !           201:    we have to cope with the dircetion on a per band basis,
        !           202: rather than a per rectangle basis.  moving bottom to top
        !           203: means we have to invert the order of the bands; moving right
        !           204: to left requires reversing the order of the rectangles in
        !           205: each band.
        !           206: 
        !           207:    if src or dst is a window, the points have already been
        !           208: translated.
        !           209: */
        !           210: 
        !           211: mfbDoBitblt(pSrcDrawable, pDstDrawable, alu, prgnDst, pptSrc)
        !           212: DrawablePtr pSrcDrawable;
        !           213: DrawablePtr pDstDrawable;
        !           214: int alu;
        !           215: RegionPtr prgnDst;
        !           216: DDXPointPtr pptSrc;
        !           217: {
        !           218:     unsigned int *psrcBase, *pdstBase; 
        !           219:                                /* start of src and dst bitmaps */
        !           220:     int widthSrc, widthDst;    /* add to get to same position in next line */
        !           221: 
        !           222:     register BoxPtr pbox;
        !           223:     int nbox;
        !           224: 
        !           225:     BoxPtr pboxTmp, pboxNext, pboxBase, pboxNew1, pboxNew2;
        !           226:                                /* temporaries for shuffling rectangles */
        !           227:     DDXPointPtr pptTmp, pptNew1, pptNew2;
        !           228:                                /* shuffling boxes entails shuffling the
        !           229:                                   source points too */
        !           230:     int w, h;
        !           231:     int xdir;                  /* 1 = left right, -1 = right left/ */
        !           232:     int ydir;                  /* 1 = top down, -1 = bottom up */
        !           233: 
        !           234:     unsigned int *psrcLine, *pdstLine; 
        !           235:                                /* pointers to line with current src and dst */
        !           236:     register unsigned int *psrc;/* pointer to current src longword */
        !           237:     register unsigned int *pdst;/* pointer to current dst longword */
        !           238: 
        !           239:                                /* following used for looping through a line */
        !           240:     int startmask, endmask;    /* masks for writing ends of dst */
        !           241:     int nlMiddle;              /* whole longwords in dst */
        !           242:     register int nl;           /* temp copy of nlMiddle */
        !           243:     register unsigned int tmpSrc;
        !           244:                                /* place to store full source word */
        !           245:     register int xoffSrc;      /* offset (>= 0, < 32) from which to
        !           246:                                   fetch whole longwords fetched 
        !           247:                                   in src */
        !           248:     int nstart;                        /* number of ragged bits at start of dst */
        !           249:     int nend;                  /* number of ragged bits at end of dst */
        !           250:     int srcStartOver;          /* pulling nstart bits from src
        !           251:                                   overflows into the next word? */
        !           252: 
        !           253: 
        !           254:     if (pSrcDrawable->type == DRAWABLE_WINDOW)
        !           255:     {
        !           256:        psrcBase = (unsigned int *)
        !           257:                (((PixmapPtr)(pSrcDrawable->pScreen->devPrivate))->devPrivate);
        !           258:        widthSrc = (int)
        !           259:                   ((PixmapPtr)(pSrcDrawable->pScreen->devPrivate))->devKind
        !           260:                    >> 2;
        !           261:     }
        !           262:     else
        !           263:     {
        !           264:        psrcBase = (unsigned int *)(((PixmapPtr)pSrcDrawable)->devPrivate);
        !           265:        widthSrc = (int)(((PixmapPtr)pSrcDrawable)->devKind) >> 2;
        !           266:     }
        !           267: 
        !           268:     if (pDstDrawable->type == DRAWABLE_WINDOW)
        !           269:     {
        !           270:        pdstBase = (unsigned int *)
        !           271:                (((PixmapPtr)(pDstDrawable->pScreen->devPrivate))->devPrivate);
        !           272:        widthDst = (int)
        !           273:                   ((PixmapPtr)(pDstDrawable->pScreen->devPrivate))->devKind
        !           274:                    >> 2;
        !           275:     }
        !           276:     else
        !           277:     {
        !           278:        pdstBase = (unsigned int *)(((PixmapPtr)pDstDrawable)->devPrivate);
        !           279:        widthDst = (int)(((PixmapPtr)pDstDrawable)->devKind) >> 2;
        !           280:     }
        !           281: 
        !           282:     pbox = prgnDst->rects;
        !           283:     nbox = prgnDst->numRects;
        !           284: 
        !           285:     pboxNew1 = 0;
        !           286:     pptNew1 = 0;
        !           287:     pboxNew2 = 0;
        !           288:     pptNew2 = 0;
        !           289:     if (pptSrc->y < pbox->y1) 
        !           290:     {
        !           291:         /* walk source botttom to top */
        !           292:        ydir = -1;
        !           293:        widthSrc = -widthSrc;
        !           294:        widthDst = -widthDst;
        !           295: 
        !           296:        if (nbox > 1)
        !           297:        {
        !           298:            /* keep ordering in each band, reverse order of bands */
        !           299:            pboxNew1 = (BoxPtr)ALLOCATE_LOCAL(sizeof(BoxRec) * nbox);
        !           300:            pptNew1 = (DDXPointPtr)ALLOCATE_LOCAL(sizeof(DDXPointRec) * nbox);
        !           301:            if(!pboxNew1 || !pptNew1)
        !           302:            {
        !           303:                DEALLOCATE_LOCAL(pptNew1);
        !           304:                DEALLOCATE_LOCAL(pboxNew1);
        !           305:                return;
        !           306:            }
        !           307:            pboxBase = pboxNext = pbox+nbox-1;
        !           308:            while (pboxBase >= pbox)
        !           309:            {
        !           310:                while ((pboxNext >= pbox) && 
        !           311:                       (pboxBase->y1 == pboxNext->y1))
        !           312:                    pboxNext--;
        !           313:                pboxTmp = pboxNext+1;
        !           314:                pptTmp = pptSrc + (pboxTmp - pbox);
        !           315:                while (pboxTmp <= pboxBase)
        !           316:                {
        !           317:                    *pboxNew1++ = *pboxTmp++;
        !           318:                    *pptNew1++ = *pptTmp++;
        !           319:                }
        !           320:                pboxBase = pboxNext;
        !           321:            }
        !           322:            pboxNew1 -= nbox;
        !           323:            pbox = pboxNew1;
        !           324:            pptNew1 -= nbox;
        !           325:            pptSrc = pptNew1;
        !           326:         }
        !           327:     }
        !           328:     else
        !           329:     {
        !           330:        /* walk source top to bottom */
        !           331:        ydir = 1;
        !           332:     }
        !           333: 
        !           334:     if (pptSrc->x < pbox->x1)
        !           335:     {
        !           336:        /* walk source right to left */
        !           337:         xdir = -1;
        !           338: 
        !           339:        if (nbox > 1)
        !           340:        {
        !           341:            /* reverse order of rects in each band */
        !           342:            pboxNew2 = (BoxPtr)ALLOCATE_LOCAL(sizeof(BoxRec) * nbox);
        !           343:            pptNew2 = (DDXPointPtr)ALLOCATE_LOCAL(sizeof(DDXPointRec) * nbox);
        !           344:            pboxBase = pboxNext = pbox;
        !           345:            if(!pboxNew2 || !pptNew2)
        !           346:            {
        !           347:                DEALLOCATE_LOCAL(pptNew2);
        !           348:                DEALLOCATE_LOCAL(pboxNew2);
        !           349:                return;
        !           350:            }
        !           351:            while (pboxBase < pbox+nbox)
        !           352:            {
        !           353:                while ((pboxNext < pbox+nbox) &&
        !           354:                       (pboxNext->y1 == pboxBase->y1))
        !           355:                    pboxNext++;
        !           356:                pboxTmp = pboxNext;
        !           357:                pptTmp = pptSrc + (pboxTmp - pbox);
        !           358:                while (pboxTmp != pboxBase)
        !           359:                {
        !           360:                    *pboxNew2++ = *--pboxTmp;
        !           361:                    *pptNew2++ = *--pptTmp;
        !           362:                }
        !           363:                pboxBase = pboxNext;
        !           364:            }
        !           365:            pboxNew2 -= nbox;
        !           366:            pbox = pboxNew2;
        !           367:            pptNew2 -= nbox;
        !           368:            pptSrc = pptNew2;
        !           369:        }
        !           370:     }
        !           371:     else
        !           372:     {
        !           373:        /* walk source left to right */
        !           374:         xdir = 1;
        !           375:     }
        !           376: 
        !           377: 
        !           378:     /* special case copy */
        !           379:     if (alu == GXcopy)
        !           380:     {
        !           381:         while (nbox--)
        !           382:         {
        !           383:            w = pbox->x2 - pbox->x1;
        !           384:            h = pbox->y2 - pbox->y1;
        !           385: 
        !           386:            if (ydir == -1) /* start at last scanline of rectangle */
        !           387:            {
        !           388:                psrcLine = psrcBase + ((pptSrc->y+h-1) * -widthSrc);
        !           389:                pdstLine = pdstBase + ((pbox->y2-1) * -widthDst);
        !           390:            }
        !           391:            else /* start at first scanline */
        !           392:            {
        !           393:                psrcLine = psrcBase + (pptSrc->y * widthSrc);
        !           394:                pdstLine = pdstBase + (pbox->y1 * widthDst);
        !           395:            }
        !           396: 
        !           397:            /* x direction doesn't matter for < 1 longword */
        !           398:            if (w <= 32)
        !           399:            {
        !           400:                int srcBit, dstBit;     /* bit offset of src and dst */
        !           401: 
        !           402:                pdstLine += (pbox->x1 >> 5);
        !           403:                psrcLine += (pptSrc->x >> 5);
        !           404:                psrc = psrcLine;
        !           405:                pdst = pdstLine;
        !           406: 
        !           407:                srcBit = pptSrc->x & 0x1f;
        !           408:                dstBit = pbox->x1 & 0x1f;
        !           409: 
        !           410:                while(h--)
        !           411:                {
        !           412:                    getbits(psrc, srcBit, w, tmpSrc)
        !           413:                    putbits(tmpSrc, dstBit, w, pdst)
        !           414:                    pdst += widthDst;
        !           415:                    psrc += widthSrc;
        !           416:                }
        !           417:            }
        !           418:            else
        !           419:            {
        !           420:                maskbits(pbox->x1, w, startmask, endmask, nlMiddle)
        !           421:                if (startmask)
        !           422:                    nstart = 32 - (pbox->x1 & 0x1f);
        !           423:                else
        !           424:                    nstart = 0;
        !           425:                if (endmask)
        !           426:                    nend = pbox->x2 & 0x1f;
        !           427:                else
        !           428:                    nend = 0;
        !           429: 
        !           430:                xoffSrc = ((pptSrc->x & 0x1f) + nstart) & 0x1f;
        !           431:                srcStartOver = ((pptSrc->x & 0x1f) + nstart) > 31;
        !           432: 
        !           433:                if (xdir == 1) /* move left to right */
        !           434:                {
        !           435:                    pdstLine += (pbox->x1 >> 5);
        !           436:                    psrcLine += (pptSrc->x >> 5);
        !           437: 
        !           438:                    while (h--)
        !           439:                    {
        !           440:                        psrc = psrcLine;
        !           441:                        pdst = pdstLine;
        !           442: 
        !           443:                        if (startmask)
        !           444:                        {
        !           445:                            getbits(psrc, (pptSrc->x & 0x1f), nstart, tmpSrc)
        !           446:                            putbits(tmpSrc, (pbox->x1 & 0x1f), nstart, pdst)
        !           447:                            pdst++;
        !           448:                            if (srcStartOver)
        !           449:                                psrc++;
        !           450:                        }
        !           451: 
        !           452:                        nl = nlMiddle;
        !           453:                        while (nl--)
        !           454:                        {
        !           455:                            getbits(psrc, xoffSrc, 32, tmpSrc)
        !           456:                            *pdst++ = tmpSrc;
        !           457:                            psrc++;
        !           458:                        }
        !           459: 
        !           460:                        if (endmask)
        !           461:                        {
        !           462:                            getbits(psrc, xoffSrc, nend, tmpSrc)
        !           463:                            putbits(tmpSrc, 0, nend, pdst)
        !           464:                        }
        !           465: 
        !           466:                        pdstLine += widthDst;
        !           467:                        psrcLine += widthSrc;
        !           468:                    }
        !           469:                }
        !           470:                else /* move right to left */
        !           471:                {
        !           472:                    pdstLine += (pbox->x2 >> 5);
        !           473:                    psrcLine += (pptSrc->x+w >> 5);
        !           474:                    /* if fetch of last partial bits from source crosses
        !           475:                       a longword boundary, start at the previous longword
        !           476:                    */
        !           477:                    if (xoffSrc + nend >= 32)
        !           478:                        --psrcLine;
        !           479: 
        !           480:                    while (h--)
        !           481:                    {
        !           482:                        psrc = psrcLine;
        !           483:                        pdst = pdstLine;
        !           484: 
        !           485:                        if (endmask)
        !           486:                        {
        !           487:                            getbits(psrc, xoffSrc, nend, tmpSrc)
        !           488:                            putbits(tmpSrc, 0, nend, pdst)
        !           489:                        }
        !           490: 
        !           491:                        nl = nlMiddle;
        !           492:                        while (nl--)
        !           493:                        {
        !           494:                            --psrc;
        !           495:                            getbits(psrc, xoffSrc, 32, tmpSrc)
        !           496:                            *--pdst = tmpSrc;
        !           497:                        }
        !           498: 
        !           499:                        if (startmask)
        !           500:                        {
        !           501:                            if (srcStartOver)
        !           502:                                --psrc;
        !           503:                            --pdst;
        !           504:                            getbits(psrc, (pptSrc->x & 0x1f), nstart, tmpSrc)
        !           505:                            putbits(tmpSrc, (pbox->x1 & 0x1f), nstart, pdst)
        !           506:                        }
        !           507: 
        !           508:                        pdstLine += widthDst;
        !           509:                        psrcLine += widthSrc;
        !           510:                    }
        !           511:                } /* move right to left */
        !           512:            }
        !           513:            pbox++;
        !           514:            pptSrc++;
        !           515:         } /* while (nbox--) */
        !           516:     }
        !           517:     else /* do some rop */
        !           518:     {
        !           519:         while (nbox--)
        !           520:         {
        !           521:            w = pbox->x2 - pbox->x1;
        !           522:            h = pbox->y2 - pbox->y1;
        !           523: 
        !           524:            if (ydir == -1) /* start at last scanline of rectangle */
        !           525:            {
        !           526:                psrcLine = psrcBase + ((pptSrc->y+h-1) * -widthSrc);
        !           527:                pdstLine = pdstBase + ((pbox->y2-1) * -widthDst);
        !           528:            }
        !           529:            else /* start at first scanline */
        !           530:            {
        !           531:                psrcLine = psrcBase + (pptSrc->y * widthSrc);
        !           532:                pdstLine = pdstBase + (pbox->y1 * widthDst);
        !           533:            }
        !           534: 
        !           535:            /* x direction doesn't matter for < 1 longword */
        !           536:            if (w <= 32)
        !           537:            {
        !           538:                int srcBit, dstBit;     /* bit offset of src and dst */
        !           539: 
        !           540:                pdstLine += (pbox->x1 >> 5);
        !           541:                psrcLine += (pptSrc->x >> 5);
        !           542:                psrc = psrcLine;
        !           543:                pdst = pdstLine;
        !           544: 
        !           545:                srcBit = pptSrc->x & 0x1f;
        !           546:                dstBit = pbox->x1 & 0x1f;
        !           547: 
        !           548:                while(h--)
        !           549:                {
        !           550:                    getbits(psrc, srcBit, w, tmpSrc)
        !           551:                    putbitsrop(tmpSrc, dstBit, w, pdst, alu)
        !           552:                    pdst += widthDst;
        !           553:                    psrc += widthSrc;
        !           554:                }
        !           555:            }
        !           556:            else
        !           557:            {
        !           558:                maskbits(pbox->x1, w, startmask, endmask, nlMiddle)
        !           559:                if (startmask)
        !           560:                    nstart = 32 - (pbox->x1 & 0x1f);
        !           561:                else
        !           562:                    nstart = 0;
        !           563:                if (endmask)
        !           564:                    nend = pbox->x2 & 0x1f;
        !           565:                else
        !           566:                    nend = 0;
        !           567: 
        !           568:                xoffSrc = ((pptSrc->x & 0x1f) + nstart) & 0x1f;
        !           569:                srcStartOver = ((pptSrc->x & 0x1f) + nstart) > 31;
        !           570: 
        !           571:                if (xdir == 1) /* move left to right */
        !           572:                {
        !           573:                    pdstLine += (pbox->x1 >> 5);
        !           574:                    psrcLine += (pptSrc->x >> 5);
        !           575: 
        !           576:                    while (h--)
        !           577:                    {
        !           578:                        psrc = psrcLine;
        !           579:                        pdst = pdstLine;
        !           580: 
        !           581:                        if (startmask)
        !           582:                        {
        !           583:                            getbits(psrc, (pptSrc->x & 0x1f), nstart, tmpSrc)
        !           584:                            putbitsrop(tmpSrc, (pbox->x1 & 0x1f), nstart, pdst,
        !           585:                                       alu)
        !           586:                            pdst++;
        !           587:                            if (srcStartOver)
        !           588:                                psrc++;
        !           589:                        }
        !           590: 
        !           591:                        nl = nlMiddle;
        !           592:                        while (nl--)
        !           593:                        {
        !           594:                            getbits(psrc, xoffSrc, 32, tmpSrc)
        !           595:                            *pdst = DoRop(alu, tmpSrc, *pdst);
        !           596:                            pdst++;
        !           597:                            psrc++;
        !           598:                        }
        !           599: 
        !           600:                        if (endmask)
        !           601:                        {
        !           602:                            getbits(psrc, xoffSrc, nend, tmpSrc)
        !           603:                            putbitsrop(tmpSrc, 0, nend, pdst, alu)
        !           604:                        }
        !           605: 
        !           606:                        pdstLine += widthDst;
        !           607:                        psrcLine += widthSrc;
        !           608:                    }
        !           609:                }
        !           610:                else /* move right to left */
        !           611:                {
        !           612:                    pdstLine += (pbox->x2 >> 5);
        !           613:                    psrcLine += (pptSrc->x+w >> 5);
        !           614:                    /* if fetch of last partial bits from source crosses
        !           615:                       a longword boundary, start at the previous longword
        !           616:                    */
        !           617:                    if (xoffSrc + nend >= 32)
        !           618:                        --psrcLine;
        !           619: 
        !           620:                    while (h--)
        !           621:                    {
        !           622:                        psrc = psrcLine;
        !           623:                        pdst = pdstLine;
        !           624: 
        !           625:                        if (endmask)
        !           626:                        {
        !           627:                            getbits(psrc, xoffSrc, nend, tmpSrc)
        !           628:                            putbitsrop(tmpSrc, 0, nend, pdst, alu)
        !           629:                        }
        !           630: 
        !           631:                        nl = nlMiddle;
        !           632:                        while (nl--)
        !           633:                        {
        !           634:                            --psrc;
        !           635:                            --pdst;
        !           636:                            getbits(psrc, xoffSrc, 32, tmpSrc)
        !           637:                            *pdst = DoRop(alu, tmpSrc, *pdst);
        !           638:                        }
        !           639: 
        !           640:                        if (startmask)
        !           641:                        {
        !           642:                            if (srcStartOver)
        !           643:                                --psrc;
        !           644:                            --pdst;
        !           645:                            getbits(psrc, (pptSrc->x & 0x1f), nstart, tmpSrc)
        !           646:                            putbitsrop(tmpSrc, (pbox->x1 & 0x1f), nstart, pdst,
        !           647:                                       alu)
        !           648:                        }
        !           649: 
        !           650:                        pdstLine += widthDst;
        !           651:                        psrcLine += widthSrc;
        !           652:                    }
        !           653:                } /* move right to left */
        !           654:            }
        !           655:            pbox++;
        !           656:            pptSrc++;
        !           657:         } /* while (nbox--) */
        !           658:     }
        !           659: 
        !           660:     /* free up stuff */
        !           661:     if (pptNew1)
        !           662:     {
        !           663:        DEALLOCATE_LOCAL(pptNew1);
        !           664:     }
        !           665:     if (pboxNew1)
        !           666:     {
        !           667:        DEALLOCATE_LOCAL(pboxNew1);
        !           668:     }
        !           669:     if (pptNew2)
        !           670:     {
        !           671:        DEALLOCATE_LOCAL(pptNew2);
        !           672:     }
        !           673:     if (pboxNew2)
        !           674:     {
        !           675:        DEALLOCATE_LOCAL(pboxNew2);
        !           676:     }
        !           677: }
        !           678: 
        !           679: 
        !           680: /*
        !           681:     if fg == 1 and bg ==0, we can do an ordinary CopyArea.
        !           682:     if fg == bg, we can do a CopyArea with alu = ReduceRop(alu, fg)
        !           683:     if fg == 0 and bg == 1, we use the same rasterop, with
        !           684:        source operand inverted.
        !           685: 
        !           686:     CopyArea deals with all of the graphics exposure events.
        !           687:     This code depends on knowing that we can change the
        !           688: alu in the GC without having to call ValidateGC() before calling
        !           689: CopyArea().
        !           690: 
        !           691: */
        !           692: 
        !           693: void
        !           694: mfbCopyPlane(pSrcDrawable, pDstDrawable,
        !           695:            pGC, srcx, srcy, width, height, dstx, dsty, plane)
        !           696: DrawablePtr pSrcDrawable, pDstDrawable;
        !           697: register GC *pGC;
        !           698: int srcx, srcy;
        !           699: int width, height;
        !           700: int dstx, dsty;
        !           701: unsigned int plane;
        !           702: {
        !           703:     int alu;
        !           704: 
        !           705:     if (!(pGC->planemask & 1))
        !           706:        return;
        !           707: 
        !           708:     if (plane != 1)
        !           709:        return;
        !           710: 
        !           711:     if ((pGC->fgPixel == 1) && (pGC->bgPixel == 0))
        !           712:     {
        !           713:        (*pGC->CopyArea)(pSrcDrawable, pDstDrawable,
        !           714:                         pGC, srcx, srcy, width, height, dstx, dsty);
        !           715:     }
        !           716:     else if (pGC->fgPixel == pGC->bgPixel)
        !           717:     {
        !           718:        alu = pGC->alu;
        !           719:        pGC->alu = ReduceRop(pGC->alu, pGC->fgPixel);
        !           720:        (*pGC->CopyArea)(pSrcDrawable, pDstDrawable,
        !           721:                         pGC, srcx, srcy, width, height, dstx, dsty);
        !           722:        pGC->alu = alu;
        !           723:     }
        !           724:     else /* need to invert the src */
        !           725:     {
        !           726:        alu = pGC->alu;
        !           727:        pGC->alu = InverseAlu[alu];
        !           728:        (*pGC->CopyArea)(pSrcDrawable, pDstDrawable,
        !           729:                         pGC, srcx, srcy, width, height, dstx, dsty);
        !           730:        pGC->alu = alu;
        !           731:     }
        !           732: }
        !           733: 

unix.superglobalmegacorp.com

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