mirror of
https://github.com/X11Libre/xserver.git
synced 2026-11-01 03:03:58 +00:00
dix: Always store GC client clip as a region (v2)
Again, this changes FixesCreateRegionFromGC to throw BadMatch when fed a GC with no client clip. v2: Fix Xnest and some variable names (Keith) Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
parent
e7b9295551
commit
73e2383b73
15 changed files with 53 additions and 133 deletions
|
|
@ -413,7 +413,7 @@ exaHWCopyNtoN(DrawablePtr pSrcDrawable,
|
|||
|
||||
if (!pGC || !exaGCReadsDestination(pDstDrawable, pGC->planemask,
|
||||
pGC->fillStyle, pGC->alu,
|
||||
pGC->clientClipType)) {
|
||||
pGC->clientClip != NULL)) {
|
||||
dstregion = RegionCreate(NullBox, 0);
|
||||
RegionCopy(dstregion, srcregion);
|
||||
RegionTranslate(dstregion, dst_off_x - dx - src_off_x,
|
||||
|
|
@ -771,7 +771,7 @@ exaPolySegment(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment * pSeg)
|
|||
|
||||
static Bool exaFillRegionSolid(DrawablePtr pDrawable, RegionPtr pRegion,
|
||||
Pixel pixel, CARD32 planemask, CARD32 alu,
|
||||
unsigned int clientClipType);
|
||||
Bool hasClientClip);
|
||||
|
||||
static void
|
||||
exaPolyFillRect(DrawablePtr pDrawable, GCPtr pGC, int nrect, xRectangle *prect)
|
||||
|
|
@ -816,11 +816,11 @@ exaPolyFillRect(DrawablePtr pDrawable, GCPtr pGC, int nrect, xRectangle *prect)
|
|||
if (((pGC->fillStyle == FillSolid || pGC->tileIsPixel) &&
|
||||
exaFillRegionSolid(pDrawable, pReg, pGC->fillStyle == FillSolid ?
|
||||
pGC->fgPixel : pGC->tile.pixel, pGC->planemask,
|
||||
pGC->alu, pGC->clientClipType)) ||
|
||||
pGC->alu, pGC->clientClip != NULL)) ||
|
||||
(pGC->fillStyle == FillTiled && !pGC->tileIsPixel &&
|
||||
exaFillRegionTiled(pDrawable, pReg, pGC->tile.pixmap, &pGC->patOrg,
|
||||
pGC->planemask, pGC->alu,
|
||||
pGC->clientClipType))) {
|
||||
pGC->clientClip != NULL))) {
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
|
@ -990,7 +990,7 @@ exaCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
|
|||
|
||||
static Bool
|
||||
exaFillRegionSolid(DrawablePtr pDrawable, RegionPtr pRegion, Pixel pixel,
|
||||
CARD32 planemask, CARD32 alu, unsigned int clientClipType)
|
||||
CARD32 planemask, CARD32 alu, Bool hasClientClip)
|
||||
{
|
||||
ExaScreenPriv(pDrawable->pScreen);
|
||||
PixmapPtr pPixmap = exaGetDrawablePixmap(pDrawable);
|
||||
|
|
@ -1013,8 +1013,7 @@ exaFillRegionSolid(DrawablePtr pDrawable, RegionPtr pRegion, Pixel pixel,
|
|||
pixmaps[0].pPix = pPixmap;
|
||||
pixmaps[0].pReg = exaGCReadsDestination(pDrawable, planemask, FillSolid,
|
||||
alu,
|
||||
clientClipType) ? NULL :
|
||||
pRegion;
|
||||
hasClientClip) ? NULL : pRegion;
|
||||
|
||||
exaDoMigration(pixmaps, 1, TRUE);
|
||||
}
|
||||
|
|
@ -1074,7 +1073,7 @@ exaFillRegionSolid(DrawablePtr pDrawable, RegionPtr pRegion, Pixel pixel,
|
|||
Bool
|
||||
exaFillRegionTiled(DrawablePtr pDrawable, RegionPtr pRegion, PixmapPtr pTile,
|
||||
DDXPointPtr pPatOrg, CARD32 planemask, CARD32 alu,
|
||||
unsigned int clientClipType)
|
||||
Bool hasClientClip)
|
||||
{
|
||||
ExaScreenPriv(pDrawable->pScreen);
|
||||
PixmapPtr pPixmap;
|
||||
|
|
@ -1096,7 +1095,7 @@ exaFillRegionTiled(DrawablePtr pDrawable, RegionPtr pRegion, PixmapPtr pTile,
|
|||
if (tileWidth == 1 && tileHeight == 1)
|
||||
return exaFillRegionSolid(pDrawable, pRegion,
|
||||
exaGetPixmapFirstPixel(pTile), planemask,
|
||||
alu, clientClipType);
|
||||
alu, hasClientClip);
|
||||
|
||||
pPixmap = exaGetDrawablePixmap(pDrawable);
|
||||
pExaPixmap = ExaGetPixmapPriv(pPixmap);
|
||||
|
|
@ -1113,8 +1112,7 @@ exaFillRegionTiled(DrawablePtr pDrawable, RegionPtr pRegion, PixmapPtr pTile,
|
|||
pixmaps[0].pPix = pPixmap;
|
||||
pixmaps[0].pReg = exaGCReadsDestination(pDrawable, planemask, FillTiled,
|
||||
alu,
|
||||
clientClipType) ? NULL :
|
||||
pRegion;
|
||||
hasClientClip) ? NULL : pRegion;
|
||||
pixmaps[1].as_dst = FALSE;
|
||||
pixmaps[1].as_src = TRUE;
|
||||
pixmaps[1].pPix = pTile;
|
||||
|
|
|
|||
|
|
@ -455,12 +455,11 @@ ExaCheckAddTraps(PicturePtr pPicture,
|
|||
static _X_INLINE Bool
|
||||
exaGCReadsDestination(DrawablePtr pDrawable, unsigned long planemask,
|
||||
unsigned int fillStyle, unsigned char alu,
|
||||
unsigned int clientClipType)
|
||||
Bool clientClip)
|
||||
{
|
||||
return ((alu != GXcopy && alu != GXclear && alu != GXset &&
|
||||
alu != GXcopyInverted) || fillStyle == FillStippled ||
|
||||
clientClipType != CT_NONE ||
|
||||
!EXA_PM_IS_SOLID(pDrawable, planemask));
|
||||
clientClip != FALSE || !EXA_PM_IS_SOLID(pDrawable, planemask));
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -470,7 +469,7 @@ Bool
|
|||
|
||||
exaFillRegionTiled(DrawablePtr pDrawable, RegionPtr pRegion, PixmapPtr pTile,
|
||||
DDXPointPtr pPatOrg, CARD32 planemask, CARD32 alu,
|
||||
unsigned int clientClipType);
|
||||
Bool clientClip);
|
||||
|
||||
void
|
||||
|
||||
|
|
|
|||
|
|
@ -107,7 +107,7 @@ ExaCheckPutImage(DrawablePtr pDrawable, GCPtr pGC, int depth,
|
|||
EXA_FALLBACK(("to %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable)));
|
||||
if (!pExaScr->prepare_access_reg || !pExaPixmap->pDamage ||
|
||||
exaGCReadsDestination(pDrawable, pGC->planemask, pGC->fillStyle,
|
||||
pGC->alu, pGC->clientClipType))
|
||||
pGC->alu, pGC->clientClip != NULL))
|
||||
exaPrepareAccess(pDrawable, EXA_PREPARE_DEST);
|
||||
else
|
||||
pExaScr->prepare_access_reg(pPixmap, EXA_PREPARE_DEST,
|
||||
|
|
@ -143,7 +143,7 @@ ExaCheckCopyNtoN(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
|
|||
|
||||
if (pExaScr->prepare_access_reg &&
|
||||
!exaGCReadsDestination(pDst, pGC->planemask, pGC->fillStyle,
|
||||
pGC->alu, pGC->clientClipType) &&
|
||||
pGC->alu, pGC->clientClip != NULL) &&
|
||||
RegionInitBoxes(®, pbox, nbox)) {
|
||||
PixmapPtr pPixmap = exaGetDrawablePixmap(pDst);
|
||||
|
||||
|
|
@ -179,10 +179,9 @@ ExaFallbackPrepareReg(DrawablePtr pDrawable,
|
|||
ExaScreenPriv(pScreen);
|
||||
|
||||
if (pExaScr->prepare_access_reg &&
|
||||
!(checkReads && exaGCReadsDestination(pDrawable,
|
||||
pGC->planemask,
|
||||
pGC->fillStyle,
|
||||
pGC->alu, pGC->clientClipType))) {
|
||||
!(checkReads && exaGCReadsDestination(pDrawable, pGC->planemask,
|
||||
pGC->fillStyle, pGC->alu,
|
||||
pGC->clientClip != NULL))) {
|
||||
BoxRec box;
|
||||
RegionRec reg;
|
||||
int xoff, yoff;
|
||||
|
|
|
|||
Loading…
Reference in a new issue