Annotation of researchv9/X11/src/X.V11R1/server/ddx/mfb/mfbpixmap.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: mfbpixmap.c,v 1.45 87/09/07 19:03:20 rws Exp $ */
        !            25: 
        !            26: /* pixmap management
        !            27:    written by drewry, september 1986
        !            28: 
        !            29:    on a monchrome device, a pixmap is a bitmap.
        !            30: */
        !            31: 
        !            32: #include "Xmd.h"
        !            33: #include "pixmapstr.h"
        !            34: #include "maskbits.h"
        !            35: 
        !            36: #include "mfb.h"
        !            37: #include "mi.h"
        !            38: 
        !            39: #include "servermd.h"
        !            40: 
        !            41: PixmapPtr
        !            42: mfbCreatePixmap (pScreen, width, height, depth)
        !            43:     ScreenPtr  pScreen;
        !            44:     int                width;
        !            45:     int                height;
        !            46:     int                depth;
        !            47: {
        !            48:     register PixmapPtr pPixmap;
        !            49:     int size;
        !            50: 
        !            51:     if (depth != 1)
        !            52:        return (PixmapPtr)NULL;
        !            53: 
        !            54:     pPixmap = (PixmapPtr)Xalloc(sizeof(PixmapRec));
        !            55:     pPixmap->drawable.type = DRAWABLE_PIXMAP;
        !            56:     pPixmap->drawable.pScreen = pScreen;
        !            57:     pPixmap->drawable.depth = 1;
        !            58:     pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
        !            59:     pPixmap->width = width;
        !            60:     pPixmap->height = height;
        !            61:     pPixmap->devKind = PixmapBytePad(width, 1);
        !            62:     pPixmap->refcnt = 1;
        !            63:     size = height * pPixmap->devKind;
        !            64: 
        !            65:     if ( !(pPixmap->devPrivate = (pointer)Xalloc(size)))
        !            66:     {
        !            67:        Xfree(pPixmap);
        !            68:        return (PixmapPtr)NULL;
        !            69:     }
        !            70:     else
        !            71:         bzero((char *)pPixmap->devPrivate, size);
        !            72:     return pPixmap;
        !            73: }
        !            74: 
        !            75: Bool
        !            76: mfbDestroyPixmap(pPixmap)
        !            77:     PixmapPtr pPixmap;
        !            78: {
        !            79: /* BOGOSITY ALERT */
        !            80:     if ((unsigned)pPixmap < 42)
        !            81:        return TRUE;
        !            82: 
        !            83:     if(--pPixmap->refcnt)
        !            84:        return TRUE;
        !            85:     Xfree(pPixmap->devPrivate);
        !            86:     Xfree(pPixmap);
        !            87:     return TRUE;
        !            88: }
        !            89: 
        !            90: 
        !            91: PixmapPtr
        !            92: mfbCopyPixmap(pSrc)
        !            93:     register PixmapPtr pSrc;
        !            94: {
        !            95:     register PixmapPtr pDst;
        !            96:     register int       *pDstPriv, *pSrcPriv, *pDstMax;
        !            97:     int                size;
        !            98: 
        !            99:     pDst = (PixmapPtr) Xalloc(sizeof(PixmapRec));
        !           100:     pDst->drawable.type = pSrc->drawable.type;
        !           101:     pDst->drawable.pScreen = pSrc->drawable.pScreen;
        !           102:     pDst->width = pSrc->width;
        !           103:     pDst->height = pSrc->height;
        !           104:     pDst->drawable.depth = pSrc->drawable.depth;
        !           105:     pDst->devKind = pSrc->devKind;
        !           106:     pDst->refcnt = 1;
        !           107: 
        !           108:     size = pDst->height * pDst->devKind;
        !           109:     pDstPriv = (int *) Xalloc(size);
        !           110:     pDst->devPrivate = (pointer) pDstPriv;
        !           111:     if (!(pDstPriv))
        !           112:     {
        !           113:        Xfree(pDst);
        !           114:        return NullPixmap;
        !           115:     }
        !           116:     else
        !           117:        bzero((char *) pDstPriv, size);
        !           118:     pSrcPriv = (int *)pSrc->devPrivate;
        !           119:     pDstMax = pDstPriv + (size >> 2);
        !           120:     /* Copy words */
        !           121:     while(pDstPriv < pDstMax)
        !           122:     {
        !           123:         *pDstPriv++ = *pSrcPriv++;
        !           124:     }
        !           125: 
        !           126:     return pDst;
        !           127: }
        !           128: 
        !           129: 
        !           130: /* replicates a pattern to be a full 32 bits wide.
        !           131:    relies on the fact that each scnaline is longword padded.
        !           132:    doesn't do anything if pixmap is not a factor of 32 wide.
        !           133:    changes width field of pixmap if successful, so that the fast
        !           134:        XRotatePixmap code gets used if we rotate the pixmap later.
        !           135: 
        !           136:    calculate number of times to repeat
        !           137:    for each scanline of pattern
        !           138:       zero out area to be filled with replicate
        !           139:       left shift and or in original as many times as needed
        !           140: 
        !           141:    returns TRUE iff pixmap was, or could be padded to be, 32 bits wide.
        !           142: */
        !           143: Bool
        !           144: mfbPadPixmap(pPixmap)
        !           145:     PixmapPtr pPixmap;
        !           146: {
        !           147:     register int width = pPixmap->width;
        !           148:     register int h;
        !           149:     register int mask;
        !           150:     register unsigned int *p;
        !           151:     register unsigned int bits;        /* real pattern bits */
        !           152:     register int i;
        !           153:     int rep;                   /* repeat count for pattern */
        !           154: 
        !           155:     if (width == 32)
        !           156:        return(TRUE);
        !           157:     if (width > 32)
        !           158:        return(FALSE);
        !           159: 
        !           160:     rep = 32/width;
        !           161:     if (rep*width != 32)
        !           162:        return(FALSE);
        !           163: 
        !           164:     mask = endtab[width];
        !           165: 
        !           166:     p = (unsigned int *)(pPixmap->devPrivate);
        !           167:     for (h=0; h < pPixmap->height; h++)
        !           168:     {
        !           169:        *p &= mask;
        !           170:        bits = *p;
        !           171:        for(i=1; i<rep; i++)
        !           172:        {
        !           173:            bits = SCRRIGHT(bits, width);
        !           174:            *p |= bits;
        !           175:        }
        !           176:        p++;
        !           177:     }
        !           178:     pPixmap->width = 32;
        !           179:     return(TRUE);
        !           180: }
        !           181: 
        !           182: /* Rotates pixmap pPix by w pixels to the right on the screen. Assumes that
        !           183:  * words are 32 bits wide, and that the least significant bit appears on the
        !           184:  * left.
        !           185:  */
        !           186: mfbXRotatePixmap(pPix, rw)
        !           187:     PixmapPtr  pPix;
        !           188:     register int rw;
        !           189: {
        !           190:     register long      *pw, *pwFinal;
        !           191:     register unsigned long     t;
        !           192: 
        !           193:     if (pPix == NullPixmap)
        !           194:         return;
        !           195: 
        !           196:     pw = (long *)pPix->devPrivate;
        !           197:     rw %= pPix->width;
        !           198:     if (rw < 0)
        !           199:        rw += pPix->width;
        !           200:     if(pPix->width == 32)
        !           201:     {
        !           202:         pwFinal = pw + pPix->height;
        !           203:        while(pw < pwFinal)
        !           204:        {
        !           205:            t = *pw;
        !           206:            *pw++ = SCRRIGHT(t, rw) | 
        !           207:                    (SCRLEFT(t, (32-rw)) & endtab[rw]);
        !           208:        }
        !           209:     }
        !           210:     else
        !           211:     {
        !           212:        /* We no longer do this.  Validate doesn't try to rotate odd-size
        !           213:         * tiles or stipples.  mfbUnnatural<tile/stipple>FS works directly off
        !           214:         * the unrotate tile/stipple in the GC
        !           215:         */
        !           216:         ErrorF("X internal error: trying to rotate odd-sized pixmap.\n");
        !           217:     }
        !           218: 
        !           219: }
        !           220: /* Rotates pixmap pPix by h lines.  Assumes that h is always less than
        !           221:    pPix->height
        !           222:    works on any width.
        !           223:  */
        !           224: mfbYRotatePixmap(pPix, rh)
        !           225:     register PixmapPtr pPix;
        !           226:     int        rh;
        !           227: {
        !           228:     int nbyDown;       /* bytes to move down to row 0; also offset of
        !           229:                           row rh */
        !           230:     int nbyUp;         /* bytes to move up to line rh; also
        !           231:                           offset of first line moved down to 0 */
        !           232:     char *pbase;
        !           233:     char *ptmp;
        !           234: 
        !           235:     if (pPix == NullPixmap)
        !           236:        return;
        !           237:     rh %= pPix->height;
        !           238:     if (rh < 0)
        !           239:        rh += pPix->height;
        !           240: 
        !           241:     pbase = (char *)pPix->devPrivate;
        !           242: 
        !           243:     nbyDown = rh * pPix->devKind;
        !           244:     nbyUp = (pPix->devKind * pPix->height) - nbyDown;
        !           245:     if(!(ptmp = (char *)ALLOCATE_LOCAL(nbyUp)))
        !           246:        return;
        !           247: 
        !           248:     bcopy(pbase, ptmp, nbyUp);         /* save the low rows */
        !           249:     bcopy(pbase+nbyUp, pbase, nbyDown);        /* slide the top rows down */
        !           250:     bcopy(ptmp, pbase+nbyDown, nbyUp); /* move lower rows up to row rh */
        !           251:     DEALLOCATE_LOCAL(ptmp);
        !           252: }
        !           253: 

unix.superglobalmegacorp.com

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