1255 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			1255 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			C
		
	
	
	
 | 
						|
/*
 | 
						|
   Copyright (C) 1998.  The XFree86 Project Inc.
 | 
						|
 | 
						|
   Written by Mark Vojkovich (mvojkovi@ucsd.edu)
 | 
						|
*/
 | 
						|
 | 
						|
#ifdef HAVE_XORG_CONFIG_H
 | 
						|
#include <xorg-config.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#include "misc.h"
 | 
						|
#include "xf86.h"
 | 
						|
#include "xf86_OSproc.h"
 | 
						|
 | 
						|
#include <X11/X.h>
 | 
						|
#include "scrnintstr.h"
 | 
						|
#include "regionstr.h"
 | 
						|
#include "windowstr.h"
 | 
						|
#include "xf86str.h"
 | 
						|
#include "migc.h"
 | 
						|
#include "gcstruct.h"
 | 
						|
#include "pixmapstr.h"
 | 
						|
#include "colormapst.h"
 | 
						|
#include "cfb8_32.h"
 | 
						|
 | 
						|
#define IS_DIRTY 	1
 | 
						|
#define IS_SHARED	2
 | 
						|
 | 
						|
/** Screen Functions **/
 | 
						|
 | 
						|
static Bool OverlayCloseScreen (int, ScreenPtr);
 | 
						|
static Bool OverlayCreateGC(GCPtr pGC);
 | 
						|
static Bool OverlayDestroyPixmap(PixmapPtr);
 | 
						|
static PixmapPtr OverlayCreatePixmap(ScreenPtr, int, int, int);
 | 
						|
static Bool OverlayChangeWindowAttributes(WindowPtr, unsigned long);
 | 
						|
static void OverlayPaintWindow(WindowPtr, RegionPtr, int);
 | 
						|
 | 
						|
/** Funcs **/
 | 
						|
static void OverlayValidateGC(GCPtr, unsigned long, DrawablePtr);
 | 
						|
static void OverlayChangeGC(GCPtr, unsigned long);
 | 
						|
static void OverlayCopyGC(GCPtr, unsigned long, GCPtr);
 | 
						|
static void OverlayDestroyGC(GCPtr);
 | 
						|
static void OverlayChangeClip(GCPtr, int, pointer, int);
 | 
						|
static void OverlayDestroyClip(GCPtr);
 | 
						|
static void OverlayCopyClip(GCPtr, GCPtr);
 | 
						|
 | 
						|
 | 
						|
static PixmapPtr OverlayRefreshPixmap(PixmapPtr);
 | 
						|
 | 
						|
static GCFuncs OverlayGCFuncs = {
 | 
						|
   OverlayValidateGC, OverlayChangeGC, 
 | 
						|
   OverlayCopyGC, OverlayDestroyGC,
 | 
						|
   OverlayChangeClip, OverlayDestroyClip, 
 | 
						|
   OverlayCopyClip
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/** Pixmap Ops */
 | 
						|
static void	 PixmapFillSpans(DrawablePtr, GCPtr, int, DDXPointPtr, int *,
 | 
						|
				  int);
 | 
						|
static void	 PixmapSetSpans(DrawablePtr, GCPtr, char *, DDXPointPtr,
 | 
						|
				 int *, int, int);
 | 
						|
static void	 PixmapPutImage(DrawablePtr, GCPtr, int, int, int, int, int,
 | 
						|
				 int, int, char *);
 | 
						|
static void	 PixmapPushPixels(GCPtr, PixmapPtr, DrawablePtr, int, int,
 | 
						|
				   int, int);
 | 
						|
static RegionPtr PixmapCopyArea(DrawablePtr, DrawablePtr, GCPtr, int, int,
 | 
						|
				 int, int, int, int);
 | 
						|
static RegionPtr PixmapCopyPlane(DrawablePtr, DrawablePtr, GCPtr, int, int,
 | 
						|
				  int, int, int, int, unsigned long);
 | 
						|
static void	 PixmapPolyPoint(DrawablePtr, GCPtr, int, int, xPoint *);
 | 
						|
static void	 PixmapPolylines(DrawablePtr, GCPtr, int, int, DDXPointPtr);
 | 
						|
static void	 PixmapPolySegment(DrawablePtr, GCPtr, int, xSegment *);
 | 
						|
static void	 PixmapPolyRectangle(DrawablePtr, GCPtr, int, xRectangle *);
 | 
						|
static void	 PixmapPolyArc(DrawablePtr, GCPtr, int, xArc *);
 | 
						|
static void	 PixmapFillPolygon(DrawablePtr, GCPtr, int, int, int,
 | 
						|
				    DDXPointPtr);
 | 
						|
static void	 PixmapPolyFillRect(DrawablePtr, GCPtr, int, xRectangle *);
 | 
						|
static void	 PixmapPolyFillArc(DrawablePtr, GCPtr, int, xArc *);
 | 
						|
static int	 PixmapPolyText8(DrawablePtr, GCPtr, int, int, int, char *);
 | 
						|
static int	 PixmapPolyText16(DrawablePtr, GCPtr, int, int, int,
 | 
						|
				   unsigned short *);
 | 
						|
static void	 PixmapImageText8(DrawablePtr, GCPtr, int, int, int, char *);
 | 
						|
static void	 PixmapImageText16(DrawablePtr, GCPtr, int, int, int,
 | 
						|
				    unsigned short *);
 | 
						|
static void	 PixmapImageGlyphBlt(DrawablePtr, GCPtr, int, int,
 | 
						|
				      unsigned int, CharInfoPtr *, pointer);
 | 
						|
static void	 PixmapPolyGlyphBlt(DrawablePtr, GCPtr, int, int,
 | 
						|
				     unsigned int, CharInfoPtr *, pointer);
 | 
						|
 | 
						|
static GCOps PixmapGCOps = {
 | 
						|
    PixmapFillSpans, PixmapSetSpans, 
 | 
						|
    PixmapPutImage, PixmapCopyArea, 
 | 
						|
    PixmapCopyPlane, PixmapPolyPoint, 
 | 
						|
    PixmapPolylines, PixmapPolySegment, 
 | 
						|
    PixmapPolyRectangle, PixmapPolyArc, 
 | 
						|
    PixmapFillPolygon, PixmapPolyFillRect, 
 | 
						|
    PixmapPolyFillArc, PixmapPolyText8, 
 | 
						|
    PixmapPolyText16, PixmapImageText8, 
 | 
						|
    PixmapImageText16, PixmapImageGlyphBlt, 
 | 
						|
    PixmapPolyGlyphBlt, PixmapPushPixels,
 | 
						|
    {NULL}		/* devPrivate */
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/** Window Ops **/
 | 
						|
static void	 WindowFillSpans(DrawablePtr, GCPtr, int, DDXPointPtr, int *,
 | 
						|
				  int);
 | 
						|
static void	 WindowSetSpans(DrawablePtr, GCPtr, char *, DDXPointPtr,
 | 
						|
				 int *, int, int);
 | 
						|
static void	 WindowPutImage(DrawablePtr, GCPtr, int, int, int, int, int,
 | 
						|
				 int, int, char *);
 | 
						|
static void	 WindowPushPixels(GCPtr, PixmapPtr, DrawablePtr, int, int,
 | 
						|
				   int, int);
 | 
						|
static RegionPtr WindowCopyArea(DrawablePtr, DrawablePtr, GCPtr, int, int,
 | 
						|
				 int, int, int, int);
 | 
						|
static RegionPtr WindowCopyPlane(DrawablePtr, DrawablePtr, GCPtr, int, int,
 | 
						|
				  int, int, int, int, unsigned long);
 | 
						|
static void	 WindowPolyPoint(DrawablePtr, GCPtr, int, int, xPoint *);
 | 
						|
static void	 WindowPolylines(DrawablePtr, GCPtr, int, int, DDXPointPtr);
 | 
						|
static void	 WindowPolySegment(DrawablePtr, GCPtr, int, xSegment *);
 | 
						|
static void	 WindowPolyRectangle(DrawablePtr, GCPtr, int, xRectangle *);
 | 
						|
static void	 WindowPolyArc(DrawablePtr, GCPtr, int, xArc *);
 | 
						|
static void	 WindowFillPolygon(DrawablePtr, GCPtr, int, int, int,
 | 
						|
				    DDXPointPtr);
 | 
						|
static void	 WindowPolyFillRect(DrawablePtr, GCPtr, int, xRectangle *);
 | 
						|
static void	 WindowPolyFillArc(DrawablePtr, GCPtr, int, xArc *);
 | 
						|
static int	 WindowPolyText8(DrawablePtr, GCPtr, int, int, int, char *);
 | 
						|
static int	 WindowPolyText16(DrawablePtr, GCPtr, int, int, int,
 | 
						|
				   unsigned short *);
 | 
						|
static void	 WindowImageText8(DrawablePtr, GCPtr, int, int, int, char *);
 | 
						|
static void	 WindowImageText16(DrawablePtr, GCPtr, int, int, int,
 | 
						|
				    unsigned short *);
 | 
						|
static void	 WindowImageGlyphBlt(DrawablePtr, GCPtr, int, int,
 | 
						|
				      unsigned int, CharInfoPtr *, pointer);
 | 
						|
static void	 WindowPolyGlyphBlt(DrawablePtr, GCPtr, int, int,
 | 
						|
				     unsigned int, CharInfoPtr *, pointer);
 | 
						|
 | 
						|
static GCOps WindowGCOps = {
 | 
						|
    WindowFillSpans, WindowSetSpans, 
 | 
						|
    WindowPutImage, WindowCopyArea, 
 | 
						|
    WindowCopyPlane, WindowPolyPoint, 
 | 
						|
    WindowPolylines, WindowPolySegment, 
 | 
						|
    WindowPolyRectangle, WindowPolyArc, 
 | 
						|
    WindowFillPolygon, WindowPolyFillRect, 
 | 
						|
    WindowPolyFillArc, WindowPolyText8, 
 | 
						|
    WindowPolyText16, WindowImageText8, 
 | 
						|
    WindowImageText16, WindowImageGlyphBlt, 
 | 
						|
    WindowPolyGlyphBlt, WindowPushPixels,
 | 
						|
    {NULL}		/* devPrivate */
 | 
						|
};
 | 
						|
 | 
						|
/** privates **/
 | 
						|
 | 
						|
typedef struct {
 | 
						|
   CloseScreenProcPtr		CloseScreen;
 | 
						|
   CreateGCProcPtr		CreateGC;
 | 
						|
   CreatePixmapProcPtr		CreatePixmap;
 | 
						|
   DestroyPixmapProcPtr		DestroyPixmap;
 | 
						|
   ChangeWindowAttributesProcPtr ChangeWindowAttributes;
 | 
						|
   PaintWindowBackgroundProcPtr	PaintWindowBackground;
 | 
						|
   PaintWindowBorderProcPtr	PaintWindowBorder;
 | 
						|
   int				LockPrivate;
 | 
						|
} OverlayScreenRec, *OverlayScreenPtr;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
   GCFuncs		*wrapFuncs;
 | 
						|
   GCOps		*wrapOps;
 | 
						|
   GCOps		*overlayOps;
 | 
						|
   unsigned long 	fg;
 | 
						|
   unsigned long 	bg;
 | 
						|
   unsigned long 	pm;
 | 
						|
   PixmapPtr		tile;
 | 
						|
} OverlayGCRec, *OverlayGCPtr;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
   PixmapPtr		pix32;
 | 
						|
   CARD32		dirty;
 | 
						|
} OverlayPixmapRec, *OverlayPixmapPtr;
 | 
						|
 | 
						|
 | 
						|
