diff options
Diffstat (limited to 'xserver/mi/migc.c')
-rw-r--r-- | xserver/mi/migc.c | 307 |
1 files changed, 144 insertions, 163 deletions
diff --git a/xserver/mi/migc.c b/xserver/mi/migc.c index 6d734e1b6..c9cdd12af 100644 --- a/xserver/mi/migc.c +++ b/xserver/mi/migc.c @@ -26,7 +26,6 @@ from The Open Group. */ - #ifdef HAVE_DIX_CONFIG_H #include <dix-config.h> #endif @@ -48,78 +47,73 @@ void miDestroyGC(GCPtr pGC) { if (pGC->pRotatedPixmap) - (*pGC->pScreen->DestroyPixmap) (pGC->pRotatedPixmap); + (*pGC->pScreen->DestroyPixmap) (pGC->pRotatedPixmap); if (pGC->freeCompClip) - RegionDestroy(pGC->pCompositeClip); + RegionDestroy(pGC->pCompositeClip); } void miDestroyClip(GCPtr pGC) { if (pGC->clientClipType == CT_NONE) - return; - else if (pGC->clientClipType == CT_PIXMAP) - { - (*pGC->pScreen->DestroyPixmap) ((PixmapPtr) (pGC->clientClip)); + return; + else if (pGC->clientClipType == CT_PIXMAP) { + (*pGC->pScreen->DestroyPixmap) ((PixmapPtr) (pGC->clientClip)); } - else - { - /* - * we know we'll never have a list of rectangles, since ChangeClip - * immediately turns them into a region - */ - RegionDestroy(pGC->clientClip); + else { + /* + * we know we'll never have a list of rectangles, since ChangeClip + * immediately turns them into a region + */ + RegionDestroy(pGC->clientClip); } pGC->clientClip = NULL; pGC->clientClipType = CT_NONE; } void -miChangeClip( GCPtr pGC, int type, pointer pvalue, int nrects) +miChangeClip(GCPtr pGC, int type, pointer pvalue, int nrects) { (*pGC->funcs->DestroyClip) (pGC); - if (type == CT_PIXMAP) - { - /* convert the pixmap to a region */ - pGC->clientClip = (pointer) BitmapToRegion(pGC->pScreen, - (PixmapPtr) pvalue); - (*pGC->pScreen->DestroyPixmap) (pvalue); + if (type == CT_PIXMAP) { + /* convert the pixmap to a region */ + pGC->clientClip = (pointer) 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_REGION) { + /* stuff the region in the GC */ + pGC->clientClip = pvalue; } - else if (type != CT_NONE) - { - pGC->clientClip = (pointer) RegionFromRects(nrects, - (xRectangle *) pvalue, - type); - free(pvalue); + else if (type != CT_NONE) { + pGC->clientClip = (pointer) RegionFromRects(nrects, + (xRectangle *) pvalue, + type); + free(pvalue); } - pGC->clientClipType = (type != CT_NONE && pGC->clientClip) ? CT_REGION : CT_NONE; + pGC->clientClipType = (type != CT_NONE && + pGC->clientClip) ? CT_REGION : CT_NONE; pGC->stateChanges |= GCClipMask; } void miCopyClip(GCPtr pgcDst, GCPtr pgcSrc) { - RegionPtr prgnNew; - - switch (pgcSrc->clientClipType) - { - case CT_PIXMAP: - ((PixmapPtr) pgcSrc->clientClip)->refcnt++; - /* Fall through !! */ - case CT_NONE: - (*pgcDst->funcs->ChangeClip) (pgcDst, (int) pgcSrc->clientClipType, - pgcSrc->clientClip, 0); - break; - case CT_REGION: - prgnNew = RegionCreate(NULL, 1); - RegionCopy(prgnNew, (RegionPtr) (pgcSrc->clientClip)); - (*pgcDst->funcs->ChangeClip) (pgcDst, CT_REGION, (pointer) prgnNew, 0); - break; + RegionPtr prgnNew; + + switch (pgcSrc->clientClipType) { + case CT_PIXMAP: + ((PixmapPtr) pgcSrc->clientClip)->refcnt++; + /* Fall through !! */ + case CT_NONE: + (*pgcDst->funcs->ChangeClip) (pgcDst, (int) pgcSrc->clientClipType, + pgcSrc->clientClip, 0); + break; + case CT_REGION: + prgnNew = RegionCreate(NULL, 1); + RegionCopy(prgnNew, (RegionPtr) (pgcSrc->clientClip)); + (*pgcDst->funcs->ChangeClip) (pgcDst, CT_REGION, (pointer) prgnNew, 0); + break; } } @@ -131,119 +125,106 @@ miCopyGC(GCPtr pGCSrc, unsigned long changes, GCPtr pGCDst) } void -miComputeCompositeClip( GCPtr pGC, DrawablePtr pDrawable) +miComputeCompositeClip(GCPtr pGC, DrawablePtr pDrawable) { - if (pDrawable->type == DRAWABLE_WINDOW) - { - WindowPtr pWin = (WindowPtr) pDrawable; - RegionPtr pregWin; - Bool freeTmpClip, freeCompClip; - - if (pGC->subWindowMode == IncludeInferiors) - { - pregWin = NotClippedByChildren(pWin); - freeTmpClip = TRUE; - } - else - { - pregWin = &pWin->clipList; - freeTmpClip = FALSE; - } - freeCompClip = pGC->freeCompClip; - - /* - * if there is no client clip, we can get by with just keeping the - * pointer we got, and remembering whether or not should destroy (or - * maybe re-use) it later. this way, we avoid unnecessary copying of - * regions. (this wins especially if many clients clip by children - * and have no client clip.) - */ - if (pGC->clientClipType == CT_NONE) - { - if (freeCompClip) - RegionDestroy(pGC->pCompositeClip); - pGC->pCompositeClip = pregWin; - pGC->freeCompClip = freeTmpClip; - } - else - { - /* - * we need one 'real' region to put into the composite clip. if - * pregWin the current composite clip are real, we can get rid of - * one. if pregWin is real and the current composite clip isn't, - * use pregWin for the composite clip. if the current composite - * clip is real and pregWin isn't, use the current composite - * clip. if neither is real, create a new region. - */ - - RegionTranslate(pGC->clientClip, - pDrawable->x + pGC->clipOrg.x, - pDrawable->y + pGC->clipOrg.y); - - if (freeCompClip) - { - RegionIntersect(pGC->pCompositeClip, - pregWin, pGC->clientClip); - if (freeTmpClip) - RegionDestroy(pregWin); - } - else if (freeTmpClip) - { - RegionIntersect(pregWin, pregWin, pGC->clientClip); - pGC->pCompositeClip = pregWin; - } - else - { - pGC->pCompositeClip = RegionCreate(NullBox, 0); - RegionIntersect(pGC->pCompositeClip, - pregWin, pGC->clientClip); - } - pGC->freeCompClip = TRUE; - RegionTranslate(pGC->clientClip, - -(pDrawable->x + pGC->clipOrg.x), - -(pDrawable->y + pGC->clipOrg.y)); - } - } /* end of composite clip for a window */ - else - { - BoxRec pixbounds; - - /* XXX should we translate by drawable.x/y here ? */ - /* If you want pixmaps in offscreen memory, yes */ - pixbounds.x1 = pDrawable->x; - pixbounds.y1 = pDrawable->y; - pixbounds.x2 = pDrawable->x + pDrawable->width; - pixbounds.y2 = pDrawable->y + pDrawable->height; - - if (pGC->freeCompClip) - { - RegionReset(pGC->pCompositeClip, &pixbounds); - } - else - { - pGC->freeCompClip = TRUE; - pGC->pCompositeClip = RegionCreate(&pixbounds, 1); - } - - if (pGC->clientClipType == CT_REGION) - { - if(pDrawable->x || pDrawable->y) { - RegionTranslate(pGC->clientClip, - pDrawable->x + pGC->clipOrg.x, - pDrawable->y + pGC->clipOrg.y); - RegionIntersect(pGC->pCompositeClip, - pGC->pCompositeClip, pGC->clientClip); - RegionTranslate(pGC->clientClip, - -(pDrawable->x + pGC->clipOrg.x), - -(pDrawable->y + pGC->clipOrg.y)); - } else { - RegionTranslate(pGC->pCompositeClip, - -pGC->clipOrg.x, -pGC->clipOrg.y); - RegionIntersect(pGC->pCompositeClip, - pGC->pCompositeClip, pGC->clientClip); - RegionTranslate(pGC->pCompositeClip, - pGC->clipOrg.x, pGC->clipOrg.y); - } - } - } /* end of composite clip for pixmap */ -} /* end miComputeCompositeClip */ + if (pDrawable->type == DRAWABLE_WINDOW) { + WindowPtr pWin = (WindowPtr) pDrawable; + RegionPtr pregWin; + Bool freeTmpClip, freeCompClip; + + if (pGC->subWindowMode == IncludeInferiors) { + pregWin = NotClippedByChildren(pWin); + freeTmpClip = TRUE; + } + else { + pregWin = &pWin->clipList; + freeTmpClip = FALSE; + } + freeCompClip = pGC->freeCompClip; + + /* + * if there is no client clip, we can get by with just keeping the + * pointer we got, and remembering whether or not should destroy (or + * maybe re-use) it later. this way, we avoid unnecessary copying of + * regions. (this wins especially if many clients clip by children + * and have no client clip.) + */ + if (pGC->clientClipType == CT_NONE) { + if (freeCompClip) + RegionDestroy(pGC->pCompositeClip); + pGC->pCompositeClip = pregWin; + pGC->freeCompClip = freeTmpClip; + } + else { + /* + * we need one 'real' region to put into the composite clip. if + * pregWin the current composite clip are real, we can get rid of + * one. if pregWin is real and the current composite clip isn't, + * use pregWin for the composite clip. if the current composite + * clip is real and pregWin isn't, use the current composite + * clip. if neither is real, create a new region. + */ + + RegionTranslate(pGC->clientClip, + pDrawable->x + pGC->clipOrg.x, + pDrawable->y + pGC->clipOrg.y); + + if (freeCompClip) { + RegionIntersect(pGC->pCompositeClip, pregWin, pGC->clientClip); + if (freeTmpClip) + RegionDestroy(pregWin); + } + else if (freeTmpClip) { + RegionIntersect(pregWin, pregWin, pGC->clientClip); + pGC->pCompositeClip = pregWin; + } + else { + pGC->pCompositeClip = RegionCreate(NullBox, 0); + RegionIntersect(pGC->pCompositeClip, pregWin, pGC->clientClip); + } + pGC->freeCompClip = TRUE; + RegionTranslate(pGC->clientClip, + -(pDrawable->x + pGC->clipOrg.x), + -(pDrawable->y + pGC->clipOrg.y)); + } + } /* end of composite clip for a window */ + else { + BoxRec pixbounds; + + /* XXX should we translate by drawable.x/y here ? */ + /* If you want pixmaps in offscreen memory, yes */ + pixbounds.x1 = pDrawable->x; + pixbounds.y1 = pDrawable->y; + pixbounds.x2 = pDrawable->x + pDrawable->width; + pixbounds.y2 = pDrawable->y + pDrawable->height; + + if (pGC->freeCompClip) { + RegionReset(pGC->pCompositeClip, &pixbounds); + } + else { + pGC->freeCompClip = TRUE; + pGC->pCompositeClip = RegionCreate(&pixbounds, 1); + } + + if (pGC->clientClipType == CT_REGION) { + if (pDrawable->x || pDrawable->y) { + RegionTranslate(pGC->clientClip, + pDrawable->x + pGC->clipOrg.x, + pDrawable->y + pGC->clipOrg.y); + RegionIntersect(pGC->pCompositeClip, + pGC->pCompositeClip, pGC->clientClip); + RegionTranslate(pGC->clientClip, + -(pDrawable->x + pGC->clipOrg.x), + -(pDrawable->y + pGC->clipOrg.y)); + } + else { + RegionTranslate(pGC->pCompositeClip, + -pGC->clipOrg.x, -pGC->clipOrg.y); + RegionIntersect(pGC->pCompositeClip, + pGC->pCompositeClip, pGC->clientClip); + RegionTranslate(pGC->pCompositeClip, + pGC->clipOrg.x, pGC->clipOrg.y); + } + } + } /* end of composite clip for pixmap */ +} /* end miComputeCompositeClip */ |