Annotation of researchv9/X11/src/X.V11R1/server/ddx/mi/mipushpxl.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: mipushpxl.c,v 1.14 87/09/11 07:20:28 toddb Exp $ */
        !            25: #include "X.h"
        !            26: #include "gcstruct.h"
        !            27: #include "scrnintstr.h"
        !            28: #include "pixmapstr.h"
        !            29: #include "miscstruct.h"
        !            30: #include "../mfb/maskbits.h"
        !            31: 
        !            32: #define NPT 128
        !            33: 
        !            34: /* miPushPixels -- squeegees the fill style of pGC through pBitMap
        !            35:  * into pDrawable.  pBitMap is a stencil (dx by dy of it is used, it may
        !            36:  * be bigger) which is placed on the drawable at xOrg, yOrg.  Where a 1 bit
        !            37:  * is set in the bitmap, the fill style is put onto the drawable using
        !            38:  * the GC's logical function. The drawable is not changed where the bitmap
        !            39:  * has a zero bit or outside the area covered by the stencil.
        !            40: 
        !            41: WARNING:
        !            42:     this code works if the 1-bit deep pixmap format returned by GetSpans
        !            43: is the same as the format defined by the mfb code (i.e. 32-bit padding
        !            44: per scanline, scanline unit = 32 bits; later, this might mean
        !            45: bitsizeof(int) padding and sacnline unit == bitsizeof(int).)
        !            46: 
        !            47:  */
        !            48: void
        !            49: miPushPixels(pGC, pBitMap, pDrawable, dx, dy, xOrg, yOrg)
        !            50:     GCPtr      pGC;
        !            51:     PixmapPtr  pBitMap;
        !            52:     DrawablePtr pDrawable;
        !            53:     int                dx, dy, xOrg, yOrg;
        !            54: {
        !            55:     int                h, dxDiv32, ibEnd;
        !            56:     unsigned long *pwLineStart;
        !            57:     register unsigned long     *pw, *pwEnd;
        !            58:     register unsigned long msk;
        !            59:     register int ib, w;
        !            60:     register int ipt;          /* index into above arrays */
        !            61:     Bool       fInBox;
        !            62:     DDXPointRec        pt[NPT], ptThisLine;
        !            63:     int                width[NPT];
        !            64: 
        !            65:     ipt = 0;
        !            66:     dxDiv32 = dx/32;
        !            67: 
        !            68:     for(h = 0, ptThisLine.x = 0, ptThisLine.y = 0; 
        !            69:        h < dy; 
        !            70:        h++, ptThisLine.y++)
        !            71:     {
        !            72: 
        !            73:        pw = (unsigned long *)(*pBitMap->drawable.pScreen->GetSpans)(pBitMap,
        !            74:                                                    dx, &ptThisLine, &dx, 1);
        !            75:        pwLineStart = pw;
        !            76:        /* Process all words which are fully in the pixmap */
        !            77:        
        !            78:        fInBox = FALSE;
        !            79:        pwEnd = pwLineStart + dxDiv32;
        !            80:        while(pw  < pwEnd)
        !            81:        {
        !            82:            w = *pw;
        !            83:            msk = endtab[1];
        !            84:            for(ib = 0; ib < 32; ib++)
        !            85:            {
        !            86:                if(w & msk)
        !            87:                {
        !            88:                    if(!fInBox)
        !            89:                    {
        !            90:                        pt[ipt].x = ((pw - pwLineStart) << 5) + ib + xOrg;
        !            91:                        pt[ipt].y = h + yOrg;
        !            92:                        /* start new box */
        !            93:                        fInBox = TRUE;
        !            94:                    }
        !            95:                }
        !            96:                else
        !            97:                {
        !            98:                    if(fInBox)
        !            99:                    {
        !           100:                        width[ipt] = ((pw - pwLineStart) << 5) + 
        !           101:                                     ib + xOrg - pt[ipt].x;
        !           102:                        if (++ipt >= NPT)
        !           103:                        {
        !           104:                            (*pGC->FillSpans)(pDrawable, pGC, 
        !           105:                                              NPT, pt, width, TRUE);
        !           106:                            ipt = 0;
        !           107:                        }
        !           108:                        /* end box */
        !           109:                        fInBox = FALSE;
        !           110:                    }
        !           111:                }
        !           112:                msk = SCRRIGHT(msk, 1);
        !           113:            }
        !           114:            pw++;
        !           115:        }
        !           116:        ibEnd = dx & 0x1F;
        !           117:        if(ibEnd)
        !           118:        {
        !           119:            /* Process final partial word on line */
        !           120:            w = *pw;
        !           121:            msk = endtab[1];
        !           122:            for(ib = 0; ib < ibEnd; ib++)
        !           123:            {
        !           124:                if(w & msk)
        !           125:                {
        !           126:                    if(!fInBox)
        !           127:                    {
        !           128:                        /* start new box */
        !           129:                        pt[ipt].x = ((pw - pwLineStart) << 5) + ib + xOrg;
        !           130:                        pt[ipt].y = h + yOrg;
        !           131:                        fInBox = TRUE;
        !           132:                    }
        !           133:                }
        !           134:                else
        !           135:                {
        !           136:                    if(fInBox)
        !           137:                    {
        !           138:                        /* end box */
        !           139:                        width[ipt] = ((pw - pwLineStart) << 5) + 
        !           140:                                     ib + xOrg - pt[ipt].x;
        !           141:                        if (++ipt >= NPT)
        !           142:                        {
        !           143:                            (*pGC->FillSpans)(pDrawable, 
        !           144:                                              pGC, NPT, pt, width, TRUE);
        !           145:                            ipt = 0;
        !           146:                        }
        !           147:                        fInBox = FALSE;
        !           148:                    }
        !           149:                }
        !           150:                msk = SCRRIGHT(msk, 1);
        !           151:            }
        !           152:        }
        !           153:        /* If scanline ended with last bit set, end the box */
        !           154:        if(fInBox)
        !           155:        {
        !           156:            width[ipt] = ((pw - pwLineStart) << 5) + ib + xOrg - pt[ipt].x;
        !           157:            if (++ipt >= NPT)
        !           158:            {
        !           159:                (*pGC->FillSpans)(pDrawable, pGC, NPT, pt, width, TRUE);
        !           160:                ipt = 0;
        !           161:            }
        !           162:        }
        !           163:        Xfree(pw);
        !           164:     }
        !           165:     /* Flush any remaining spans */
        !           166:     if (ipt)
        !           167:     {
        !           168:        (*pGC->FillSpans)(pDrawable, pGC, ipt, pt, width, TRUE);
        !           169:     }
        !           170: }

unix.superglobalmegacorp.com

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