static int OverlayScreenIndex = -1;
 | 
						|
static int OverlayGCIndex = -1;
 | 
						|
static int OverlayPixmapIndex = -1;
 | 
						|
static unsigned long OverlayGeneration = 0;
 | 
						|
 | 
						|
/** Macros **/
 | 
						|
 | 
						|
#define TILE_EXISTS(pGC) (!(pGC)->tileIsPixel && (pGC)->tile.pixmap)
 | 
						|
 | 
						|
#define OVERLAY_GET_PIXMAP_PRIVATE(pPix) \
 | 
						|
    (OverlayPixmapPtr)((pPix)->devPrivates[OverlayPixmapIndex].ptr)
 | 
						|
 | 
						|
#define OVERLAY_GET_SCREEN_PRIVATE(pScreen) \
 | 
						|
    (OverlayScreenPtr)((pScreen)->devPrivates[OverlayScreenIndex].ptr)
 | 
						|
 | 
						|
#define OVERLAY_GET_GC_PRIVATE(pGC) \
 | 
						|
    (OverlayGCPtr)((pGC)->devPrivates[OverlayGCIndex].ptr)
 | 
						|
 | 
						|
#define OVERLAY_GC_FUNC_PROLOGUE(pGC)\
 | 
						|
    OverlayGCPtr pGCPriv = OVERLAY_GET_GC_PRIVATE(pGC);\
 | 
						|
    (pGC)->funcs = pGCPriv->wrapFuncs;\
 | 
						|
    if(pGCPriv->overlayOps) \
 | 
						|
	(pGC)->ops = pGCPriv->wrapOps
 | 
						|
 | 
						|
#define OVERLAY_GC_FUNC_EPILOGUE(pGC)\
 | 
						|
    pGCPriv->wrapFuncs = (pGC)->funcs;\
 | 
						|
    (pGC)->funcs = &OverlayGCFuncs;\
 | 
						|
    if(pGCPriv->overlayOps) { \
 | 
						|
	pGCPriv->wrapOps = (pGC)->ops;\
 | 
						|
	(pGC)->ops = pGCPriv->overlayOps;\
 | 
						|
    }
 | 
						|
 | 
						|
#define WINDOW_GC_OP_PROLOGUE(pGC)\
 | 
						|
    OverlayScreenPtr pScreenPriv = OVERLAY_GET_SCREEN_PRIVATE((pGC)->pScreen);\
 | 
						|
    OverlayGCPtr pGCPriv = OVERLAY_GET_GC_PRIVATE(pGC);\
 | 
						|
    unsigned long oldfg = (pGC)->fgPixel;\
 | 
						|
    unsigned long oldbg = (pGC)->bgPixel;\
 | 
						|
    unsigned long oldpm = (pGC)->planemask;\
 | 
						|
    PixmapPtr oldtile = (pGC)->tile.pixmap;\
 | 
						|
    (pGC)->fgPixel = pGCPriv->fg;\
 | 
						|
    (pGC)->bgPixel = pGCPriv->bg;\
 | 
						|
    (pGC)->planemask = pGCPriv->pm;\
 | 
						|
    if(pGCPriv->tile) (pGC)->tile.pixmap = pGCPriv->tile;\
 | 
						|
    (pGC)->funcs = pGCPriv->wrapFuncs;\
 | 
						|
    (pGC)->ops = pGCPriv->wrapOps;\
 | 
						|
    pScreenPriv->LockPrivate++
 | 
						|
    
 | 
						|
 | 
						|
