151 lines
3.0 KiB
C
151 lines
3.0 KiB
C
|
#ifdef HAVE_XORG_CONFIG_H
|
||
|
#include <xorg-config.h>
|
||
|
#endif
|
||
|
|
||
|
#include <stdlib.h>
|
||
|
|
||
|
#include <X11/X.h>
|
||
|
#include <X11/Xmd.h>
|
||
|
#include <X11/Xproto.h>
|
||
|
#define PSZ 8
|
||
|
#include "cfb.h"
|
||
|
#undef PSZ
|
||
|
#include "cfb32.h"
|
||
|
#include "cfb8_32.h"
|
||
|
#include <X11/fonts/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;
|
||
|
}
|
||
|
}
|
||
|
|