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

1.1       root        1: /***********************************************************
                      2: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
                      3: and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
                      4: 
                      5:                         All Rights Reserved
                      6: 
                      7: Permission to use, copy, modify, and distribute this software and its 
                      8: documentation for any purpose and without fee is hereby granted, 
                      9: provided that the above copyright notice appear in all copies and that
                     10: both that copyright notice and this permission notice appear in 
                     11: supporting documentation, and that the names of Digital or MIT not be
                     12: used in advertising or publicity pertaining to distribution of the
                     13: software without specific, written prior permission.  
                     14: 
                     15: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
                     16: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
                     17: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     18: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
                     19: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
                     20: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
                     21: SOFTWARE.
                     22: 
                     23: ******************************************************************/
                     24: /* $Header: mfbclip.c,v 1.14 87/09/11 07:21:11 toddb Exp $ */
                     25: #include "X.h"
                     26: #include "miscstruct.h"
                     27: #include "pixmapstr.h"
                     28: #include "scrnintstr.h"
                     29: #include "regionstr.h"
                     30: #include "gc.h"
                     31: #include "maskbits.h"
                     32: 
                     33: /* Convert bitmap clip mask into clipping region. 
                     34:  * First, goes through each line and makes boxes by noting the transitions
                     35:  * from 0 to 1 and 1 to 0.
                     36:  * Then it coalesces the current line with the previous if they have boxes
                     37:  * at the same X coordinates.  We have to keep indices to rectangles rather 
                     38:  * than pointers because everything may move if we Xrealloc when adding a
                     39:  * rectangle.
                     40:  */
                     41: RegionPtr
                     42: mfbPixmapToRegion(pPix)
                     43:     PixmapPtr  pPix;
                     44: {
                     45:     RegionPtr  pReg;
                     46:     register unsigned  *pw, w;
                     47:     register int       ib;
                     48:     int                        width, h, base, rx1, crects;
                     49:     unsigned int       *pwLineStart;
                     50:     int                        irectPrevStart, irectLineStart;
                     51:     register BoxPtr    prectO, prectN;
                     52:     BoxPtr             FirstRect, rects, prectLineStart;
                     53:     Bool               fInBox, fSame;
                     54: 
                     55: 
                     56:     if((pReg = (*pPix->drawable.pScreen->RegionCreate)(NULL, 1)) == NullRegion)
                     57:        return NullRegion;
                     58:     rects = (BoxPtr) Xalloc(sizeof(BoxRec));
                     59:     FirstRect = rects;
                     60:     width = pPix->width;
                     61:     pw = (unsigned int  *)pPix->devPrivate;
                     62:     irectPrevStart = -1;
                     63:     for(h = 0; h < pPix->height; h++)
                     64:     {
                     65: 
                     66:        irectLineStart = rects - FirstRect;
                     67:        pwLineStart = pw;
                     68:        /* If the Screen left most bit of the word is set, we're starting in
                     69:         * a box */
                     70:        if(*pw & mask[0])
                     71:        {
                     72:            fInBox = TRUE;
                     73:            rx1 = 0;
                     74:        }
                     75:        else
                     76:            fInBox = FALSE;
                     77:        /* Process all words which are fully in the pixmap */
                     78:        while(pw  < pwLineStart + width/32)
                     79:        {
                     80:            base = (pw - pwLineStart) * 32;
                     81:            w = *pw++;
                     82:            for(ib = 0; ib < 32; ib++)
                     83:            {
                     84:                /* If the Screen left most bit of the word is set, we're
                     85:                 * starting a box */
                     86:                if(w & mask[0])
                     87:                {
                     88:                    if(!fInBox)
                     89:                    {
                     90:                        rx1 = base + ib;
                     91:                        /* start new box */
                     92:                        fInBox = TRUE;
                     93:                    }
                     94:                }
                     95:                else
                     96:                {
                     97:                    if(fInBox)
                     98:                    {
                     99:                        /* end box */
                    100:                        MEMCHECK(pReg, rects, FirstRect);
                    101:                        ADDRECT(pReg, rects, rx1, h, base + ib, h + 1);
                    102:                        fInBox = FALSE;
                    103:                    }
                    104:                }
                    105:                /* Shift the word VISUALLY left one. */
                    106:                w = SCRLEFT(w, 1);
                    107:            }
                    108:        }
                    109:        if(width & 0x1F)
                    110:        {
                    111:            /* Process final partial word on line */
                    112:            base = (pw - pwLineStart) * 32;
                    113:            w = *pw++;
                    114:            for(ib = 0; ib < width &0x1F; ib++)
                    115:            {
                    116:                /* If the Screen left most bit of the word is set, we're
                    117:                 * starting a box */
                    118:                if(w & mask[0])
                    119:                {
                    120:                    if(!fInBox)
                    121:                    {
                    122:                        rx1 = base + ib;
                    123:                        /* start new box */
                    124:                        fInBox = TRUE;
                    125:                    }
                    126:                }
                    127:                else
                    128:                {
                    129:                    if(fInBox)
                    130:                    {
                    131:                        /* end box */
                    132:                        MEMCHECK(pReg, rects, FirstRect);
                    133:                        ADDRECT(pReg, rects, rx1, h, base + ib, h + 1);
                    134:                        fInBox = FALSE;
                    135:                    }
                    136:                }
                    137:                /* Shift the word VISUALLY left one. */
                    138:                w = SCRLEFT(w, 1);
                    139:            }
                    140:        }
                    141:        /* If scanline ended with last bit set, end the box */
                    142:        if(fInBox)
                    143:        {
                    144:            MEMCHECK(pReg, rects, FirstRect);
                    145:            ADDRECT(pReg, rects, rx1, h, base + ib, h + 1);
                    146:        }
                    147:        /* if all rectangles on this line have the same x-coords as
                    148:         * those on the previous line, then add 1 to all the previous  y2s and 
                    149:         * throw away all the rectangles from this line 
                    150:         */
                    151:        fSame = FALSE;
                    152:        if(irectPrevStart != -1)
                    153:        {
                    154:            crects = irectLineStart - irectPrevStart;
                    155:            if(crects == ((rects - FirstRect) - irectLineStart))
                    156:            {
                    157:                prectO = FirstRect + irectPrevStart;
                    158:                prectN = prectLineStart = FirstRect + irectLineStart;
                    159:                fSame = TRUE;
                    160:                while(prectO < prectLineStart)
                    161:                {
                    162:                    if((prectO->x1 != prectN->x1) || (prectO->x2 != prectN->x2))
                    163:                    {
                    164:                          fSame = FALSE;
                    165:                          break;
                    166:                    }
                    167:                    prectO++;
                    168:                    prectN++;
                    169:                }
                    170:                if (fSame)
                    171:                {
                    172:                    prectO = FirstRect + irectPrevStart;
                    173:                    while(prectO < prectLineStart)
                    174:                    {
                    175:                        prectO->y2 += 1;
                    176:                        prectO++;
                    177:                    }
                    178:                    rects -= crects;
                    179:                    pReg->numRects -= crects;
                    180:                }
                    181:            }
                    182:        }
                    183:        if(!fSame)
                    184:            irectPrevStart = irectLineStart;
                    185:     }
                    186:     if(pReg->numRects)
                    187:     {
                    188:        Xfree((char *)pReg->rects);
                    189:        pReg->size = pReg->numRects;
                    190:        pReg->rects = FirstRect;
                    191:     }
                    192:     else
                    193:     {
                    194:        Xfree((char *) FirstRect);
                    195:        Xfree((char *) pReg);
                    196:        pReg = NullRegion;
                    197:     }
                    198: 
                    199:     return(pReg);
                    200: }
                    201: 

unix.superglobalmegacorp.com

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