Nearly every server uses the mi versions of these; allowing them to be replaced and wrapped is a waste of code and time.
Xnest and Xdmx required a bit of special handling as they were using the ChangeClip function to send the updated clip lists to the underlying X server. Moving that code up into ChangeGC is a functional replacement, although for Xnest, it means we're always sending rectangles and never a bitmap. Signed-off-by: Keith Packard <[email protected]> --- Xext/panoramiX.c | 33 +------- dix/gc.c | 52 +++++++++++-- exa/exa.c | 47 +---------- fb/fbgc.c | 11 +-- glamor/glamor_core.c | 11 +-- hw/dmx/dmxgc.c | 110 ++++++++------------------ hw/dmx/dmxgc.h | 3 - hw/xfree86/common/xf86VGAarbiter.c | 31 +------- hw/xfree86/common/xf86VGAarbiterPriv.h | 4 - hw/xfree86/drivers/modesetting/dri2.c | 2 +- hw/xnest/GC.c | 138 ++++++--------------------------- hw/xnest/XNGC.h | 3 - include/gc.h | 6 ++ include/gcstruct.h | 11 +-- mi/mibitblt.c | 4 +- mi/migc.c | 40 ---------- mi/migc.h | 10 --- miext/damage/damage.c | 33 +------- miext/rootless/rootlessGC.c | 38 +-------- present/present.c | 4 +- render/mirect.c | 2 +- xfixes/region.c | 3 +- 22 files changed, 143 insertions(+), 453 deletions(-) diff --git a/Xext/panoramiX.c b/Xext/panoramiX.c index 209df292c..23d9103a8 100644 --- a/Xext/panoramiX.c +++ b/Xext/panoramiX.c @@ -130,13 +130,12 @@ static void XineramaValidateGC(GCPtr, unsigned long, DrawablePtr); static void XineramaChangeGC(GCPtr, unsigned long); static void XineramaCopyGC(GCPtr, unsigned long, GCPtr); static void XineramaDestroyGC(GCPtr); -static void XineramaChangeClip(GCPtr, int, void *, int); -static void XineramaDestroyClip(GCPtr); -static void XineramaCopyClip(GCPtr, GCPtr); static const GCFuncs XineramaGCFuncs = { - XineramaValidateGC, XineramaChangeGC, XineramaCopyGC, XineramaDestroyGC, - XineramaChangeClip, XineramaDestroyClip, XineramaCopyClip + .ValidateGC = XineramaValidateGC, + .ChangeGC = XineramaChangeGC, + .CopyGC = XineramaCopyGC, + .DestroyGC = XineramaDestroyGC, }; #define Xinerama_GC_FUNC_PROLOGUE(pGC)\ @@ -293,30 +292,6 @@ XineramaCopyGC(GCPtr pGCSrc, unsigned long mask, GCPtr pGCDst) Xinerama_GC_FUNC_EPILOGUE(pGCDst); } -static void -XineramaChangeClip(GCPtr pGC, int type, void *pvalue, int nrects) -{ - Xinerama_GC_FUNC_PROLOGUE(pGC); - (*pGC->funcs->ChangeClip) (pGC, type, pvalue, nrects); - Xinerama_GC_FUNC_EPILOGUE(pGC); -} - -static void -XineramaCopyClip(GCPtr pgcDst, GCPtr pgcSrc) -{ - Xinerama_GC_FUNC_PROLOGUE(pgcDst); - (*pgcDst->funcs->CopyClip) (pgcDst, pgcSrc); - Xinerama_GC_FUNC_EPILOGUE(pgcDst); -} - -static void -XineramaDestroyClip(GCPtr pGC) -{ - Xinerama_GC_FUNC_PROLOGUE(pGC); - (*pGC->funcs->DestroyClip) (pGC); - Xinerama_GC_FUNC_EPILOGUE(pGC); -} - int XineramaDeleteResource(void *data, XID id) { diff --git a/dix/gc.c b/dix/gc.c index cb8db8535..920620e80 100644 --- a/dix/gc.c +++ b/dix/gc.c @@ -340,8 +340,7 @@ ChangeGC(ClientPtr client, GC * pGC, BITS32 mask, ChangeGCValPtr pUnion) } pPixmap->refcnt++; } - (*pGC->funcs->ChangeClip) (pGC, pPixmap ? CT_PIXMAP : CT_NONE, - (void *) pPixmap, 0); + ChangeClip (pGC, pPixmap ? CT_PIXMAP : CT_NONE, (void *) pPixmap, 0); break; case GCDashOffset: NEXTVAL(INT16, pGC->dashOffset); @@ -712,7 +711,7 @@ CopyGC(GC * pgcSrc, GC * pgcDst, BITS32 mask) pgcDst->clipOrg.y = pgcSrc->clipOrg.y; break; case GCClipMask: - (*pgcDst->funcs->CopyClip) (pgcDst, pgcSrc); + CopyClip (pgcDst, pgcSrc); break; case GCDashOffset: pgcDst->dashOffset = pgcSrc->dashOffset; @@ -770,7 +769,7 @@ FreeGC(void *value, XID gid) GCPtr pGC = (GCPtr) value; CloseFont(pGC->font, (Font) 0); - (*pGC->funcs->DestroyClip) (pGC); + DestroyClip (pGC); if (!pGC->tileIsPixel) (*pGC->pScreen->DestroyPixmap) (pGC->tile.pixmap); @@ -1022,13 +1021,54 @@ SetClipRects(GCPtr pGC, int xOrigin, int yOrigin, int nrects, if (size) memmove((char *) prectsNew, (char *) prects, size); - (*pGC->funcs->ChangeClip) (pGC, newct, (void *) prectsNew, nrects); + ChangeClip (pGC, newct, (void *) prectsNew, nrects); if (pGC->funcs->ChangeGC) (*pGC->funcs->ChangeGC) (pGC, GCClipXOrigin | GCClipYOrigin | GCClipMask); return Success; } +/* Manipulate clip list */ +void +DestroyClip(GCPtr pGC) +{ + if (pGC->clientClip) + RegionDestroy(pGC->clientClip); + pGC->clientClip = NULL; +} + +void +ChangeClip(GCPtr pGC, int type, void *pvalue, int nrects) +{ + DestroyClip (pGC); + if (type == CT_PIXMAP) { + /* convert the pixmap to a region */ + pGC->clientClip = BitmapToRegion(pGC->pScreen, (PixmapPtr) pvalue); + (*pGC->pScreen->DestroyPixmap) (pvalue); + } + else if (type == CT_REGION) { + /* stuff the region in the GC */ + pGC->clientClip = pvalue; + } + else if (type != CT_NONE) { + pGC->clientClip = RegionFromRects(nrects, (xRectangle *) pvalue, type); + free(pvalue); + } + pGC->stateChanges |= GCClipMask; +} + +void +CopyClip(GCPtr pgcDst, GCPtr pgcSrc) +{ + if (pgcSrc->clientClip) { + RegionPtr prgnNew = RegionCreate(NULL, 1); + RegionCopy(prgnNew, (RegionPtr) (pgcSrc->clientClip)); + ChangeClip (pgcDst, CT_REGION, prgnNew, 0); + } else { + ChangeClip (pgcDst, CT_NONE, NULL, 0); + } +} + /* sets reasonable defaults if we can get a pre-allocated one, use it and mark it as used. @@ -1065,7 +1105,7 @@ GetScratchGC(unsigned depth, ScreenPtr pScreen) pGC->clipOrg.x = 0; pGC->clipOrg.y = 0; if (pGC->clientClip) - (*pGC->funcs->ChangeClip) (pGC, CT_NONE, NULL, 0); + ChangeClip (pGC, CT_NONE, NULL, 0); pGC->stateChanges = GCAllBits; return pGC; } diff --git a/exa/exa.c b/exa/exa.c index 7266b71f9..e9f65c317 100644 --- a/exa/exa.c +++ b/exa/exa.c @@ -474,23 +474,11 @@ static void static void exaCopyGC(GCPtr pGCSrc, unsigned long mask, GCPtr pGCDst); -static void - exaChangeClip(GCPtr pGC, int type, void *pvalue, int nrects); - -static void - exaCopyClip(GCPtr pGCDst, GCPtr pGCSrc); - -static void - exaDestroyClip(GCPtr pGC); - const GCFuncs exaGCFuncs = { - exaValidateGC, - exaChangeGC, - exaCopyGC, - exaDestroyGC, - exaChangeClip, - exaDestroyClip, - exaCopyClip + .ValidateGC = exaValidateGC, + .ChangeGC = exaChangeGC, + .CopyGC =exaCopyGC, + .DestroyGC = exaDestroyGC, }; static void @@ -578,33 +566,6 @@ exaCopyGC(GCPtr pGCSrc, unsigned long mask, GCPtr pGCDst) swap(pExaGC, pGCDst, funcs); } -static void -exaChangeClip(GCPtr pGC, int type, void *pvalue, int nrects) -{ - ExaGCPriv(pGC); - swap(pExaGC, pGC, funcs); - (*pGC->funcs->ChangeClip) (pGC, type, pvalue, nrects); - swap(pExaGC, pGC, funcs); -} - -static void -exaCopyClip(GCPtr pGCDst, GCPtr pGCSrc) -{ - ExaGCPriv(pGCDst); - swap(pExaGC, pGCDst, funcs); - (*pGCDst->funcs->CopyClip) (pGCDst, pGCSrc); - swap(pExaGC, pGCDst, funcs); -} - -static void -exaDestroyClip(GCPtr pGC) -{ - ExaGCPriv(pGC); - swap(pExaGC, pGC, funcs); - (*pGC->funcs->DestroyClip) (pGC); - swap(pExaGC, pGC, funcs); -} - /** * exaCreateGC makes a new GC and hooks up its funcs handler, so that * exaValidateGC() will get called. diff --git a/fb/fbgc.c b/fb/fbgc.c index 19c613158..4cef28409 100644 --- a/fb/fbgc.c +++ b/fb/fbgc.c @@ -29,13 +29,10 @@ #include "fb.h" const GCFuncs fbGCFuncs = { - fbValidateGC, - miChangeGC, - miCopyGC, - miDestroyGC, - miChangeClip, - miDestroyClip, - miCopyClip, + .ValidateGC = fbValidateGC, + .ChangeGC = miChangeGC, + .CopyGC = miCopyGC, + .DestroyGC = miDestroyGC, }; const GCOps fbGCOps = { diff --git a/glamor/glamor_core.c b/glamor/glamor_core.c index 7b2b39633..54006873e 100644 --- a/glamor/glamor_core.c +++ b/glamor/glamor_core.c @@ -303,13 +303,10 @@ glamor_destroy_gc(GCPtr gc) } static GCFuncs glamor_gc_funcs = { - glamor_validate_gc, - miChangeGC, - miCopyGC, - glamor_destroy_gc, - miChangeClip, - miDestroyClip, - miCopyClip + .ValidateGC = glamor_validate_gc, + .ChangeGC = miChangeGC, + .CopyGC = miCopyGC, + .DestroyGC = glamor_destroy_gc, }; /** diff --git a/hw/dmx/dmxgc.c b/hw/dmx/dmxgc.c index c4789a607..5a592c23d 100644 --- a/hw/dmx/dmxgc.c +++ b/hw/dmx/dmxgc.c @@ -50,13 +50,10 @@ #include "migc.h" static const GCFuncs dmxGCFuncs = { - dmxValidateGC, - dmxChangeGC, - dmxCopyGC, - dmxDestroyGC, - dmxChangeClip, - dmxDestroyClip, - dmxCopyClip, + .ValidateGC = dmxValidateGC, + .ChangeGC = dmxChangeGC, + .CopyGC = dmxCopyGC, + .DestroyGC = dmxDestroyGC, }; static const GCOps dmxGCOps = { @@ -300,8 +297,34 @@ dmxChangeGC(GCPtr pGC, unsigned long mask) v.clip_x_origin = pGC->clipOrg.x; if (mask & GCClipYOrigin) v.clip_y_origin = pGC->clipOrg.y; - if (mask & GCClipMask) - mask &= ~GCClipMask; /* See ChangeClip */ + if (mask & GCClipMask) { + mask &= ~GCClipMask; + /* Set the client clip on the back-end server */ + if (!pGC->clientClip) { + if (dmxScreen->beDisplay) + XSetClipMask(dmxScreen->beDisplay, pGCPriv->gc, None); + } else { + if (dmxScreen->beDisplay) { + int nRects = RegionNumRects((RegionPtr) pGC->clientClip); + XRectangle *pRects = xallocarray(nRects, sizeof(*pRects)); + BoxPtr pBox = RegionRects((RegionPtr) pGC->clientClip); + int i; + + for (i = 0; i < nRects; i++) { + pRects[i].x = pBox[i].x1; + pRects[i].y = pBox[i].y1; + pRects[i].width = pBox[i].x2 - pBox[i].x1; + pRects[i].height = pBox[i].y2 - pBox[i].y1; + } + + XSetClipRectangles(dmxScreen->beDisplay, pGCPriv->gc, + pGC->clipOrg.x, pGC->clipOrg.y, + pRects, nRects, Unsorted); + + free(pRects); + } + } + } if (mask & GCDashOffset) v.dash_offset = pGC->dashOffset; if (mask & GCDashList) { @@ -375,72 +398,3 @@ dmxDestroyGC(GCPtr pGC) pGC->funcs->DestroyGC(pGC); DMX_GC_FUNC_EPILOGUE(pGC); } - -/** Change the clip rects for a GC. */ -void -dmxChangeClip(GCPtr pGC, int type, void *pvalue, int nrects) -{ - ScreenPtr pScreen = pGC->pScreen; - DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum]; - dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC); - XRectangle *pRects; - BoxPtr pBox; - int i, nRects; - - DMX_GC_FUNC_PROLOGUE(pGC); - pGC->funcs->ChangeClip(pGC, type, pvalue, nrects); - - /* Set the client clip on the back-end server */ - if (!pGC->clientClip) { - if (dmxScreen->beDisplay) - XSetClipMask(dmxScreen->beDisplay, pGCPriv->gc, None); - } else { - if (dmxScreen->beDisplay) { - nRects = RegionNumRects((RegionPtr) pGC->clientClip); - pRects = xallocarray(nRects, sizeof(*pRects)); - pBox = RegionRects((RegionPtr) pGC->clientClip); - - for (i = 0; i < nRects; i++) { - pRects[i].x = pBox[i].x1; - pRects[i].y = pBox[i].y1; - pRects[i].width = pBox[i].x2 - pBox[i].x1; - pRects[i].height = pBox[i].y2 - pBox[i].y1; - } - - XSetClipRectangles(dmxScreen->beDisplay, pGCPriv->gc, - pGC->clipOrg.x, pGC->clipOrg.y, - pRects, nRects, Unsorted); - - free(pRects); - } - } - - DMX_GC_FUNC_EPILOGUE(pGC); -} - -/** Destroy a GC's clip rects. */ -void -dmxDestroyClip(GCPtr pGC) -{ - ScreenPtr pScreen = pGC->pScreen; - DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum]; - dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC); - - DMX_GC_FUNC_PROLOGUE(pGC); - pGC->funcs->DestroyClip(pGC); - - /* Set the client clip on the back-end server to None */ - if (dmxScreen->beDisplay) - XSetClipMask(dmxScreen->beDisplay, pGCPriv->gc, None); - - DMX_GC_FUNC_EPILOGUE(pGC); -} - -/** Copy a GC's clip rects. */ -void -dmxCopyClip(GCPtr pGCDst, GCPtr pGCSrc) -{ - DMX_GC_FUNC_PROLOGUE(pGCDst); - pGCDst->funcs->CopyClip(pGCDst, pGCSrc); - DMX_GC_FUNC_EPILOGUE(pGCDst); -} diff --git a/hw/dmx/dmxgc.h b/hw/dmx/dmxgc.h index c5c6b7732..62a9a4dea 100644 --- a/hw/dmx/dmxgc.h +++ b/hw/dmx/dmxgc.h @@ -55,9 +55,6 @@ extern void dmxValidateGC(GCPtr pGC, unsigned long changes, extern void dmxChangeGC(GCPtr pGC, unsigned long mask); extern void dmxCopyGC(GCPtr pGCSrc, unsigned long changes, GCPtr pGCDst); extern void dmxDestroyGC(GCPtr pGC); -extern void dmxChangeClip(GCPtr pGC, int type, void *pvalue, int nrects); -extern void dmxDestroyClip(GCPtr pGC); -extern void dmxCopyClip(GCPtr pGCDst, GCPtr pGCSrc); extern void dmxBECreateGC(ScreenPtr pScreen, GCPtr pGC); extern Bool dmxBEFreeGC(GCPtr pGC); diff --git a/hw/xfree86/common/xf86VGAarbiter.c b/hw/xfree86/common/xf86VGAarbiter.c index 40f241aee..42264c087 100644 --- a/hw/xfree86/common/xf86VGAarbiter.c +++ b/hw/xfree86/common/xf86VGAarbiter.c @@ -37,9 +37,10 @@ #include "pciaccess.h" static GCFuncs VGAarbiterGCFuncs = { - VGAarbiterValidateGC, VGAarbiterChangeGC, VGAarbiterCopyGC, - VGAarbiterDestroyGC, VGAarbiterChangeClip, VGAarbiterDestroyClip, - VGAarbiterCopyClip + .ValidateGC = VGAarbiterValidateGC, + .ChangeGC = VGAarbiterChangeGC, + .CopyGC = VGAarbiterCopyGC, + .DestroyGC = VGAarbiterDestroyGC, }; static GCOps VGAarbiterGCOps = { @@ -583,30 +584,6 @@ VGAarbiterCopyGC(GCPtr pGCSrc, unsigned long mask, GCPtr pGCDst) GC_WRAP(pGCDst); } -static void -VGAarbiterChangeClip(GCPtr pGC, int type, void *pvalue, int nrects) -{ - GC_UNWRAP(pGC); - (*pGC->funcs->ChangeClip) (pGC, type, pvalue, nrects); - GC_WRAP(pGC); -} - -static void -VGAarbiterCopyClip(GCPtr pgcDst, GCPtr pgcSrc) -{ - GC_UNWRAP(pgcDst); - (*pgcDst->funcs->CopyClip) (pgcDst, pgcSrc); - GC_WRAP(pgcDst); -} - -static void -VGAarbiterDestroyClip(GCPtr pGC) -{ - GC_UNWRAP(pGC); - (*pGC->funcs->DestroyClip) (pGC); - GC_WRAP(pGC); -} - /* GC Ops */ static void VGAarbiterFillSpans(DrawablePtr pDraw, diff --git a/hw/xfree86/common/xf86VGAarbiterPriv.h b/hw/xfree86/common/xf86VGAarbiterPriv.h index 09be10aa3..6bd65292c 100644 --- a/hw/xfree86/common/xf86VGAarbiterPriv.h +++ b/hw/xfree86/common/xf86VGAarbiterPriv.h @@ -190,10 +190,6 @@ static void VGAarbiterValidateGC(GCPtr pGC, unsigned long changes, static void VGAarbiterChangeGC(GCPtr pGC, unsigned long mask); static void VGAarbiterCopyGC(GCPtr pGCSrc, unsigned long mask, GCPtr pGCDst); static void VGAarbiterDestroyGC(GCPtr pGC); -static void VGAarbiterChangeClip(GCPtr pGC, int type, void *pvalue, - int nrects); -static void VGAarbiterDestroyClip(GCPtr pGC); -static void VGAarbiterCopyClip(GCPtr pgcDst, GCPtr pgcSrc); /* GC ops */ static void VGAarbiterFillSpans(DrawablePtr pDraw, GC * pGC, int nInit, diff --git a/hw/xfree86/drivers/modesetting/dri2.c b/hw/xfree86/drivers/modesetting/dri2.c index 8944ef136..48ae6bc8e 100644 --- a/hw/xfree86/drivers/modesetting/dri2.c +++ b/hw/xfree86/drivers/modesetting/dri2.c @@ -303,7 +303,7 @@ ms_dri2_copy_region2(ScreenPtr screen, DrawablePtr drawable, RegionPtr pRegion, REGION_COPY(screen, pCopyClip, pRegion); if (translate) REGION_TRANSLATE(screen, pCopyClip, off_x, off_y); - (*gc->funcs->ChangeClip) (gc, CT_REGION, pCopyClip, 0); + ChangeClip(gc, CT_REGION, pCopyClip, 0); ValidateGC(dst, gc); /* It's important that this copy gets submitted before the direct diff --git a/hw/xnest/GC.c b/hw/xnest/GC.c index ecfa61e39..9db9f432c 100644 --- a/hw/xnest/GC.c +++ b/hw/xnest/GC.c @@ -38,13 +38,10 @@ is" without express or implied warranty. DevPrivateKeyRec xnestGCPrivateKeyRec; static GCFuncs xnestFuncs = { - xnestValidateGC, - xnestChangeGC, - xnestCopyGC, - xnestDestroyGC, - xnestChangeClip, - xnestDestroyClip, - xnestCopyClip, + .ValidateGC = xnestValidateGC, + .ChangeGC = xnestChangeGC, + .CopyGC = xnestCopyGC, + .DestroyGC = xnestDestroyGC, }; static GCOps xnestOps = { @@ -156,8 +153,26 @@ xnestChangeGC(GCPtr pGC, unsigned long mask) if (mask & GCClipYOrigin) values.clip_y_origin = pGC->clipOrg.y; - if (mask & GCClipMask) /* this is handled in change clip */ + if (mask & GCClipMask) { mask &= ~GCClipMask; + if (pGC->clientClip == NULL) { + XSetClipMask(xnestDisplay, xnestGC(pGC), None); + } else { + int nRects = RegionNumRects(pGC->clientClip); + XRectangle *pRects = xallocarray(nRects, sizeof(*pRects)); + BoxPtr pBox = RegionRects(pGC->clientClip); + int i; + for (i = nRects; i-- > 0;) { + pRects[i].x = pBox[i].x1; + pRects[i].y = pBox[i].y1; + pRects[i].width = pBox[i].x2 - pBox[i].x1; + pRects[i].height = pBox[i].y2 - pBox[i].y1; + } + XSetClipRectangles(xnestDisplay, xnestGC(pGC), 0, 0, + pRects, nRects, Unsorted); + free((char *) pRects); + } + } if (mask & GCDashOffset) values.dash_offset = pGC->dashOffset; @@ -186,110 +201,3 @@ xnestDestroyGC(GCPtr pGC) { XFreeGC(xnestDisplay, xnestGC(pGC)); } - -void -xnestChangeClip(GCPtr pGC, int type, void *pValue, int nRects) -{ - int i; - BoxPtr pBox; - XRectangle *pRects; - - xnestDestroyClip(pGC); - - switch (type) { - case CT_NONE: - XSetClipMask(xnestDisplay, xnestGC(pGC), None); - pValue = NULL; - break; - - case CT_REGION: - nRects = RegionNumRects((RegionPtr) pValue); - pRects = xallocarray(nRects, sizeof(*pRects)); - pBox = RegionRects((RegionPtr) pValue); - for (i = nRects; i-- > 0;) { - pRects[i].x = pBox[i].x1; - pRects[i].y = pBox[i].y1; - pRects[i].width = pBox[i].x2 - pBox[i].x1; - pRects[i].height = pBox[i].y2 - pBox[i].y1; - } - XSetClipRectangles(xnestDisplay, xnestGC(pGC), 0, 0, - pRects, nRects, Unsorted); - free((char *) pRects); - break; - - case CT_PIXMAP: - XSetClipMask(xnestDisplay, xnestGC(pGC), - xnestPixmap((PixmapPtr) pValue)); - /* - * Need to change into region, so subsequent uses are with - * current pixmap contents. - */ - pGC->clientClip = (*pGC->pScreen->BitmapToRegion) ((PixmapPtr) pValue); - (*pGC->pScreen->DestroyPixmap) ((PixmapPtr) pValue); - pValue = pGC->clientClip; - break; - - case CT_UNSORTED: - XSetClipRectangles(xnestDisplay, xnestGC(pGC), - pGC->clipOrg.x, pGC->clipOrg.y, - (XRectangle *) pValue, nRects, Unsorted); - break; - - case CT_YSORTED: - XSetClipRectangles(xnestDisplay, xnestGC(pGC), - pGC->clipOrg.x, pGC->clipOrg.y, - (XRectangle *) pValue, nRects, YSorted); - break; - - case CT_YXSORTED: - XSetClipRectangles(xnestDisplay, xnestGC(pGC), - pGC->clipOrg.x, pGC->clipOrg.y, - (XRectangle *) pValue, nRects, YXSorted); - break; - - case CT_YXBANDED: - XSetClipRectangles(xnestDisplay, xnestGC(pGC), - pGC->clipOrg.x, pGC->clipOrg.y, - (XRectangle *) pValue, nRects, YXBanded); - break; - } - - switch (type) { - default: - break; - - case CT_UNSORTED: - case CT_YSORTED: - case CT_YXSORTED: - case CT_YXBANDED: - /* server clip representation is a region */ - pGC->clientClip = RegionFromRects(nRects, (xRectangle *) pValue, type); - free(pValue); - pValue = pGC->clientClip; - break; - } - - pGC->clientClip = pValue; -} - -void -xnestDestroyClip(GCPtr pGC) -{ - if (pGC->clientClip) { - RegionDestroy(pGC->clientClip); - XSetClipMask(xnestDisplay, xnestGC(pGC), None); - pGC->clientClip = NULL; - } -} - -void -xnestCopyClip(GCPtr pGCDst, GCPtr pGCSrc) -{ - if (pGCSrc->clientClip) { - RegionPtr pRgn = RegionCreate(NULL, 1); - RegionCopy(pRgn, pGCSrc->clientClip); - xnestChangeClip(pGCDst, CT_REGION, pRgn, 0); - } else { - xnestDestroyClip(pGCDst); - } -} diff --git a/hw/xnest/XNGC.h b/hw/xnest/XNGC.h index 974173e50..c1ec6fa92 100644 --- a/hw/xnest/XNGC.h +++ b/hw/xnest/XNGC.h @@ -35,8 +35,5 @@ void xnestValidateGC(GCPtr pGC, unsigned long changes, DrawablePtr pDrawable); void xnestChangeGC(GCPtr pGC, unsigned long mask); void xnestCopyGC(GCPtr pGCSrc, unsigned long mask, GCPtr pGCDst); void xnestDestroyGC(GCPtr pGC); -void xnestChangeClip(GCPtr pGC, int type, void *pValue, int nRects); -void xnestDestroyClip(GCPtr pGC); -void xnestCopyClip(GCPtr pGCDst, GCPtr pGCSrc); #endif /* XNESTGC_H */ diff --git a/include/gc.h b/include/gc.h index 53f9c29e1..5f217739a 100644 --- a/include/gc.h +++ b/include/gc.h @@ -144,4 +144,10 @@ extern _X_EXPORT GCPtr GetScratchGC(unsigned /*depth */ , extern _X_EXPORT void FreeScratchGC(GCPtr /*pGC */ ); +extern _X_EXPORT void DestroyClip(GCPtr pGC); + +extern _X_EXPORT void ChangeClip(GCPtr pGC, int type, void *pvalue, int nrects); + +extern _X_EXPORT void CopyClip(GCPtr pgcDst, GCPtr pgcSrc); + #endif /* GC_H */ diff --git a/include/gcstruct.h b/include/gcstruct.h index e48d61045..e756c226d 100644 --- a/include/gcstruct.h +++ b/include/gcstruct.h @@ -75,18 +75,9 @@ typedef struct _GCFuncs { GCPtr /*pGCDst */ ); void (*DestroyGC) (GCPtr /*pGC */ ); - - void (*ChangeClip) (GCPtr pGC, - int type, - void *pvalue, - int nrects); - - void (*DestroyClip) (GCPtr /*pGC */ ); - - void (*CopyClip) (GCPtr /*pgcDst */ , - GCPtr /*pgcSrc */ ); } GCFuncs; + /* * graphics operations invoked through a GC */ diff --git a/mi/mibitblt.c b/mi/mibitblt.c index 28296a449..e65050aeb 100644 --- a/mi/mibitblt.c +++ b/mi/mibitblt.c @@ -414,7 +414,7 @@ miOpqStipDrawable(DrawablePtr pDraw, GCPtr pGC, RegionPtr prgnSrc, prgnSrcClip = RegionCreate(NULL, 0); RegionCopy(prgnSrcClip, prgnSrc); RegionTranslate(prgnSrcClip, srcx, 0); - (*pGCT->funcs->ChangeClip) (pGCT, CT_REGION, prgnSrcClip, 0); + ChangeClip(pGCT, CT_REGION, prgnSrcClip, 0); ValidateGC((DrawablePtr) pPixmap, pGCT); /* Since we know pDraw is always a pixmap, we never need to think @@ -497,7 +497,7 @@ miOpqStipDrawable(DrawablePtr pDraw, GCPtr pGC, RegionPtr prgnSrc, ValidateGC(pDraw, pGC); /* put what we hope is a smaller clip region back in the scratch gc */ - (*pGCT->funcs->ChangeClip) (pGCT, CT_NONE, NULL, 0); + ChangeClip(pGCT, CT_NONE, NULL, 0); FreeScratchGC(pGCT); (*pDraw->pScreen->DestroyPixmap) (pPixmap); diff --git a/mi/migc.c b/mi/migc.c index 8fdd4810c..bfb3bacbe 100644 --- a/mi/migc.c +++ b/mi/migc.c @@ -52,46 +52,6 @@ miDestroyGC(GCPtr pGC) RegionDestroy(pGC->pCompositeClip); } -void -miDestroyClip(GCPtr pGC) -{ - if (pGC->clientClip) - RegionDestroy(pGC->clientClip); - pGC->clientClip = NULL; -} - -void -miChangeClip(GCPtr pGC, int type, void *pvalue, int nrects) -{ - (*pGC->funcs->DestroyClip) (pGC); - if (type == CT_PIXMAP) { - /* convert the pixmap to a region */ - pGC->clientClip = BitmapToRegion(pGC->pScreen, (PixmapPtr) pvalue); - (*pGC->pScreen->DestroyPixmap) (pvalue); - } - else if (type == CT_REGION) { - /* stuff the region in the GC */ - pGC->clientClip = pvalue; - } - else if (type != CT_NONE) { - pGC->clientClip = RegionFromRects(nrects, (xRectangle *) pvalue, type); - free(pvalue); - } - pGC->stateChanges |= GCClipMask; -} - -void -miCopyClip(GCPtr pgcDst, GCPtr pgcSrc) -{ - if (pgcSrc->clientClip) { - RegionPtr prgnNew = RegionCreate(NULL, 1); - RegionCopy(prgnNew, (RegionPtr) (pgcSrc->clientClip)); - (*pgcDst->funcs->ChangeClip) (pgcDst, CT_REGION, prgnNew, 0); - } else { - (*pgcDst->funcs->ChangeClip) (pgcDst, CT_NONE, NULL, 0); - } -} - /* ARGSUSED */ void miCopyGC(GCPtr pGCSrc, unsigned long changes, GCPtr pGCDst) diff --git a/mi/migc.h b/mi/migc.h index add601a94..59526f3e2 100644 --- a/mi/migc.h +++ b/mi/migc.h @@ -34,16 +34,6 @@ extern _X_EXPORT void miChangeGC(GCPtr pGC, extern _X_EXPORT void miDestroyGC(GCPtr pGC); -extern _X_EXPORT void miDestroyClip(GCPtr pGC); - -extern _X_EXPORT void miChangeClip(GCPtr pGC, - int type, - void *pvalue, - int nrects); - -extern _X_EXPORT void miCopyClip(GCPtr pgcDst, - GCPtr pgcSrc); - extern _X_EXPORT void miCopyGC(GCPtr pGCSrc, unsigned long changes, GCPtr pGCDst); diff --git a/miext/damage/damage.c b/miext/damage/damage.c index 2fae03fc2..385e5fe0f 100644 --- a/miext/damage/damage.c +++ b/miext/damage/damage.c @@ -328,13 +328,12 @@ static void damageValidateGC(GCPtr, unsigned long, DrawablePtr); static void damageChangeGC(GCPtr, unsigned long); static void damageCopyGC(GCPtr, unsigned long, GCPtr); static void damageDestroyGC(GCPtr); -static void damageChangeClip(GCPtr, int, void *, int); -static void damageDestroyClip(GCPtr); -static void damageCopyClip(GCPtr, GCPtr); static GCFuncs damageGCFuncs = { - damageValidateGC, damageChangeGC, damageCopyGC, damageDestroyGC, - damageChangeClip, damageDestroyClip, damageCopyClip + .ValidateGC = damageValidateGC, + .ChangeGC = damageChangeGC, + .CopyGC = damageCopyGC, + .DestroyGC = damageDestroyGC, }; static GCOps damageGCOps; @@ -411,30 +410,6 @@ damageCopyGC(GCPtr pGCSrc, unsigned long mask, GCPtr pGCDst) DAMAGE_GC_FUNC_EPILOGUE(pGCDst); } -static void -damageChangeClip(GCPtr pGC, int type, void *pvalue, int nrects) -{ - DAMAGE_GC_FUNC_PROLOGUE(pGC); - (*pGC->funcs->ChangeClip) (pGC, type, pvalue, nrects); - DAMAGE_GC_FUNC_EPILOGUE(pGC); -} - -static void -damageCopyClip(GCPtr pgcDst, GCPtr pgcSrc) -{ - DAMAGE_GC_FUNC_PROLOGUE(pgcDst); - (*pgcDst->funcs->CopyClip) (pgcDst, pgcSrc); - DAMAGE_GC_FUNC_EPILOGUE(pgcDst); -} - -static void -damageDestroyClip(GCPtr pGC) -{ - DAMAGE_GC_FUNC_PROLOGUE(pGC); - (*pGC->funcs->DestroyClip) (pGC); - DAMAGE_GC_FUNC_EPILOGUE(pGC); -} - #define TRIM_BOX(box, pGC) if (pGC->pCompositeClip) { \ BoxPtr extents = &pGC->pCompositeClip->extents;\ if(box.x1 < extents->x1) box.x1 = extents->x1; \ diff --git a/miext/rootless/rootlessGC.c b/miext/rootless/rootlessGC.c index 235b3ab7c..da3697e4c 100644 --- a/miext/rootless/rootlessGC.c +++ b/miext/rootless/rootlessGC.c @@ -55,20 +55,14 @@ static void RootlessValidateGC(GCPtr pGC, unsigned long changes, static void RootlessChangeGC(GCPtr pGC, unsigned long mask); static void RootlessCopyGC(GCPtr pGCSrc, unsigned long mask, GCPtr pGCDst); static void RootlessDestroyGC(GCPtr pGC); -static void RootlessChangeClip(GCPtr pGC, int type, void *pvalue, int nrects); -static void RootlessDestroyClip(GCPtr pGC); -static void RootlessCopyClip(GCPtr pgcDst, GCPtr pgcSrc); Bool RootlessCreateGC(GCPtr pGC); GCFuncs rootlessGCFuncs = { - RootlessValidateGC, - RootlessChangeGC, - RootlessCopyGC, - RootlessDestroyGC, - RootlessChangeClip, - RootlessDestroyClip, - RootlessCopyClip, + .ValidateGC = RootlessValidateGC, + .ChangeGC = RootlessChangeGC, + .CopyGC = RootlessCopyGC, + .DestroyGC = RootlessDestroyGC, }; // GC operations @@ -367,30 +361,6 @@ RootlessDestroyGC(GCPtr pGC) GCFUNC_WRAP(pGC); } -static void -RootlessChangeClip(GCPtr pGC, int type, void *pvalue, int nrects) -{ - GCFUNC_UNWRAP(pGC); - pGC->funcs->ChangeClip(pGC, type, pvalue, nrects); - GCFUNC_WRAP(pGC); -} - -static void -RootlessDestroyClip(GCPtr pGC) -{ - GCFUNC_UNWRAP(pGC); - pGC->funcs->DestroyClip(pGC); - GCFUNC_WRAP(pGC); -} - -static void -RootlessCopyClip(GCPtr pgcDst, GCPtr pgcSrc) -{ - GCFUNC_UNWRAP(pgcDst); - pgcDst->funcs->CopyClip(pgcDst, pgcSrc); - GCFUNC_WRAP(pgcDst); -} - /* * GC ops * diff --git a/present/present.c b/present/present.c index aa9c041df..16091f613 100644 --- a/present/present.c +++ b/present/present.c @@ -89,7 +89,7 @@ present_copy_region(DrawablePtr drawable, ChangeGC(serverClient, gc, GCClipXOrigin|GCClipYOrigin, changes); - (*gc->funcs->ChangeClip)(gc, CT_REGION, update, 0); + ChangeClip(gc, CT_REGION, update, 0); } ValidateGC(drawable, gc); (*gc->ops->CopyArea)(&pixmap->drawable, @@ -99,7 +99,7 @@ present_copy_region(DrawablePtr drawable, pixmap->drawable.width, pixmap->drawable.height, x_off, y_off); if (update) - (*gc->funcs->ChangeClip)(gc, CT_NONE, NULL, 0); + ChangeClip(gc, CT_NONE, NULL, 0); FreeScratchGC(gc); } diff --git a/render/mirect.c b/render/mirect.c index a36d1d6e3..0ef23872d 100644 --- a/render/mirect.c +++ b/render/mirect.c @@ -61,7 +61,7 @@ miColorRects(PicturePtr pDst, pClip = RegionCreate(NULL, 1); RegionCopy(pClip, (RegionPtr) pClipPict->clientClip); - (*pGC->funcs->ChangeClip) (pGC, CT_REGION, pClip, 0); + ChangeClip(pGC, CT_REGION, pClip, 0); } ChangeGC(NullClient, pGC, mask, tmpval); diff --git a/xfixes/region.c b/xfixes/region.c index e7737011e..f1fed6cb9 100644 --- a/xfixes/region.c +++ b/xfixes/region.c @@ -616,8 +616,7 @@ ProcXFixesSetGCClipRegion(ClientPtr client) vals[0].val = stuff->xOrigin; vals[1].val = stuff->yOrigin; ChangeGC(NullClient, pGC, GCClipXOrigin | GCClipYOrigin, vals); - (*pGC->funcs->ChangeClip) (pGC, pRegion ? CT_REGION : CT_NONE, - (void *) pRegion, 0); + ChangeClip(pGC, pRegion ? CT_REGION : CT_NONE, (void *) pRegion, 0); return Success; } -- 2.11.0 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel
