cw: Remove
XAA was the only consumer. Signed-off-by: Adam Jackson <ajax@redhat.com> Reviewed-by: Dave Airlie <airlied@redhat.com> Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Reviewed-by: Daniel Stone <daniel@fooishbar.org> Acked-by: Aaron Plattner <aplattner@nvidia.com> Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
		
							parent
							
								
									20b4d90f32
								
							
						
					
					
						commit
						a44a379a2a
					
				| 
						 | 
				
			
			@ -2222,7 +2222,6 @@ miext/Makefile
 | 
			
		|||
miext/sync/Makefile
 | 
			
		||||
miext/damage/Makefile
 | 
			
		||||
miext/shadow/Makefile
 | 
			
		||||
miext/cw/Makefile
 | 
			
		||||
miext/rootless/Makefile
 | 
			
		||||
os/Makefile
 | 
			
		||||
randr/Makefile
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,11 +1,8 @@
 | 
			
		|||
SUBDIRS = sync damage shadow
 | 
			
		||||
if COMPOSITE
 | 
			
		||||
SUBDIRS += cw
 | 
			
		||||
endif
 | 
			
		||||
if XQUARTZ
 | 
			
		||||
SUBDIRS += rootless
 | 
			
		||||
endif
 | 
			
		||||
if XWIN_MULTIWINDOWEXTWM
 | 
			
		||||
SUBDIRS += rootless
 | 
			
		||||
endif
 | 
			
		||||
DIST_SUBDIRS = sync damage shadow cw rootless
 | 
			
		||||
DIST_SUBDIRS = sync damage shadow rootless
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,11 +0,0 @@
 | 
			
		|||
noinst_LTLIBRARIES = libcw.la
 | 
			
		||||
 | 
			
		||||
AM_CFLAGS = $(DIX_CFLAGS)
 | 
			
		||||
 | 
			
		||||
INCLUDES = -I$(top_srcdir)/hw/xfree86/os-support
 | 
			
		||||
 | 
			
		||||
libcw_la_SOURCES = 	\
 | 
			
		||||
	cw.c		\
 | 
			
		||||
	cw_ops.c	\
 | 
			
		||||
	cw_render.c     \
 | 
			
		||||
        cw.h
 | 
			
		||||
							
								
								
									
										524
									
								
								miext/cw/cw.c
								
								
								
								
							
							
						
						
									
										524
									
								
								miext/cw/cw.c
								
								
								
								
							| 
						 | 
				
			
			@ -1,524 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright © 2004 Eric Anholt
 | 
			
		||||
 *
 | 
			
		||||
 * 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, and that the name of Eric Anholt not be used in
 | 
			
		||||
 * advertising or publicity pertaining to distribution of the software without
 | 
			
		||||
 * specific, written prior permission.  Eric Anholt makes no
 | 
			
		||||
 * representations about the suitability of this software for any purpose.  It
 | 
			
		||||
 * is provided "as is" without express or implied warranty.
 | 
			
		||||
 *
 | 
			
		||||
 * ERIC ANHOLT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | 
			
		||||
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 | 
			
		||||
 * EVENT SHALL ERIC ANHOLT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 | 
			
		||||
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 | 
			
		||||
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 | 
			
		||||
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 | 
			
		||||
 * PERFORMANCE OF THIS SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_DIX_CONFIG_H
 | 
			
		||||
#include <dix-config.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "gcstruct.h"
 | 
			
		||||
#include "windowstr.h"
 | 
			
		||||
#include "cw.h"
 | 
			
		||||
 | 
			
		||||
#define CW_DEBUG 1
 | 
			
		||||
 | 
			
		||||
#if CW_DEBUG
 | 
			
		||||
#define CW_ASSERT(x) do {						\
 | 
			
		||||
    if (!(x)) {								\
 | 
			
		||||
	ErrorF("composite wrapper: assertion failed at %s:%d\n", __FUNC__, \
 | 
			
		||||
	    __LINE__);							\
 | 
			
		||||
    }									\
 | 
			
		||||
} while (0)
 | 
			
		||||
#else
 | 
			
		||||
#define CW_ASSERT(x) do {} while (0)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
DevPrivateKeyRec cwGCKeyRec;
 | 
			
		||||
DevPrivateKeyRec cwScreenKeyRec;
 | 
			
		||||
DevPrivateKeyRec cwWindowKeyRec;
 | 
			
		||||
DevPrivateKeyRec cwPictureKeyRec;
 | 
			
		||||
 | 
			
		||||
extern GCOps cwGCOps;
 | 
			
		||||
 | 
			
		||||
static Bool
 | 
			
		||||
 cwCloseScreen(ScreenPtr pScreen);
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
 cwValidateGC(GCPtr pGC, unsigned long stateChanges, DrawablePtr pDrawable);
 | 
			
		||||
static void
 | 
			
		||||
 cwChangeGC(GCPtr pGC, unsigned long mask);
 | 
			
		||||
static void
 | 
			
		||||
 cwCopyGC(GCPtr pGCSrc, unsigned long mask, GCPtr pGCDst);
 | 
			
		||||
static void
 | 
			
		||||
 cwDestroyGC(GCPtr pGC);
 | 
			
		||||
static void
 | 
			
		||||
 cwChangeClip(GCPtr pGC, int type, pointer pvalue, int nrects);
 | 
			
		||||
static void
 | 
			
		||||
 cwCopyClip(GCPtr pgcDst, GCPtr pgcSrc);
 | 
			
		||||
static void
 | 
			
		||||
 cwDestroyClip(GCPtr pGC);
 | 
			
		||||
 | 
			
		||||
