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/sync/Makefile
|
||||||
miext/damage/Makefile
|
miext/damage/Makefile
|
||||||
miext/shadow/Makefile
|
miext/shadow/Makefile
|
||||||
miext/cw/Makefile
|
|
||||||
miext/rootless/Makefile
|
miext/rootless/Makefile
|
||||||
os/Makefile
|
os/Makefile
|
||||||
randr/Makefile
|
randr/Makefile
|
||||||
|
|
|
@ -1,11 +1,8 @@
|
||||||
SUBDIRS = sync damage shadow
|
SUBDIRS = sync damage shadow
|
||||||
if COMPOSITE
|
|
||||||
SUBDIRS += cw
|
|
||||||
endif
|
|
||||||
if XQUARTZ
|
if XQUARTZ
|
||||||
SUBDIRS += rootless
|
SUBDIRS += rootless
|
||||||
endif
|
endif
|
||||||
if XWIN_MULTIWINDOWEXTWM
|
if XWIN_MULTIWINDOWEXTWM
|
||||||
SUBDIRS += rootless
|
SUBDIRS += rootless
|
||||||
endif
|
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 "gcstruct.h"
|
||||||
#include "damage.h"
|
#include "damage.h"
|
||||||
#include "damagestr.h"
|
#include "damagestr.h"
|
||||||
#ifdef COMPOSITE
|
|
||||||
#include "cw.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define wrap(priv, real, mem, func) {\
|
#define wrap(priv, real, mem, func) {\
|
||||||
priv->mem = real->mem; \
|
priv->mem = real->mem; \
|
||||||
|
|
Loading…
Reference in New Issue