Edit

IABSD.fr/xenocara/xserver/cfb/cfb8bit.h

Branch :

  • Show log

    Commit

  • Author : matthieu
    Date : 2006-11-26 18:13:41
    Hash : 889b8606
    Message : Importing xserver from X.Org 7.2RC2

  • xserver/cfb/cfb8bit.h
  • /*
     * cfb8bit.h
     *
     * Defines which are only useful to 8 bit color frame buffers
     *
     * That doesn't seem to be true any more.  Some of the macros in here 
     * are used for depths other than 8.  Perhaps the file should be
     * renamed.  dpw
     */
    
    /*
    
    Copyright 1989, 1998  The Open Group
    
    Permission to use, copy, modify, distribute, and sell this software and its
    documentation for any purpose is hereby granted without fee, provided that
    the above copyright notice appear in all copies and that both that
    copyright notice and this permission notice appear in supporting
    documentation.
    
    The above copyright notice and this permission notice shall be included in
    all copies or substantial portions of the Software.
    
    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
    OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
    AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
    CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    
    Except as contained in this notice, the name of The Open Group shall not be
    used in advertising or otherwise to promote the sale, use or other dealings
    in this Software without prior written authorization from The Open Group.
    */
    
    
    #ifdef HAVE_DIX_CONFIG_H
    #include <dix-config.h>
    #endif
    
    #include "servermd.h"
    
    #if (BITMAP_BIT_ORDER == MSBFirst)
    #define GetBitGroup(x)		(((PixelGroup) (x)) >> (PGSZ - PGSZB))
    #define NextBitGroup(x)		((x) <<= PGSZB)
    #define NextSomeBits(x,n)	((x) <<= (n))
    #else
    #define GetBitGroup(x)		((x) & PGSZBMSK)
    #define NextBitGroup(x)		((x) >>= PGSZB)
    #define NextSomeBits(x,n)	((x) >>= (n))
    #endif
    
    #define RotBitsLeft(x,k)    ((x) = BitLeft (x,k) | \
    				   BitRight (x, PGSZ-(k)))
    
    #if defined(__GNUC__) && defined(mc68020)
    #undef RotBitsLeft
    #define RotBitsLeft(x,k)	asm("rol%.l %2,%0" \
    				: "=d" (x) \
     				: "0" (x), "dI" (k))
    #endif
    
    #if PSZ == 8
    
    #define GetPixelGroup(x)		(cfb8StippleXor[GetBitGroup(x)])
    #define RRopPixels(dst,x)	(DoRRop(dst,cfb8StippleAnd[x], cfb8StippleXor[x]))
    #define RRopPixelGroup(dst,x)	(RRopPixels(dst,GetBitGroup(x)))
    #define MaskRRopPixels(dst,x,mask)  (DoMaskRRop(dst,cfb8StippleAnd[x], cfb8StippleXor[x], mask))
    
    #define NUM_MASKS	(1<<PPW) /* XXX goes in cfbmskbits.h? */
    extern int		cfb8StippleMode, cfb8StippleAlu;
    extern PixelGroup	cfb8StippleFg, cfb8StippleBg, cfb8StipplePm;
    extern PixelGroup	cfb8StippleMasks[NUM_MASKS];
    extern PixelGroup	cfb8StippleAnd[NUM_MASKS], cfb8StippleXor[NUM_MASKS];
    extern int		cfb8StippleRRop;
    
    #define cfb8PixelMasks	cfb8StippleMasks
    #define cfb8Pixels	cfb8StippleXor
    
    #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 >= MFB_PPW) \
    	{ \
    	    inputBits = *srcTemp++; \
    	    bitsLeft -= MFB_PPW; \
    	    partBitsLeft = MFB_PPW; \
    	} \
    	else \
    	{ \
    	    inputBits = 0; \
    	    if (bitsLeft) \
    		inputBits = *srcTemp & ~cfb8BitLenMasks[bitsLeft]; \
    	    srcTemp = srcStart; \
    	    partBitsLeft = bitsLeft; \
    	    bitsLeft = bitsWhole; \
    	}
    
    #define NextUnnaturalStippleBits \
        if (partBitsLeft >= PPW) { \
    	bits = GetBitGroup (inputBits); \
    	NextBitGroup (inputBits); \
    	partBitsLeft -= PPW; \
        } else { \
    	bits = GetBitGroup (inputBits); \
    	nextPartBits = PPW - partBitsLeft; \
    	NextUnnaturalStippleWord \
    	if (partBitsLeft < nextPartBits) { \
    	    if (partBitsLeft) {\
    	    	bits |= BitRight (GetBitGroup (inputBits), \
    				  PPW - nextPartBits) & PPWMSK;\
    	    	nextPartBits -= partBitsLeft; \
    	    } \
    	    NextUnnaturalStippleWord \
    	} \
    	bits |= BitRight (GetBitGroup (inputBits), \
    			  PPW - nextPartBits) & PPWMSK; \
    	NextSomeBits (inputBits, nextPartBits); \
    	partBitsLeft -= nextPartBits; \
        }
    
    #define NextUnnaturalStippleBitsFast \
        if (partBitsLeft >= PPW) { \
    	bits = GetBitGroup(inputBits); \
    	NextBitGroup(inputBits); \
    	partBitsLeft -= PPW; \
        } else { \
    	bits = GetBitGroup (inputBits); \
    	nextPartBits = PPW - partBitsLeft; \
    	inputBits = *srcTemp++; \
    	bits |= BitRight (GetBitGroup (inputBits), \
    		          partBitsLeft) & PPWMSK; \
    	NextSomeBits (inputBits, nextPartBits); \
    	partBitsLeft =  MFB_PPW - nextPartBits; \
        }
    
    /*
     * WriteBitGroup takes the destination address, a pixel
     * value (which must be 8 bits duplicated 4 time with PFILL)
     * and the PPW bits to write, which must be in the low order
     * bits of the register (probably from GetBitGroup) and writes
     * the appropriate locations in memory with the pixel value.  This
     * is a copy-mode only operation.
     */
    
    #define RRopBitGroup(dst,bits)					\
        {								\
        *(dst) = RRopPixels(*(dst),bits);				\
        }
    
    #define MaskRRopBitGroup(dst,bits,mask)				\
        {								\
        *(dst) = MaskRRopPixels(*(dst),bits,mask);			\
        }
    #endif /* PSZ == 8 */
    
    #if !defined(AVOID_MEMORY_READ) && PSZ == 8
    
    #define WriteBitGroup(dst,pixel,bits)				\
        {								\
        register PixelGroup _maskTmp = cfb8PixelMasks[(bits)];   \
        *(dst) = (*(dst) & ~_maskTmp) | ((pixel) & _maskTmp);	\
        }
    
    #define SwitchBitGroup(dst,pixel,bits)				\
        {								\
        register PixelGroup _maskTmp = cfb8PixelMasks[(bits)];   \
        register PixelGroup _pixTmp = ((pixel) & _maskTmp);	\
        _maskTmp = ~_maskTmp;					\
        SwitchBitsLoop (*(dst) = (*(dst) & _maskTmp) | _pixTmp;)	\
        }
        
    #else /* AVOID_MEMORY_READ */
    
    #if PGSZ == 32
    #if (BITMAP_BIT_ORDER == MSBFirst)
    #define SinglePixel0	3
    #define SinglePixel1	2
    #define SinglePixel2	1
    #define SinglePixel3	0
    #define SinglePixel4	7
    #define SinglePixel5	6
    #define SinglePixel6	5
    #define SinglePixel7	4
    #define SinglePixel8	0xB
    #define SinglePixel9	0xA
    #define DoublePixel0	1
    #define DoublePixel1	0
    #define DoublePixel2	3
    #define DoublePixel3	2
    #define DoublePixel4	5
    #define DoublePixel5	4
    #else
    #define SinglePixel0	0
    #define SinglePixel1	1
    #define SinglePixel2	2
    #define SinglePixel3	3
    #define SinglePixel4	4
    #define SinglePixel5	5
    #define SinglePixel6	6
    #define SinglePixel7	7
    #define SinglePixel8	8
    #define SinglePixel9	9
    #define DoublePixel0	0
    #define DoublePixel1	1
    #define DoublePixel2	2
    #define DoublePixel3	3
    #define DoublePixel4	4
    #define DoublePixel5	5
    #endif
    #define QuadPixel0	0
    #define QuadPixel1	1
    #define QuadPixel2	2
    #else /* PGSZ == 64 */
    #if (BITMAP_BIT_ORDER == MSBFirst)
    #define SinglePixel0	7
    #define SinglePixel1	6
    #define SinglePixel2	5
    #define SinglePixel3	4
    #define SinglePixel4	3
    #define SinglePixel5	2
    #define SinglePixel6	1
    #define SinglePixel7	0
    #define DoublePixel0	3
    #define DoublePixel1	2
    #define DoublePixel2	1
    #define DoublePixel3	0
    #define QuadPixel0	1
    #define QuadPixel1	0
    #else
    #define SinglePixel0	0
    #define SinglePixel1	1
    #define SinglePixel2	2
    #define SinglePixel3	3
    #define SinglePixel4	4
    #define SinglePixel5	5
    #define SinglePixel6	6
    #define SinglePixel7	7
    #define DoublePixel0	0
    #define DoublePixel1	1
    #define DoublePixel2	2
    #define DoublePixel3	3
    #define QuadPixel0	0
    #define QuadPixel1	1
    #endif
    #define OctaPixel0	0
    #endif /* PGSZ == 64 */
    
    #if PSZ == 8
    
    #if PGSZ == 32
    #define WriteBitGroup(dst,pixel,bits) \
    	switch (bits) {			\
    	case 0:				\
    	    break;			\
    	case 1:				\
    	    ((CARD8 *) (dst))[SinglePixel0] = (pixel);	\
    	    break;			\
    	case 2:				\
    	    ((CARD8 *) (dst))[SinglePixel1] = (pixel);	\
    	    break;			\
    	case 3:				\
    	    ((CARD16 *) (dst))[DoublePixel0] = (pixel);	\
    	    break;			\
    	case 4:				\
    	    ((CARD8 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 5:				\
    	    ((CARD8 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD8 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 6:				\
    	    ((CARD8 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD8 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 7:				\
    	    ((CARD16 *) (dst))[DoublePixel0] = (pixel);	\
    	    ((CARD8 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 8:				\
    	    ((CARD8 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 9:				\
    	    ((CARD8 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD8 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 10:			\
    	    ((CARD8 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD8 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 11:			\
    	    ((CARD16 *) (dst))[DoublePixel0] = (pixel);	\
    	    ((CARD8 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 12:			\
    	    ((CARD16 *) (dst))[DoublePixel1] = (pixel);	\
    	    break;			\
    	case 13:			\
    	    ((CARD8 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD16 *) (dst))[DoublePixel1] = (pixel);	\
    	    break;			\
    	case 14:			\
    	    ((CARD8 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD16 *) (dst))[DoublePixel1] = (pixel);	\
    	    break;			\
    	case 15:			\
    	    ((CARD32 *) (dst))[0] = (pixel);	\
    	    break;			\
    	}
    #else /* PGSZ == 64 */
    #define WriteBitGroup(dst,pixel,bits) 				\
        if ( bits == 0xff )						\
    	((PixelGroup *) (dst))[OctaPixel0] = (pixel);		\
        else {							\
    	switch (bits & 0x0f) {					\
    	    case 0:						\
    	        break;						\
    	    case 1:						\
    	        ((CARD8 *) (dst))[SinglePixel0] = (pixel);	\
    	        break;						\
    	    case 2:						\
    	        ((CARD8 *) (dst))[SinglePixel1] = (pixel);	\
    	        break;						\
    	    case 3:						\
    	        ((CARD16 *) (dst))[DoublePixel0] = (pixel);	\
    	        break;						\
    	    case 4:						\
    	        ((CARD8 *) (dst))[SinglePixel2] = (pixel);	\
    	        break;						\
    	    case 5:						\
    	        ((CARD8 *) (dst))[SinglePixel0] = (pixel);	\
    	        ((CARD8 *) (dst))[SinglePixel2] = (pixel);	\
    	        break;						\
    	    case 6:						\
    	        ((CARD8 *) (dst))[SinglePixel1] = (pixel);	\
    	        ((CARD8 *) (dst))[SinglePixel2] = (pixel);	\
    	        break;						\
    	    case 7:						\
    	        ((CARD16 *) (dst))[DoublePixel0] = (pixel);	\
    	        ((CARD8 *) (dst))[SinglePixel2] = (pixel);	\
    	        break;						\
    	    case 8:						\
    	        ((CARD8 *) (dst))[SinglePixel3] = (pixel);	\
    	        break;						\
    	    case 9:						\
    	        ((CARD8 *) (dst))[SinglePixel0] = (pixel);	\
    	        ((CARD8 *) (dst))[SinglePixel3] = (pixel);	\
    	        break;						\
    	    case 10:						\
    	        ((CARD8 *) (dst))[SinglePixel1] = (pixel);	\
    	        ((CARD8 *) (dst))[SinglePixel3] = (pixel);	\
    	        break;						\
    	    case 11:						\
    	        ((CARD16 *) (dst))[DoublePixel0] = (pixel);	\
    	        ((CARD8 *) (dst))[SinglePixel3] = (pixel);	\
    	        break;						\
    	    case 12:						\
    	        ((CARD16 *) (dst))[DoublePixel1] = (pixel);	\
    	        break;						\
    	    case 13:						\
    	        ((CARD8 *) (dst))[SinglePixel0] = (pixel);	\
    	        ((CARD16 *) (dst))[DoublePixel1] = (pixel);	\
    	        break;						\
    	    case 14:						\
    	        ((CARD8 *) (dst))[SinglePixel1] = (pixel);	\
    	        ((CARD16 *) (dst))[DoublePixel1] = (pixel);	\
    	        break;						\
    	    case 15:						\
    	        ((CARD32 *) (dst))[QuadPixel0] = (pixel);	\
    	        break;						\
    	}							\
    	switch ((bits & 0xf0) >> 4) {				\
    	    case 0:						\
    	        break;						\
    	    case 1:						\
    	        ((CARD8 *) (dst))[SinglePixel4] = (pixel);	\
    	        break;						\
    	    case 2:						\
    	        ((CARD8 *) (dst))[SinglePixel5] = (pixel);	\
    	        break;						\
    	    case 3:						\
    	        ((CARD16 *) (dst))[DoublePixel2] = (pixel);	\
    	        break;						\
    	    case 4:						\
    	        ((CARD8 *) (dst))[SinglePixel6] = (pixel);	\
    	        break;						\
    	    case 5:						\
    	        ((CARD8 *) (dst))[SinglePixel4] = (pixel);	\
    	        ((CARD8 *) (dst))[SinglePixel6] = (pixel);	\
    	        break;						\
    	    case 6:						\
    	        ((CARD8 *) (dst))[SinglePixel5] = (pixel);	\
    	        ((CARD8 *) (dst))[SinglePixel6] = (pixel);	\
    	        break;						\
    	    case 7:						\
    	        ((CARD16 *) (dst))[DoublePixel2] = (pixel);	\
    	        ((CARD8 *) (dst))[SinglePixel6] = (pixel);	\
    	        break;						\
    	    case 8:						\
    	        ((CARD8 *) (dst))[SinglePixel7] = (pixel);	\
    	        break;						\
    	    case 9:						\
    	        ((CARD8 *) (dst))[SinglePixel4] = (pixel);	\
    	        ((CARD8 *) (dst))[SinglePixel7] = (pixel);	\
    	        break;						\
    	    case 10:						\
    	        ((CARD8 *) (dst))[SinglePixel5] = (pixel);	\
    	        ((CARD8 *) (dst))[SinglePixel7] = (pixel);	\
    	        break;						\
    	    case 11:						\
    	        ((CARD16 *) (dst))[DoublePixel2] = (pixel);	\
    	        ((CARD8 *) (dst))[SinglePixel7] = (pixel);	\
    	        break;						\
    	    case 12:						\
    	        ((CARD16 *) (dst))[DoublePixel3] = (pixel);	\
    	        break;						\
    	    case 13:						\
    	        ((CARD8 *) (dst))[SinglePixel4] = (pixel);	\
    	        ((CARD16 *) (dst))[DoublePixel3] = (pixel);	\
    	        break;						\
    	    case 14:						\
    	        ((CARD8 *) (dst))[SinglePixel5] = (pixel);	\
    	        ((CARD16 *) (dst))[DoublePixel3] = (pixel);	\
    	        break;						\
    	    case 15:						\
    	        ((CARD32 *) (dst))[QuadPixel1] = (pixel);	\
    	        break;						\
    	}							\
        }
    #endif /* PGSZ == 64 */
    
    #if PGSZ == 32
    #define SwitchBitGroup(dst,pixel,bits) { \
    	switch (bits) { \
    	case 0: \
           	    break; \
    	case 1: \
    	    SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel0] = (pixel);) \
    	    break; \
    	case 2: \
    	    SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel1] = (pixel);) \
    	    break; \
    	case 3: \
    	    SwitchBitsLoop (((CARD16 *) (dst))[DoublePixel0] = (pixel);) \
    	    break; \
    	case 4: \
    	    SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel2] = (pixel);) \
    	    break; \
    	case 5: \
    	    SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel0] = (pixel); \
    		     ((CARD8 *) (dst))[SinglePixel2] = (pixel);) \
    	    break; \
    	case 6: \
    	    SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel1] = (pixel); \
    		     ((CARD8 *) (dst))[SinglePixel2] = (pixel);) \
    	    break; \
    	case 7: \
    	    SwitchBitsLoop (((CARD16 *) (dst))[DoublePixel0] = (pixel); \
    		     ((CARD8 *) (dst))[SinglePixel2] = (pixel);) \
    	    break; \
    	case 8: \
    	    SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel3] = (pixel);) \
    	    break; \
    	case 9: \
    	    SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel0] = (pixel); \
    		     ((CARD8 *) (dst))[SinglePixel3] = (pixel);) \
    	    break; \
    	case 10: \
    	    SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel1] = (pixel); \
    		     ((CARD8 *) (dst))[SinglePixel3] = (pixel);) \
    	    break; \
    	case 11: \
    	    SwitchBitsLoop (((CARD16 *) (dst))[DoublePixel0] = (pixel); \
    		     ((CARD8 *) (dst))[SinglePixel3] = (pixel);) \
    	    break; \
    	case 12: \
    	    SwitchBitsLoop (((CARD16 *) (dst))[DoublePixel1] = (pixel);) \
    	    break; \
    	case 13: \
    	    SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel0] = (pixel); \
    		     ((CARD16 *) (dst))[DoublePixel1] = (pixel);) \
    	    break; \
    	case 14: \
    	    SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel1] = (pixel); \
    		     ((CARD16 *) (dst))[DoublePixel1] = (pixel);) \
    	    break; \
    	case 15: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[0] = (pixel);) \
    	    break; \
    	} \
    }
    #else /* PGSZ == 64 */
    #define SwitchBitGroup(dst,pixel,bits) { 				   \
        if ( bits == 0xff )							   \
    	SwitchBitsLoop (((PixelGroup *) (dst))[OctaPixel0] = (pixel);)	   \
        else {								   \
    	switch (bits & 0x0f) {	 					   \
    	    case 0: 							   \
           	        break; 							   \
    	    case 1: 							   \
    	        SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel0] = (pixel);) \
    	        break; 							   \
    	    case 2: 							   \
    	        SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel1] = (pixel);) \
    	        break; 							   \
    	    case 3: 							   \
    	        SwitchBitsLoop (((CARD16 *) (dst))[DoublePixel0] = (pixel);)\
    	        break; 							   \
    	    case 4: 							   \
    	        SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel2] = (pixel);) \
    	        break; 							   \
    	    case 5: 							   \
    	        SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel0] = (pixel);  \
    		         	((CARD8 *) (dst))[SinglePixel2] = (pixel);) \
    	        break; 							   \
    	    case 6: 							   \
    	        SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel1] = (pixel);  \
    		         	((CARD8 *) (dst))[SinglePixel2] = (pixel);) \
    	        break; 							   \
    	    case 7: 							   \
    	        SwitchBitsLoop (((CARD16 *) (dst))[DoublePixel0] = (pixel); \
    		         	((CARD8 *) (dst))[SinglePixel2] = (pixel);) \
    	        break; 							   \
    	    case 8: 							   \
    	        SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel3] = (pixel);) \
    	        break; 							   \
    	    case 9: 							   \
    	        SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel0] = (pixel);  \
    		         	((CARD8 *) (dst))[SinglePixel3] = (pixel);) \
    	        break; 							   \
    	    case 10: 							   \
    	        SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel1] = (pixel);  \
    		         	((CARD8 *) (dst))[SinglePixel3] = (pixel);) \
    	        break; 							   \
    	    case 11: 							   \
    	        SwitchBitsLoop (((CARD16 *) (dst))[DoublePixel0] = (pixel); \
    		         	((CARD8 *) (dst))[SinglePixel3] = (pixel);) \
    	        break; 							   \
    	    case 12: 							   \
    	        SwitchBitsLoop (((CARD16 *) (dst))[DoublePixel1] = (pixel);)\
    	        break; 							   \
    	    case 13: 							   \
    	        SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel0] = (pixel);  \
    		         	((CARD16 *) (dst))[DoublePixel1] = (pixel);)\
    	        break; 							   \
    	    case 14: 							   \
    	        SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel1] = (pixel);  \
    		         	((CARD16 *) (dst))[DoublePixel1] = (pixel);)\
    	        break; 							   \
    	    case 15: 							   \
    	        SwitchBitsLoop (((CARD32 *) (dst))[QuadPixel0] = (pixel);)    \
    	        break; 							   \
    	}								   \
    	switch ((bits & 0xf0) >> 4) {					   \
    	    case 0: 							   \
           	        break; 							   \
    	    case 1: 							   \
    	        SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel4] = (pixel);) \
    	        break; 							   \
    	    case 2: 							   \
    	        SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel5] = (pixel);) \
    	        break; 							   \
    	    case 3: 							   \
    	        SwitchBitsLoop (((CARD16 *) (dst))[DoublePixel2] = (pixel);)\
    	        break; 							   \
    	    case 4: 							   \
    	        SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel6] = (pixel);) \
    	        break; 							   \
    	    case 5: 							   \
    	        SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel4] = (pixel);  \
    		         	((CARD8 *) (dst))[SinglePixel6] = (pixel);) \
    	        break; 							   \
    	    case 6: 							   \
    	        SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel5] = (pixel);  \
    		         	((CARD8 *) (dst))[SinglePixel6] = (pixel);) \
    	        break; 							   \
    	    case 7: 							   \
    	        SwitchBitsLoop (((CARD16 *) (dst))[DoublePixel2] = (pixel); \
    		         	((CARD8 *) (dst))[SinglePixel6] = (pixel);) \
    	        break; 							   \
    	    case 8: 							   \
    	        SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel7] = (pixel);) \
    	        break; 							   \
    	    case 9: 							   \
    	        SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel4] = (pixel);  \
    		         	((CARD8 *) (dst))[SinglePixel7] = (pixel);) \
    	        break; 							   \
    	    case 10: 							   \
    	        SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel5] = (pixel);  \
    		         	((CARD8 *) (dst))[SinglePixel7] = (pixel);) \
    	        break; 							   \
    	    case 11: 							   \
    	        SwitchBitsLoop (((CARD16 *) (dst))[DoublePixel2] = (pixel); \
    		         	((CARD8 *) (dst))[SinglePixel7] = (pixel);) \
    	        break; 							   \
    	    case 12: 							   \
    	        SwitchBitsLoop (((CARD16 *) (dst))[DoublePixel3] = (pixel);)\
    	        break; 							   \
    	    case 13: 							   \
    	        SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel4] = (pixel);  \
    		         	((CARD16 *) (dst))[DoublePixel3] = (pixel);)\
    	        break; 							   \
    	    case 14: 							   \
    	        SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel5] = (pixel);  \
    		         	((CARD16 *) (dst))[DoublePixel3] = (pixel);)\
    	        break; 							   \
    	    case 15: 							   \
    	        SwitchBitsLoop (((CARD32 *) (dst))[QuadPixel1] = (pixel);) \
    	        break; 							   \
    	} 								   \
        }									   \
    }
    #endif /* PGSZ == 64 */
    #endif /* PSZ == 8 */
    
    #if PSZ == 16
    
    #if PGSZ == 32
    #define WriteBitGroup(dst,pixel,bits) \
    	switch (bits) {			\
    	case 0:				\
    	    break;			\
    	case 1:				\
    	    ((CARD16 *) (dst))[SinglePixel0] = (pixel);	\
    	    break;			\
    	case 2:				\
    	    ((CARD16 *) (dst))[SinglePixel1] = (pixel);	\
    	    break;			\
    	case 3:				\
    	    ((CARD32 *) (dst))[DoublePixel0] = (pixel);	\
    	    break;			\
    	case 4:				\
    	    ((CARD16 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 5:				\
    	    ((CARD16 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD16 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 6:				\
    	    ((CARD16 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD16 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 7:				\
    	    ((CARD32 *) (dst))[DoublePixel0] = (pixel);	\
    	    ((CARD16 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 8:				\
    	    ((CARD16 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 9:				\
    	    ((CARD16 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD16 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 10:			\
    	    ((CARD16 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD16 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 11:			\
    	    ((CARD32 *) (dst))[DoublePixel0] = (pixel);	\
    	    ((CARD16 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 12:			\
    	    ((CARD32 *) (dst))[DoublePixel1] = (pixel);	\
    	    break;			\
    	case 13:			\
    	    ((CARD16 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[DoublePixel1] = (pixel);	\
    	    break;			\
    	case 14:			\
    	    ((CARD16 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD32 *) (dst))[DoublePixel1] = (pixel);	\
    	    break;			\
    	case 15:			\
    	    ((CARD32 *) (dst))[DoublePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[DoublePixel1] = (pixel);	\
    	    break;			\
    	}
    #else /* PGSZ == 64 */
    #define WriteBitGroup(dst,pixel,bits) \
        if ( bits == 0xff )	{						\
    	((PixelGroup *) (dst))[QuadPixel0] = (pixel);			\
    	((PixelGroup *) (dst))[QuadPixel1] = (pixel);			\
        }									\
        else {								\
    	switch (bits & 0x0f) {	 					\
    	case 0:				\
    	    break;			\
    	case 1:				\
    	    ((CARD16 *) (dst))[SinglePixel0] = (pixel);	\
    	    break;			\
    	case 2:				\
    	    ((CARD16 *) (dst))[SinglePixel1] = (pixel);	\
    	    break;			\
    	case 3:				\
    	    ((CARD32 *) (dst))[DoublePixel0] = (pixel);	\
    	    break;			\
    	case 4:				\
    	    ((CARD16 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 5:				\
    	    ((CARD16 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD16 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 6:				\
    	    ((CARD16 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD16 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 7:				\
    	    ((CARD32 *) (dst))[DoublePixel0] = (pixel);	\
    	    ((CARD16 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 8:				\
    	    ((CARD16 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 9:				\
    	    ((CARD16 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD16 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 10:			\
    	    ((CARD16 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD16 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 11:			\
    	    ((CARD32 *) (dst))[DoublePixel0] = (pixel);	\
    	    ((CARD16 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 12:			\
    	    ((CARD32 *) (dst))[DoublePixel1] = (pixel);	\
    	    break;			\
    	case 13:			\
    	    ((CARD16 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[DoublePixel1] = (pixel);	\
    	    break;			\
    	case 14:			\
    	    ((CARD16 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD32 *) (dst))[DoublePixel1] = (pixel);	\
    	    break;			\
    	case 15:			\
    	    ((CARD32 *) (dst))[DoublePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[DoublePixel1] = (pixel);	\
    	    break;			\
    	}				\
    	switch ((bits & 0xf0) >> 4) {			\
    	case 0:				\
    	    break;			\
    	case 1:				\
    	    ((CARD16 *) (dst))[SinglePixel4] = (pixel);	\
    	    break;			\
    	case 2:				\
    	    ((CARD16 *) (dst))[SinglePixel5] = (pixel);	\
    	    break;			\
    	case 3:				\
    	    ((CARD32 *) (dst))[DoublePixel2] = (pixel);	\
    	    break;			\
    	case 4:				\
    	    ((CARD16 *) (dst))[SinglePixel6] = (pixel);	\
    	    break;			\
    	case 5:				\
    	    ((CARD16 *) (dst))[SinglePixel4] = (pixel);	\
    	    ((CARD16 *) (dst))[SinglePixel6] = (pixel);	\
    	    break;			\
    	case 6:				\
    	    ((CARD16 *) (dst))[SinglePixel5] = (pixel);	\
    	    ((CARD16 *) (dst))[SinglePixel6] = (pixel);	\
    	    break;			\
    	case 7:				\
    	    ((CARD32 *) (dst))[DoublePixel2] = (pixel);	\
    	    ((CARD16 *) (dst))[SinglePixel6] = (pixel);	\
    	    break;			\
    	case 8:				\
    	    ((CARD16 *) (dst))[SinglePixel7] = (pixel);	\
    	    break;			\
    	case 9:				\
    	    ((CARD16 *) (dst))[SinglePixel4] = (pixel);	\
    	    ((CARD16 *) (dst))[SinglePixel7] = (pixel);	\
    	    break;			\
    	case 10:			\
    	    ((CARD16 *) (dst))[SinglePixel5] = (pixel);	\
    	    ((CARD16 *) (dst))[SinglePixel7] = (pixel);	\
    	    break;			\
    	case 11:			\
    	    ((CARD32 *) (dst))[DoublePixel2] = (pixel);	\
    	    ((CARD16 *) (dst))[SinglePixel7] = (pixel);	\
    	    break;			\
    	case 12:			\
    	    ((CARD32 *) (dst))[DoublePixel3] = (pixel);	\
    	    break;			\
    	case 13:			\
    	    ((CARD16 *) (dst))[SinglePixel4] = (pixel);	\
    	    ((CARD32 *) (dst))[DoublePixel3] = (pixel);	\
    	    break;			\
    	case 14:			\
    	    ((CARD16 *) (dst))[SinglePixel5] = (pixel);	\
    	    ((CARD32 *) (dst))[DoublePixel3] = (pixel);	\
    	    break;			\
    	case 15:			\
    	    ((CARD32 *) (dst))[DoublePixel2] = (pixel);	\
    	    ((CARD32 *) (dst))[DoublePixel3] = (pixel);	\
    	    break;			\
    	}				\
        }
    #endif /* PGSZ */
    
    #if PGSZ == 32
    #define SwitchBitGroup(dst,pixel,bits) { \
    	switch (bits) { \
    	case 0: \
           	    break; \
    	case 1: \
    	    SwitchBitsLoop (((CARD16 *) (dst))[SinglePixel0] = (pixel);) \
    	    break; \
    	case 2: \
    	    SwitchBitsLoop (((CARD16 *) (dst))[SinglePixel1] = (pixel);) \
    	    break; \
    	case 3: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[DoublePixel0] = (pixel);) \
    	    break; \
    	case 4: \
    	    SwitchBitsLoop (((CARD16 *) (dst))[SinglePixel2] = (pixel);) \
    	    break; \
    	case 5: \
    	    SwitchBitsLoop (((CARD16 *) (dst))[SinglePixel0] = (pixel); \
    		     ((CARD16 *) (dst))[SinglePixel2] = (pixel);) \
    	    break; \
    	case 6: \
    	    SwitchBitsLoop (((CARD16 *) (dst))[SinglePixel1] = (pixel); \
    		     ((CARD16 *) (dst))[SinglePixel2] = (pixel);) \
    	    break; \
    	case 7: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[DoublePixel0] = (pixel); \
    		     ((CARD16 *) (dst))[SinglePixel2] = (pixel);) \
    	    break; \
    	case 8: \
    	    SwitchBitsLoop (((CARD16 *) (dst))[SinglePixel3] = (pixel);) \
    	    break; \
    	case 9: \
    	    SwitchBitsLoop (((CARD16 *) (dst))[SinglePixel0] = (pixel); \
    		     ((CARD16 *) (dst))[SinglePixel3] = (pixel);) \
    	    break; \
    	case 10: \
    	    SwitchBitsLoop (((CARD16 *) (dst))[SinglePixel1] = (pixel); \
    		     ((CARD16 *) (dst))[SinglePixel3] = (pixel);) \
    	    break; \
    	case 11: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[DoublePixel0] = (pixel); \
    		     ((CARD16 *) (dst))[SinglePixel3] = (pixel);) \
    	    break; \
    	case 12: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[DoublePixel1] = (pixel);) \
    	    break; \
    	case 13: \
    	    SwitchBitsLoop (((CARD16 *) (dst))[SinglePixel0] = (pixel); \
    		     ((CARD32 *) (dst))[DoublePixel1] = (pixel);) \
    	    break; \
    	case 14: \
    	    SwitchBitsLoop (((CARD16 *) (dst))[SinglePixel1] = (pixel); \
    		     ((CARD32 *) (dst))[DoublePixel1] = (pixel);) \
    	    break; \
    	case 15: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[DoublePixel0] = (pixel); \
    			    ((CARD32 *) (dst))[DoublePixel1] = (pixel);) \
    	    break; \
    	} \
    }
    #else /* PGSZ == 64 */
    #define SwitchBitGroup(dst,pixel,bits) { \
    	cfb cannot hack 64-bit SwitchBitGroup psz=PSZ
    #endif /* PGSZ */
    
    #endif /* PSZ == 16 */
    
    #if PSZ == 24
    /* 32 000011112222*/
    /* 24 000111222333*/
    /* 16 001122334455*/
    /*  8 0123456789AB*/
    #if PGSZ == 32
    #define WriteBitGroup(dst,pixel,bits) \
    	{ \
    	register CARD32 reg_pixel = (pixel); \
    	switch (bits) {			\
    	case 0:				\
    	    break;			\
    	case 1:				\
    	    ((CARD16 *) (dst))[DoublePixel0] = reg_pixel;	\
    	    ((CARD8 *) (dst))[SinglePixel2] = ((reg_pixel>>16)&0xFF);	\
    	    break;			\
    	case 2:				\
    	    ((CARD8 *) (dst))[SinglePixel3] = reg_pixel&0xFF;	\
    	    ((CARD16 *) (dst))[DoublePixel2] = (reg_pixel>>8)&0xFFFF;	\
    	    break;			\
    	case 3:				\
    	    ((CARD8 *) (dst))[SinglePixel3] = reg_pixel & 0xFF;	\
    	    ((CARD16 *) (dst))[DoublePixel0] = reg_pixel;	\
    	    ((CARD16 *) (dst))[DoublePixel2] = (reg_pixel>>8)&0xFFFF;	\
    	    ((CARD8 *) (dst))[SinglePixel2] = (reg_pixel>>16&0xFF);	\
    	    break;			\
    	case 4:				\
    	    ((CARD16 *) (dst))[DoublePixel3] = reg_pixel;	\
    	    ((CARD8 *) (dst))[SinglePixel8] = (reg_pixel>>16)&0xFF; \
    	    break;			\
    	case 5:				\
    	    ((CARD16 *) (dst))[DoublePixel0] = \
    	    ((CARD16 *) (dst))[DoublePixel3] = reg_pixel;	\
    	    reg_pixel >>= 16;	\
    	    ((CARD8 *) (dst))[SinglePixel2] = \
    	    ((CARD8 *) (dst))[SinglePixel8] = reg_pixel&0xFF; \
    	    break;			\
    	case 6:				\
    	    ((CARD8 *) (dst))[SinglePixel3] = reg_pixel;	\
    	    ((CARD16 *) (dst))[DoublePixel3] = reg_pixel;	\
    	    reg_pixel >>= 8;	\
    	    ((CARD16 *) (dst))[DoublePixel2] = reg_pixel;	\
    	    reg_pixel >>= 8;	\
    	    ((CARD8 *) (dst))[SinglePixel8] = reg_pixel&0xFF; \
    	    break;			\
    	case 7:				\
    	    ((CARD16 *) (dst))[DoublePixel0] = \
    	    ((CARD16 *) (dst))[DoublePixel3] = reg_pixel;	\
    	    ((CARD8 *) (dst))[SinglePixel3] = reg_pixel&0xFF;	\
    	    reg_pixel >>= 8;	\
    	    ((CARD16 *) (dst))[DoublePixel2] = reg_pixel;	\
    	    reg_pixel >>= 8;	\
    	    ((CARD8 *) (dst))[SinglePixel2] = \
    	    ((CARD8 *) (dst))[SinglePixel8] = reg_pixel&0xFF; \
    	    break;			\
    	case 8:				\
    	    ((CARD8 *) (dst))[SinglePixel9] = reg_pixel&0xFF;	\
    	    ((CARD16 *) (dst))[DoublePixel5] = (reg_pixel>>8);	\
    	    break;			\
    	case 9:				\
    	    ((CARD16 *) (dst))[DoublePixel0] = reg_pixel;	\
    	    ((CARD8 *) (dst))[SinglePixel9] = reg_pixel&0xFF;	\
    	    reg_pixel >>= 8;	\
    	    ((CARD16 *) (dst))[DoublePixel5] = reg_pixel;	\
    	    reg_pixel >>= 8;	\
    	    ((CARD8 *) (dst))[SinglePixel2] = reg_pixel&0xFF;	\
    	    break;			\
    	case 10:			\
    	    ((CARD8 *) (dst))[SinglePixel3] = \
    	    ((CARD8 *) (dst))[SinglePixel9] = reg_pixel&0xFF;	\
    	    reg_pixel >>= 8;	\
    	    ((CARD16 *) (dst))[DoublePixel2] = \
    	    ((CARD16 *) (dst))[DoublePixel5] = reg_pixel;	\
    	    break;			\
    	case 11:			\
    	    ((CARD8 *) (dst))[SinglePixel3] = \
    	    ((CARD8 *) (dst))[SinglePixel9] = reg_pixel;	\
    	    ((CARD16 *) (dst))[DoublePixel0] = reg_pixel;	\
    	    reg_pixel >>= 8;	\
    	    ((CARD16 *) (dst))[DoublePixel2] = \
    	    ((CARD16 *) (dst))[DoublePixel5] = reg_pixel;	\
    	    reg_pixel >>= 8;	\
    	    ((CARD8 *) (dst))[SinglePixel2] = reg_pixel;	\
    	    break;			\
    	case 12:			\
    	    ((CARD16 *) (dst))[DoublePixel3] = reg_pixel;	\
    	    ((CARD8 *) (dst))[SinglePixel9] = reg_pixel;	\
    	    reg_pixel >>= 8;	\
    	    ((CARD16 *) (dst))[DoublePixel5] = reg_pixel;	\
    	    reg_pixel >>= 8;	\
    	    ((CARD8 *) (dst))[SinglePixel8] = reg_pixel; \
    	    break;			\
    	case 13:			\
    	    ((CARD16 *) (dst))[DoublePixel0] = \
    	    ((CARD16 *) (dst))[DoublePixel3] = reg_pixel;	\
    	    ((CARD8 *) (dst))[SinglePixel9] = reg_pixel;	\
    	    reg_pixel >>= 8;	\
    	    ((CARD16 *) (dst))[DoublePixel5] = reg_pixel;	\
    	    reg_pixel >>= 8;	\
    	    ((CARD8 *) (dst))[SinglePixel2] = \
    	    ((CARD8 *) (dst))[SinglePixel8] = reg_pixel; \
    	    break;			\
    	case 14:			\
    	    ((CARD8 *) (dst))[SinglePixel3] = \
    	    ((CARD8 *) (dst))[SinglePixel9] = reg_pixel;	\
    	    ((CARD16 *) (dst))[DoublePixel3] = reg_pixel;	\
    	    reg_pixel >>= 8;	\
    	    ((CARD16 *) (dst))[DoublePixel2] = \
    	    ((CARD16 *) (dst))[DoublePixel5] = reg_pixel;	\
    	    reg_pixel >>= 8;	\
    	    ((CARD8 *) (dst))[SinglePixel8] = reg_pixel; \
    	    break;			\
    	case 15:			\
    	    ((CARD16 *) (dst))[DoublePixel0] = \
    	    ((CARD16 *) (dst))[DoublePixel3] = reg_pixel;	\
    	    ((CARD8 *) (dst))[SinglePixel3] = \
    	    ((CARD8 *) (dst))[SinglePixel9] = reg_pixel;	\
    	    reg_pixel >>= 8;	\
    	    ((CARD16 *) (dst))[DoublePixel2] = \
    	    ((CARD16 *) (dst))[DoublePixel5] = reg_pixel;	\
    	    reg_pixel >>= 8;	\
    	    ((CARD8 *) (dst))[SinglePixel8] = \
    	    ((CARD8 *) (dst))[SinglePixel2] = reg_pixel;	\
    	    break;			\
    	} \
          }
    #else /* PGSZ == 64 */
    #define WriteBitGroup(dst,pixel,bits) \
        if ( bits == 0xff )	 {				   \
    	((PixelGroup *) (dst))[DoublePixel0] = (pixel);	   \
    	((PixelGroup *) (dst))[DoublePixel1] = (pixel);	   \
    	((PixelGroup *) (dst))[DoublePixel2] = (pixel);	   \
    	((PixelGroup *) (dst))[DoublePixel3] = (pixel);	   \
        }							   \
        else {						   \
    	switch (bits & 0x0f) {	 			   \
    	case 0:				\
    	    break;			\
    	case 1:				\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    break;			\
    	case 2:				\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    break;			\
    	case 3:				\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    break;			\
    	case 4:				\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 5:				\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 6:				\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 7:				\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 8:				\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 9:				\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 10:			\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 11:			\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 12:			\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 13:			\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 14:			\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 15:			\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	}				\
    	switch ((bits & 0xf0) >> 4) {	\
    	case 0:				\
    	    break;			\
    	case 1:				\
    	    ((CARD32 *) (dst))[SinglePixel4] = (pixel);	\
    	    break;			\
    	case 2:				\
    	    ((CARD32 *) (dst))[SinglePixel5] = (pixel);	\
    	    break;			\
    	case 3:				\
    	    ((CARD32 *) (dst))[SinglePixel4] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel5] = (pixel);	\
    	    break;			\
    	case 4:				\
    	    ((CARD32 *) (dst))[SinglePixel6] = (pixel);	\
    	    break;			\
    	case 5:				\
    	    ((CARD32 *) (dst))[SinglePixel4] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel6] = (pixel);	\
    	    break;			\
    	case 6:				\
    	    ((CARD32 *) (dst))[SinglePixel5] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel6] = (pixel);	\
    	    break;			\
    	case 7:				\
    	    ((CARD32 *) (dst))[SinglePixel4] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel5] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel6] = (pixel);	\
    	    break;			\
    	case 8:				\
    	    ((CARD32 *) (dst))[SinglePixel7] = (pixel);	\
    	    break;			\
    	case 9:				\
    	    ((CARD32 *) (dst))[SinglePixel4] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel7] = (pixel);	\
    	    break;			\
    	case 10:			\
    	    ((CARD32 *) (dst))[SinglePixel5] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel7] = (pixel);	\
    	    break;			\
    	case 11:			\
    	    ((CARD32 *) (dst))[SinglePixel4] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel5] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel7] = (pixel);	\
    	    break;			\
    	case 12:			\
    	    ((CARD32 *) (dst))[SinglePixel6] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel7] = (pixel);	\
    	    break;			\
    	case 13:			\
    	    ((CARD32 *) (dst))[SinglePixel4] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel6] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel7] = (pixel);	\
    	    break;			\
    	case 14:			\
    	    ((CARD32 *) (dst))[SinglePixel5] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel6] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel7] = (pixel);	\
    	    break;			\
    	case 15:			\
    	    ((CARD32 *) (dst))[SinglePixel4] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel5] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel6] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel7] = (pixel);	\
    	    break;			\
    	}				\
        }
    #endif /* PGSZ */
    
    #if PGSZ == 32
    #define SwitchBitGroup(dst,pixel,bits) { \
    	switch (bits) { \
    	case 0: \
           	    break; \
    	case 1: \
    	    SwitchBitsLoop (((CARD16 *) (dst))[DoublePixel0] = (pixel); \
    			    ((CARD8 *) (dst))[SinglePixel2] = (pixel);) \
    	    break; \
    	case 2: \
    	    SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel3] = (pixel); \
    			    ((CARD16 *) (dst))[DoublePixel2] = (pixel);) \
    	    break; \
    	case 3: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[QuadPixel0] = (pixel); \
    			    ((CARD16 *) (dst))[DoublePixel2] = (pixel);) \
    	    break; \
    	case 4: \
    	    SwitchBitsLoop (((CARD16 *) (dst))[DoublePixel3] = (pixel); \
    			    ((CARD8 *) (dst))[SinglePixel8] = (pixel);) \
    	    break; \
    	case 5: \
    	    SwitchBitsLoop (((CARD16 *) (dst))[DoublePixel0] = (pixel); \
    			    ((CARD8 *) (dst))[SinglePixel2] = (pixel); \
    			    ((CARD16 *) (dst))[DoublePixel3] = (pixel); \
    			    ((CARD8 *) (dst))[SinglePixel8] = (pixel);) \
    	    break; \
    	case 6: \
    	    SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel3] = (pixel); \
    			    ((CARD32 *) (dst))[QuadPixel2] = (pixel); \
    			    ((CARD8 *) (dst))[SinglePixel8] = (pixel);) \
    	    break; \
    	case 7: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[QuadPixel0] = (pixel); \
    			    ((CARD32 *) (dst))[QuadPixel1] = (pixel); \
    			    ((CARD8 *) (dst))[SinglePixel8] = (pixel);) \
    	    break; \
    	case 8: \
    	    SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel9] = (pixel); \
    			    ((CARD16 *) (dst))[DoublePixel5] = (pixel);) \
    	    break; \
    	case 9: \
    	    SwitchBitsLoop (((CARD16 *) (dst))[DoublePixel0] = (pixel); \
    			    ((CARD8 *) (dst))[SinglePixel2] = (pixel); \
    			    ((CARD8 *) (dst))[SinglePixel9] = (pixel); \
    			    ((CARD16 *) (dst))[DoublePixel5] = (pixel);) \
    	    break; \
    	case 10: \
    	    SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel3] = (pixel); \
    			    ((CARD16 *) (dst))[DoublePixel2] = (pixel); \
    			    ((CARD8 *) (dst))[SinglePixel9] = (pixel); \
    			    ((CARD16 *) (dst))[DoublePixel5] = (pixel);) \
    	    break; \
    	case 11: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[QuadPixel0] = (pixel); \
    			    ((CARD16 *) (dst))[DoublePixel3] = (pixel);) \
    			    ((CARD8 *) (dst))[SinglePixel9] = (pixel); \
    			    ((CARD16 *) (dst))[DoublePixel5] = (pixel);) \
    	    break; \
    	case 12: \
    	    SwitchBitsLoop (((CARD16 *) (dst))[DoublePixel3] = (pixel); \
    			    ((CARD32 *) (dst))[QuadPixel2] = (pixel);) \
    	    break; \
    	case 13: \
    	    SwitchBitsLoop (((CARD16 *) (dst))[SinglePixel0] = (pixel); \
    			    ((CARD8 *) (dst))[SinglePixel2] = (pixel); \
    			    ((CARD16 *) (dst))[DoublePixel3] = (pixel); \
    			    ((CARD32 *) (dst))[QuadPixel2] = (pixel);) \
    	    break; \
    	case 14: \
    	    SwitchBitsLoop (((CARD8 *) (dst))[SinglePixel3] = (pixel); \
    			    ((CARD32 *) (dst))[QuadPixel1] = (pixel); \
    			    ((CARD32 *) (dst))[QuadPixel2] = (pixel);) \
    	    break; \
    	case 15: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[QuadPixel0] = (pixel); \
    			    ((CARD32 *) (dst))[QuadPixel1] = (pixel); \
    			    ((CARD32 *) (dst))[QuadPixel2] = (pixel);) \
    	    break; \
    	} \
    }
    #else /* PGSZ == 64 */
    #define SwitchBitGroup(dst,pixel,bits) { \
    	cfb cannot hack 64-bit SwitchBitGroup psz=PSZ
    #endif /* PGSZ */
    
    #endif /* PSZ == 24 */
    
    #if PSZ == 32
    
    #if PGSZ == 32
    #define WriteBitGroup(dst,pixel,bits) \
    	switch (bits) {			\
    	case 0:				\
    	    break;			\
    	case 1:				\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    break;			\
    	case 2:				\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    break;			\
    	case 3:				\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    break;			\
    	case 4:				\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 5:				\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 6:				\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 7:				\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 8:				\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 9:				\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 10:			\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 11:			\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 12:			\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 13:			\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 14:			\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 15:			\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	}
    #else /* PGSZ == 64 */
    #define WriteBitGroup(dst,pixel,bits) \
        if ( bits == 0xff )	 {				   \
    	((PixelGroup *) (dst))[DoublePixel0] = (pixel);	   \
    	((PixelGroup *) (dst))[DoublePixel1] = (pixel);	   \
    	((PixelGroup *) (dst))[DoublePixel2] = (pixel);	   \
    	((PixelGroup *) (dst))[DoublePixel3] = (pixel);	   \
        }							   \
        else {						   \
    	switch (bits & 0x0f) {	 			   \
    	case 0:				\
    	    break;			\
    	case 1:				\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    break;			\
    	case 2:				\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    break;			\
    	case 3:				\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    break;			\
    	case 4:				\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 5:				\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 6:				\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 7:				\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    break;			\
    	case 8:				\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 9:				\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 10:			\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 11:			\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 12:			\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 13:			\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 14:			\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	case 15:			\
    	    ((CARD32 *) (dst))[SinglePixel0] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel1] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel2] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel3] = (pixel);	\
    	    break;			\
    	}				\
    	switch ((bits & 0xf0) >> 4) {	\
    	case 0:				\
    	    break;			\
    	case 1:				\
    	    ((CARD32 *) (dst))[SinglePixel4] = (pixel);	\
    	    break;			\
    	case 2:				\
    	    ((CARD32 *) (dst))[SinglePixel5] = (pixel);	\
    	    break;			\
    	case 3:				\
    	    ((CARD32 *) (dst))[SinglePixel4] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel5] = (pixel);	\
    	    break;			\
    	case 4:				\
    	    ((CARD32 *) (dst))[SinglePixel6] = (pixel);	\
    	    break;			\
    	case 5:				\
    	    ((CARD32 *) (dst))[SinglePixel4] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel6] = (pixel);	\
    	    break;			\
    	case 6:				\
    	    ((CARD32 *) (dst))[SinglePixel5] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel6] = (pixel);	\
    	    break;			\
    	case 7:				\
    	    ((CARD32 *) (dst))[SinglePixel4] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel5] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel6] = (pixel);	\
    	    break;			\
    	case 8:				\
    	    ((CARD32 *) (dst))[SinglePixel7] = (pixel);	\
    	    break;			\
    	case 9:				\
    	    ((CARD32 *) (dst))[SinglePixel4] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel7] = (pixel);	\
    	    break;			\
    	case 10:			\
    	    ((CARD32 *) (dst))[SinglePixel5] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel7] = (pixel);	\
    	    break;			\
    	case 11:			\
    	    ((CARD32 *) (dst))[SinglePixel4] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel5] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel7] = (pixel);	\
    	    break;			\
    	case 12:			\
    	    ((CARD32 *) (dst))[SinglePixel6] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel7] = (pixel);	\
    	    break;			\
    	case 13:			\
    	    ((CARD32 *) (dst))[SinglePixel4] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel6] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel7] = (pixel);	\
    	    break;			\
    	case 14:			\
    	    ((CARD32 *) (dst))[SinglePixel5] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel6] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel7] = (pixel);	\
    	    break;			\
    	case 15:			\
    	    ((CARD32 *) (dst))[SinglePixel4] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel5] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel6] = (pixel);	\
    	    ((CARD32 *) (dst))[SinglePixel7] = (pixel);	\
    	    break;			\
    	}				\
        }
    #endif /* PGSZ */
    
    #if PGSZ == 32
    #define SwitchBitGroup(dst,pixel,bits) { \
    	switch (bits) { \
    	case 0: \
           	    break; \
    	case 1: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[SinglePixel0] = (pixel);) \
    	    break; \
    	case 2: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[SinglePixel1] = (pixel);) \
    	    break; \
    	case 3: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[SinglePixel0] = (pixel); \
    			    ((CARD32 *) (dst))[SinglePixel1] = (pixel);) \
    	    break; \
    	case 4: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[SinglePixel2] = (pixel);) \
    	    break; \
    	case 5: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[SinglePixel0] = (pixel); \
    			    ((CARD32 *) (dst))[SinglePixel2] = (pixel);) \
    	    break; \
    	case 6: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[SinglePixel1] = (pixel); \
    			    ((CARD32 *) (dst))[SinglePixel2] = (pixel);) \
    	    break; \
    	case 7: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[SinglePixel0] = (pixel); \
    			    ((CARD32 *) (dst))[SinglePixel1] = (pixel); \
    			    ((CARD32 *) (dst))[SinglePixel2] = (pixel);) \
    	    break; \
    	case 8: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[SinglePixel3] = (pixel);) \
    	    break; \
    	case 9: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[SinglePixel0] = (pixel); \
    			    ((CARD32 *) (dst))[SinglePixel3] = (pixel);) \
    	    break; \
    	case 10: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[SinglePixel1] = (pixel); \
    			    ((CARD32 *) (dst))[SinglePixel3] = (pixel);) \
    	    break; \
    	case 11: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[SinglePixel0] = (pixel); \
    			    ((CARD32 *) (dst))[SinglePixel1] = (pixel); \
    			    ((CARD32 *) (dst))[SinglePixel3] = (pixel);) \
    	    break; \
    	case 12: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[SinglePixel2] = (pixel); \
    			    ((CARD32 *) (dst))[SinglePixel3] = (pixel);) \
    	    break; \
    	case 13: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[SinglePixel0] = (pixel); \
    			    ((CARD32 *) (dst))[SinglePixel2] = (pixel); \
    			    ((CARD32 *) (dst))[SinglePixel3] = (pixel);) \
    	    break; \
    	case 14: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[SinglePixel1] = (pixel); \
    			    ((CARD32 *) (dst))[SinglePixel2] = (pixel); \
    			    ((CARD32 *) (dst))[SinglePixel3] = (pixel);) \
    	    break; \
    	case 15: \
    	    SwitchBitsLoop (((CARD32 *) (dst))[SinglePixel0] = (pixel); \
    			    ((CARD32 *) (dst))[SinglePixel1] = (pixel); \
    			    ((CARD32 *) (dst))[SinglePixel2] = (pixel); \
    			    ((CARD32 *) (dst))[SinglePixel3] = (pixel);) \
    	    break; \
    	} \
    }
    #else /* PGSZ == 64 */
    #define SwitchBitGroup(dst,pixel,bits) { \
    	cfb cannot hack 64-bit SwitchBitGroup psz=PSZ
    #endif /* PGSZ */
    
    #endif /* PSZ == 32 */
    #endif /* AVOID_MEMORY_READ */
    
    extern PixelGroup cfb8BitLenMasks[PGSZ];
    
    extern int cfb8SetStipple (
        int	/*alu*/,
        CfbBits /*fg*/,
        CfbBits /*planemask*/
    );
    
    extern int cfb8SetOpaqueStipple (
        int /*alu*/,
        CfbBits /*fg*/,
        CfbBits /*bg*/,
        CfbBits /*planemask*/
    );
    
    extern int cfb8ComputeClipMasks32 (
        BoxPtr	/*pBox*/,
        int		/*numRects*/,
        int		/*x*/,
        int		/*y*/,
        int		/*w*/,
        int		/*h*/,
        CARD32 * /*clips*/
    );