Annotation of researchv9/X11/src/X.V11R1/server/ddx/mfb/mfbsetsp.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: mfbsetsp.c,v 1.21 87/09/07 19:08:09 toddb Exp $ */
        !            25: 
        !            26: #include "X.h"
        !            27: #include "Xmd.h"
        !            28: 
        !            29: #include "misc.h"
        !            30: #include "regionstr.h"
        !            31: #include "gcstruct.h"
        !            32: #include "windowstr.h"
        !            33: #include "pixmapstr.h"
        !            34: #include "scrnintstr.h"
        !            35: 
        !            36: #include "mfb.h"
        !            37: #include "maskbits.h"
        !            38: 
        !            39: #include "servermd.h"
        !            40: 
        !            41: 
        !            42: /* mfbSetScanline -- copies the bits from psrc to the drawable starting at
        !            43:  * (xStart, y) and continuing to (xEnd, y).  xOrigin tells us where psrc 
        !            44:  * starts on the scanline. (I.e., if this scanline passes through multiple
        !            45:  * boxes, we may not want to start grabbing bits at psrc but at some offset
        !            46:  * further on.) 
        !            47:  */
        !            48: mfbSetScanline(y, xOrigin, xStart, xEnd, psrc, alu, pdstBase, widthDst)
        !            49:     int                        y;
        !            50:     int                        xOrigin;        /* where this scanline starts */
        !            51:     int                        xStart;         /* first bit to use from scanline */
        !            52:     int                        xEnd;           /* last bit to use from scanline + 1 */
        !            53:     register int       *psrc;
        !            54:     register int       alu;            /* raster op */
        !            55:     int                        *pdstBase;      /* start of the drawable */
        !            56:     int                        widthDst;       /* width of drawable in words */
        !            57: {
        !            58:     int                        w;              /* width of scanline in bits */
        !            59:     register int       *pdst;          /* where to put the bits */
        !            60:     register int       tmpSrc;         /* scratch buffer to collect bits in */
        !            61:     int                        dstBit;         /* offset in bits from beginning of 
        !            62:                                         * word */
        !            63:     register int       nstart;         /* number of bits from first partial */
        !            64:     register int       nend;           /* " " last partial word */
        !            65:     int                offSrc;
        !            66:     int                startmask, endmask, nlMiddle, nl;
        !            67: 
        !            68:     pdst = pdstBase + (y * widthDst) + (xStart >> 5); 
        !            69:     psrc += (xStart - xOrigin) >> 5;
        !            70:     offSrc = (xStart - xOrigin) & 0x1f;
        !            71:     w = xEnd - xStart;
        !            72:     dstBit = xStart & 0x1f;
        !            73: 
        !            74:     if (dstBit + w <= 32) 
        !            75:     { 
        !            76:        getbits(psrc, offSrc, w, tmpSrc);
        !            77:        putbitsrop(tmpSrc, dstBit, w, pdst, alu); 
        !            78:     } 
        !            79:     else 
        !            80:     { 
        !            81: 
        !            82:        maskbits(xStart, w, startmask, endmask, nlMiddle);
        !            83:        if (startmask) 
        !            84:            nstart = 32 - dstBit; 
        !            85:        else 
        !            86:            nstart = 0; 
        !            87:        if (endmask) 
        !            88:            nend = xEnd & 0x1f; 
        !            89:        else 
        !            90:            nend = 0; 
        !            91:        if (startmask) 
        !            92:        { 
        !            93:            getbits(psrc, offSrc, nstart, tmpSrc);
        !            94:            putbitsrop(tmpSrc, dstBit, nstart, pdst, alu);
        !            95:            pdst++; 
        !            96:            offSrc += nstart;
        !            97:            if (offSrc > 31)
        !            98:            {
        !            99:                psrc++;
        !           100:                offSrc -= 32;
        !           101:            }
        !           102:        } 
        !           103:        nl = nlMiddle; 
        !           104:        while (nl--) 
        !           105:        { 
        !           106:            getbits(psrc, offSrc, 32, tmpSrc);
        !           107:            *pdst = DoRop(alu, tmpSrc, *pdst); 
        !           108:            pdst++; 
        !           109:            psrc++; 
        !           110:        } 
        !           111:        if (endmask) 
        !           112:        { 
        !           113:            getbits(psrc, offSrc, nend, tmpSrc);
        !           114:            putbitsrop(tmpSrc, 0, nend, pdst, alu);
        !           115:        } 
        !           116:         
        !           117:     } 
        !           118: }
        !           119: 
        !           120: 
        !           121: 
        !           122: /* SetSpans -- for each span copy pwidth[i] bits from psrc to pDrawable at
        !           123:  * ppt[i] using the raster op from the GC.  If fSorted is TRUE, the scanlines
        !           124:  * are in increasing Y order.
        !           125:  * Source bit lines are server scanline padded so that they always begin
        !           126:  * on a word boundary.
        !           127:  */ 
        !           128: void
        !           129: mfbSetSpans(pDrawable, pGC, psrc, ppt, pwidth, nspans, fSorted)
        !           130:     DrawablePtr                pDrawable;
        !           131:     GCPtr              pGC;
        !           132:     int                        *psrc;
        !           133:     register DDXPointPtr ppt;
        !           134:     int                        *pwidth;
        !           135:     int                        nspans;
        !           136:     int                        fSorted;
        !           137: {
        !           138:     int                *pdstBase;      /* start of dst bitmap */
        !           139:     int                widthDst;       /* width of bitmap in words */
        !           140:     register BoxPtr    pbox, pboxLast, pboxTest;
        !           141:     register DDXPointPtr pptLast;
        !           142:     int                alu;
        !           143:     RegionPtr          prgnDst;
        !           144:     int                        xStart, xEnd;
        !           145:     int                        yMax;
        !           146: 
        !           147:     alu = pGC->alu;
        !           148:     prgnDst = ((mfbPrivGC *)(pGC->devPriv))->pCompositeClip;
        !           149: 
        !           150:     pptLast = ppt + nspans;
        !           151: 
        !           152:     if (pDrawable->type == DRAWABLE_WINDOW)
        !           153:     {
        !           154:        pdstBase = (int *)
        !           155:                (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devPrivate);
        !           156:        widthDst = (int)
        !           157:                   ((PixmapPtr)(pDrawable->pScreen->devPrivate))->devKind
        !           158:                    >> 2;
        !           159:        yMax = (int)((WindowPtr)pDrawable)->clientWinSize.height +
        !           160:                    ((WindowPtr)pDrawable)->absCorner.y;
        !           161:     }
        !           162:     else
        !           163:     {
        !           164:        pdstBase = (int *)(((PixmapPtr)pDrawable)->devPrivate);
        !           165:        widthDst = (int)(((PixmapPtr)pDrawable)->devKind) >> 2;
        !           166:        yMax = ((PixmapPtr)pDrawable)->height;
        !           167:     }
        !           168: 
        !           169:     pbox =  prgnDst->rects;
        !           170:     pboxLast = pbox + prgnDst->numRects;
        !           171: 
        !           172:     if(fSorted)
        !           173:     {
        !           174:     /* scan lines sorted in ascending order. Because they are sorted, we
        !           175:      * don't have to check each scanline against each clip box.  We can be
        !           176:      * sure that this scanline only has to be clipped to boxes at or after the
        !           177:      * beginning of this y-band 
        !           178:      */
        !           179:        pboxTest = pbox;
        !           180:        while(ppt < pptLast)
        !           181:        {
        !           182:            pbox = pboxTest;
        !           183:            if(ppt->y >= yMax)
        !           184:                break;
        !           185:            while(pbox < pboxLast)
        !           186:            {
        !           187:                if(pbox->y1 > ppt->y)
        !           188:                {
        !           189:                    /* scanline is before clip box */
        !           190:                    break;
        !           191:                }
        !           192:                else if(pbox->y2 <= ppt->y)
        !           193:                {
        !           194:                    /* clip box is before scanline */
        !           195:                    pboxTest = ++pbox;
        !           196:                    continue;
        !           197:                }
        !           198:                else if(pbox->x1 > ppt->x + *pwidth) 
        !           199:                {
        !           200:                    /* clip box is to right of scanline */
        !           201:                    break;
        !           202:                }
        !           203:                else if(pbox->x2 <= ppt->x)
        !           204:                {
        !           205:                    /* scanline is to right of clip box */
        !           206:                    pbox++;
        !           207:                    continue;
        !           208:                }
        !           209: 
        !           210:                /* at least some of the scanline is in the current clip box */
        !           211:                xStart = max(pbox->x1, ppt->x);
        !           212:                xEnd = min(ppt->x + *pwidth, pbox->x2);
        !           213:                mfbSetScanline(ppt->y, ppt->x, xStart, xEnd, psrc, alu,
        !           214:                               pdstBase, widthDst);
        !           215:                if(ppt->x + *pwidth <= pbox->x2)
        !           216:                {
        !           217:                    /* End of the line, as it were */
        !           218:                    break;
        !           219:                }
        !           220:                else
        !           221:                    pbox++;
        !           222:            }
        !           223:            /* We've tried this line against every box; it must be outside them
        !           224:             * all.  move on to the next point */
        !           225:            ppt++;
        !           226:            psrc += PixmapWidthInPadUnits(*pwidth, 1);
        !           227:            pwidth++;
        !           228:        }
        !           229:     }
        !           230:     else
        !           231:     {
        !           232:     /* scan lines not sorted. We must clip each line against all the boxes */
        !           233:        while(ppt < pptLast)
        !           234:        {
        !           235:            if(ppt->y >= 0 && ppt->y < yMax)
        !           236:            {
        !           237:                
        !           238:                for(pbox = prgnDst->rects; pbox< pboxLast; pbox++)
        !           239:                {
        !           240:                    if(pbox->y1 > ppt->y)
        !           241:                    {
        !           242:                        /* rest of clip region is above this scanline,
        !           243:                         * skip it */
        !           244:                        break;
        !           245:                    }
        !           246:                    if(pbox->y2 <= ppt->y)
        !           247:                    {
        !           248:                        /* clip box is below scanline */
        !           249:                        pbox++;
        !           250:                        break;
        !           251:                    }
        !           252:                    if(pbox->x1 <= ppt->x + *pwidth &&
        !           253:                       pbox->x2 > ppt->x)
        !           254:                    {
        !           255:                        xStart = max(pbox->x1, ppt->x);
        !           256:                        xEnd = min(pbox->x2, ppt->x + *pwidth);
        !           257:                        mfbSetScanline(ppt->y, ppt->x, xStart, xEnd, 
        !           258:                                       psrc, alu, pdstBase, widthDst);
        !           259:                    }
        !           260: 
        !           261:                }
        !           262:            }
        !           263:        psrc += PixmapWidthInPadUnits(*pwidth, 1);
        !           264:        ppt++;
        !           265:        pwidth++;
        !           266:        }
        !           267:     }
        !           268: }
        !           269: 

unix.superglobalmegacorp.com

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