#define WINDOW_GC_OP_EPILOGUE(pGC)\
 | 
						|
    pGCPriv->wrapOps = (pGC)->ops;\
 | 
						|
    pGCPriv->wrapFuncs = (pGC)->funcs;\
 | 
						|
    (pGC)->fgPixel = oldfg;\
 | 
						|
    (pGC)->bgPixel = oldbg;\
 | 
						|
    (pGC)->planemask = oldpm;\
 | 
						|
    (pGC)->tile.pixmap = oldtile;\
 | 
						|
    (pGC)->funcs = &OverlayGCFuncs;\
 | 
						|
    (pGC)->ops   = &WindowGCOps;\
 | 
						|
    pScreenPriv->LockPrivate--
 | 
						|
 | 
						|
 | 
						|
#define PIXMAP_GC_OP_PROLOGUE(pGC)\
 | 
						|
    OverlayGCPtr pGCPriv = OVERLAY_GET_GC_PRIVATE(pGC);\
 | 
						|
    OverlayPixmapPtr pPixPriv = OVERLAY_GET_PIXMAP_PRIVATE((PixmapPtr)pDraw);\
 | 
						|
    pGC->funcs = pGCPriv->wrapFuncs;\
 | 
						|
    pGC->ops = pGCPriv->wrapOps
 | 
						|
    
 | 
						|
#define PIXMAP_GC_OP_EPILOGUE(pGC)\
 | 
						|
    pGCPriv->wrapOps = pGC->ops;\
 | 
						|
    pGC->funcs = &OverlayGCFuncs;\
 | 
						|
    pGC->ops = &PixmapGCOps;\
 | 
						|
    pPixPriv->dirty |= IS_DIRTY
 | 
						|
    
 | 
						|
 | 
						|
Bool
 | 
						|
