summaryrefslogtreecommitdiff
path: root/render
diff options
context:
space:
mode:
authorAdam Jackson <ajax@redhat.com>2014-10-08 17:20:33 +0200
committerKeith Packard <keithp@keithp.com>2014-10-23 14:35:49 -0700
commit462bf87c4d1c2211dd49a5ce62d01ff84ff33970 (patch)
tree397fba28721adaf3a3c4469a589d59072516bffb /render
parent3f4edd2e3ff84c38df563b09c2e8c32404db38f7 (diff)
render: Always store client clip as a region
This does have one semantic change. FixesCreateRegionFromPicture used to throw BadImplementation if you tried to create a region from a picture with no client clip. I changed that to BadMatch here since that more honestly describes what's going on. Signed-off-by: Adam Jackson <ajax@redhat.com> Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'render')
-rw-r--r--render/mipict.c34
-rw-r--r--render/mirect.c2
-rw-r--r--render/picture.c1
-rw-r--r--render/picturestr.h3
4 files changed, 9 insertions, 31 deletions
diff --git a/render/mipict.c b/render/mipict.c
index 3959fc415..a72510480 100644
--- a/render/mipict.c
+++ b/render/mipict.c
@@ -49,23 +49,9 @@ miDestroyPicture(PicturePtr pPicture)
void
miDestroyPictureClip(PicturePtr pPicture)
{
- switch (pPicture->clientClipType) {
- case CT_NONE:
- return;
- case CT_PIXMAP:
- (*pPicture->pDrawable->pScreen->
- DestroyPixmap) ((PixmapPtr) (pPicture->clientClip));
- break;
- default:
- /*
- * we know we'll never have a list of rectangles, since ChangeClip
- * immediately turns them into a region
- */
+ if (pPicture->clientClip)
RegionDestroy(pPicture->clientClip);
- break;
- }
pPicture->clientClip = NULL;
- pPicture->clientClipType = CT_NONE;
}
int
@@ -73,37 +59,31 @@ miChangePictureClip(PicturePtr pPicture, int type, void *value, int n)
{
ScreenPtr pScreen = pPicture->pDrawable->pScreen;
PictureScreenPtr ps = GetPictureScreen(pScreen);
- void *clientClip;
- int clientClipType;
+ RegionPtr clientClip;
switch (type) {
case CT_PIXMAP:
/* convert the pixmap to a region */
- clientClip = (void *) BitmapToRegion(pScreen, (PixmapPtr) value);
+ clientClip = BitmapToRegion(pScreen, (PixmapPtr) value);
if (!clientClip)
return BadAlloc;
- clientClipType = CT_REGION;
(*pScreen->DestroyPixmap) ((PixmapPtr) value);
break;
case CT_REGION:
clientClip = value;
- clientClipType = CT_REGION;
break;
case CT_NONE:
clientClip = 0;
- clientClipType = CT_NONE;
break;
default:
- clientClip = (void *) RegionFromRects(n, (xRectangle *) value, type);
+ clientClip = RegionFromRects(n, (xRectangle *) value, type);
if (!clientClip)
return BadAlloc;
- clientClipType = CT_REGION;
free(value);
break;
}
(*ps->DestroyPictureClip) (pPicture);
pPicture->clientClip = clientClip;
- pPicture->clientClipType = clientClipType;
pPicture->stateChanges |= CPClipMask;
return Success;
}
@@ -144,7 +124,7 @@ miValidatePicture(PicturePtr pPicture, Mask mask)
* copying of regions. (this wins especially if many clients clip
* by children and have no client clip.)
*/
- if (pPicture->clientClipType == CT_NONE) {
+ if (!pPicture->clientClip) {
if (freeCompClip)
RegionDestroy(pPicture->pCompositeClip);
pPicture->pCompositeClip = pregWin;
@@ -203,7 +183,7 @@ miValidatePicture(PicturePtr pPicture, Mask mask)
pPicture->pCompositeClip = RegionCreate(&pixbounds, 1);
}
- if (pPicture->clientClipType == CT_REGION) {
+ if (pPicture->clientClip) {
if (pDrawable->x || pDrawable->y) {
RegionTranslate(pPicture->clientClip,
pDrawable->x + pPicture->clipOrigin.x,
@@ -284,7 +264,7 @@ miClipPictureReg(pixman_region16_t * pRegion,
static inline Bool
miClipPictureSrc(RegionPtr pRegion, PicturePtr pPicture, int dx, int dy)
{
- if (pPicture->clientClipType != CT_NONE) {
+ if (pPicture->clientClip) {
Bool result;
pixman_region_translate(pPicture->clientClip,
diff --git a/render/mirect.c b/render/mirect.c
index 4e76972d1..a36d1d6e3 100644
--- a/render/mirect.c
+++ b/render/mirect.c
@@ -54,7 +54,7 @@ miColorRects(PicturePtr pDst,
tmpval[1].val = pixel;
tmpval[2].val = pDst->subWindowMode;
mask = GCFunction | GCForeground | GCSubwindowMode;
- if (pClipPict->clientClipType == CT_REGION) {
+ if (pClipPict->clientClip) {
tmpval[3].val = pDst->clipOrigin.x - xoff;
tmpval[4].val = pDst->clipOrigin.y - yoff;
mask |= GCClipXOrigin | GCClipYOrigin;
diff --git a/render/picture.c b/render/picture.c
index 58535d475..cd9bc7485 100644
--- a/render/picture.c
+++ b/render/picture.c
@@ -731,7 +731,6 @@ SetPictureToDefaults(PicturePtr pPicture)
pPicture->polyEdge = PolyEdgeSharp;
pPicture->polyMode = PolyModePrecise;
pPicture->freeCompClip = FALSE;
- pPicture->clientClipType = CT_NONE;
pPicture->componentAlpha = FALSE;
pPicture->repeatType = RepeatNone;
diff --git a/render/picturestr.h b/render/picturestr.h
index 1278f620a..177f87b80 100644
--- a/render/picturestr.h
+++ b/render/picturestr.h
@@ -132,7 +132,6 @@ typedef struct _Picture {
unsigned int polyEdge:1;
unsigned int polyMode:1;
unsigned int freeCompClip:1;
- unsigned int clientClipType:2;
unsigned int componentAlpha:1;
unsigned int repeatType:2;
unsigned int filter:3;
@@ -145,7 +144,7 @@ typedef struct _Picture {
DDXPointRec alphaOrigin;
DDXPointRec clipOrigin;
- void *clientClip;
+ RegionPtr clientClip;
unsigned long serialNumber;