#include "layerstr.h"
GCFuncs layerGCFuncs = {
layerValidateGC, layerChangeGC, layerCopyGC, layerDestroyGC,
layerChangeClip, layerDestroyClip, layerCopyClip
};
#if 0
GCOps layerGCOps = {
layerFillSpans, layerSetSpans,
layerPutImage, layerCopyArea,
layerCopyPlane, layerPolyPoint,
layerPolylines, layerPolySegment,
layerPolyRectangle, layerPolyArc,
layerFillPolygon, layerPolyFillRect,
layerPolyFillArc, layerPolyText8,
layerPolyText16, layerImageText8,
layerImageText16, layerImageGlyphBlt,
layerPolyGlyphBlt, layerPushPixels,
#ifdef NEED_LINEHELPER
NULL,
#endif
{NULL}
};
#endif
Bool
layerCreateGC (GCPtr pGC)
{
Bool ret = TRUE;
LayerKindPtr pLayKind;
ScreenPtr pScreen = pGC->pScreen;
layerScrPriv(pScreen);
layerGCPriv(pGC);
pLayKind = &pLayScr->kinds[0];
if (pLayScr->pLayers)
pLayKind = pLayScr->pLayers->pKind;
pLayGC->pKind = pLayKind;
LayerUnwrap (pScreen,pLayGC->pKind,CreateGC);
if (!(*pScreen->CreateGC) (pGC))
ret = FALSE;
LayerWrap (pScreen,pLayKind,CreateGC,layerCreateGC);
LayerWrap (pGC,pLayGC,funcs,&layerGCFuncs);
return ret;
}
void
layerValidateGC(GCPtr pGC,
unsigned long changes,
DrawablePtr pDraw)
{
layerGCPriv(pGC);
LayerKindPtr pKind;
if (pDraw->type == DRAWABLE_WINDOW)
{
layerWinPriv ((WindowPtr) pDraw);
pKind = layerWinLayer (pLayWin)->pKind;
}
else
{
layerScrPriv (pDraw->pScreen);
pKind = &pLayScr->kinds[0];
if (pLayScr->pLayers)
pKind = pLayScr->pLayers->pKind;
}
LayerUnwrap (pGC,pLayGC,funcs);
if (pKind != pLayGC->pKind)
{
CreateGCProcPtr CreateGC;
(*pGC->funcs->DestroyGC) (pGC);
pGC->serialNumber = GC_CHANGE_SERIAL_BIT;
pLayGC->pKind = pKind;
CreateGC = pGC->pScreen->CreateGC;
LayerUnwrap (pGC->pScreen, pLayGC->pKind, CreateGC);
(*pGC->pScreen->CreateGC) (pGC);
LayerWrap (pGC->pScreen, pLayGC->pKind, CreateGC, CreateGC);
}
(*pGC->funcs->ValidateGC) (pGC, changes, pDraw);
LayerWrap(pGC,pLayGC,funcs,&layerGCFuncs);
}
void
layerDestroyGC(GCPtr pGC)
{
layerGCPriv(pGC);
LayerUnwrap (pGC,pLayGC,funcs);
(*pGC->funcs->DestroyGC)(pGC);
LayerWrap(pGC,pLayGC,funcs,&layerGCFuncs);
}
void
layerChangeGC (GCPtr pGC,
unsigned long mask)
{
layerGCPriv(pGC);
LayerUnwrap (pGC,pLayGC,funcs);
(*pGC->funcs->ChangeGC) (pGC, mask);
LayerWrap(pGC,pLayGC,funcs,&layerGCFuncs);
}
void
layerCopyGC (GCPtr pGCSrc,
unsigned long mask,
GCPtr pGCDst)
{
layerGCPriv(pGCDst);
LayerUnwrap (pGCDst,pLayGC,funcs);
(*pGCDst->funcs->CopyGC) (pGCSrc, mask, pGCDst);
LayerWrap(pGCDst,pLayGC,funcs,&layerGCFuncs);
}
void
layerChangeClip (GCPtr pGC,
int type,
pointer pvalue,
int nrects)
{
layerGCPriv(pGC);
LayerUnwrap (pGC,pLayGC,funcs);
(*pGC->funcs->ChangeClip) (pGC, type, pvalue, nrects);
LayerWrap(pGC,pLayGC,funcs,&layerGCFuncs);
}
void
layerCopyClip(GCPtr pGCDst, GCPtr pGCSrc)
{
layerGCPriv(pGCDst);
LayerUnwrap (pGCDst,pLayGC,funcs);
(*pGCDst->funcs->CopyClip) (pGCDst, pGCSrc);
LayerWrap(pGCDst,pLayGC,funcs,&layerGCFuncs);
}
void
layerDestroyClip(GCPtr pGC)
{
layerGCPriv(pGC);
LayerUnwrap (pGC,pLayGC,funcs);
(*pGC->funcs->DestroyClip) (pGC);
LayerWrap(pGC,pLayGC,funcs,&layerGCFuncs);
}