xf86Overlay8Plus32Init (ScreenPtr pScreen)
 | 
						|
{
 | 
						|
    OverlayScreenPtr pScreenPriv;
 | 
						|
 | 
						|
    if(OverlayGeneration != serverGeneration) {
 | 
						|
	if(((OverlayScreenIndex = AllocateScreenPrivateIndex()) < 0) ||
 | 
						|
	   ((OverlayGCIndex = AllocateGCPrivateIndex()) < 0) ||
 | 
						|
	   ((OverlayPixmapIndex = AllocatePixmapPrivateIndex()) < 0))
 | 
						|
		return FALSE;
 | 
						|
 | 
						|
	OverlayGeneration = serverGeneration;
 | 
						|
    }
 | 
						|
 | 
						|
    if (!AllocateGCPrivate(pScreen, OverlayGCIndex, sizeof(OverlayGCRec)))
 | 
						|
	return FALSE;
 | 
						|
 | 
						|
    if (!AllocatePixmapPrivate(pScreen, OverlayPixmapIndex, 
 | 
						|
						sizeof(OverlayPixmapRec)))
 | 
						|
	return FALSE;
 | 
						|
 | 
						|
    if (!(pScreenPriv = xalloc(sizeof(OverlayScreenRec))))
 | 
						|
	return FALSE;
 | 
						|
 | 
						|
    pScreen->devPrivates[OverlayScreenIndex].ptr = (pointer)pScreenPriv;
 | 
						|
 | 
						|
    pScreenPriv->CreateGC = pScreen->CreateGC;
 | 
						|
    pScreenPriv->CloseScreen = pScreen->CloseScreen;
 | 
						|
    pScreenPriv->CreatePixmap = pScreen->CreatePixmap;
 | 
						|
    pScreenPriv->DestroyPixmap = pScreen->DestroyPixmap;
 | 
						|
    pScreenPriv->ChangeWindowAttributes = pScreen->ChangeWindowAttributes;
 | 
						|
    pScreenPriv->PaintWindowBackground = pScreen->PaintWindowBackground;
 | 
						|
    pScreenPriv->PaintWindowBorder = pScreen->PaintWindowBorder;
 | 
						|
 | 
						|
    pScreen->CreateGC = OverlayCreateGC;
 | 
						|
    pScreen->CloseScreen = OverlayCloseScreen;
 | 
						|
    pScreen->CreatePixmap = OverlayCreatePixmap; 
 | 
						|
    pScreen->DestroyPixmap = OverlayDestroyPixmap; 
 | 
						|
    pScreen->ChangeWindowAttributes = OverlayChangeWindowAttributes; 
 | 
						|
    pScreen->PaintWindowBackground = OverlayPaintWindow; 
 | 
						|
    pScreen->PaintWindowBorder = OverlayPaintWindow; 
 | 
						|
 | 
						|
    pScreenPriv->LockPrivate = 0; 
 | 
						|
 | 
						|
    /* allocate the key in the default map */
 | 
						|
    if(pScreen->defColormap) {
 | 
						|
	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
 | 
						|
	ColormapPtr pmap;
 | 
						|
	xColorItem color;
 | 
						|
 | 
						|
	pmap = (ColormapPtr)LookupIDByType(pScreen->defColormap, RT_COLORMAP);
 | 
						|
 | 
						|
	pmap->red[pScrn->colorKey].refcnt = AllocPrivate;
 | 
						|
	pmap->red[pScrn->colorKey].fShared = FALSE;
 | 
						|
	pmap->freeRed--;
 | 
						|
	
 | 
						|
	color.red = color.blue = color.green = 0;
 | 
						|
	color.pixel = pScrn->colorKey;
 | 
						|
	color.flags = DoRed | DoGreen | DoBlue;
 | 
						|
 | 
						|
	StoreColors(pmap, 1, &color);
 | 
						|
    }
 | 
						|
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*********************** Screen Funcs ***********************/
 | 
						|
 | 
						|
Bool
 | 
						|
OverlayCreateGC(GCPtr pGC)
 | 
						|
{
 | 
						|
    ScreenPtr    pScreen = pGC->pScreen;
 | 
						|
    OverlayGCPtr pGCPriv = OVERLAY_GET_GC_PRIVATE(pGC);
 | 
						|
    OverlayScreenPtr pScreenPriv = OVERLAY_GET_SCREEN_PRIVATE(pScreen);
 | 
						|
    Bool ret;
 | 
						|
 | 
						|
    pScreen->CreateGC = pScreenPriv->CreateGC;
 | 
						|
 | 
						|
    if((ret = (*pScreen->CreateGC)(pGC)) && (pGC->depth != 1)) {
 | 
						|
	pGCPriv->wrapFuncs = pGC->funcs;
 | 
						|
	pGC->funcs = &OverlayGCFuncs;
 | 
						|
	pGCPriv->wrapOps = NULL;
 | 
						|
	pGCPriv->overlayOps = NULL;
 | 
						|
	pGCPriv->tile = NULL;
 | 
						|
    }
 | 
						|
 | 
						|
    pScreen->CreateGC = OverlayCreateGC;
 | 
						|
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
static PixmapPtr 
 | 
						|
OverlayCreatePixmap(ScreenPtr pScreen, int w, int h, int depth)
 | 
						|
{
 | 
						|
    OverlayScreenPtr pScreenPriv = OVERLAY_GET_SCREEN_PRIVATE(pScreen);
 | 
						|
    PixmapPtr pPix;
 | 
						|
    
 | 
						|
    pScreen->CreatePixmap = pScreenPriv->CreatePixmap;
 | 
						|
    pPix = (*pScreen->CreatePixmap) (pScreen, w, h, depth);
 | 
						|
    pScreen->CreatePixmap = OverlayCreatePixmap;
 | 
						|
 | 
						|
    /* We initialize all the privates */
 | 
						|
    if(pPix) {
 | 
						|
	OverlayPixmapPtr pPriv = OVERLAY_GET_PIXMAP_PRIVATE(pPix);
 | 
						|
        pPriv->pix32 = NULL;
 | 
						|
        pPriv->dirty = IS_DIRTY;
 | 
						|
	if(!w || !h)
 | 
						|
	   pPriv->dirty |= IS_SHARED;
 | 
						|
    }
 | 
						|
 | 
						|
    return pPix;
 | 
						|
}
 | 
						|
 | 
						|
static Bool
 | 
						|
OverlayDestroyPixmap(PixmapPtr pPix)
 | 
						|
{
 | 
						|
    ScreenPtr pScreen = pPix->drawable.pScreen;
 | 
						|
    OverlayScreenPtr pScreenPriv = OVERLAY_GET_SCREEN_PRIVATE(pScreen);
 | 
						|
    Bool result;
 | 
						|
 | 
						|
    pScreen->DestroyPixmap = pScreenPriv->DestroyPixmap;
 | 
						|
 | 
						|
    if((pPix->refcnt == 1) && (pPix->drawable.bitsPerPixel == 8)) {
 | 
						|
	OverlayPixmapPtr pPriv = OVERLAY_GET_PIXMAP_PRIVATE(pPix);
 | 
						|
	if(pPriv->pix32) {
 | 
						|
	   if(pPriv->pix32->refcnt != 1)
 | 
						|
	     ErrorF("Warning! private pix refcnt = %i\n", pPriv->pix32->refcnt);
 | 
						|
	   (*pScreen->DestroyPixmap)(pPriv->pix32);
 | 
						|
	}
 | 
						|
	pPriv->pix32 = NULL;
 | 
						|
    }
 | 
						|
 | 
						|
    result = (*pScreen->DestroyPixmap) (pPix);
 | 
						|
    pScreen->DestroyPixmap = OverlayDestroyPixmap;
 | 
						|
 | 
						|
    return result;
 | 
						|
}
 | 
						|
 | 
						|
static Bool
 | 
						|
OverlayCloseScreen (int i, ScreenPtr pScreen)
 | 
						|
{
 | 
						|
    OverlayScreenPtr pScreenPriv = OVERLAY_GET_SCREEN_PRIVATE(pScreen);
 | 
						|
 | 
						|
    pScreen->CreateGC = pScreenPriv->CreateGC;
 | 
						|
    pScreen->CloseScreen = pScreenPriv->CloseScreen;
 | 
						|
    pScreen->CreatePixmap = pScreenPriv->CreatePixmap;
 | 
						|
    pScreen->DestroyPixmap = pScreenPriv->DestroyPixmap;
 | 
						|
    pScreen->ChangeWindowAttributes = pScreenPriv->ChangeWindowAttributes;
 | 
						|
    pScreen->PaintWindowBackground = pScreenPriv->PaintWindowBackground;
 | 
						|
    pScreen->PaintWindowBorder = pScreenPriv->PaintWindowBorder;
 | 
						|
 | 
						|
    xfree ((pointer) pScreenPriv);
 | 
						|
 | 
						|
    return (*pScreen->CloseScreen) (i, pScreen);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
static Bool
 | 
						|
OverlayChangeWindowAttributes (WindowPtr pWin, unsigned long mask)
 | 
						|
{
 | 
						|
    ScreenPtr pScreen = pWin->drawable.pScreen;
 | 
						|
    OverlayScreenPtr pScreenPriv = OVERLAY_GET_SCREEN_PRIVATE(pScreen);
 | 
						|
    Bool result;    
 | 
						|
 | 
						|
    if(pWin->drawable.depth == 8) {
 | 
						|
	if((mask & CWBackPixmap) && 
 | 
						|
	   (pWin->backgroundState == BackgroundPixmap)) 	
 | 
						|
		OverlayRefreshPixmap(pWin->background.pixmap);
 | 
						|
 | 
						|
	if((mask & CWBorderPixmap) && !pWin->borderIsPixel)
 | 
						|
		OverlayRefreshPixmap(pWin->border.pixmap);
 | 
						|
    }
 | 
						|
 | 
						|
    pScreen->ChangeWindowAttributes = pScreenPriv->ChangeWindowAttributes;
 | 
						|
    result = (*pScreen->ChangeWindowAttributes) (pWin, mask);
 | 
						|
    pScreen->ChangeWindowAttributes = OverlayChangeWindowAttributes;
 | 
						|
 | 
						|
    return result;
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
OverlayPaintWindow(
 | 
						|
  WindowPtr pWin,
 | 
						|
  RegionPtr pReg,
 | 
						|
  int what
 | 
						|
){
 | 
						|
    ScreenPtr pScreen = pWin->drawable.pScreen;
 | 
						|
    OverlayScreenPtr pScreenPriv = OVERLAY_GET_SCREEN_PRIVATE(pScreen);
 | 
						|
    OverlayPixmapPtr pixPriv;
 | 
						|
    PixmapPtr oldPix = NULL;
 | 
						|
 | 
						|
    if(what == PW_BACKGROUND) {
 | 
						|
	if(pWin->drawable.depth == 8) {
 | 
						|
	   if(pWin->backgroundState == ParentRelative) {
 | 
						|
		do {
 | 
						|
		   pWin = pWin->parent;
 | 
						|
		} while (pWin->backgroundState == ParentRelative);
 | 
						|
	   }
 | 
						|
 | 
						|
	   if(pWin->backgroundState == BackgroundPixmap) {
 | 
						|
		oldPix = pWin->background.pixmap;
 | 
						|
		pixPriv = OVERLAY_GET_PIXMAP_PRIVATE(oldPix);
 | 
						|
		/* have to do this here because alot of applications
 | 
						|
		   incorrectly assume changes to a pixmap that is
 | 
						|
		   a window background go into effect immediatedly */
 | 
						|
		if(pixPriv->dirty & IS_DIRTY)
 | 
						|
		    OverlayRefreshPixmap(pWin->background.pixmap);
 | 
						|
		pWin->background.pixmap = pixPriv->pix32;
 | 
						|
	   }
 | 
						|
	}
 | 
						|
 | 
						|
	pScreen->PaintWindowBackground = pScreenPriv->PaintWindowBackground;
 | 
						|
	(*pScreen->PaintWindowBackground) (pWin, pReg, what);
 | 
						|
	pScreen->PaintWindowBackground = OverlayPaintWindow;
 | 
						|
 | 
						|
	if(oldPix)
 | 
						|
	   pWin->background.pixmap = oldPix;
 | 
						|
    } else {
 | 
						|
	if((pWin->drawable.depth == 8) && !pWin->borderIsPixel) {
 | 
						|
	   oldPix = pWin->border.pixmap;
 | 
						|
	   pixPriv = OVERLAY_GET_PIXMAP_PRIVATE(oldPix);
 | 
						|
	   if(pixPriv->dirty & IS_DIRTY)
 | 
						|
		OverlayRefreshPixmap(pWin->border.pixmap);
 | 
						|
	   pWin->border.pixmap = pixPriv->pix32;
 | 
						|
        }
 | 
						|
 | 
						|
	pScreen->PaintWindowBorder = pScreenPriv->PaintWindowBorder;
 | 
						|
	(*pScreen->PaintWindowBorder) (pWin, pReg, what);
 | 
						|
	pScreen->PaintWindowBorder = OverlayPaintWindow;
 | 
						|
 | 
						|
	if(oldPix)
 | 
						|
	   pWin->border.pixmap = oldPix;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*********************** GC Funcs *****************************/
 | 
						|
 | 
						|
 | 
						|
static PixmapPtr
 | 
						|
OverlayRefreshPixmap(PixmapPtr pix8) 
 | 
						|
{
 | 
						|
    OverlayPixmapPtr pixPriv = OVERLAY_GET_PIXMAP_PRIVATE(pix8);
 | 
						|
    ScreenPtr pScreen = pix8->drawable.pScreen;
 | 
						|
 | 
						|
    if(!pixPriv->pix32) {
 | 
						|
	PixmapPtr newPix;
 | 
						|
 | 
						|
	newPix = (*pScreen->CreatePixmap)(pScreen, pix8->drawable.width,
 | 
						|
		pix8->drawable.height, 24);
 | 
						|
	newPix->drawable.depth = 8;  /* Bad Mark! Bad Mark! */
 | 
						|
        pixPriv->pix32 = newPix;
 | 
						|
    }
 | 
						|
 | 
						|
    if(pixPriv->dirty) {
 | 
						|
	OverlayScreenPtr pScreenPriv = OVERLAY_GET_SCREEN_PRIVATE(pScreen);
 | 
						|
	GCPtr pGC;
 | 
						|
 | 
						|
	pGC = GetScratchGC(8, pScreen);
 | 
						|
 | 
						|
	pScreenPriv->LockPrivate++;  /* don't modify this one */
 | 
						|
	ValidateGC((DrawablePtr)pixPriv->pix32, pGC);
 | 
						|
 | 
						|
	(*pGC->ops->CopyArea)((DrawablePtr)pix8, (DrawablePtr)pixPriv->pix32,
 | 
						|
		pGC, 0, 0, pix8->drawable.width, pix8->drawable.height, 0, 0);  
 | 
						|
	pScreenPriv->LockPrivate--;
 | 
						|
	FreeScratchGC(pGC);
 | 
						|
 | 
						|
	pixPriv->dirty &= ~IS_DIRTY;
 | 
						|
	pixPriv->pix32->drawable.serialNumber = NEXT_SERIAL_NUMBER;    
 | 
						|
    }
 | 
						|
 | 
						|
    return pixPriv->pix32;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
static void
 | 
						|
OverlayValidateGC(
 | 
						|
   GCPtr         pGC,
 | 
						|
   unsigned long changes,
 | 
						|
   DrawablePtr   pDraw 
 | 
						|
){
 | 
						|
    OverlayScreenPtr pScreenPriv = OVERLAY_GET_SCREEN_PRIVATE(pGC->pScreen);
 | 
						|
    OVERLAY_GC_FUNC_PROLOGUE (pGC);
 | 
						|
 | 
						|
    if(pScreenPriv->LockPrivate < 0) {
 | 
						|
	ErrorF("Something is wrong in OverlayValidateGC!\n");
 | 
						|
	pScreenPriv->LockPrivate = 0;
 | 
						|
    }
 | 
						|
 | 
						|
    if(pGC->depth == 24) {
 | 
						|
	unsigned long oldpm = pGC->planemask;
 | 
						|
	pGCPriv->overlayOps = NULL;
 | 
						|
 | 
						|
	if(pDraw->type == DRAWABLE_WINDOW)
 | 
						|
	   pGC->planemask &= 0x00ffffff;
 | 
						|
	else
 | 
						|
	   pGC->planemask |= 0xff000000; 
 | 
						|
 | 
						|
        if(oldpm != pGC->planemask) changes |= GCPlaneMask;
 | 
						|
 | 
						|
	(*pGC->funcs->ValidateGC)(pGC, changes, pDraw);
 | 
						|
 | 
						|
    } else { /* depth == 8 */
 | 
						|
	unsigned long newChanges = 0;
 | 
						|
 | 
						|
	if(pDraw->bitsPerPixel == 32) {
 | 
						|
	
 | 
						|
	    if(pGC->fillStyle == FillTiled)
 | 
						|
		pGCPriv->tile = OverlayRefreshPixmap(pGC->tile.pixmap);
 | 
						|
	    else pGCPriv->tile = NULL;
 | 
						|
 | 
						|
	    if(pGCPriv->overlayOps != &WindowGCOps) {
 | 
						|
		newChanges = GCForeground | GCBackground | GCPlaneMask;
 | 
						|
		if(pGCPriv->tile) 
 | 
						|
		    newChanges |= GCTile;
 | 
						|
	    }
 | 
						|
	    pGCPriv->overlayOps = &WindowGCOps;
 | 
						|
 | 
						|
	    if(!pScreenPriv->LockPrivate) {
 | 
						|
		unsigned long oldfg = pGC->fgPixel;
 | 
						|
		unsigned long oldbg = pGC->bgPixel;
 | 
						|
		unsigned long oldpm = pGC->planemask;
 | 
						|
		PixmapPtr oldtile = pGC->tile.pixmap;
 | 
						|
 | 
						|
		pGC->fgPixel = pGCPriv->fg = oldfg << 24;
 | 
						|
		pGC->bgPixel = pGCPriv->bg = oldbg << 24;
 | 
						|
		pGC->planemask = pGCPriv->pm = oldpm << 24;
 | 
						|
		if(pGCPriv->tile)
 | 
						|
		    pGC->tile.pixmap = pGCPriv->tile;
 | 
						|
 | 
						|
		(*pGC->funcs->ValidateGC)(pGC, changes | newChanges, pDraw);
 | 
						|
 | 
						|
		pGC->fgPixel = oldfg;
 | 
						|
		pGC->bgPixel = oldbg;
 | 
						|
		pGC->planemask = oldpm;
 | 
						|
		pGC->tile.pixmap = oldtile;
 | 
						|
	    } else {
 | 
						|
		pGCPriv->fg = pGC->fgPixel;
 | 
						|
		pGCPriv->bg = pGC->bgPixel;
 | 
						|
		pGCPriv->pm = pGC->planemask;
 | 
						|
 | 
						|
		(*pGC->funcs->ValidateGC)(pGC, changes | newChanges, pDraw);
 | 
						|
	    }
 | 
						|
 | 
						|
	} else {  /* bitsPerPixel == 8 */
 | 
						|
	    if(pGCPriv->overlayOps == &WindowGCOps) {
 | 
						|
		newChanges = GCForeground | GCBackground | GCPlaneMask;
 | 
						|
		if(pGCPriv->tile) 
 | 
						|
		    newChanges |= GCTile;
 | 
						|
	    }
 | 
						|
	    pGCPriv->overlayOps = &PixmapGCOps;
 | 
						|
 | 
						|
	    (*pGC->funcs->ValidateGC)(pGC, changes | newChanges, pDraw);
 | 
						|
	}
 | 
						|
    }
 | 
						|
 | 
						|
    OVERLAY_GC_FUNC_EPILOGUE (pGC);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
static void
 | 
						|
OverlayDestroyGC(GCPtr pGC)
 | 
						|
{
 | 
						|
    OVERLAY_GC_FUNC_PROLOGUE (pGC);
 | 
						|
    (*pGC->funcs->DestroyGC)(pGC);
 | 
						|
    OVERLAY_GC_FUNC_EPILOGUE (pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
OverlayChangeGC (
 | 
						|
    GCPtr	    pGC,
 | 
						|
    unsigned long   mask
 | 
						|
){
 | 
						|
    OVERLAY_GC_FUNC_PROLOGUE (pGC);
 | 
						|
    (*pGC->funcs->ChangeGC) (pGC, mask);
 | 
						|
    OVERLAY_GC_FUNC_EPILOGUE (pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
OverlayCopyGC (
 | 
						|
    GCPtr	    pGCSrc, 
 | 
						|
    unsigned long   mask,
 | 
						|
    GCPtr	    pGCDst
 | 
						|
){
 | 
						|
    OVERLAY_GC_FUNC_PROLOGUE (pGCDst);
 | 
						|
    (*pGCDst->funcs->CopyGC) (pGCSrc, mask, pGCDst);
 | 
						|
    OVERLAY_GC_FUNC_EPILOGUE (pGCDst);
 | 
						|
}
 | 
						|
static void
 | 
						|
OverlayChangeClip (
 | 
						|
    GCPtr   pGC,
 | 
						|
    int		type,
 | 
						|
    pointer	pvalue,
 | 
						|
    int		nrects
 | 
						|
){
 | 
						|
    OVERLAY_GC_FUNC_PROLOGUE (pGC);
 | 
						|
    (*pGC->funcs->ChangeClip) (pGC, type, pvalue, nrects);
 | 
						|
    OVERLAY_GC_FUNC_EPILOGUE (pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
OverlayCopyClip(GCPtr pgcDst, GCPtr pgcSrc)
 | 
						|
{
 | 
						|
    OVERLAY_GC_FUNC_PROLOGUE (pgcDst);
 | 
						|
    (* pgcDst->funcs->CopyClip)(pgcDst, pgcSrc);
 | 
						|
    OVERLAY_GC_FUNC_EPILOGUE (pgcDst);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
OverlayDestroyClip(GCPtr pGC)
 | 
						|
{
 | 
						|
    OVERLAY_GC_FUNC_PROLOGUE (pGC);
 | 
						|
    (* pGC->funcs->DestroyClip)(pGC);
 | 
						|
    OVERLAY_GC_FUNC_EPILOGUE (pGC);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/******************* Window GC ops ***********************/
 | 
						|
 | 
						|
static void
 | 
						|
WindowFillSpans(
 | 
						|
    DrawablePtr pDraw,
 | 
						|
    GC		*pGC,
 | 
						|
    int		nInit,	
 | 
						|
    DDXPointPtr pptInit,	
 | 
						|
    int *pwidthInit,		
 | 
						|
    int fSorted 
 | 
						|
){
 | 
						|
    WINDOW_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->FillSpans)(pDraw, pGC, nInit, pptInit, pwidthInit, fSorted);
 | 
						|
    WINDOW_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
WindowSetSpans(
 | 
						|
    DrawablePtr		pDraw,
 | 
						|
    GCPtr		pGC,
 | 
						|
    char		*pcharsrc,
 | 
						|
    register DDXPointPtr ppt,
 | 
						|
    int			*pwidth,
 | 
						|
    int			nspans,
 | 
						|
    int			fSorted 
 | 
						|
){
 | 
						|
    WINDOW_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->SetSpans)(pDraw, pGC, pcharsrc, ppt, pwidth, nspans, fSorted);
 | 
						|
    WINDOW_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
WindowPutImage(
 | 
						|
    DrawablePtr pDraw,
 | 
						|
    GCPtr	pGC,
 | 
						|
    int		depth, 
 | 
						|
    int x, int y, int w, int h,
 | 
						|
    int		leftPad,
 | 
						|
    int		format,
 | 
						|
    char 	*pImage 
 | 
						|
){
 | 
						|
    WINDOW_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->PutImage)(pDraw, pGC, depth, x, y, w, h, 
 | 
						|
						leftPad, format, pImage);
 | 
						|
    WINDOW_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static RegionPtr
 | 
						|
WindowCopyArea(
 | 
						|
    DrawablePtr pSrc,
 | 
						|
    DrawablePtr pDst,
 | 
						|
    GC *pGC,
 | 
						|
    int srcx, int srcy,
 | 
						|
    int width, int height,
 | 
						|
    int dstx, int dsty 
 | 
						|
){
 | 
						|
    RegionPtr ret;
 | 
						|
 | 
						|
    WINDOW_GC_OP_PROLOGUE(pGC);
 | 
						|
    ret = (*pGC->ops->CopyArea)(pSrc, pDst,
 | 
						|
            pGC, srcx, srcy, width, height, dstx, dsty);
 | 
						|
    WINDOW_GC_OP_EPILOGUE(pGC);
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
static RegionPtr
 | 
						|
WindowCopyPlane(
 | 
						|
    DrawablePtr	pSrc,
 | 
						|
    DrawablePtr	pDst,
 | 
						|
    GCPtr pGC,
 | 
						|
    int	srcx, int srcy,
 | 
						|
    int	width, int height,
 | 
						|
    int	dstx, int dsty,
 | 
						|
    unsigned long bitPlane 
 | 
						|
){
 | 
						|
    RegionPtr ret;
 | 
						|
 | 
						|
    WINDOW_GC_OP_PROLOGUE(pGC);
 | 
						|
    ret = (*pGC->ops->CopyPlane)(pSrc, pDst,
 | 
						|
	       pGC, srcx, srcy, width, height, dstx, dsty, bitPlane);
 | 
						|
    WINDOW_GC_OP_EPILOGUE(pGC);
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
WindowPolyPoint(
 | 
						|
    DrawablePtr pDraw,
 | 
						|
    GCPtr pGC,
 | 
						|
    int mode,
 | 
						|
    int npt,
 | 
						|
    xPoint *pptInit
 | 
						|
){
 | 
						|
    WINDOW_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->PolyPoint)(pDraw, pGC, mode, npt, pptInit);
 | 
						|
    WINDOW_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
WindowPolylines(
 | 
						|
    DrawablePtr pDraw,
 | 
						|
    GCPtr	pGC,
 | 
						|
    int		mode,		
 | 
						|
    int		npt,		
 | 
						|
    DDXPointPtr pptInit 
 | 
						|
){
 | 
						|
    WINDOW_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->Polylines)(pDraw, pGC, mode, npt, pptInit);
 | 
						|
    WINDOW_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void 
 | 
						|
WindowPolySegment(
 | 
						|
    DrawablePtr	pDraw,
 | 
						|
    GCPtr	pGC,
 | 
						|
    int		nseg,
 | 
						|
    xSegment	*pSeg 
 | 
						|
){
 | 
						|
    WINDOW_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->PolySegment)(pDraw, pGC, nseg, pSeg);
 | 
						|
    WINDOW_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
WindowPolyRectangle(
 | 
						|
    DrawablePtr  pDraw,
 | 
						|
    GCPtr        pGC,
 | 
						|
    int	         nRectsInit,
 | 
						|
    xRectangle  *pRectsInit 
 | 
						|
){
 | 
						|
    WINDOW_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->PolyRectangle)(pDraw, pGC, nRectsInit, pRectsInit);
 | 
						|
    WINDOW_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
WindowPolyArc(
 | 
						|
    DrawablePtr	pDraw,
 | 
						|
    GCPtr	pGC,
 | 
						|
    int		narcs,
 | 
						|
    xArc	*parcs 
 | 
						|
){
 | 
						|
    WINDOW_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->PolyArc)(pDraw, pGC, narcs, parcs);
 | 
						|
    WINDOW_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
WindowFillPolygon(
 | 
						|
    DrawablePtr	pDraw,
 | 
						|
    GCPtr	pGC,
 | 
						|
    int		shape,
 | 
						|
    int		mode,
 | 
						|
    int		count,
 | 
						|
    DDXPointPtr	ptsIn 
 | 
						|
){
 | 
						|
    WINDOW_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->FillPolygon)(pDraw, pGC, shape, mode, count, ptsIn);
 | 
						|
    WINDOW_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void 
 | 
						|
WindowPolyFillRect(
 | 
						|
    DrawablePtr	pDraw,
 | 
						|
    GCPtr	pGC,
 | 
						|
    int		nrectFill, 
 | 
						|
    xRectangle	*prectInit 
 | 
						|
){
 | 
						|
    WINDOW_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->PolyFillRect)(pDraw, pGC, nrectFill, prectInit);
 | 
						|
    WINDOW_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
WindowPolyFillArc(
 | 
						|
    DrawablePtr	pDraw,
 | 
						|
    GCPtr	pGC,
 | 
						|
    int		narcs,
 | 
						|
    xArc	*parcs 
 | 
						|
){
 | 
						|
    WINDOW_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->PolyFillArc)(pDraw, pGC, narcs, parcs);
 | 
						|
    WINDOW_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static int
 | 
						|
WindowPolyText8(
 | 
						|
    DrawablePtr pDraw,
 | 
						|
    GCPtr	pGC,
 | 
						|
    int		x, 
 | 
						|
    int 	y,
 | 
						|
    int 	count,
 | 
						|
    char	*chars 
 | 
						|
){
 | 
						|
    int ret;
 | 
						|
 | 
						|
    WINDOW_GC_OP_PROLOGUE(pGC);
 | 
						|
    ret = (*pGC->ops->PolyText8)(pDraw, pGC, x, y, count, chars);
 | 
						|
    WINDOW_GC_OP_EPILOGUE(pGC);
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
static int
 | 
						|
WindowPolyText16(
 | 
						|
    DrawablePtr pDraw,
 | 
						|
    GCPtr	pGC,
 | 
						|
    int		x,
 | 
						|
    int		y,
 | 
						|
    int 	count,
 | 
						|
    unsigned short *chars 
 | 
						|
){
 | 
						|
    int ret;
 | 
						|
 | 
						|
    WINDOW_GC_OP_PROLOGUE(pGC);
 | 
						|
    ret = (*pGC->ops->PolyText16)(pDraw, pGC, x, y, count, chars);
 | 
						|
    WINDOW_GC_OP_EPILOGUE(pGC);
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
WindowImageText8(
 | 
						|
    DrawablePtr pDraw,
 | 
						|
    GCPtr	pGC,
 | 
						|
    int		x, 
 | 
						|
    int		y,
 | 
						|
    int 	count,
 | 
						|
    char	*chars 
 | 
						|
){
 | 
						|
    WINDOW_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->ImageText8)(pDraw, pGC, x, y, count, chars);
 | 
						|
    WINDOW_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
WindowImageText16(
 | 
						|
    DrawablePtr pDraw,
 | 
						|
    GCPtr	pGC,
 | 
						|
    int		x,
 | 
						|
    int		y,
 | 
						|
    int 	count,
 | 
						|
    unsigned short *chars 
 | 
						|
){
 | 
						|
    WINDOW_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->ImageText16)(pDraw, pGC, x, y, count, chars);
 | 
						|
    WINDOW_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
WindowImageGlyphBlt(
 | 
						|
    DrawablePtr pDraw,
 | 
						|
    GCPtr pGC,
 | 
						|
    int xInit, int yInit,
 | 
						|
    unsigned int nglyph,
 | 
						|
    CharInfoPtr *ppci,
 | 
						|
    pointer pglyphBase 
 | 
						|
){
 | 
						|
    WINDOW_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->ImageGlyphBlt)(pDraw, pGC, xInit, yInit, nglyph, 
 | 
						|
					ppci, pglyphBase);
 | 
						|
    WINDOW_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
WindowPolyGlyphBlt(
 | 
						|
    DrawablePtr pDraw,
 | 
						|
    GCPtr pGC,
 | 
						|
    int xInit, int yInit,
 | 
						|
    unsigned int nglyph,
 | 
						|
    CharInfoPtr *ppci,
 | 
						|
    pointer pglyphBase 
 | 
						|
){
 | 
						|
    WINDOW_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->PolyGlyphBlt)(pDraw, pGC, xInit, yInit, nglyph, 
 | 
						|
						ppci, pglyphBase);
 | 
						|
    WINDOW_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
WindowPushPixels(
 | 
						|
    GCPtr	pGC,
 | 
						|
    PixmapPtr	pBitMap,
 | 
						|
    DrawablePtr pDraw,
 | 
						|
    int	dx, int dy, int xOrg, int yOrg 
 | 
						|
){
 | 
						|
    WINDOW_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->PushPixels)(pGC, pBitMap, pDraw, dx, dy, xOrg, yOrg);
 | 
						|
    WINDOW_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/******************* Pixmap GC ops ***********************/
 | 
						|
 | 
						|
static void
 | 
						|
PixmapFillSpans(
 | 
						|
    DrawablePtr pDraw,
 | 
						|
    GC		*pGC,
 | 
						|
    int		nInit,	
 | 
						|
    DDXPointPtr pptInit,	
 | 
						|
    int *pwidthInit,		
 | 
						|
    int fSorted 
 | 
						|
){
 | 
						|
    PIXMAP_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->FillSpans)(pDraw, pGC, nInit, pptInit, pwidthInit, fSorted);
 | 
						|
    PIXMAP_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
PixmapSetSpans(
 | 
						|
    DrawablePtr		pDraw,
 | 
						|
    GCPtr		pGC,
 | 
						|
    char		*pcharsrc,
 | 
						|
    register DDXPointPtr ppt,
 | 
						|
    int			*pwidth,
 | 
						|
    int			nspans,
 | 
						|
    int			fSorted 
 | 
						|
){
 | 
						|
    PIXMAP_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->SetSpans)(pDraw, pGC, pcharsrc, ppt, pwidth, nspans, fSorted);
 | 
						|
    PIXMAP_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
PixmapPutImage(
 | 
						|
    DrawablePtr pDraw,
 | 
						|
    GCPtr	pGC,
 | 
						|
    int		depth, 
 | 
						|
    int x, int y, int w, int h,
 | 
						|
    int		leftPad,
 | 
						|
    int		format,
 | 
						|
    char 	*pImage 
 | 
						|
){
 | 
						|
    PIXMAP_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->PutImage)(pDraw, pGC, depth, x, y, w, h, 
 | 
						|
						leftPad, format, pImage);
 | 
						|
    PIXMAP_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static RegionPtr
 | 
						|
PixmapCopyArea(
 | 
						|
    DrawablePtr pSrc,
 | 
						|
    DrawablePtr pDraw,
 | 
						|
    GC *pGC,
 | 
						|
    int srcx, int srcy,
 | 
						|
    int width, int height,
 | 
						|
    int dstx, int dsty 
 | 
						|
){
 | 
						|
    RegionPtr ret;
 | 
						|
 | 
						|
    PIXMAP_GC_OP_PROLOGUE(pGC);
 | 
						|
    ret = (*pGC->ops->CopyArea)(pSrc, pDraw,
 | 
						|
            pGC, srcx, srcy, width, height, dstx, dsty);
 | 
						|
    PIXMAP_GC_OP_EPILOGUE(pGC);
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
static RegionPtr
 | 
						|
PixmapCopyPlane(
 | 
						|
    DrawablePtr	pSrc,
 | 
						|
    DrawablePtr	pDraw,
 | 
						|
    GCPtr pGC,
 | 
						|
    int	srcx, int srcy,
 | 
						|
    int	width, int height,
 | 
						|
    int	dstx, int dsty,
 | 
						|
    unsigned long bitPlane 
 | 
						|
){
 | 
						|
    RegionPtr ret;
 | 
						|
 | 
						|
    PIXMAP_GC_OP_PROLOGUE(pGC);
 | 
						|
    ret = (*pGC->ops->CopyPlane)(pSrc, pDraw,
 | 
						|
	       pGC, srcx, srcy, width, height, dstx, dsty, bitPlane);
 | 
						|
    PIXMAP_GC_OP_EPILOGUE(pGC);
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
PixmapPolyPoint(
 | 
						|
    DrawablePtr pDraw,
 | 
						|
    GCPtr pGC,
 | 
						|
    int mode,
 | 
						|
    int npt,
 | 
						|
    xPoint *pptInit
 | 
						|
){
 | 
						|
    PIXMAP_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->PolyPoint)(pDraw, pGC, mode, npt, pptInit);
 | 
						|
    PIXMAP_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
PixmapPolylines(
 | 
						|
    DrawablePtr pDraw,
 | 
						|
    GCPtr	pGC,
 | 
						|
    int		mode,		
 | 
						|
    int		npt,		
 | 
						|
    DDXPointPtr pptInit 
 | 
						|
){
 | 
						|
    PIXMAP_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->Polylines)(pDraw, pGC, mode, npt, pptInit);
 | 
						|
    PIXMAP_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void 
 | 
						|
PixmapPolySegment(
 | 
						|
    DrawablePtr	pDraw,
 | 
						|
    GCPtr	pGC,
 | 
						|
    int		nseg,
 | 
						|
    xSegment	*pSeg 
 | 
						|
){
 | 
						|
    PIXMAP_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->PolySegment)(pDraw, pGC, nseg, pSeg);
 | 
						|
    PIXMAP_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
PixmapPolyRectangle(
 | 
						|
    DrawablePtr  pDraw,
 | 
						|
    GCPtr        pGC,
 | 
						|
    int	         nRectsInit,
 | 
						|
    xRectangle  *pRectsInit 
 | 
						|
){
 | 
						|
    PIXMAP_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->PolyRectangle)(pDraw, pGC, nRectsInit, pRectsInit);
 | 
						|
    PIXMAP_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
PixmapPolyArc(
 | 
						|
    DrawablePtr	pDraw,
 | 
						|
    GCPtr	pGC,
 | 
						|
    int		narcs,
 | 
						|
    xArc	*parcs 
 | 
						|
){
 | 
						|
    PIXMAP_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->PolyArc)(pDraw, pGC, narcs, parcs);
 | 
						|
    PIXMAP_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
PixmapFillPolygon(
 | 
						|
    DrawablePtr	pDraw,
 | 
						|
    GCPtr	pGC,
 | 
						|
    int		shape,
 | 
						|
    int		mode,
 | 
						|
    int		count,
 | 
						|
    DDXPointPtr	ptsIn 
 | 
						|
){
 | 
						|
    PIXMAP_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->FillPolygon)(pDraw, pGC, shape, mode, count, ptsIn);
 | 
						|
    PIXMAP_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void 
 | 
						|
PixmapPolyFillRect(
 | 
						|
    DrawablePtr	pDraw,
 | 
						|
    GCPtr	pGC,
 | 
						|
    int		nrectFill, 
 | 
						|
    xRectangle	*prectInit 
 | 
						|
){
 | 
						|
    PIXMAP_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->PolyFillRect)(pDraw, pGC, nrectFill, prectInit);
 | 
						|
    PIXMAP_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
PixmapPolyFillArc(
 | 
						|
    DrawablePtr	pDraw,
 | 
						|
    GCPtr	pGC,
 | 
						|
    int		narcs,
 | 
						|
    xArc	*parcs 
 | 
						|
){
 | 
						|
    PIXMAP_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->PolyFillArc)(pDraw, pGC, narcs, parcs);
 | 
						|
    PIXMAP_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static int
 | 
						|
PixmapPolyText8(
 | 
						|
    DrawablePtr pDraw,
 | 
						|
    GCPtr	pGC,
 | 
						|
    int		x, 
 | 
						|
    int 	y,
 | 
						|
    int 	count,
 | 
						|
    char	*chars 
 | 
						|
){
 | 
						|
    int ret;
 | 
						|
 | 
						|
    PIXMAP_GC_OP_PROLOGUE(pGC);
 | 
						|
    ret = (*pGC->ops->PolyText8)(pDraw, pGC, x, y, count, chars);
 | 
						|
    PIXMAP_GC_OP_EPILOGUE(pGC);
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
static int
 | 
						|
PixmapPolyText16(
 | 
						|
    DrawablePtr pDraw,
 | 
						|
    GCPtr	pGC,
 | 
						|
    int		x,
 | 
						|
    int		y,
 | 
						|
    int 	count,
 | 
						|
    unsigned short *chars 
 | 
						|
){
 | 
						|
    int ret;
 | 
						|
 | 
						|
    PIXMAP_GC_OP_PROLOGUE(pGC);
 | 
						|
    ret = (*pGC->ops->PolyText16)(pDraw, pGC, x, y, count, chars);
 | 
						|
    PIXMAP_GC_OP_EPILOGUE(pGC);
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
PixmapImageText8(
 | 
						|
    DrawablePtr pDraw,
 | 
						|
    GCPtr	pGC,
 | 
						|
    int		x, 
 | 
						|
    int		y,
 | 
						|
    int 	count,
 | 
						|
    char	*chars 
 | 
						|
){
 | 
						|
    PIXMAP_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->ImageText8)(pDraw, pGC, x, y, count, chars);
 | 
						|
    PIXMAP_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
PixmapImageText16(
 | 
						|
    DrawablePtr pDraw,
 | 
						|
    GCPtr	pGC,
 | 
						|
    int		x,
 | 
						|
    int		y,
 | 
						|
    int 	count,
 | 
						|
    unsigned short *chars 
 | 
						|
){
 | 
						|
    PIXMAP_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->ImageText16)(pDraw, pGC, x, y, count, chars);
 | 
						|
    PIXMAP_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
PixmapImageGlyphBlt(
 | 
						|
    DrawablePtr pDraw,
 | 
						|
    GCPtr pGC,
 | 
						|
    int xInit, int yInit,
 | 
						|
    unsigned int nglyph,
 | 
						|
    CharInfoPtr *ppci,
 | 
						|
    pointer pglyphBase 
 | 
						|
){
 | 
						|
    PIXMAP_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->ImageGlyphBlt)(pDraw, pGC, xInit, yInit, nglyph, 
 | 
						|
					ppci, pglyphBase);
 | 
						|
    PIXMAP_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
PixmapPolyGlyphBlt(
 | 
						|
    DrawablePtr pDraw,
 | 
						|
    GCPtr pGC,
 | 
						|
    int xInit, int yInit,
 | 
						|
    unsigned int nglyph,
 | 
						|
    CharInfoPtr *ppci,
 | 
						|
    pointer pglyphBase 
 | 
						|
){
 | 
						|
    PIXMAP_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->PolyGlyphBlt)(pDraw, pGC, xInit, yInit, nglyph, 
 | 
						|
						ppci, pglyphBase);
 | 
						|
    PIXMAP_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
PixmapPushPixels(
 | 
						|
    GCPtr	pGC,
 | 
						|
    PixmapPtr	pBitMap,
 | 
						|
    DrawablePtr pDraw,
 | 
						|
    int	dx, int dy, int xOrg, int yOrg 
 | 
						|
){
 | 
						|
    PIXMAP_GC_OP_PROLOGUE(pGC);
 | 
						|
    (*pGC->ops->PushPixels)(pGC, pBitMap, pDraw, dx, dy, xOrg, yOrg);
 | 
						|
    PIXMAP_GC_OP_EPILOGUE(pGC);
 | 
						|
}
 | 
						|
 | 
						|
 |