home *** CD-ROM | disk | FTP | other *** search
- /*
- * cfb8bit.h
- *
- * Defines which are only useful to 8 bit color frame buffers
- */
-
- /*
- Copyright 1989 by the Massachusetts Institute of Technology
-
- Permission to use, copy, modify, and distribute this software and its
- documentation for any purpose and without fee is hereby granted,
- provided that the above copyright notice appear in all copies and that
- both that copyright notice and this permission notice appear in
- supporting documentation, and that the name of M.I.T. not be used in
- advertising or publicity pertaining to distribution of the software
- without specific, written prior permission. M.I.T. makes no
- representations about the suitability of this software for any
- purpose. It is provided "as is" without express or implied warranty.
- */
-
- /* $XConsortium: cfb8bit.h,v 1.11 91/07/11 17:58:48 keith Exp $ */
-
- #if (PPW == 4)
-
- #include "servermd.h"
-
- #if (BITMAP_BIT_ORDER == MSBFirst)
- #define GetFourBits(x) (((unsigned long) (x)) >> 28)
- #define NextFourBits(x) ((x) <<= 4)
- #define NextSomeBits(x,n) ((x) <<= (n))
- #else
- #define GetFourBits(x) ((x) & 0xf)
- #define NextFourBits(x) ((x) >>= 4)
- #define NextSomeBits(x,n) ((x) >>= (n))
- #endif
-
- #define RotBitsLeft(x,k) ((x) = BitLeft (x,k) | \
- BitRight (x, 32-(k)))
-
- #if defined(__GNUC__) && defined(mc68020)
- #undef RotBitsLeft
- #define RotBitsLeft(x,k) asm("rol%.l %2,%0" \
- : "=d" (x) \
- : "0" (x), "dI" (k))
- #endif
-
- #define GetFourPixels(x) (cfb8StippleXor[GetFourBits(x)])
- #define RRopPixels(dst,x) (DoRRop(dst,cfb8StippleAnd[x], cfb8StippleXor[x]))
- #define RRopFourPixels(dst,x) (RRopPixels(dst,GetFourBits(x)))
- #define MaskRRopPixels(dst,x,mask) (DoMaskRRop(dst,cfb8StippleAnd[x], cfb8StippleXor[x], mask))
-
-
- extern int cfb8StippleMode, cfb8StippleAlu;
- extern unsigned long cfb8StippleFg, cfb8StippleBg, cfb8StipplePm;
- extern unsigned long cfb8StippleMasks[16];
- extern unsigned long cfb8StippleAnd[16], cfb8StippleXor[16];
- extern int cfb8StippleRRop;
-
- #define cfb8PixelMasks cfb8StippleMasks
- #define cfb8Pixels cfb8StippleXor
-
- extern int cfb8SetStipple (), cfb8SetOpaqueStipple();
-
- #define cfb8CheckPixels(fg, bg) \
- (FillOpaqueStippled == cfb8StippleMode && \
- GXcopy == cfb8StippleAlu && \
- ((fg) & PMSK) == cfb8StippleFg && \
- ((bg) & PMSK) == cfb8StippleBg && \
- PMSK == cfb8StipplePm)
-
- #define cfb8CheckOpaqueStipple(alu,fg,bg,pm) \
- ((FillOpaqueStippled == cfb8StippleMode && \
- (alu) == cfb8StippleAlu && \
- ((fg) & PMSK) == cfb8StippleFg && \
- ((bg) & PMSK) == cfb8StippleBg && \
- ((pm) & PMSK) == cfb8StipplePm) ? 0 : cfb8SetOpaqueStipple(alu,fg,bg,pm))
-
- #define cfb8CheckStipple(alu,fg,pm) \
- ((FillStippled == cfb8StippleMode && \
- (alu) == cfb8StippleAlu && \
- ((fg) & PMSK) == cfb8StippleFg && \
- ((pm) & PMSK) == cfb8StipplePm) ? 0 : cfb8SetStipple(alu,fg,pm))
-
- #define cfb8SetPixels(fg,bg) cfb8SetOpaqueStipple(GXcopy,fg,bg,PMSK)
-
- /*
- * These macros are shared between the unnatural spans code
- * and the unnatural rectangle code. No reasonable person
- * would attempt to use them anyplace else.
- */
-
- #define NextUnnaturalStippleWord \
- if (bitsLeft >= 32) \
- { \
- inputBits = *srcTemp++; \
- bitsLeft -= 32; \
- partBitsLeft = 32; \
- } \
- else \
- { \
- inputBits = 0; \
- if (bitsLeft) \
- inputBits = *srcTemp & ~cfb8BitLenMasks[bitsLeft]; \
- srcTemp = srcStart; \
- partBitsLeft = bitsLeft; \
- bitsLeft = bitsWhole; \
- }
-
- #define NextUnnaturalStippleBits \
- if (partBitsLeft >= 4) { \
- bits = GetFourBits (inputBits); \
- NextFourBits (inputBits); \
- partBitsLeft -= 4; \
- } else { \
- bits = GetFourBits (inputBits); \
- nextPartBits = 4 - partBitsLeft; \
- NextUnnaturalStippleWord \
- if (partBitsLeft < nextPartBits) { \
- if (partBitsLeft) {\
- bits |= BitRight (GetFourBits (inputBits), \
- 4 - nextPartBits) & 0xf;\
- nextPartBits -= partBitsLeft; \
- } \
- NextUnnaturalStippleWord \
- } \
- bits |= BitRight (GetFourBits (inputBits), \
- 4 - nextPartBits) & 0xf; \
- NextSomeBits (inputBits, nextPartBits); \
- partBitsLeft -= nextPartBits; \
- }
-
- #define NextUnnaturalStippleBitsFast \
- if (partBitsLeft >= 4) { \
- bits = GetFourBits(inputBits); \
- NextFourBits(inputBits); \
- partBitsLeft -= 4; \
- } else { \
- bits = GetFourBits (inputBits); \
- nextPartBits = 4 - partBitsLeft; \
- inputBits = *srcTemp++; \
- bits |= BitRight (GetFourBits (inputBits), \
- partBitsLeft) & 0xf; \
- NextSomeBits (inputBits, nextPartBits); \
- partBitsLeft = 32 - nextPartBits; \
- }
-
- /*
- * WriteFourBits takes the destination address, a pixel
- * value (which must be 8 bits duplicated 4 time with PFILL)
- * and the four bits to write, which must be in the low order
- * bits of the register (probably from GetFourBits) and writes
- * the appropriate locations in memory with the pixel value. This
- * is a copy-mode only operation.
- */
-
- #define RRopFourBits(dst,bits) \
- { \
- register int _bitsTmp = (bits); \
- *(dst) = RRopPixels(*(dst),bits); \
- }
-
- #define MaskRRopFourBits(dst,bits,mask) \
- { \
- register int _bitsTmp = (bits); \
- *(dst) = MaskRRopPixels(*(dst),bits,mask); \
- }
-
- #ifndef AVOID_MEMORY_READ
-
- #define WriteFourBits(dst,pixel,bits) \
- { \
- register unsigned long _maskTmp = cfb8PixelMasks[(bits)]; \
- *(dst) = (*(dst) & ~_maskTmp) | ((pixel) & _maskTmp); \
- }
-
- #define SwitchFourBits(dst,pixel,bits) \
- { \
- register unsigned long _maskTmp = cfb8PixelMasks[(bits)]; \
- register unsigned long _pixTmp = ((pixel) & _maskTmp); \
- _maskTmp = ~_maskTmp; \
- SwitchBitsLoop (*(dst) = (*(dst) & _maskTmp) | _pixTmp;) \
- }
-
- #else /* AVOID_MEMORY_READ */
-
- #if (BITMAP_BIT_ORDER == MSBFirst)
- #define WriteFourBits(dst,pixel,bits) \
- switch (bits) { \
- case 0: \
- break; \
- case 1: \
- ((char *) (dst))[3] = (pixel); \
- break; \
- case 2: \
- ((char *) (dst))[2] = (pixel); \
- break; \
- case 3: \
- ((short *) (dst))[1] = (pixel); \
- break; \
- case 4: \
- ((char *) (dst))[1] = (pixel); \
- break; \
- case 5: \
- ((char *) (dst))[3] = (pixel); \
- ((char *) (dst))[1] = (pixel); \
- break; \
- case 6: \
- ((char *) (dst))[2] = (pixel); \
- ((char *) (dst))[1] = (pixel); \
- break; \
- case 7: \
- ((short *) (dst))[1] = (pixel); \
- ((char *) (dst))[1] = (pixel); \
- break; \
- case 8: \
- ((char *) (dst))[0] = (pixel); \
- break; \
- case 9: \
- ((char *) (dst))[3] = (pixel); \
- ((char *) (dst))[0] = (pixel); \
- break; \
- case 10: \
- ((char *) (dst))[2] = (pixel); \
- ((char *) (dst))[0] = (pixel); \
- break; \
- case 11: \
- ((short *) (dst))[1] = (pixel); \
- ((char *) (dst))[0] = (pixel); \
- break; \
- case 12: \
- ((short *) (dst))[0] = (pixel); \
- break; \
- case 13: \
- ((char *) (dst))[3] = (pixel); \
- ((short *) (dst))[0] = (pixel); \
- break; \
- case 14: \
- ((char *) (dst))[2] = (pixel); \
- ((short *) (dst))[0] = (pixel); \
- break; \
- case 15: \
- ((long *) (dst))[0] = (pixel); \
- break; \
- }
-
- #define SwitchFourBits(dst,pixel,bits) { \
- switch (bits) { \
- case 0: \
- break; \
- case 1: \
- SwitchBitsLoop (((char *) (dst))[3] = (pixel);) \
- break; \
- case 2: \
- SwitchBitsLoop (((char *) (dst))[2] = (pixel);) \
- break; \
- case 3: \
- SwitchBitsLoop (((short *) (dst))[1] = (pixel);) \
- break; \
- case 4: \
- SwitchBitsLoop (((char *) (dst))[1] = (pixel);) \
- break; \
- case 5: \
- SwitchBitsLoop (((char *) (dst))[3] = (pixel); \
- ((char *) (dst))[1] = (pixel);) \
- break; \
- case 6: \
- SwitchBitsLoop (((char *) (dst))[2] = (pixel); \
- ((char *) (dst))[1] = (pixel);) \
- break; \
- case 7: \
- SwitchBitsLoop (((short *) (dst))[1] = (pixel); \
- ((char *) (dst))[1] = (pixel);) \
- break; \
- case 8: \
- SwitchBitsLoop (((char *) (dst))[0] = (pixel);) \
- break; \
- case 9: \
- SwitchBitsLoop (((char *) (dst))[3] = (pixel); \
- ((char *) (dst))[0] = (pixel);) \
- break; \
- case 10: \
- SwitchBitsLoop (((char *) (dst))[2] = (pixel); \
- ((char *) (dst))[0] = (pixel);) \
- break; \
- case 11: \
- SwitchBitsLoop (((short *) (dst))[1] = (pixel); \
- ((char *) (dst))[0] = (pixel);) \
- break; \
- case 12: \
- SwitchBitsLoop (((short *) (dst))[0] = (pixel);) \
- break; \
- case 13: \
- SwitchBitsLoop (((char *) (dst))[3] = (pixel); \
- ((short *) (dst))[0] = (pixel);) \
- break; \
- case 14: \
- SwitchBitsLoop (((char *) (dst))[2] = (pixel); \
- ((short *) (dst))[0] = (pixel);) \
- break; \
- case 15: \
- SwitchBitsLoop (((long *) (dst))[0] = (pixel);) \
- break; \
- } \
- }
-
- #else /* BITMAP_BIT_ORDER */
-
- #define WriteFourBits(dst,pixel,bits) \
- switch (bits) { \
- case 0: \
- break; \
- case 1: \
- ((char *) (dst))[0] = (pixel); \
- break; \
- case 2: \
- ((char *) (dst))[1] = (pixel); \
- break; \
- case 3: \
- ((short *) (dst))[0] = (pixel); \
- break; \
- case 4: \
- ((char *) (dst))[2] = (pixel); \
- break; \
- case 5: \
- ((char *) (dst))[0] = (pixel); \
- ((char *) (dst))[2] = (pixel); \
- break; \
- case 6: \
- ((char *) (dst))[1] = (pixel); \
- ((char *) (dst))[2] = (pixel); \
- break; \
- case 7: \
- ((short *) (dst))[0] = (pixel); \
- ((char *) (dst))[2] = (pixel); \
- break; \
- case 8: \
- ((char *) (dst))[3] = (pixel); \
- break; \
- case 9: \
- ((char *) (dst))[0] = (pixel); \
- ((char *) (dst))[3] = (pixel); \
- break; \
- case 10: \
- ((char *) (dst))[1] = (pixel); \
- ((char *) (dst))[3] = (pixel); \
- break; \
- case 11: \
- ((short *) (dst))[0] = (pixel); \
- ((char *) (dst))[3] = (pixel); \
- break; \
- case 12: \
- ((short *) (dst))[1] = (pixel); \
- break; \
- case 13: \
- ((char *) (dst))[0] = (pixel); \
- ((short *) (dst))[1] = (pixel); \
- break; \
- case 14: \
- ((char *) (dst))[1] = (pixel); \
- ((short *) (dst))[1] = (pixel); \
- break; \
- case 15: \
- ((long *) (dst))[0] = (pixel); \
- break; \
- }
-
- #define SwitchFourBits(dst,pixel,bits) { \
- switch (bits) { \
- case 0: \
- break; \
- case 1: \
- SwitchBitsLoop (((char *) (dst))[0] = (pixel);) \
- break; \
- case 2: \
- SwitchBitsLoop (((char *) (dst))[1] = (pixel);) \
- break; \
- case 3: \
- SwitchBitsLoop (((short *) (dst))[0] = (pixel);) \
- break; \
- case 4: \
- SwitchBitsLoop (((char *) (dst))[2] = (pixel);) \
- break; \
- case 5: \
- SwitchBitsLoop (((char *) (dst))[0] = (pixel); \
- ((char *) (dst))[2] = (pixel);) \
- break; \
- case 6: \
- SwitchBitsLoop (((char *) (dst))[1] = (pixel); \
- ((char *) (dst))[2] = (pixel);) \
- break; \
- case 7: \
- SwitchBitsLoop (((short *) (dst))[0] = (pixel); \
- ((char *) (dst))[2] = (pixel);) \
- break; \
- case 8: \
- SwitchBitsLoop (((char *) (dst))[3] = (pixel);) \
- break; \
- case 9: \
- SwitchBitsLoop (((char *) (dst))[0] = (pixel); \
- ((char *) (dst))[3] = (pixel);) \
- break; \
- case 10: \
- SwitchBitsLoop (((char *) (dst))[1] = (pixel); \
- ((char *) (dst))[3] = (pixel);) \
- break; \
- case 11: \
- SwitchBitsLoop (((short *) (dst))[0] = (pixel); \
- ((char *) (dst))[3] = (pixel);) \
- break; \
- case 12: \
- SwitchBitsLoop (((short *) (dst))[1] = (pixel);) \
- break; \
- case 13: \
- SwitchBitsLoop (((char *) (dst))[0] = (pixel); \
- ((short *) (dst))[1] = (pixel);) \
- break; \
- case 14: \
- SwitchBitsLoop (((char *) (dst))[1] = (pixel); \
- ((short *) (dst))[1] = (pixel);) \
- break; \
- case 15: \
- SwitchBitsLoop (((long *) (dst))[0] = (pixel);) \
- break; \
- } \
- }
-
- # endif /* BITMAP_BIT_ORDER */
- #endif /* AVOID_MEMORY_READ */
-
- extern unsigned long cfb8BitLenMasks[32];
- extern int cfb8ComputeClipMasks32 ();
-
- #endif /* PPW == 4 */
-