Annotation of researchv9/X11/src/X.V11R1/server/ddx/cfb/cfbutils.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: 
                     25: #include "cfbmskbits.h"
                     26: 
                     27: /* cfbQuickBlt -- a quick and dirty bitblit routine
                     28:  * copies from psrcBase(xSrc, ySrc) to pdstBase(xDst, yDst) an array of bits
                     29:  * w wide by h high.  It is assumed that psrcBase and pdstBase point at 
                     30:  * things reasonable to bitblt between. It is assumed that all clipping has
                     31:  * been done.  It is also assumed that the rectangle fits on the destination
                     32:  * (that is, that (pdstBase + (yDst * h) + w) is a bit in the destination).
                     33:  * This routine does no error-checking of any type, CAVEAT HACKER 
                     34:  */
                     35: cfbQuickBlt(psrcBase, pdstBase, xSrc, ySrc, xDst, yDst, w, h, wSrc, wDst)
                     36:     int  *psrcBase, *pdstBase, /* first bits in pixmaps */
                     37:          xSrc, ySrc,           /* origin of source */
                     38:         xDst, yDst,            /* origin for destination */
                     39:         w,                     /* width to blt  */
                     40:         h,                     /* height to blt */
                     41:         wSrc, wDst;            /* width of pixmaps */
                     42: {
                     43: 
                     44:     int *psrcLine, *pdstLine;
                     45:     int xdir, ydir;
                     46:     int nl, startmask, endmask, nlMiddle, *psrc, *pdst, tmpSrc;
                     47: 
                     48:     if(psrcBase + wSrc * h < pdstBase ||
                     49:        pdstBase + wDst * h < psrcBase)
                     50:     {
                     51:        /* the areas don't overlap  right and down is fine */
                     52:        xdir = ydir = 1;
                     53:     }
                     54:     else if(ySrc < yDst) /* move right and up */
                     55:     {
                     56:        xdir = 1;
                     57:        ydir = -1;
                     58:     }
                     59:     else if(ySrc > yDst) /* move right and down */
                     60:     {
                     61:        xdir = 1;
                     62:        ydir = 1;
                     63:     }
                     64:     else if(xSrc < xDst) /* move left and down */
                     65:     {
                     66:        xdir = -1;
                     67:        ydir = 1;
                     68:     }
                     69:     else /* if xSrc <= xDst */ /* move right and down */
                     70:     {
                     71:        xdir = 1;
                     72:        ydir = 1;
                     73:     }
                     74: 
                     75:     if (ydir == -1) /* start at last scanline of rectangle */
                     76:     {
                     77:        psrcLine = psrcBase + (((ySrc + h) -1) * wSrc);
                     78:        pdstLine = pdstBase + (((yDst + h) -1) * wDst);
                     79:        wSrc = -wSrc;
                     80:        wDst = -wDst;
                     81:     }
                     82:     else /* start at first scanline */
                     83:     {
                     84:        psrcLine = psrcBase + (ySrc * wSrc);
                     85:        pdstLine = pdstBase + (yDst * wDst);
                     86:     }
                     87: 
                     88:     /* x direction doesn't matter for < 1 longword */
                     89:     if (w <= PPW)
                     90:     {
                     91:        int srcBit, dstBit;     /* bit offset of src and dst */
                     92: 
                     93:        pdstLine += (xDst >> PWSH);
                     94:        psrcLine += (xSrc >> PWSH);
                     95:        psrc = psrcLine;
                     96:        pdst = pdstLine;
                     97: 
                     98:        srcBit = xSrc & PIM;
                     99:        dstBit = xDst & PIM;
                    100: 
                    101:        while(h--)
                    102:        {
                    103:            getbits(psrc, srcBit, w, tmpSrc);
                    104: /*XXX*/            putbits(tmpSrc, dstBit, w, pdst, -1);
                    105:            psrc += wSrc;
                    106:            pdst += wDst;
                    107:        }
                    108:     }
                    109:     else
                    110:     {
                    111:        register int xoffSrc;   /* offset (>= 0, < 32) from which to
                    112:                                   fetch whole longwords fetched 
                    113:                                   in src */
                    114:        int nstart;             /* number of ragged bits 
                    115:                                   at start of dst */
                    116:        int nend;               /* number of ragged bits at end 
                    117:                                   of dst */
                    118:        int srcStartOver;       /* pulling nstart bits from src
                    119:                                   overflows into the next word? */
                    120: 
                    121:        maskbits(xDst, w, startmask, endmask, nlMiddle);
                    122:        if (startmask)
                    123:            nstart = PPW - (xDst & PIM);
                    124:        else
                    125:            nstart = 0;
                    126:        if (endmask)
                    127:            nend = (xDst + w)  & PIM;
                    128:        else
                    129:            nend = 0;
                    130: 
                    131:        xoffSrc = ((xSrc & PIM) + nstart) & PIM;
                    132:        srcStartOver = ((xSrc & PIM) + nstart) > PLST;
                    133: 
                    134:        if (xdir == 1) /* move left to right */
                    135:        {
                    136:            pdstLine += (xDst >> PWSH);
                    137:            psrcLine += (xSrc >> PWSH);
                    138: 
                    139:            while (h--)
                    140:            {
                    141:                psrc = psrcLine;
                    142:                pdst = pdstLine;
                    143: 
                    144:                if (startmask)
                    145:                {
                    146:                    getbits(psrc, (xSrc & PIM), nstart, tmpSrc);
                    147: /*XXX*/                    putbits(tmpSrc, (xDst & PIM), nstart, pdst, -1);
                    148:                    pdst++;
                    149:                    if (srcStartOver)
                    150:                        psrc++;
                    151:                }
                    152: 
                    153:                nl = nlMiddle;
                    154:                while (nl--)
                    155:                {
                    156:                    getbits(psrc, xoffSrc, PPW, tmpSrc);
                    157:                    *pdst++ = tmpSrc;
                    158:                    psrc++;
                    159:                }
                    160: 
                    161:                if (endmask)
                    162:                {
                    163:                    getbits(psrc, xoffSrc, nend, tmpSrc);
                    164: /*XXX*/                    putbits(tmpSrc, 0, nend, pdst, -1);
                    165:                }
                    166: 
                    167:                psrcLine += wSrc;
                    168:                pdstLine += wDst;
                    169:            }
                    170:        }
                    171:        else /* move right to left */
                    172:        {
                    173:            pdstLine += ((xDst + w) >> PWSH);
                    174:            psrcLine += (xSrc + w >> PWSH);
                    175:            /* if fetch of last partial bits from source crosses
                    176:               a longword boundary, start at the previous longword
                    177:            */
                    178:            if (xoffSrc + nend >= PPW)
                    179:                --psrcLine;
                    180: 
                    181:            while (h--)
                    182:            {
                    183:                psrc = psrcLine;
                    184:                pdst = pdstLine;
                    185: 
                    186:                if (endmask)
                    187:                {
                    188:                    getbits(psrc, xoffSrc, nend, tmpSrc)
                    189: /*XXX*/                    putbits(tmpSrc, 0, nend, pdst, -1)
                    190:                }
                    191: 
                    192:                nl = nlMiddle;
                    193:                while (nl--)
                    194:                {
                    195:                    --psrc;
                    196:                    getbits(psrc, xoffSrc, PPW, tmpSrc)
                    197:                    *--pdst = tmpSrc;
                    198:                }
                    199: 
                    200:                if (startmask)
                    201:                {
                    202:                    if (srcStartOver)
                    203:                        --psrc;
                    204:                    --pdst;
                    205:                    getbits(psrc, (xSrc & PIM), nstart, tmpSrc)
                    206: /*XXX*/                    putbits(tmpSrc, (xDst & PIM), nstart, pdst, -1)
                    207:                }
                    208: 
                    209:                pdstLine += wDst;
                    210:                psrcLine += wSrc;
                    211:            }
                    212:        } /* move right to left */
                    213:     }
                    214: }

unix.superglobalmegacorp.com

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