147 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
| /* $XFree86$ */
 | |
| 
 | |
| #include "X.h"
 | |
| #include "Xmd.h"
 | |
| #include "Xproto.h"
 | |
| #define PSZ 8
 | |
| #include "cfb.h"
 | |
| #undef PSZ
 | |
| #include "cfb32.h"
 | |
| #include "cfb8_32.h"
 | |
| #include "fontstruct.h"
 | |
| #include "dixfontstr.h"
 | |
| #include "gcstruct.h"
 | |
| #include "windowstr.h"
 | |
| #include "pixmapstr.h"
 | |
| #include "scrnintstr.h"
 | |
| #include "region.h"
 | |
| 
 | |
| #include "mistruct.h"
 | |
| #include "mibstore.h"
 | |
| #include "migc.h"
 | |
| 
 | |
| 
 | |
| static void cfb8_32ValidateGC(GCPtr, unsigned long, DrawablePtr);
 | |
| static void cfb8_32DestroyGC(GCPtr pGC);
 | |
| static void cfb32DestroyGC_Underlay(GCPtr pGC);
 | |
| 
 | |
| static
 | |
| GCFuncs cfb8_32GCFuncs = {
 | |
|     cfb8_32ValidateGC,
 | |
|     miChangeGC,
 | |
|     miCopyGC,
 | |
|     cfb8_32DestroyGC,
 | |
|     miChangeClip,
 | |
|     miDestroyClip,
 | |
|     miCopyClip,
 | |
| };
 | |
| 
 | |
| 
 | |
| static
 | |
| GCFuncs cfb32GCFuncs_Underlay = {
 | |
|     cfb32ValidateGC_Underlay,
 | |
|     miChangeGC,
 | |
|     miCopyGC,
 | |
|     cfb32DestroyGC_Underlay,
 | |
|     miChangeClip,
 | |
|     miDestroyClip,
 | |
|     miCopyClip,
 | |
| };
 | |
| 
 | |
| static void
 | |
| cfb32DestroyGC_Underlay(GCPtr pGC)
 | |
| {
 | |
|     if (pGC->freeCompClip)
 | |
|         REGION_DESTROY(pGC->pScreen, pGC->pCompositeClip);
 | |
| 
 | |
|     if(pGC->ops)
 | |
| 	miDestroyGCOps(pGC->ops);
 | |
| }
 | |
| 
 | |
| 
 | |
| static void
 | |
| cfb8_32DestroyGC(GCPtr pGC)
 | |
| {
 | |
|     cfb8_32GCPtr pGCPriv = CFB8_32_GET_GC_PRIVATE(pGC);
 | |
| 
 | |
|     if (pGC->freeCompClip)
 | |
|         REGION_DESTROY(pGC->pScreen, pGC->pCompositeClip);
 | |
|     if(pGCPriv->Ops8bpp)
 | |
| 	miDestroyGCOps(pGCPriv->Ops8bpp);
 | |
|     if(pGCPriv->Ops32bpp)
 | |
| 	miDestroyGCOps(pGCPriv->Ops32bpp);
 | |
| }
 | |
| 
 | |
| Bool
 | |
| cfb8_32CreateGC(GCPtr pGC)
 | |
| {
 | |
|     cfb8_32GCPtr pGCPriv;
 | |
|     cfbPrivGC *pPriv;
 | |
| 
 | |
|     if (PixmapWidthPaddingInfo[pGC->depth].padPixelsLog2 == LOG2_BITMAP_PAD)
 | |
|         return (mfbCreateGC(pGC));
 | |
| 
 | |
|     pGC->clientClip = NULL;
 | |
|     pGC->clientClipType = CT_NONE;
 | |
|     pGC->miTranslate = 1;
 | |
|     pGC->fExpose = TRUE;
 | |
|     pGC->freeCompClip = FALSE;
 | |
|     pGC->pRotatedPixmap = (PixmapPtr) NULL;
 | |
| 
 | |
|     pPriv = cfbGetGCPrivate(pGC);
 | |
|     pPriv->rop = pGC->alu;
 | |
|     pPriv->oneRect = FALSE;
 | |
| 
 | |
|     pGC->ops = NULL;
 | |
| 
 | |
|     if (pGC->depth == 8) {
 | |
| 	pGC->funcs = &cfb8_32GCFuncs;
 | |
| 
 | |
| 	pGCPriv = CFB8_32_GET_GC_PRIVATE(pGC);
 | |
| 	pGCPriv->Ops8bpp = NULL;
 | |
| 	pGCPriv->Ops32bpp = NULL;
 | |
| 	pGCPriv->OpsAre8bpp = FALSE;
 | |
| 	pGCPriv->changes = 0;
 | |
|     } else
 | |
| 	pGC->funcs = &cfb32GCFuncs_Underlay;
 | |
| 	
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| 
 | |
| static void
 | |
| cfb8_32ValidateGC(
 | |
|     GCPtr pGC,
 | |
|     unsigned long changes,
 | |
|     DrawablePtr pDraw
 | |
| ){
 | |
|     cfb8_32GCPtr pGCPriv = CFB8_32_GET_GC_PRIVATE(pGC);
 | |
| 
 | |
|     if(pDraw->bitsPerPixel == 32) {
 | |
| 	if(pGCPriv->OpsAre8bpp) {
 | |
| 	    int origChanges = changes;
 | |
| 	    pGC->ops = pGCPriv->Ops32bpp;
 | |
| 	    changes |= pGCPriv->changes;
 | |
| 	    pGCPriv->changes = origChanges;
 | |
| 	    pGCPriv->OpsAre8bpp = FALSE;
 | |
| 	} else 
 | |
| 	    pGCPriv->changes |= changes;
 | |
| 
 | |
| 	cfb8_32ValidateGC32(pGC, changes, pDraw);
 | |
| 	pGCPriv->Ops32bpp = pGC->ops;
 | |
|     } else {  /* bitsPerPixel == 8 */
 | |
| 	if(!pGCPriv->OpsAre8bpp) {
 | |
| 	    int origChanges = changes;
 | |
| 	    pGC->ops = pGCPriv->Ops8bpp;
 | |
| 	    changes |= pGCPriv->changes;
 | |
| 	    pGCPriv->changes = origChanges;
 | |
| 	    pGCPriv->OpsAre8bpp = TRUE;
 | |
| 	} else 
 | |
| 	    pGCPriv->changes |= changes;
 | |
| 
 | |
| 	cfb8_32ValidateGC8(pGC, changes, pDraw);
 | |
| 	pGCPriv->Ops8bpp = pGC->ops;
 | |
|     }
 | |
| }
 | |
| 
 |