GCFuncs cwGCFuncs = {
 | 
			
		||||
    cwValidateGC,
 | 
			
		||||
    cwChangeGC,
 | 
			
		||||
    cwCopyGC,
 | 
			
		||||
    cwDestroyGC,
 | 
			
		||||
    cwChangeClip,
 | 
			
		||||
    cwDestroyClip,
 | 
			
		||||
    cwCopyClip,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Find the real drawable to draw to, and provide offsets that will translate
 | 
			
		||||
 * window coordinates to backing pixmap coordinates.
 | 
			
		||||
 */
 | 
			
		||||
DrawablePtr
 | 
			
		||||
cwGetBackingDrawable(DrawablePtr pDrawable, int *x_off, int *y_off)
 | 
			
		||||
{
 | 
			
		||||
    PixmapPtr pPixmap;
 | 
			
		||||
 | 
			
		||||
    if (pDrawable->type == DRAWABLE_WINDOW &&
 | 
			
		||||
        (pPixmap = getCwPixmap((WindowPtr) pDrawable))) {
 | 
			
		||||
        *x_off = pDrawable->x - pPixmap->screen_x;
 | 
			
		||||
        *y_off = pDrawable->y - pPixmap->screen_y;
 | 
			
		||||
        return &pPixmap->drawable;
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        *x_off = *y_off = 0;
 | 
			
		||||
        return pDrawable;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define FUNC_PROLOGUE(pGC, pPriv) do {					\
 | 
			
		||||
    (pGC)->funcs = (pPriv)->wrapFuncs;					\
 | 
			
		||||
    (pGC)->ops = (pPriv)->wrapOps;					\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define FUNC_EPILOGUE(pGC, pPriv) do {					\
 | 
			
		||||
    (pPriv)->wrapFuncs = (pGC)->funcs;					\
 | 
			
		||||
    (pPriv)->wrapOps = (pGC)->ops;					\
 | 
			
		||||
    (pGC)->funcs = &cwGCFuncs;						\
 | 
			
		||||
    (pGC)->ops = &cwGCOps;						\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
static Bool
 | 
			
		||||
cwCreateBackingGC(GCPtr pGC, DrawablePtr pDrawable)
 | 
			
		||||
{
 | 
			
		||||
    cwGCRec *pPriv = getCwGC(pGC);
 | 
			
		||||
    int status, x_off, y_off;
 | 
			
		||||
    XID noexpose = xFalse;
 | 
			
		||||
    DrawablePtr pBackingDrawable;
 | 
			
		||||
 | 
			
		||||
    pBackingDrawable = cwGetBackingDrawable(pDrawable, &x_off, &y_off);
 | 
			
		||||
    pPriv->pBackingGC = CreateGC(pBackingDrawable, GCGraphicsExposures,
 | 
			
		||||
                                 &noexpose, &status, (XID) 0, serverClient);
 | 
			
		||||
    if (status != Success)
 | 
			
		||||
        return FALSE;
 | 
			
		||||
 | 
			
		||||
    pPriv->serialNumber = 0;
 | 
			
		||||
    pPriv->stateChanges = GCAllBits;
 | 
			
		||||
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwDestroyBackingGC(GCPtr pGC)
 | 
			
		||||
{
 | 
			
		||||
    cwGCPtr pPriv;
 | 
			
		||||
 | 
			
		||||
    pPriv = (cwGCPtr) getCwGC(pGC);
 | 
			
		||||
 | 
			
		||||
    if (pPriv->pBackingGC) {
 | 
			
		||||
        FreeGC(pPriv->pBackingGC, (XID) 0);
 | 
			
		||||
        pPriv->pBackingGC = NULL;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwValidateGC(GCPtr pGC, unsigned long stateChanges, DrawablePtr pDrawable)
 | 
			
		||||
{
 | 
			
		||||
    GCPtr pBackingGC;
 | 
			
		||||
    cwGCPtr pPriv;
 | 
			
		||||
    DrawablePtr pBackingDrawable;
 | 
			
		||||
    int x_off, y_off;
 | 
			
		||||
 | 
			
		||||
    pPriv = (cwGCPtr) getCwGC(pGC);
 | 
			
		||||
 | 
			
		||||
    FUNC_PROLOGUE(pGC, pPriv);
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Must call ValidateGC to ensure pGC->pCompositeClip is valid
 | 
			
		||||
     */
 | 
			
		||||
    (*pGC->funcs->ValidateGC) (pGC, stateChanges, pDrawable);
 | 
			
		||||
 | 
			
		||||
    if (!cwDrawableIsRedirWindow(pDrawable)) {
 | 
			
		||||
        cwDestroyBackingGC(pGC);
 | 
			
		||||
        FUNC_EPILOGUE(pGC, pPriv);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        if (!pPriv->pBackingGC && !cwCreateBackingGC(pGC, pDrawable)) {
 | 
			
		||||
            FUNC_EPILOGUE(pGC, pPriv);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pBackingGC = pPriv->pBackingGC;
 | 
			
		||||
    pBackingDrawable = cwGetBackingDrawable(pDrawable, &x_off, &y_off);
 | 
			
		||||
 | 
			
		||||
    pPriv->stateChanges |= stateChanges;
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Copy the composite clip into the backing GC if either
 | 
			
		||||
     * the drawable clip list has changed or the client has changed
 | 
			
		||||
     * the client clip data
 | 
			
		||||
     */
 | 
			
		||||
    if (pDrawable->serialNumber != pPriv->serialNumber ||
 | 
			
		||||
        (pPriv->stateChanges & (GCClipXOrigin | GCClipYOrigin | GCClipMask))) {
 | 
			
		||||
        ChangeGCVal vals[2];
 | 
			
		||||
        RegionPtr pCompositeClip;
 | 
			
		||||
 | 
			
		||||
        pCompositeClip = RegionCreate(NULL, 0);
 | 
			
		||||
        RegionCopy(pCompositeClip, pGC->pCompositeClip);
 | 
			
		||||
 | 
			
		||||
        /* Either the drawable has changed, or the clip list in the drawable has
 | 
			
		||||
         * changed.  Copy the new clip list over and set the new translated
 | 
			
		||||
         * offset for it.
 | 
			
		||||
         */
 | 
			
		||||
 | 
			
		||||
        (*pBackingGC->funcs->ChangeClip) (pBackingGC, CT_REGION,
 | 
			
		||||
                                          (pointer) pCompositeClip, 0);
 | 
			
		||||
 | 
			
		||||
        vals[0].val = x_off - pDrawable->x;
 | 
			
		||||
        vals[1].val = y_off - pDrawable->y;
 | 
			
		||||
        ChangeGC(NullClient, pBackingGC, (GCClipXOrigin | GCClipYOrigin), vals);
 | 
			
		||||
 | 
			
		||||
        pPriv->serialNumber = pDrawable->serialNumber;
 | 
			
		||||
        /*
 | 
			
		||||
         * Mask off any client clip changes to make sure
 | 
			
		||||
         * the clip list set above remains in effect
 | 
			
		||||
         */
 | 
			
		||||
        pPriv->stateChanges &= ~(GCClipXOrigin | GCClipYOrigin | GCClipMask);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (pPriv->stateChanges) {
 | 
			
		||||
        CopyGC(pGC, pBackingGC, pPriv->stateChanges);
 | 
			
		||||
        pPriv->stateChanges = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ((pGC->patOrg.x + x_off) != pBackingGC->patOrg.x ||
 | 
			
		||||
        (pGC->patOrg.y + y_off) != pBackingGC->patOrg.y) {
 | 
			
		||||
        ChangeGCVal vals[2];
 | 
			
		||||
 | 
			
		||||
        vals[0].val = pGC->patOrg.x + x_off;
 | 
			
		||||
        vals[1].val = pGC->patOrg.y + y_off;
 | 
			
		||||
        ChangeGC(NullClient, pBackingGC,
 | 
			
		||||
                 (GCTileStipXOrigin | GCTileStipYOrigin), vals);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ValidateGC(pBackingDrawable, pBackingGC);
 | 
			
		||||
 | 
			
		||||
    FUNC_EPILOGUE(pGC, pPriv);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwChangeGC(GCPtr pGC, unsigned long mask)
 | 
			
		||||
{
 | 
			
		||||
    cwGCPtr pPriv = (cwGCPtr) dixLookupPrivate(&pGC->devPrivates, cwGCKey);
 | 
			
		||||
 | 
			
		||||
    FUNC_PROLOGUE(pGC, pPriv);
 | 
			
		||||
 | 
			
		||||
    (*pGC->funcs->ChangeGC) (pGC, mask);
 | 
			
		||||
 | 
			
		||||
    FUNC_EPILOGUE(pGC, pPriv);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwCopyGC(GCPtr pGCSrc, unsigned long mask, GCPtr pGCDst)
 | 
			
		||||
{
 | 
			
		||||
    cwGCPtr pPriv = (cwGCPtr) dixLookupPrivate(&pGCDst->devPrivates, cwGCKey);
 | 
			
		||||
 | 
			
		||||
    FUNC_PROLOGUE(pGCDst, pPriv);
 | 
			
		||||
 | 
			
		||||
    (*pGCDst->funcs->CopyGC) (pGCSrc, mask, pGCDst);
 | 
			
		||||
 | 
			
		||||
    FUNC_EPILOGUE(pGCDst, pPriv);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwDestroyGC(GCPtr pGC)
 | 
			
		||||
{
 | 
			
		||||
    cwGCPtr pPriv = (cwGCPtr) dixLookupPrivate(&pGC->devPrivates, cwGCKey);
 | 
			
		||||
 | 
			
		||||
    FUNC_PROLOGUE(pGC, pPriv);
 | 
			
		||||
 | 
			
		||||
    cwDestroyBackingGC(pGC);
 | 
			
		||||
 | 
			
		||||
    (*pGC->funcs->DestroyGC) (pGC);
 | 
			
		||||
 | 
			
		||||
    /* leave it unwrapped */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwChangeClip(GCPtr pGC, int type, pointer pvalue, int nrects)
 | 
			
		||||
{
 | 
			
		||||
    cwGCPtr pPriv = (cwGCPtr) dixLookupPrivate(&pGC->devPrivates, cwGCKey);
 | 
			
		||||
 | 
			
		||||
    FUNC_PROLOGUE(pGC, pPriv);
 | 
			
		||||
 | 
			
		||||
    (*pGC->funcs->ChangeClip) (pGC, type, pvalue, nrects);
 | 
			
		||||
 | 
			
		||||
    FUNC_EPILOGUE(pGC, pPriv);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwCopyClip(GCPtr pgcDst, GCPtr pgcSrc)
 | 
			
		||||
{
 | 
			
		||||
    cwGCPtr pPriv = (cwGCPtr) dixLookupPrivate(&pgcDst->devPrivates, cwGCKey);
 | 
			
		||||
 | 
			
		||||
    FUNC_PROLOGUE(pgcDst, pPriv);
 | 
			
		||||
 | 
			
		||||
    (*pgcDst->funcs->CopyClip) (pgcDst, pgcSrc);
 | 
			
		||||
 | 
			
		||||
    FUNC_EPILOGUE(pgcDst, pPriv);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwDestroyClip(GCPtr pGC)
 | 
			
		||||
{
 | 
			
		||||
    cwGCPtr pPriv = (cwGCPtr) dixLookupPrivate(&pGC->devPrivates, cwGCKey);
 | 
			
		||||
 | 
			
		||||
    FUNC_PROLOGUE(pGC, pPriv);
 | 
			
		||||
 | 
			
		||||
    (*pGC->funcs->DestroyClip) (pGC);
 | 
			
		||||
 | 
			
		||||
    FUNC_EPILOGUE(pGC, pPriv);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Screen wrappers.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define SCREEN_PROLOGUE(pScreen, field)				\
 | 
			
		||||
  ((pScreen)->field = getCwScreen(pScreen)->field)
 | 
			
		||||
 | 
			
		||||
#define SCREEN_EPILOGUE(pScreen, field, wrapper) do {		\
 | 
			
		||||
    getCwScreen(pScreen)->field = (pScreen)->field;		\
 | 
			
		||||
    (pScreen)->field = (wrapper);				\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
static Bool
 | 
			
		||||
cwCreateGC(GCPtr pGC)
 | 
			
		||||
{
 | 
			
		||||
    cwGCPtr pPriv = getCwGC(pGC);
 | 
			
		||||
    ScreenPtr pScreen = pGC->pScreen;
 | 
			
		||||
    Bool ret;
 | 
			
		||||
 | 
			
		||||
    SCREEN_PROLOGUE(pScreen, CreateGC);
 | 
			
		||||
 | 
			
		||||
    if ((ret = (*pScreen->CreateGC) (pGC)))
 | 
			
		||||
        FUNC_EPILOGUE(pGC, pPriv);
 | 
			
		||||
 | 
			
		||||
    SCREEN_EPILOGUE(pScreen, CreateGC, cwCreateGC);
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwGetImage(DrawablePtr pSrc, int x, int y, int w, int h, unsigned int format,
 | 
			
		||||
           unsigned long planemask, char *pdstLine)
 | 
			
		||||
{
 | 
			
		||||
    ScreenPtr pScreen = pSrc->pScreen;
 | 
			
		||||
    DrawablePtr pBackingDrawable;
 | 
			
		||||
    int src_off_x, src_off_y;
 | 
			
		||||
 | 
			
		||||
    SCREEN_PROLOGUE(pScreen, GetImage);
 | 
			
		||||
 | 
			
		||||
    pBackingDrawable = cwGetBackingDrawable(pSrc, &src_off_x, &src_off_y);
 | 
			
		||||
 | 
			
		||||
    CW_OFFSET_XY_SRC(x, y);
 | 
			
		||||
 | 
			
		||||
    (*pScreen->GetImage) (pBackingDrawable, x, y, w, h, format, planemask,
 | 
			
		||||
                          pdstLine);
 | 
			
		||||
 | 
			
		||||
    SCREEN_EPILOGUE(pScreen, GetImage, cwGetImage);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwGetSpans(DrawablePtr pSrc, int wMax, DDXPointPtr ppt, int *pwidth,
 | 
			
		||||
           int nspans, char *pdstStart)
 | 
			
		||||
{
 | 
			
		||||
    ScreenPtr pScreen = pSrc->pScreen;
 | 
			
		||||
    DrawablePtr pBackingDrawable;
 | 
			
		||||
    int i;
 | 
			
		||||
    int src_off_x, src_off_y;
 | 
			
		||||
 | 
			
		||||
    SCREEN_PROLOGUE(pScreen, GetSpans);
 | 
			
		||||
 | 
			
		||||
    pBackingDrawable = cwGetBackingDrawable(pSrc, &src_off_x, &src_off_y);
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < nspans; i++)
 | 
			
		||||
        CW_OFFSET_XY_SRC(ppt[i].x, ppt[i].y);
 | 
			
		||||
 | 
			
		||||
    (*pScreen->GetSpans) (pBackingDrawable, wMax, ppt, pwidth, nspans,
 | 
			
		||||
                          pdstStart);
 | 
			
		||||
 | 
			
		||||
    SCREEN_EPILOGUE(pScreen, GetSpans, cwGetSpans);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
 | 
			
		||||
{
 | 
			
		||||
    ScreenPtr pScreen = pWin->drawable.pScreen;
 | 
			
		||||
 | 
			
		||||
    SCREEN_PROLOGUE(pScreen, CopyWindow);
 | 
			
		||||
 | 
			
		||||
    if (!cwDrawableIsRedirWindow((DrawablePtr) pWin)) {
 | 
			
		||||
        (*pScreen->CopyWindow) (pWin, ptOldOrg, prgnSrc);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        GCPtr pGC;
 | 
			
		||||
        BoxPtr pExtents;
 | 
			
		||||
        int x_off, y_off;
 | 
			
		||||
        int dx, dy;
 | 
			
		||||
        PixmapPtr pBackingPixmap;
 | 
			
		||||
        RegionPtr pClip;
 | 
			
		||||
        int src_x, src_y, dst_x, dst_y, w, h;
 | 
			
		||||
 | 
			
		||||
        dx = ptOldOrg.x - pWin->drawable.x;
 | 
			
		||||
        dy = ptOldOrg.y - pWin->drawable.y;
 | 
			
		||||
 | 
			
		||||
        pExtents = RegionExtents(prgnSrc);
 | 
			
		||||
 | 
			
		||||
        pBackingPixmap = (PixmapPtr) cwGetBackingDrawable((DrawablePtr) pWin,
 | 
			
		||||
                                                          &x_off, &y_off);
 | 
			
		||||
 | 
			
		||||
        src_x = pExtents->x1 - pBackingPixmap->screen_x;
 | 
			
		||||
        src_y = pExtents->y1 - pBackingPixmap->screen_y;
 | 
			
		||||
        w = pExtents->x2 - pExtents->x1;
 | 
			
		||||
        h = pExtents->y2 - pExtents->y1;
 | 
			
		||||
        dst_x = src_x - dx;
 | 
			
		||||
        dst_y = src_y - dy;
 | 
			
		||||
 | 
			
		||||
        /* Translate region (as required by API) */
 | 
			
		||||
        RegionTranslate(prgnSrc, -dx, -dy);
 | 
			
		||||
 | 
			
		||||
        pGC = GetScratchGC(pBackingPixmap->drawable.depth, pScreen);
 | 
			
		||||
        /*
 | 
			
		||||
         * Copy region to GC as clip, aligning as dest clip
 | 
			
		||||
         */
 | 
			
		||||
        pClip = RegionCreate(NULL, 0);
 | 
			
		||||
        RegionIntersect(pClip, &pWin->borderClip, prgnSrc);
 | 
			
		||||
        RegionTranslate(pClip,
 | 
			
		||||
                        -pBackingPixmap->screen_x, -pBackingPixmap->screen_y);
 | 
			
		||||
 | 
			
		||||
        (*pGC->funcs->ChangeClip) (pGC, CT_REGION, pClip, 0);
 | 
			
		||||
 | 
			
		||||
        ValidateGC(&pBackingPixmap->drawable, pGC);
 | 
			
		||||
 | 
			
		||||
        (*pGC->ops->CopyArea) (&pBackingPixmap->drawable,
 | 
			
		||||
                               &pBackingPixmap->drawable, pGC,
 | 
			
		||||
                               src_x, src_y, w, h, dst_x, dst_y);
 | 
			
		||||
 | 
			
		||||
        (*pGC->funcs->DestroyClip) (pGC);
 | 
			
		||||
 | 
			
		||||
        FreeScratchGC(pGC);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    SCREEN_EPILOGUE(pScreen, CopyWindow, cwCopyWindow);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static PixmapPtr
 | 
			
		||||
cwGetWindowPixmap(WindowPtr pWin)
 | 
			
		||||
{
 | 
			
		||||
    PixmapPtr pPixmap = getCwPixmap(pWin);
 | 
			
		||||
 | 
			
		||||
    if (!pPixmap) {
 | 
			
		||||
        ScreenPtr pScreen = pWin->drawable.pScreen;
 | 
			
		||||
 | 
			
		||||
        SCREEN_PROLOGUE(pScreen, GetWindowPixmap);
 | 
			
		||||
        if (pScreen->GetWindowPixmap)
 | 
			
		||||
            pPixmap = (*pScreen->GetWindowPixmap) (pWin);
 | 
			
		||||
        SCREEN_EPILOGUE(pScreen, GetWindowPixmap, cwGetWindowPixmap);
 | 
			
		||||
    }
 | 
			
		||||
    return pPixmap;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwSetWindowPixmap(WindowPtr pWindow, PixmapPtr pPixmap)
 | 
			
		||||
{
 | 
			
		||||
    ScreenPtr pScreen = pWindow->drawable.pScreen;
 | 
			
		||||
 | 
			
		||||
    if (pPixmap == (*pScreen->GetScreenPixmap) (pScreen))
 | 
			
		||||
        pPixmap = NULL;
 | 
			
		||||
    setCwPixmap(pWindow, pPixmap);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Screen initialization/teardown */
 | 
			
		||||
void
 | 
			
		||||
miInitializeCompositeWrapper(ScreenPtr pScreen)
 | 
			
		||||
{
 | 
			
		||||
    cwScreenPtr pScreenPriv;
 | 
			
		||||
    Bool has_render = GetPictureScreenIfSet(pScreen) != NULL;
 | 
			
		||||
 | 
			
		||||
    if (!dixRegisterPrivateKey(&cwScreenKeyRec, PRIVATE_SCREEN, 0))
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    if (!dixRegisterPrivateKey(&cwGCKeyRec, PRIVATE_GC, sizeof(cwGCRec)))
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    if (!dixRegisterPrivateKey(&cwWindowKeyRec, PRIVATE_WINDOW, 0))
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    if (!dixRegisterPrivateKey(&cwPictureKeyRec, PRIVATE_PICTURE, 0))
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    pScreenPriv = malloc(sizeof(cwScreenRec));
 | 
			
		||||
    if (!pScreenPriv)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    dixSetPrivate(&pScreen->devPrivates, cwScreenKey, pScreenPriv);
 | 
			
		||||
 | 
			
		||||
    SCREEN_EPILOGUE(pScreen, CloseScreen, cwCloseScreen);
 | 
			
		||||
    SCREEN_EPILOGUE(pScreen, GetImage, cwGetImage);
 | 
			
		||||
    SCREEN_EPILOGUE(pScreen, GetSpans, cwGetSpans);
 | 
			
		||||
    SCREEN_EPILOGUE(pScreen, CreateGC, cwCreateGC);
 | 
			
		||||
    SCREEN_EPILOGUE(pScreen, CopyWindow, cwCopyWindow);
 | 
			
		||||
 | 
			
		||||
    SCREEN_EPILOGUE(pScreen, SetWindowPixmap, cwSetWindowPixmap);
 | 
			
		||||
    SCREEN_EPILOGUE(pScreen, GetWindowPixmap, cwGetWindowPixmap);
 | 
			
		||||
 | 
			
		||||
    if (has_render)
 | 
			
		||||
        cwInitializeRender(pScreen);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Bool
 | 
			
		||||
cwCloseScreen(ScreenPtr pScreen)
 | 
			
		||||
{
 | 
			
		||||
    cwScreenPtr pScreenPriv;
 | 
			
		||||
    PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
 | 
			
		||||
 | 
			
		||||
    pScreenPriv = (cwScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
 | 
			
		||||
                                                 cwScreenKey);
 | 
			
		||||
    pScreen->CloseScreen = pScreenPriv->CloseScreen;
 | 
			
		||||
    pScreen->GetImage = pScreenPriv->GetImage;
 | 
			
		||||
    pScreen->GetSpans = pScreenPriv->GetSpans;
 | 
			
		||||
    pScreen->CreateGC = pScreenPriv->CreateGC;
 | 
			
		||||
    pScreen->CopyWindow = pScreenPriv->CopyWindow;
 | 
			
		||||
 | 
			
		||||
    if (ps)
 | 
			
		||||
        cwFiniRender(pScreen);
 | 
			
		||||
 | 
			
		||||
    free((pointer) pScreenPriv);
 | 
			
		||||
 | 
			
		||||
    return (*pScreen->CloseScreen) (pScreen);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										173
									
								
								miext/cw/cw.h
								
								
								
								
							
							
						
						
									
										173
									
								
								miext/cw/cw.h
								
								
								
								
							| 
						 | 
				
			
			@ -1,173 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright © 2004 Eric Anholt
 | 
			
		||||
 *
 | 
			
		||||
 * 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, and that the name of Eric Anholt not be used in
 | 
			
		||||
 * advertising or publicity pertaining to distribution of the software without
 | 
			
		||||
 * specific, written prior permission.  Eric Anholt makes no
 | 
			
		||||
 * representations about the suitability of this software for any purpose.  It
 | 
			
		||||
 * is provided "as is" without express or implied warranty.
 | 
			
		||||
 *
 | 
			
		||||
 * ERIC ANHOLT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | 
			
		||||
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 | 
			
		||||
 * EVENT SHALL ERIC ANHOLT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 | 
			
		||||
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 | 
			
		||||
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 | 
			
		||||
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 | 
			
		||||
 * PERFORMANCE OF THIS SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_DIX_CONFIG_H
 | 
			
		||||
#include <dix-config.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "gcstruct.h"
 | 
			
		||||
#include "picturestr.h"
 | 
			
		||||
#include "privates.h"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * One of these structures is allocated per GC that gets used with a window with
 | 
			
		||||
 * backing pixmap.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    GCPtr pBackingGC;           /* Copy of the GC but with graphicsExposures
 | 
			
		||||
                                 * set FALSE and the clientClip set to
 | 
			
		||||
                                 * clip output to the valid regions of the
 | 
			
		||||
                                 * backing pixmap. */
 | 
			
		||||
    unsigned long serialNumber; /* clientClip computed time */
 | 
			
		||||
    unsigned long stateChanges; /* changes in parent gc since last copy */
 | 
			
		||||
    GCOps *wrapOps;             /* wrapped ops */
 | 
			
		||||
    GCFuncs *wrapFuncs;         /* wrapped funcs */
 | 
			
		||||
} cwGCRec, *cwGCPtr;
 | 
			
		||||
 | 
			
		||||
extern _X_EXPORT DevPrivateKeyRec cwGCKeyRec;
 | 
			
		||||
 | 
			
		||||
#define cwGCKey (&cwGCKeyRec)
 | 
			
		||||
 | 
			
		||||
#define getCwGC(pGC) ((cwGCPtr)dixLookupPrivate(&(pGC)->devPrivates, cwGCKey))
 | 
			
		||||
#define setCwGC(pGC,p) dixSetPrivate(&(pGC)->devPrivates, cwGCKey, p)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * One of these structures is allocated per Picture that gets used with a
 | 
			
		||||
 * window with a backing pixmap
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    PicturePtr pBackingPicture;
 | 
			
		||||
    unsigned long serialNumber;
 | 
			
		||||
    unsigned long stateChanges;
 | 
			
		||||
} cwPictureRec, *cwPicturePtr;
 | 
			
		||||
 | 
			
		||||
extern _X_EXPORT DevPrivateKeyRec cwPictureKeyRec;
 | 
			
		||||
 | 
			
		||||
#define cwPictureKey (&cwPictureKeyRec)
 | 
			
		||||
 | 
			
		||||
#define getCwPicture(pPicture) (pPicture->pDrawable ? \
 | 
			
		||||
    (cwPicturePtr)dixLookupPrivate(&(pPicture)->devPrivates, cwPictureKey) : 0)
 | 
			
		||||
#define setCwPicture(pPicture,p) dixSetPrivate(&(pPicture)->devPrivates, cwPictureKey, p)
 | 
			
		||||
 | 
			
		||||
extern _X_EXPORT DevPrivateKeyRec cwWindowKeyRec;
 | 
			
		||||
 | 
			
		||||
#define cwWindowKey (&cwWindowKeyRec)
 | 
			
		||||
 | 
			
		||||
#define cwWindowPrivate(pWin) dixLookupPrivate(&(pWin)->devPrivates, cwWindowKey)
 | 
			
		||||
#define getCwPixmap(pWindow)	    ((PixmapPtr) cwWindowPrivate(pWindow))
 | 
			
		||||
#define setCwPixmap(pWindow,pPixmap) \
 | 
			
		||||
    dixSetPrivate(&(pWindow)->devPrivates, cwWindowKey, pPixmap)
 | 
			
		||||
 | 
			
		||||
#define cwDrawableIsRedirWindow(pDraw)					\
 | 
			
		||||
	((pDraw)->type == DRAWABLE_WINDOW &&				\
 | 
			
		||||
	 getCwPixmap((WindowPtr) (pDraw)) != NULL)
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    /*
 | 
			
		||||
     * screen func wrappers
 | 
			
		||||
     */
 | 
			
		||||
    CloseScreenProcPtr CloseScreen;
 | 
			
		||||
    GetImageProcPtr GetImage;
 | 
			
		||||
    GetSpansProcPtr GetSpans;
 | 
			
		||||
    CreateGCProcPtr CreateGC;
 | 
			
		||||
 | 
			
		||||
    CopyWindowProcPtr CopyWindow;
 | 
			
		||||
 | 
			
		||||
    GetWindowPixmapProcPtr GetWindowPixmap;
 | 
			
		||||
    SetWindowPixmapProcPtr SetWindowPixmap;
 | 
			
		||||
 | 
			
		||||
    DestroyPictureProcPtr DestroyPicture;
 | 
			
		||||
    ChangePictureClipProcPtr ChangePictureClip;
 | 
			
		||||
    DestroyPictureClipProcPtr DestroyPictureClip;
 | 
			
		||||
 | 
			
		||||
    ChangePictureProcPtr ChangePicture;
 | 
			
		||||
    ValidatePictureProcPtr ValidatePicture;
 | 
			
		||||
 | 
			
		||||
    CompositeProcPtr Composite;
 | 
			
		||||
    CompositeRectsProcPtr CompositeRects;
 | 
			
		||||
 | 
			
		||||
    TrapezoidsProcPtr Trapezoids;
 | 
			
		||||
    TrianglesProcPtr Triangles;
 | 
			
		||||
 | 
			
		||||
    RasterizeTrapezoidProcPtr RasterizeTrapezoid;
 | 
			
		||||
} cwScreenRec, *cwScreenPtr;
 | 
			
		||||
 | 
			
		||||
extern _X_EXPORT DevPrivateKeyRec cwScreenKeyRec;
 | 
			
		||||
 | 
			
		||||
#define cwScreenKey (&cwScreenKeyRec)
 | 
			
		||||
 | 
			
		||||
#define getCwScreen(pScreen) ((cwScreenPtr)dixLookupPrivate(&(pScreen)->devPrivates, cwScreenKey))
 | 
			
		||||
#define setCwScreen(pScreen,p) dixSetPrivate(&(pScreen)->devPrivates, cwScreenKey, p)
 | 
			
		||||
 | 
			
		||||
#define CW_OFFSET_XYPOINTS(ppt, npt) do { \
 | 
			
		||||
    DDXPointPtr _ppt = (DDXPointPtr)(ppt); \
 | 
			
		||||
    int _i; \
 | 
			
		||||
    for (_i = 0; _i < npt; _i++) { \
 | 
			
		||||
	_ppt[_i].x += dst_off_x; \
 | 
			
		||||
	_ppt[_i].y += dst_off_y; \
 | 
			
		||||
    } \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define CW_OFFSET_RECTS(prect, nrect) do { \
 | 
			
		||||
    int _i; \
 | 
			
		||||
    for (_i = 0; _i < nrect; _i++) { \
 | 
			
		||||
	(prect)[_i].x += dst_off_x; \
 | 
			
		||||
	(prect)[_i].y += dst_off_y; \
 | 
			
		||||
    } \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define CW_OFFSET_ARCS(parc, narc) do { \
 | 
			
		||||
    int _i; \
 | 
			
		||||
    for (_i = 0; _i < narc; _i++) { \
 | 
			
		||||
	(parc)[_i].x += dst_off_x; \
 | 
			
		||||
	(parc)[_i].y += dst_off_y; \
 | 
			
		||||
    } \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define CW_OFFSET_XY_DST(x, y) do { \
 | 
			
		||||
    (x) = (x) + dst_off_x; \
 | 
			
		||||
    (y) = (y) + dst_off_y; \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define CW_OFFSET_XY_SRC(x, y) do { \
 | 
			
		||||
    (x) = (x) + src_off_x; \
 | 
			
		||||
    (y) = (y) + src_off_y; \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
/* cw.c */
 | 
			
		||||
extern _X_EXPORT DrawablePtr
 | 
			
		||||
 cwGetBackingDrawable(DrawablePtr pDrawable, int *x_off, int *y_off);
 | 
			
		||||
 | 
			
		||||
/* cw_render.c */
 | 
			
		||||
 | 
			
		||||
extern _X_EXPORT void
 | 
			
		||||
 cwInitializeRender(ScreenPtr pScreen);
 | 
			
		||||
 | 
			
		||||
extern _X_EXPORT void
 | 
			
		||||
 cwFiniRender(ScreenPtr pScreen);
 | 
			
		||||
 | 
			
		||||
/* cw.c */
 | 
			
		||||
 | 
			
		||||
extern _X_EXPORT void
 | 
			
		||||
 miInitializeCompositeWrapper(ScreenPtr pScreen);
 | 
			
		||||
| 
						 | 
				
			
			@ -1,477 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright © 2004 Eric Anholt
 | 
			
		||||
 *
 | 
			
		||||
 * 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, and that the name of Eric Anholt not be used in
 | 
			
		||||
 * advertising or publicity pertaining to distribution of the software without
 | 
			
		||||
 * specific, written prior permission.  Eric Anholt makes no
 | 
			
		||||
 * representations about the suitability of this software for any purpose.  It
 | 
			
		||||
 * is provided "as is" without express or implied warranty.
 | 
			
		||||
 *
 | 
			
		||||
 * ERIC ANHOLT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | 
			
		||||
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 | 
			
		||||
 * EVENT SHALL ERIC ANHOLT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 | 
			
		||||
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 | 
			
		||||
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 | 
			
		||||
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 | 
			
		||||
 * PERFORMANCE OF THIS SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_DIX_CONFIG_H
 | 
			
		||||
#include <dix-config.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
#include "gcstruct.h"
 | 
			
		||||
#include "pixmapstr.h"
 | 
			
		||||
#include "cw.h"
 | 
			
		||||
#include "mi.h"
 | 
			
		||||
 | 
			
		||||
#define SETUP_BACKING_DST(_pDst, _pGC) \
 | 
			
		||||
    cwGCPtr pGCPrivate = getCwGC (_pGC); \
 | 
			
		||||
    int dst_off_x, dst_off_y; \
 | 
			
		||||
    DrawablePtr pBackingDst = cwGetBackingDrawable(pDst, &dst_off_x, \
 | 
			
		||||
	&dst_off_y); \
 | 
			
		||||
    GCPtr pBackingGC = pGCPrivate->pBackingGC ? pGCPrivate->pBackingGC : _pGC
 | 
			
		||||
 | 
			
		||||
#define SETUP_BACKING_SRC(pSrc, pGC) \
 | 
			
		||||
    int src_off_x, src_off_y; \
 | 
			
		||||
    DrawablePtr pBackingSrc = cwGetBackingDrawable(pSrc, &src_off_x, \
 | 
			
		||||
	&src_off_y)
 | 
			
		||||
 | 
			
		||||
#define PROLOGUE(pGC) do { \
 | 
			
		||||
    if (pBackingGC->serialNumber != pBackingDst->serialNumber) { \
 | 
			
		||||
	ValidateGC(pBackingDst, pBackingGC); \
 | 
			
		||||
    } \
 | 
			
		||||
    pGC->funcs = pGCPrivate->wrapFuncs;\
 | 
			
		||||
    pGC->ops = pGCPrivate->wrapOps;\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define EPILOGUE(pGC) do { \
 | 
			
		||||
    pGCPrivate->wrapFuncs = (pGC)->funcs; \
 | 
			
		||||
    pGCPrivate->wrapOps = (pGC)->ops; \
 | 
			
		||||
    (pGC)->funcs = &cwGCFuncs; \
 | 
			
		||||
    (pGC)->ops = &cwGCOps; \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
extern GCFuncs cwGCFuncs;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * GC ops -- wrap each GC operation with our own function
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static void cwFillSpans(DrawablePtr pDst, GCPtr pGC, int nInit,
 | 
			
		||||
                        DDXPointPtr pptInit, int *pwidthInit, int fSorted);
 | 
			
		||||
static void cwSetSpans(DrawablePtr pDst, GCPtr pGC, char *psrc,
 | 
			
		||||
                       DDXPointPtr ppt, int *pwidth, int nspans, int fSorted);
 | 
			
		||||
static void cwPutImage(DrawablePtr pDst, GCPtr pGC, int depth,
 | 
			
		||||
                       int x, int y, int w, int h, int leftPad, int format,
 | 
			
		||||
                       char *pBits);
 | 
			
		||||
static RegionPtr cwCopyArea(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
 | 
			
		||||
                            int srcx, int srcy, int w, int h,
 | 
			
		||||
                            int dstx, int dsty);
 | 
			
		||||
static RegionPtr cwCopyPlane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
 | 
			
		||||
                             int srcx, int srcy, int w, int h,
 | 
			
		||||
                             int dstx, int dsty, unsigned long plane);
 | 
			
		||||
static void cwPolyPoint(DrawablePtr pDst, GCPtr pGC, int mode, int npt,
 | 
			
		||||
                        xPoint * pptInit);
 | 
			
		||||
static void cwPolylines(DrawablePtr pDst, GCPtr pGC, int mode, int npt,
 | 
			
		||||
                        DDXPointPtr pptInit);
 | 
			
		||||
static void cwPolySegment(DrawablePtr pDst, GCPtr pGC, int nseg,
 | 
			
		||||
                          xSegment * pSegs);
 | 
			
		||||
static void cwPolyRectangle(DrawablePtr pDst, GCPtr pGC,
 | 
			
		||||
                            int nrects, xRectangle *pRects);
 | 
			
		||||
static void cwPolyArc(DrawablePtr pDst, GCPtr pGC, int narcs, xArc * parcs);
 | 
			
		||||
static void cwFillPolygon(DrawablePtr pDst, GCPtr pGC, int shape, int mode,
 | 
			
		||||
                          int count, DDXPointPtr pPts);
 | 
			
		||||
static void cwPolyFillRect(DrawablePtr pDst, GCPtr pGC,
 | 
			
		||||
                           int nrectFill, xRectangle *prectInit);
 | 
			
		||||
static void cwPolyFillArc(DrawablePtr pDst, GCPtr pGC, int narcs, xArc * parcs);
 | 
			
		||||
static int cwPolyText8(DrawablePtr pDrawable, GCPtr pGC, int x, int y,
 | 
			
		||||
                       int count, char *chars);
 | 
			
		||||
static int cwPolyText16(DrawablePtr pDst, GCPtr pGC, int x, int y,
 | 
			
		||||
                        int count, unsigned short *chars);
 | 
			
		||||
static void cwImageText8(DrawablePtr pDst, GCPtr pGC, int x, int y,
 | 
			
		||||
                         int count, char *chars);
 | 
			
		||||
static void cwImageText16(DrawablePtr pDst, GCPtr pGC, int x, int y,
 | 
			
		||||
                          int count, unsigned short *chars);
 | 
			
		||||
static void cwImageGlyphBlt(DrawablePtr pDst, GCPtr pGC, int x, int y,
 | 
			
		||||
                            unsigned int nglyph, CharInfoPtr * ppci,
 | 
			
		||||
                            pointer pglyphBase);
 | 
			
		||||
static void cwPolyGlyphBlt(DrawablePtr pDst, GCPtr pGC, int x, int y,
 | 
			
		||||
                           unsigned int nglyph, CharInfoPtr * ppci,
 | 
			
		||||
                           pointer pglyphBase);
 | 
			
		||||
static void cwPushPixels(GCPtr pGC, PixmapPtr pBitMap, DrawablePtr pDst,
 | 
			
		||||
                         int w, int h, int x, int y);
 | 
			
		||||
 | 
			
		||||
GCOps cwGCOps = {
 | 
			
		||||
    cwFillSpans,
 | 
			
		||||
    cwSetSpans,
 | 
			
		||||
    cwPutImage,
 | 
			
		||||
    cwCopyArea,
 | 
			
		||||
    cwCopyPlane,
 | 
			
		||||
    cwPolyPoint,
 | 
			
		||||
    cwPolylines,
 | 
			
		||||
    cwPolySegment,
 | 
			
		||||
    cwPolyRectangle,
 | 
			
		||||
    cwPolyArc,
 | 
			
		||||
    cwFillPolygon,
 | 
			
		||||
    cwPolyFillRect,
 | 
			
		||||
    cwPolyFillArc,
 | 
			
		||||
    cwPolyText8,
 | 
			
		||||
    cwPolyText16,
 | 
			
		||||
    cwImageText8,
 | 
			
		||||
    cwImageText16,
 | 
			
		||||
    cwImageGlyphBlt,
 | 
			
		||||
    cwPolyGlyphBlt,
 | 
			
		||||
    cwPushPixels
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwFillSpans(DrawablePtr pDst, GCPtr pGC, int nspans, DDXPointPtr ppt,
 | 
			
		||||
            int *pwidth, int fSorted)
 | 
			
		||||
{
 | 
			
		||||
    SETUP_BACKING_DST(pDst, pGC);
 | 
			
		||||
 | 
			
		||||
    PROLOGUE(pGC);
 | 
			
		||||
 | 
			
		||||
    CW_OFFSET_XYPOINTS(ppt, nspans);
 | 
			
		||||
 | 
			
		||||
    (*pBackingGC->ops->FillSpans) (pBackingDst, pBackingGC, nspans, ppt,
 | 
			
		||||
                                   pwidth, fSorted);
 | 
			
		||||
 | 
			
		||||
    EPILOGUE(pGC);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwSetSpans(DrawablePtr pDst, GCPtr pGC, char *psrc, DDXPointPtr ppt,
 | 
			
		||||
           int *pwidth, int nspans, int fSorted)
 | 
			
		||||
{
 | 
			
		||||
    SETUP_BACKING_DST(pDst, pGC);
 | 
			
		||||
 | 
			
		||||
    PROLOGUE(pGC);
 | 
			
		||||
 | 
			
		||||
    CW_OFFSET_XYPOINTS(ppt, nspans);
 | 
			
		||||
 | 
			
		||||
    (*pBackingGC->ops->SetSpans) (pBackingDst, pBackingGC, psrc, ppt, pwidth,
 | 
			
		||||
                                  nspans, fSorted);
 | 
			
		||||
 | 
			
		||||
    EPILOGUE(pGC);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwPutImage(DrawablePtr pDst, GCPtr pGC, int depth, int x, int y, int w, int h,
 | 
			
		||||
           int leftPad, int format, char *pBits)
 | 
			
		||||
{
 | 
			
		||||
    SETUP_BACKING_DST(pDst, pGC);
 | 
			
		||||
 | 
			
		||||
    PROLOGUE(pGC);
 | 
			
		||||
 | 
			
		||||
    CW_OFFSET_XY_DST(x, y);
 | 
			
		||||
 | 
			
		||||
    (*pBackingGC->ops->PutImage) (pBackingDst, pBackingGC, depth, x, y, w, h,
 | 
			
		||||
                                  leftPad, format, pBits);
 | 
			
		||||
 | 
			
		||||
    EPILOGUE(pGC);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static RegionPtr
 | 
			
		||||
cwCopyArea(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, int srcx, int srcy,
 | 
			
		||||
           int w, int h, int dstx, int dsty)
 | 
			
		||||
{
 | 
			
		||||
    int odstx, odsty;
 | 
			
		||||
    int osrcx, osrcy;
 | 
			
		||||
 | 
			
		||||
    SETUP_BACKING_DST(pDst, pGC);
 | 
			
		||||
    SETUP_BACKING_SRC(pSrc, pGC);
 | 
			
		||||
 | 
			
		||||
    PROLOGUE(pGC);
 | 
			
		||||
 | 
			
		||||
    odstx = dstx;
 | 
			
		||||
    odsty = dsty;
 | 
			
		||||
    osrcx = srcx;
 | 
			
		||||
    osrcy = srcy;
 | 
			
		||||
    CW_OFFSET_XY_DST(dstx, dsty);
 | 
			
		||||
    CW_OFFSET_XY_SRC(srcx, srcy);
 | 
			
		||||
 | 
			
		||||
    (*pBackingGC->ops->CopyArea) (pBackingSrc, pBackingDst,
 | 
			
		||||
                                  pBackingGC, srcx, srcy, w, h, dstx, dsty);
 | 
			
		||||
 | 
			
		||||
    EPILOGUE(pGC);
 | 
			
		||||
 | 
			
		||||
    return miHandleExposures(pSrc, pDst, pGC,
 | 
			
		||||
                             osrcx, osrcy, w, h, odstx, odsty, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static RegionPtr
 | 
			
		||||
cwCopyPlane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, int srcx, int srcy,
 | 
			
		||||
            int w, int h, int dstx, int dsty, unsigned long plane)
 | 
			
		||||
{
 | 
			
		||||
    int odstx, odsty;
 | 
			
		||||
    int osrcx, osrcy;
 | 
			
		||||
 | 
			
		||||
    SETUP_BACKING_DST(pDst, pGC);
 | 
			
		||||
    SETUP_BACKING_SRC(pSrc, pGC);
 | 
			
		||||
 | 
			
		||||
    PROLOGUE(pGC);
 | 
			
		||||
 | 
			
		||||
    odstx = dstx;
 | 
			
		||||
    odsty = dsty;
 | 
			
		||||
    osrcx = srcx;
 | 
			
		||||
    osrcy = srcy;
 | 
			
		||||
    CW_OFFSET_XY_DST(dstx, dsty);
 | 
			
		||||
    CW_OFFSET_XY_SRC(srcx, srcy);
 | 
			
		||||
 | 
			
		||||
    (*pBackingGC->ops->CopyPlane) (pBackingSrc, pBackingDst,
 | 
			
		||||
                                   pBackingGC, srcx, srcy, w, h,
 | 
			
		||||
                                   dstx, dsty, plane);
 | 
			
		||||
 | 
			
		||||
    EPILOGUE(pGC);
 | 
			
		||||
 | 
			
		||||
    return miHandleExposures(pSrc, pDst, pGC,
 | 
			
		||||
                             osrcx, osrcy, w, h, odstx, odsty, plane);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwPolyPoint(DrawablePtr pDst, GCPtr pGC, int mode, int npt, xPoint * ppt)
 | 
			
		||||
{
 | 
			
		||||
    SETUP_BACKING_DST(pDst, pGC);
 | 
			
		||||
 | 
			
		||||
    PROLOGUE(pGC);
 | 
			
		||||
 | 
			
		||||
    if (mode == CoordModeOrigin)
 | 
			
		||||
        CW_OFFSET_XYPOINTS(ppt, npt);
 | 
			
		||||
    else
 | 
			
		||||
        CW_OFFSET_XYPOINTS(ppt, 1);
 | 
			
		||||
 | 
			
		||||
    (*pBackingGC->ops->PolyPoint) (pBackingDst, pBackingGC, mode, npt, ppt);
 | 
			
		||||
 | 
			
		||||
    EPILOGUE(pGC);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwPolylines(DrawablePtr pDst, GCPtr pGC, int mode, int npt, DDXPointPtr ppt)
 | 
			
		||||
{
 | 
			
		||||
    SETUP_BACKING_DST(pDst, pGC);
 | 
			
		||||
 | 
			
		||||
    PROLOGUE(pGC);
 | 
			
		||||
 | 
			
		||||
    if (mode == CoordModeOrigin)
 | 
			
		||||
        CW_OFFSET_XYPOINTS(ppt, npt);
 | 
			
		||||
    else
 | 
			
		||||
        CW_OFFSET_XYPOINTS(ppt, 1);
 | 
			
		||||
 | 
			
		||||
    (*pBackingGC->ops->Polylines) (pBackingDst, pBackingGC, mode, npt, ppt);
 | 
			
		||||
 | 
			
		||||
    EPILOGUE(pGC);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwPolySegment(DrawablePtr pDst, GCPtr pGC, int nseg, xSegment * pSegs)
 | 
			
		||||
{
 | 
			
		||||
    SETUP_BACKING_DST(pDst, pGC);
 | 
			
		||||
 | 
			
		||||
    PROLOGUE(pGC);
 | 
			
		||||
 | 
			
		||||
    CW_OFFSET_XYPOINTS(pSegs, nseg * 2);
 | 
			
		||||
 | 
			
		||||
    (*pBackingGC->ops->PolySegment) (pBackingDst, pBackingGC, nseg, pSegs);
 | 
			
		||||
 | 
			
		||||
    EPILOGUE(pGC);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwPolyRectangle(DrawablePtr pDst, GCPtr pGC, int nrects, xRectangle *pRects)
 | 
			
		||||
{
 | 
			
		||||
    SETUP_BACKING_DST(pDst, pGC);
 | 
			
		||||
 | 
			
		||||
    PROLOGUE(pGC);
 | 
			
		||||
 | 
			
		||||
    CW_OFFSET_RECTS(pRects, nrects);
 | 
			
		||||
 | 
			
		||||
    (*pBackingGC->ops->PolyRectangle) (pBackingDst, pBackingGC, nrects, pRects);
 | 
			
		||||
 | 
			
		||||
    EPILOGUE(pGC);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwPolyArc(DrawablePtr pDst, GCPtr pGC, int narcs, xArc * pArcs)
 | 
			
		||||
{
 | 
			
		||||
    SETUP_BACKING_DST(pDst, pGC);
 | 
			
		||||
 | 
			
		||||
    PROLOGUE(pGC);
 | 
			
		||||
 | 
			
		||||
    CW_OFFSET_RECTS(pArcs, narcs);
 | 
			
		||||
 | 
			
		||||
    (*pBackingGC->ops->PolyArc) (pBackingDst, pBackingGC, narcs, pArcs);
 | 
			
		||||
 | 
			
		||||
    EPILOGUE(pGC);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwFillPolygon(DrawablePtr pDst, GCPtr pGC, int shape, int mode, int npt,
 | 
			
		||||
              DDXPointPtr ppt)
 | 
			
		||||
{
 | 
			
		||||
    SETUP_BACKING_DST(pDst, pGC);
 | 
			
		||||
 | 
			
		||||
    PROLOGUE(pGC);
 | 
			
		||||
 | 
			
		||||
    if (mode == CoordModeOrigin)
 | 
			
		||||
        CW_OFFSET_XYPOINTS(ppt, npt);
 | 
			
		||||
    else
 | 
			
		||||
        CW_OFFSET_XYPOINTS(ppt, 1);
 | 
			
		||||
 | 
			
		||||
    (*pBackingGC->ops->FillPolygon) (pBackingDst, pBackingGC, shape, mode, npt,
 | 
			
		||||
                                     ppt);
 | 
			
		||||
 | 
			
		||||
    EPILOGUE(pGC);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwPolyFillRect(DrawablePtr pDst, GCPtr pGC, int nrects, xRectangle *pRects)
 | 
			
		||||
{
 | 
			
		||||
    SETUP_BACKING_DST(pDst, pGC);
 | 
			
		||||
 | 
			
		||||
    PROLOGUE(pGC);
 | 
			
		||||
 | 
			
		||||
    CW_OFFSET_RECTS(pRects, nrects);
 | 
			
		||||
 | 
			
		||||
    (*pBackingGC->ops->PolyFillRect) (pBackingDst, pBackingGC, nrects, pRects);
 | 
			
		||||
 | 
			
		||||
    EPILOGUE(pGC);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwPolyFillArc(DrawablePtr pDst, GCPtr pGC, int narcs, xArc * parcs)
 | 
			
		||||
{
 | 
			
		||||
    SETUP_BACKING_DST(pDst, pGC);
 | 
			
		||||
 | 
			
		||||
    PROLOGUE(pGC);
 | 
			
		||||
 | 
			
		||||
    CW_OFFSET_RECTS(parcs, narcs);
 | 
			
		||||
 | 
			
		||||
    (*pBackingGC->ops->PolyFillArc) (pBackingDst, pBackingGC, narcs, parcs);
 | 
			
		||||
 | 
			
		||||
    EPILOGUE(pGC);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
cwPolyText8(DrawablePtr pDst, GCPtr pGC, int x, int y, int count, char *chars)
 | 
			
		||||
{
 | 
			
		||||
    int result;
 | 
			
		||||
 | 
			
		||||
    SETUP_BACKING_DST(pDst, pGC);
 | 
			
		||||
 | 
			
		||||
    PROLOGUE(pGC);
 | 
			
		||||
 | 
			
		||||
    CW_OFFSET_XY_DST(x, y);
 | 
			
		||||
 | 
			
		||||
    result = (*pBackingGC->ops->PolyText8) (pBackingDst, pBackingGC, x, y,
 | 
			
		||||
                                            count, chars);
 | 
			
		||||
 | 
			
		||||
    EPILOGUE(pGC);
 | 
			
		||||
 | 
			
		||||
    return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
cwPolyText16(DrawablePtr pDst, GCPtr pGC, int x, int y, int count,
 | 
			
		||||
             unsigned short *chars)
 | 
			
		||||
{
 | 
			
		||||
    int result;
 | 
			
		||||
 | 
			
		||||
    SETUP_BACKING_DST(pDst, pGC);
 | 
			
		||||
 | 
			
		||||
    PROLOGUE(pGC);
 | 
			
		||||
 | 
			
		||||
    CW_OFFSET_XY_DST(x, y);
 | 
			
		||||
 | 
			
		||||
    result = (*pBackingGC->ops->PolyText16) (pBackingDst, pBackingGC, x, y,
 | 
			
		||||
                                             count, chars);
 | 
			
		||||
 | 
			
		||||
    EPILOGUE(pGC);
 | 
			
		||||
    return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwImageText8(DrawablePtr pDst, GCPtr pGC, int x, int y, int count, char *chars)
 | 
			
		||||
{
 | 
			
		||||
    SETUP_BACKING_DST(pDst, pGC);
 | 
			
		||||
 | 
			
		||||
    PROLOGUE(pGC);
 | 
			
		||||
 | 
			
		||||
    CW_OFFSET_XY_DST(x, y);
 | 
			
		||||
 | 
			
		||||
    (*pBackingGC->ops->ImageText8) (pBackingDst, pBackingGC, x, y, count,
 | 
			
		||||
                                    chars);
 | 
			
		||||
 | 
			
		||||
    EPILOGUE(pGC);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwImageText16(DrawablePtr pDst, GCPtr pGC, int x, int y, int count,
 | 
			
		||||
              unsigned short *chars)
 | 
			
		||||
{
 | 
			
		||||
    SETUP_BACKING_DST(pDst, pGC);
 | 
			
		||||
 | 
			
		||||
    PROLOGUE(pGC);
 | 
			
		||||
 | 
			
		||||
    CW_OFFSET_XY_DST(x, y);
 | 
			
		||||
 | 
			
		||||
    (*pBackingGC->ops->ImageText16) (pBackingDst, pBackingGC, x, y, count,
 | 
			
		||||
                                     chars);
 | 
			
		||||
 | 
			
		||||
    EPILOGUE(pGC);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwImageGlyphBlt(DrawablePtr pDst, GCPtr pGC, int x, int y, unsigned int nglyph,
 | 
			
		||||
                CharInfoPtr * ppci, pointer pglyphBase)
 | 
			
		||||
{
 | 
			
		||||
    SETUP_BACKING_DST(pDst, pGC);
 | 
			
		||||
 | 
			
		||||
    PROLOGUE(pGC);
 | 
			
		||||
 | 
			
		||||
    CW_OFFSET_XY_DST(x, y);
 | 
			
		||||
 | 
			
		||||
    (*pBackingGC->ops->ImageGlyphBlt) (pBackingDst, pBackingGC, x, y, nglyph,
 | 
			
		||||
                                       ppci, pglyphBase);
 | 
			
		||||
 | 
			
		||||
    EPILOGUE(pGC);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwPolyGlyphBlt(DrawablePtr pDst, GCPtr pGC, int x, int y, unsigned int nglyph,
 | 
			
		||||
               CharInfoPtr * ppci, pointer pglyphBase)
 | 
			
		||||
{
 | 
			
		||||
    SETUP_BACKING_DST(pDst, pGC);
 | 
			
		||||
 | 
			
		||||
    PROLOGUE(pGC);
 | 
			
		||||
 | 
			
		||||
    CW_OFFSET_XY_DST(x, y);
 | 
			
		||||
 | 
			
		||||
    (*pBackingGC->ops->PolyGlyphBlt) (pBackingDst, pBackingGC, x, y, nglyph,
 | 
			
		||||
                                      ppci, pglyphBase);
 | 
			
		||||
 | 
			
		||||
    EPILOGUE(pGC);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwPushPixels(GCPtr pGC, PixmapPtr pBitMap, DrawablePtr pDst, int w, int h,
 | 
			
		||||
             int x, int y)
 | 
			
		||||
{
 | 
			
		||||
    SETUP_BACKING_DST(pDst, pGC);
 | 
			
		||||
 | 
			
		||||
    PROLOGUE(pGC);
 | 
			
		||||
 | 
			
		||||
    CW_OFFSET_XY_DST(x, y);
 | 
			
		||||
 | 
			
		||||
    (*pBackingGC->ops->PushPixels) (pBackingGC, pBitMap, pBackingDst, w, h,
 | 
			
		||||
                                    x, y);
 | 
			
		||||
 | 
			
		||||
    EPILOGUE(pGC);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,383 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright © 2004 Eric Anholt
 | 
			
		||||
 *
 | 
			
		||||
 * 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, and that the name of Eric Anholt not be used in
 | 
			
		||||
 * advertising or publicity pertaining to distribution of the software without
 | 
			
		||||
 * specific, written prior permission.  Eric Anholt makes no
 | 
			
		||||
 * representations about the suitability of this software for any purpose.  It
 | 
			
		||||
 * is provided "as is" without express or implied warranty.
 | 
			
		||||
 *
 | 
			
		||||
 * ERIC ANHOLT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | 
			
		||||
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 | 
			
		||||
 * EVENT SHALL ERIC ANHOLT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 | 
			
		||||
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 | 
			
		||||
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 | 
			
		||||
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 | 
			
		||||
 * PERFORMANCE OF THIS SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_DIX_CONFIG_H
 | 
			
		||||
#include <dix-config.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "gcstruct.h"
 | 
			
		||||
#include "windowstr.h"
 | 
			
		||||
#include "cw.h"
 | 
			
		||||
 | 
			
		||||
#define cwPsDecl(pScreen)	\
 | 
			
		||||
    PictureScreenPtr	ps = GetPictureScreen (pScreen);	\
 | 
			
		||||
    cwScreenPtr		pCwScreen = getCwScreen (pScreen)
 | 
			
		||||
 | 
			
		||||
#define cwPicturePrivate					\
 | 
			
		||||
    cwPicturePtr    pPicturePrivate = getCwPicture(pPicture)
 | 
			
		||||
 | 
			
		||||
#define cwSrcPictureDecl							\
 | 
			
		||||
    int		    src_picture_x_off, src_picture_y_off;			\
 | 
			
		||||
    PicturePtr	    pBackingSrcPicture = cwGetBackingPicture(pSrcPicture,	\
 | 
			
		||||
							     &src_picture_x_off,\
 | 
			
		||||
							     &src_picture_y_off)
 | 
			
		||||
 | 
			
		||||
#define cwDstPictureDecl							\
 | 
			
		||||
    int		    dst_picture_x_off, dst_picture_y_off;			\
 | 
			
		||||
    PicturePtr	    pBackingDstPicture = cwGetBackingPicture(pDstPicture,	\
 | 
			
		||||
							     &dst_picture_x_off,\
 | 
			
		||||
							     &dst_picture_y_off)
 | 
			
		||||
 | 
			
		||||
#define cwMskPictureDecl							\
 | 
			
		||||
    int		    msk_picture_x_off = 0, msk_picture_y_off = 0;		\
 | 
			
		||||
    PicturePtr	    pBackingMskPicture = (!pMskPicture ? 0 :	    		\
 | 
			
		||||
					  cwGetBackingPicture(pMskPicture,	\
 | 
			
		||||
							      &msk_picture_x_off,\
 | 
			
		||||
							      &msk_picture_y_off))
 | 
			
		||||
 | 
			
		||||
#define cwPsUnwrap(elt) {	\
 | 
			
		||||
    ps->elt = pCwScreen->elt;	\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define cwPsWrap(elt,func) {	\
 | 
			
		||||
    pCwScreen->elt = ps->elt;	\
 | 
			
		||||
    ps->elt = func;		\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static cwPicturePtr
 | 
			
		||||
cwCreatePicturePrivate(PicturePtr pPicture)
 | 
			
		||||
{
 | 
			
		||||
    WindowPtr pWindow = (WindowPtr) pPicture->pDrawable;
 | 
			
		||||
    PixmapPtr pPixmap = getCwPixmap(pWindow);
 | 
			
		||||
    int error;
 | 
			
		||||
    cwPicturePtr pPicturePrivate;
 | 
			
		||||
 | 
			
		||||
    pPicturePrivate = malloc(sizeof(cwPictureRec));
 | 
			
		||||
    if (!pPicturePrivate)
 | 
			
		||||
        return NULL;
 | 
			
		||||
 | 
			
		||||
    pPicturePrivate->pBackingPicture = CreatePicture(0, &pPixmap->drawable,
 | 
			
		||||
                                                     pPicture->pFormat,
 | 
			
		||||
                                                     0, 0, serverClient,
 | 
			
		||||
                                                     &error);
 | 
			
		||||
    if (!pPicturePrivate->pBackingPicture) {
 | 
			
		||||
        free(pPicturePrivate);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Ensure that this serial number does not match the window's
 | 
			
		||||
     */
 | 
			
		||||
    pPicturePrivate->serialNumber = pPixmap->drawable.serialNumber;
 | 
			
		||||
    pPicturePrivate->stateChanges = (1 << (CPLastBit + 1)) - 1;
 | 
			
		||||
 | 
			
		||||
    setCwPicture(pPicture, pPicturePrivate);
 | 
			
		||||
 | 
			
		||||
    return pPicturePrivate;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwDestroyPicturePrivate(PicturePtr pPicture)
 | 
			
		||||
{
 | 
			
		||||
    cwPicturePrivate;
 | 
			
		||||
 | 
			
		||||
    if (pPicturePrivate) {
 | 
			
		||||
        if (pPicturePrivate->pBackingPicture)
 | 
			
		||||
            FreePicture(pPicturePrivate->pBackingPicture, 0);
 | 
			
		||||
        free(pPicturePrivate);
 | 
			
		||||
        setCwPicture(pPicture, NULL);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static PicturePtr
 | 
			
		||||
cwGetBackingPicture(PicturePtr pPicture, int *x_off, int *y_off)
 | 
			
		||||
{
 | 
			
		||||
    cwPicturePrivate;
 | 
			
		||||
 | 
			
		||||
    if (pPicturePrivate) {
 | 
			
		||||
        DrawablePtr pDrawable = pPicture->pDrawable;
 | 
			
		||||
        WindowPtr pWindow = (WindowPtr) pDrawable;
 | 
			
		||||
        PixmapPtr pPixmap = getCwPixmap(pWindow);
 | 
			
		||||
 | 
			
		||||
        *x_off = pDrawable->x - pPixmap->screen_x;
 | 
			
		||||
        *y_off = pDrawable->y - pPixmap->screen_y;
 | 
			
		||||
 | 
			
		||||
        return pPicturePrivate->pBackingPicture;
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        *x_off = *y_off = 0;
 | 
			
		||||
        return pPicture;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwDestroyPicture(PicturePtr pPicture)
 | 
			
		||||
{
 | 
			
		||||
    ScreenPtr pScreen = pPicture->pDrawable->pScreen;
 | 
			
		||||
 | 
			
		||||
    cwPsDecl(pScreen);
 | 
			
		||||
 | 
			
		||||
    cwPsUnwrap(DestroyPicture);
 | 
			
		||||
    cwDestroyPicturePrivate(pPicture);
 | 
			
		||||
    (*ps->DestroyPicture) (pPicture);
 | 
			
		||||
    cwPsWrap(DestroyPicture, cwDestroyPicture);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwChangePicture(PicturePtr pPicture, Mask mask)
 | 
			
		||||
{
 | 
			
		||||
    ScreenPtr pScreen = pPicture->pDrawable->pScreen;
 | 
			
		||||
 | 
			
		||||
    cwPsDecl(pScreen);
 | 
			
		||||
    cwPicturePtr pPicturePrivate = getCwPicture(pPicture);
 | 
			
		||||
 | 
			
		||||
    cwPsUnwrap(ChangePicture);
 | 
			
		||||
    (*ps->ChangePicture) (pPicture, mask);
 | 
			
		||||
    if (pPicturePrivate)
 | 
			
		||||
        pPicturePrivate->stateChanges |= mask;
 | 
			
		||||
    cwPsWrap(ChangePicture, cwChangePicture);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwValidatePicture(PicturePtr pPicture, Mask mask)
 | 
			
		||||
{
 | 
			
		||||
    DrawablePtr pDrawable = pPicture->pDrawable;
 | 
			
		||||
    ScreenPtr pScreen = pDrawable->pScreen;
 | 
			
		||||
 | 
			
		||||
    cwPsDecl(pScreen);
 | 
			
		||||
    cwPicturePrivate;
 | 
			
		||||
 | 
			
		||||
    cwPsUnwrap(ValidatePicture);
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Must call ValidatePicture to ensure pPicture->pCompositeClip is valid
 | 
			
		||||
     */
 | 
			
		||||
    (*ps->ValidatePicture) (pPicture, mask);
 | 
			
		||||
 | 
			
		||||
    if (!cwDrawableIsRedirWindow(pDrawable)) {
 | 
			
		||||
        if (pPicturePrivate)
 | 
			
		||||
            cwDestroyPicturePrivate(pPicture);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        PicturePtr pBackingPicture;
 | 
			
		||||
        DrawablePtr pBackingDrawable;
 | 
			
		||||
        int x_off, y_off;
 | 
			
		||||
 | 
			
		||||
        pBackingDrawable = cwGetBackingDrawable(pDrawable, &x_off, &y_off);
 | 
			
		||||
 | 
			
		||||
        if (pPicturePrivate &&
 | 
			
		||||
            pPicturePrivate->pBackingPicture->pDrawable != pBackingDrawable) {
 | 
			
		||||
            cwDestroyPicturePrivate(pPicture);
 | 
			
		||||
            pPicturePrivate = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!pPicturePrivate) {
 | 
			
		||||
            pPicturePrivate = cwCreatePicturePrivate(pPicture);
 | 
			
		||||
            if (!pPicturePrivate) {
 | 
			
		||||
                cwPsWrap(ValidatePicture, cwValidatePicture);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        pBackingPicture = pPicturePrivate->pBackingPicture;
 | 
			
		||||
 | 
			
		||||
        /*
 | 
			
		||||
         * Always copy transform and filters because there's no
 | 
			
		||||
         * indication of when they've changed
 | 
			
		||||
         */
 | 
			
		||||
        SetPictureTransform(pBackingPicture, pPicture->transform);
 | 
			
		||||
 | 
			
		||||
        if (pBackingPicture->filter != pPicture->filter ||
 | 
			
		||||
            pPicture->filter_nparams > 0) {
 | 
			
		||||
            char *filter = PictureGetFilterName(pPicture->filter);
 | 
			
		||||
 | 
			
		||||
            SetPictureFilter(pBackingPicture,
 | 
			
		||||
                             filter, strlen(filter),
 | 
			
		||||
                             pPicture->filter_params, pPicture->filter_nparams);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        pPicturePrivate->stateChanges |= mask;
 | 
			
		||||
 | 
			
		||||
        if (pPicturePrivate->serialNumber != pDrawable->serialNumber ||
 | 
			
		||||
            (pPicturePrivate->
 | 
			
		||||
             stateChanges & (CPClipXOrigin | CPClipYOrigin | CPClipMask))) {
 | 
			
		||||
            SetPictureClipRegion(pBackingPicture, x_off - pDrawable->x,
 | 
			
		||||
                                 y_off - pDrawable->y,
 | 
			
		||||
                                 pPicture->pCompositeClip);
 | 
			
		||||
 | 
			
		||||
            pPicturePrivate->serialNumber = pDrawable->serialNumber;
 | 
			
		||||
            pPicturePrivate->stateChanges &=
 | 
			
		||||
                ~(CPClipXOrigin | CPClipYOrigin | CPClipMask);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        CopyPicture(pPicture, pPicturePrivate->stateChanges, pBackingPicture);
 | 
			
		||||
 | 
			
		||||
        ValidatePicture(pBackingPicture);
 | 
			
		||||
    }
 | 
			
		||||
    cwPsWrap(ValidatePicture, cwValidatePicture);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwComposite(CARD8 op,
 | 
			
		||||
            PicturePtr pSrcPicture,
 | 
			
		||||
            PicturePtr pMskPicture,
 | 
			
		||||
            PicturePtr pDstPicture,
 | 
			
		||||
            INT16 xSrc,
 | 
			
		||||
            INT16 ySrc,
 | 
			
		||||
            INT16 xMsk,
 | 
			
		||||
            INT16 yMsk, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height)
 | 
			
		||||
{
 | 
			
		||||
    ScreenPtr pScreen = pDstPicture->pDrawable->pScreen;
 | 
			
		||||
 | 
			
		||||
    cwPsDecl(pScreen);
 | 
			
		||||
    cwSrcPictureDecl;
 | 
			
		||||
    cwMskPictureDecl;
 | 
			
		||||
    cwDstPictureDecl;
 | 
			
		||||
 | 
			
		||||
    cwPsUnwrap(Composite);
 | 
			
		||||
    (*ps->Composite) (op, pBackingSrcPicture, pBackingMskPicture,
 | 
			
		||||
                      pBackingDstPicture, xSrc + src_picture_x_off,
 | 
			
		||||
                      ySrc + src_picture_y_off, xMsk + msk_picture_x_off,
 | 
			
		||||
                      yMsk + msk_picture_y_off, xDst + dst_picture_x_off,
 | 
			
		||||
                      yDst + dst_picture_y_off, width, height);
 | 
			
		||||
    cwPsWrap(Composite, cwComposite);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwCompositeRects(CARD8 op,
 | 
			
		||||
                 PicturePtr pDstPicture,
 | 
			
		||||
                 xRenderColor * color, int nRect, xRectangle *rects)
 | 
			
		||||
{
 | 
			
		||||
    ScreenPtr pScreen = pDstPicture->pDrawable->pScreen;
 | 
			
		||||
 | 
			
		||||
    cwPsDecl(pScreen);
 | 
			
		||||
    cwDstPictureDecl;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    cwPsUnwrap(CompositeRects);
 | 
			
		||||
    for (i = 0; i < nRect; i++) {
 | 
			
		||||
        rects[i].x += dst_picture_x_off;
 | 
			
		||||
        rects[i].y += dst_picture_y_off;
 | 
			
		||||
    }
 | 
			
		||||
    (*ps->CompositeRects) (op, pBackingDstPicture, color, nRect, rects);
 | 
			
		||||
    cwPsWrap(CompositeRects, cwCompositeRects);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwTrapezoids(CARD8 op,
 | 
			
		||||
             PicturePtr pSrcPicture,
 | 
			
		||||
             PicturePtr pDstPicture,
 | 
			
		||||
             PictFormatPtr maskFormat,
 | 
			
		||||
             INT16 xSrc, INT16 ySrc, int ntrap, xTrapezoid * traps)
 | 
			
		||||
{
 | 
			
		||||
    ScreenPtr pScreen = pDstPicture->pDrawable->pScreen;
 | 
			
		||||
 | 
			
		||||
    cwPsDecl(pScreen);
 | 
			
		||||
    cwSrcPictureDecl;
 | 
			
		||||
    cwDstPictureDecl;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    cwPsUnwrap(Trapezoids);
 | 
			
		||||
    if (dst_picture_x_off || dst_picture_y_off) {
 | 
			
		||||
        for (i = 0; i < ntrap; i++) {
 | 
			
		||||
            traps[i].top += dst_picture_y_off << 16;
 | 
			
		||||
            traps[i].bottom += dst_picture_y_off << 16;
 | 
			
		||||
            traps[i].left.p1.x += dst_picture_x_off << 16;
 | 
			
		||||
            traps[i].left.p1.y += dst_picture_y_off << 16;
 | 
			
		||||
            traps[i].left.p2.x += dst_picture_x_off << 16;
 | 
			
		||||
            traps[i].left.p2.y += dst_picture_y_off << 16;
 | 
			
		||||
            traps[i].right.p1.x += dst_picture_x_off << 16;
 | 
			
		||||
            traps[i].right.p1.y += dst_picture_y_off << 16;
 | 
			
		||||
            traps[i].right.p2.x += dst_picture_x_off << 16;
 | 
			
		||||
            traps[i].right.p2.y += dst_picture_y_off << 16;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    (*ps->Trapezoids) (op, pBackingSrcPicture, pBackingDstPicture, maskFormat,
 | 
			
		||||
                       xSrc + src_picture_x_off, ySrc + src_picture_y_off,
 | 
			
		||||
                       ntrap, traps);
 | 
			
		||||
    cwPsWrap(Trapezoids, cwTrapezoids);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cwTriangles(CARD8 op,
 | 
			
		||||
            PicturePtr pSrcPicture,
 | 
			
		||||
            PicturePtr pDstPicture,
 | 
			
		||||
            PictFormatPtr maskFormat,
 | 
			
		||||
            INT16 xSrc, INT16 ySrc, int ntri, xTriangle * tris)
 | 
			
		||||
{
 | 
			
		||||
    ScreenPtr pScreen = pDstPicture->pDrawable->pScreen;
 | 
			
		||||
 | 
			
		||||
    cwPsDecl(pScreen);
 | 
			
		||||
    cwSrcPictureDecl;
 | 
			
		||||
    cwDstPictureDecl;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    cwPsUnwrap(Triangles);
 | 
			
		||||
    if (dst_picture_x_off || dst_picture_y_off) {
 | 
			
		||||
        for (i = 0; i < ntri; i++) {
 | 
			
		||||
            tris[i].p1.x += dst_picture_x_off << 16;
 | 
			
		||||
            tris[i].p1.y += dst_picture_y_off << 16;
 | 
			
		||||
            tris[i].p2.x += dst_picture_x_off << 16;
 | 
			
		||||
            tris[i].p2.y += dst_picture_y_off << 16;
 | 
			
		||||
            tris[i].p3.x += dst_picture_x_off << 16;
 | 
			
		||||
            tris[i].p3.y += dst_picture_y_off << 16;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    (*ps->Triangles) (op, pBackingSrcPicture, pBackingDstPicture, maskFormat,
 | 
			
		||||
                      xSrc + src_picture_x_off, ySrc + src_picture_y_off,
 | 
			
		||||
                      ntri, tris);
 | 
			
		||||
    cwPsWrap(Triangles, cwTriangles);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
cwInitializeRender(ScreenPtr pScreen)
 | 
			
		||||
{
 | 
			
		||||
    cwPsDecl(pScreen);
 | 
			
		||||
 | 
			
		||||
    cwPsWrap(DestroyPicture, cwDestroyPicture);
 | 
			
		||||
    cwPsWrap(ChangePicture, cwChangePicture);
 | 
			
		||||
    cwPsWrap(ValidatePicture, cwValidatePicture);
 | 
			
		||||
    cwPsWrap(Composite, cwComposite);
 | 
			
		||||
    cwPsWrap(CompositeRects, cwCompositeRects);
 | 
			
		||||
    cwPsWrap(Trapezoids, cwTrapezoids);
 | 
			
		||||
    cwPsWrap(Triangles, cwTriangles);
 | 
			
		||||
    /* There is no need to wrap AddTraps as far as we can tell.  AddTraps can
 | 
			
		||||
     * only be done on alpha-only pictures, and we won't be getting
 | 
			
		||||
     * alpha-only window pictures, so there's no need to translate.
 | 
			
		||||
     */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
cwFiniRender(ScreenPtr pScreen)
 | 
			
		||||
{
 | 
			
		||||
    cwPsDecl(pScreen);
 | 
			
		||||
 | 
			
		||||
    cwPsUnwrap(DestroyPicture);
 | 
			
		||||
    cwPsUnwrap(ChangePicture);
 | 
			
		||||
    cwPsUnwrap(ValidatePicture);
 | 
			
		||||
    cwPsUnwrap(Composite);
 | 
			
		||||
    cwPsUnwrap(CompositeRects);
 | 
			
		||||
    cwPsUnwrap(Trapezoids);
 | 
			
		||||
    cwPsUnwrap(Triangles);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -38,9 +38,6 @@
 | 
			
		|||
#include    "gcstruct.h"
 | 
			
		||||
#include    "damage.h"
 | 
			
		||||
#include    "damagestr.h"
 | 
			
		||||
#ifdef COMPOSITE
 | 
			
		||||
#include    "cw.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define wrap(priv, real, mem, func) {\
 | 
			
		||||
    priv->mem = real->mem; \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue