Annotation of researchv9/X11/src/X.V11R1/server/ddx/cfb/cfbpixmap.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: /* pixmap management
        !            25:    written by drewry, september 1986
        !            26: 
        !            27:    on a monchrome device, a pixmap is a bitmap.
        !            28: */
        !            29: 
        !            30: #include "Xmd.h"
        !            31: #include "servermd.h"
        !            32: #include "pixmapstr.h"
        !            33: #include "cfbmskbits.h"
        !            34: 
        !            35: #include "cfb.h"
        !            36: #include "mi.h"
        !            37: 
        !            38: PixmapPtr
        !            39: cfbCreatePixmap (pScreen, width, height, depth, format)
        !            40:     ScreenPtr  pScreen;
        !            41:     int                width;
        !            42:     int                height;
        !            43:     int                depth;
        !            44:     int                format;
        !            45: {
        !            46:     register PixmapPtr pPixmap;
        !            47:     int size;
        !            48: 
        !            49:     if (depth != 1 && depth != PSZ)
        !            50:        return (PixmapPtr)NULL;
        !            51: 
        !            52:     pPixmap = (PixmapPtr)Xalloc(sizeof(PixmapRec));
        !            53:     pPixmap->drawable.type = DRAWABLE_PIXMAP;
        !            54:     pPixmap->drawable.pScreen = pScreen;
        !            55:     pPixmap->drawable.depth = depth;
        !            56:     pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
        !            57:     pPixmap->width = width;
        !            58:     pPixmap->height = height;
        !            59:     pPixmap->devKind = PixmapBytePad(width, depth);
        !            60:     pPixmap->refcnt = 1;
        !            61:     size = height * pPixmap->devKind;
        !            62: 
        !            63:     if ( !(pPixmap->devPrivate = (pointer)Xalloc(size)))
        !            64:     {
        !            65:        Xfree(pPixmap);
        !            66:        return (PixmapPtr)NULL;
        !            67:     }
        !            68:     else
        !            69:         bzero((char *)pPixmap->devPrivate, size);
        !            70:     return pPixmap;
        !            71: }
        !            72: 
        !            73: Bool
        !            74: cfbDestroyPixmap(pPixmap)
        !            75:     PixmapPtr pPixmap;
        !            76: {
        !            77: /* BOGOSITY ALERT */
        !            78:     if ((unsigned)pPixmap < 42)
        !            79:        return TRUE;
        !            80: 
        !            81:     if(--pPixmap->refcnt)
        !            82:        return TRUE;
        !            83:     Xfree(pPixmap->devPrivate);
        !            84:     Xfree(pPixmap);
        !            85:     return TRUE;
        !            86: }
        !            87: 
        !            88: 
        !            89: PixmapPtr
        !            90: cfbCopyPixmap(pSrc)
        !            91:     register PixmapPtr pSrc;
        !            92: {
        !            93:     register PixmapPtr pDst;
        !            94:     register int       *pDstPriv, *pSrcPriv, *pDstMax;
        !            95:     int                size;
        !            96: 
        !            97:     pDst = (PixmapPtr) Xalloc(sizeof(PixmapRec));
        !            98:     pDst->drawable.type = pSrc->drawable.type;
        !            99:     pDst->drawable.pScreen = pSrc->drawable.pScreen;
        !           100:     pDst->width = pSrc->width;
        !           101:     pDst->height = pSrc->height;
        !           102:     pDst->drawable.depth = pSrc->drawable.depth;
        !           103:     pDst->devKind = pSrc->devKind;
        !           104:     pDst->refcnt = 1;
        !           105: 
        !           106:     size = pDst->height * pDst->devKind;
        !           107:     pDstPriv = (int *) Xalloc(size);
        !           108:     pDst->devPrivate = (pointer) pDstPriv;
        !           109:     if (!(pDstPriv))
        !           110:     {
        !           111:        Xfree(pDst);
        !           112:        return NullPixmap;
        !           113:     }
        !           114:     else
        !           115:        bzero((char *) pDstPriv, size);
        !           116:     pSrcPriv = (int *)pSrc->devPrivate;
        !           117:     pDstMax = pDstPriv + (size >> 2);
        !           118:     /* Copy words */
        !           119:     while(pDstPriv < pDstMax)
        !           120:     {
        !           121:         *pDstPriv++ = *pSrcPriv++;
        !           122:     }
        !           123: 
        !           124:     return pDst;
        !           125: }
        !           126: 
        !           127: 
        !           128: /* replicates a pattern to be a full 32 bits wide.
        !           129:    relies on the fact that each scnaline is longword padded.
        !           130:    doesn't do anything if pixmap is not a factor of 32 wide.
        !           131:    changes width field of pixmap if successful, so that the fast
        !           132:        cfbXRotatePixmap code gets used if we rotate the pixmap later.
        !           133:        cfbXRotatePixmap code gets used if we rotate the pixmap later.
        !           134: 
        !           135:    calculate number of times to repeat
        !           136:    for each scanline of pattern
        !           137:       zero out area to be filled with replicate
        !           138:       left shift and or in original as many times as needed
        !           139: 
        !           140:    returns TRUE iff pixmap was, or could be padded to be, 32 bits wide.
        !           141: */
        !           142: Bool
        !           143: cfbPadPixmap(pPixmap)
        !           144:     PixmapPtr pPixmap;
        !           145: {
        !           146:     /* do nothing for now; eventually pad to a 4-byte boundary. */
        !           147:     return( FALSE );
        !           148: }
        !           149: 
        !           150: 
        !           151: #ifdef notdef
        !           152: /*
        !           153:  * cfb debugging routine -- assumes pixmap is 1 byte deep 
        !           154:  */
        !           155: static cfbdumppixmap(pPix)
        !           156:     PixmapPtr  pPix;
        !           157: {
        !           158:     unsigned int *pw;
        !           159:     char *psrc, *pdst;
        !           160:     int        i, j;
        !           161:     char       line[66];
        !           162: 
        !           163:     ErrorF(  "pPixmap: 0x%x\n", pPix);
        !           164:     ErrorF(  "%d wide %d high\n", pPix->width, pPix->height);
        !           165:     if (pPix->width > 64)
        !           166:     {
        !           167:        ErrorF(  "too wide to see\n");
        !           168:        return;
        !           169:     }
        !           170: 
        !           171:     pw = (unsigned int *) pPix->devPrivate;
        !           172:     psrc = (char *) pw;
        !           173: 
        !           174: /*
        !           175:     for ( i=0; i<pPix->height; ++i )
        !           176:        ErrorF( "0x%x\n", pw[i] );
        !           177: */
        !           178: 
        !           179:     for ( i = 0; i < pPix->height; ++i ) {
        !           180:        pdst = line;
        !           181:        for(j = 0; j < pPix->width; j++) {
        !           182:            *pdst++ = *psrc++ ? 'X' : ' ' ;
        !           183:        }
        !           184:        *pdst++ = '\n';
        !           185:        *pdst++ = '\0';
        !           186:        ErrorF( "%s", line);
        !           187:     }
        !           188: }
        !           189: #endif notdef
        !           190: 
        !           191: /* Rotates pixmap pPix by w pixels to the right on the screen. Assumes that
        !           192:  * words are 32 bits wide, and that the least significant bit appears on the
        !           193:  * left.
        !           194:  */
        !           195: cfbXRotatePixmap(pPix, rw)
        !           196:     PixmapPtr  pPix;
        !           197:     register int rw;
        !           198: {
        !           199:     register long      *pw, *pwFinal, *pwNew;
        !           200:     register unsigned long     t;
        !           201:     int                        size;
        !           202: 
        !           203:     if (pPix == NullPixmap)
        !           204:         return;
        !           205: 
        !           206:     switch (((DrawablePtr) pPix)->depth) {
        !           207:        case PSZ:
        !           208:            break;
        !           209:        case 1:
        !           210:            cfbXRotateBitmap(pPix, rw);
        !           211:            return;
        !           212:        default:
        !           213:            ErrorF("cfbXRotatePixmap: unsupported depth %d\n", ((DrawablePtr) pPix)->depth);
        !           214:            return;
        !           215:     }
        !           216:     pw = (long *)pPix->devPrivate;
        !           217:     rw %= pPix->width;
        !           218:     if (rw < 0)
        !           219:        rw += pPix->width;
        !           220:     if(pPix->width == PPW)
        !           221:     {
        !           222:         pwFinal = pw + pPix->height;
        !           223:        while(pw < pwFinal)
        !           224:        {
        !           225:            t = *pw;
        !           226:            *pw++ = SCRRIGHT(t, rw) | 
        !           227:                    (SCRLEFT(t, (PPW-rw)) & cfbendtab[rw]);
        !           228:        }
        !           229:     }
        !           230:     else
        !           231:     {
        !           232:        pwNew = (long *) Xalloc( pPix->height * pPix->devKind);
        !           233: 
        !           234:        /* o.k., divide pw (the pixmap) in two vertically at (w - rw)
        !           235:         * pick up the part on the left and make it the right of the new
        !           236:         * pixmap.  then pick up the part on the right and make it the left
        !           237:         * of the new pixmap.
        !           238:         * now hook in the new part and throw away the old. All done.
        !           239:         */
        !           240:        size = PixmapBytePad(pPix->width, PSZ) >> 2;
        !           241:         cfbQuickBlt(pw, pwNew, 0, 0, rw, 0, pPix->width - rw, pPix->height,
        !           242:                    size, size);
        !           243:         cfbQuickBlt(pw, pwNew, pPix->width - rw, 0, 0, 0, rw, pPix->height,
        !           244:                    size, size);
        !           245:        pPix->devPrivate = (pointer) pwNew;
        !           246:        Xfree((char *) pw);
        !           247: 
        !           248:     }
        !           249: 
        !           250: }
        !           251: /* Rotates pixmap pPix by h lines.  Assumes that h is always less than
        !           252:    pPix->height
        !           253:    works on any width.
        !           254:  */
        !           255: cfbYRotatePixmap(pPix, rh)
        !           256:     register PixmapPtr pPix;
        !           257:     int        rh;
        !           258: {
        !           259:     int nbyDown;       /* bytes to move down to row 0; also offset of
        !           260:                           row rh */
        !           261:     int nbyUp;         /* bytes to move up to line rh; also
        !           262:                           offset of first line moved down to 0 */
        !           263:     char *pbase;
        !           264:     char *ptmp;
        !           265: 
        !           266:     if (pPix == NullPixmap)
        !           267:        return;
        !           268:     switch (((DrawablePtr) pPix)->depth) {
        !           269:        case PSZ:
        !           270:            break;
        !           271:        case 1:
        !           272:            mfbYRotatePixmap(pPix, rh);
        !           273:            return;
        !           274:        default:
        !           275:            ErrorF("cfbYRotatePixmap: unsupported depth %d\n", ((DrawablePtr) pPix)->depth);
        !           276:            return;
        !           277:     }
        !           278: 
        !           279:     rh %= pPix->height;
        !           280:     if (rh < 0)
        !           281:        rh += pPix->height;
        !           282: 
        !           283:     pbase = (char *)pPix->devPrivate;
        !           284: 
        !           285:     nbyDown = rh * pPix->devKind;
        !           286:     nbyUp = (pPix->devKind * pPix->height) - nbyDown;
        !           287:     if(!(ptmp = (char *)ALLOCATE_LOCAL(nbyUp)))
        !           288:        return;
        !           289: 
        !           290:     bcopy(pbase, ptmp, nbyUp);         /* save the low rows */
        !           291:     bcopy(pbase+nbyUp, pbase, nbyDown);        /* slide the top rows down */
        !           292:     bcopy(ptmp, pbase+nbyDown, nbyUp); /* move lower rows up to row rh */
        !           293:     DEALLOCATE_LOCAL(ptmp);
        !           294: }
        !           295: 

unix.superglobalmegacorp.com

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