Simplify error-handling in dixChangeGC.

Signed-off-by: Jamey Sharp <jamey@minilop.net>
Reviewed-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
Jamey Sharp 2010-05-07 20:00:40 -07:00
parent 4080cd42fd
commit 2160ff5240

117
dix/gc.c
View File

@ -263,78 +263,68 @@ dixChangeGC(ClientPtr client, GC *pGC, BITS32 mask, CARD32 *pC32, ChangeGCValPtr
break; break;
} }
case GCTile: case GCTile:
{
XID newpix = 0;
if (pUnion) if (pUnion)
{ {
NEXT_PTR(PixmapPtr, pPixmap); NEXT_PTR(PixmapPtr, pPixmap);
rc = Success;
} }
else else
{ {
XID newpix;
NEXTVAL(XID, newpix); NEXTVAL(XID, newpix);
rc = dixLookupResourceByType((pointer *)&pPixmap, newpix, rc = dixLookupResourceByType((pointer *)&pPixmap, newpix,
RT_PIXMAP, client, DixReadAccess); RT_PIXMAP, client, DixReadAccess);
if (rc != Success)
{
clientErrorValue = newpix;
error = (rc == BadValue) ? BadPixmap : rc;
break;
}
} }
if (rc == Success) if ((pPixmap->drawable.depth != pGC->depth) ||
(pPixmap->drawable.pScreen != pGC->pScreen))
{ {
if ((pPixmap->drawable.depth != pGC->depth) || error = BadMatch;
(pPixmap->drawable.pScreen != pGC->pScreen))
{
error = BadMatch;
}
else
{
pPixmap->refcnt++;
if (!pGC->tileIsPixel)
(* pGC->pScreen->DestroyPixmap)(pGC->tile.pixmap);
pGC->tileIsPixel = FALSE;
pGC->tile.pixmap = pPixmap;
}
} }
else else
{ {
clientErrorValue = newpix; pPixmap->refcnt++;
error = (rc == BadValue) ? BadPixmap : rc; if (!pGC->tileIsPixel)
(* pGC->pScreen->DestroyPixmap)(pGC->tile.pixmap);
pGC->tileIsPixel = FALSE;
pGC->tile.pixmap = pPixmap;
} }
break; break;
}
case GCStipple: case GCStipple:
{
XID newstipple = 0;
if (pUnion) if (pUnion)
{ {
NEXT_PTR(PixmapPtr, pPixmap); NEXT_PTR(PixmapPtr, pPixmap);
rc = Success;
} }
else else
{ {
XID newstipple;
NEXTVAL(XID, newstipple) NEXTVAL(XID, newstipple)
rc = dixLookupResourceByType((pointer *)&pPixmap, newstipple, rc = dixLookupResourceByType((pointer *)&pPixmap, newstipple,
RT_PIXMAP, client, DixReadAccess); RT_PIXMAP, client, DixReadAccess);
if (rc != Success)
{
clientErrorValue = newstipple;
error = (rc == BadValue) ? BadPixmap : rc;
break;
}
} }
if (rc == Success) if ((pPixmap->drawable.depth != 1) ||
(pPixmap->drawable.pScreen != pGC->pScreen))
{ {
if ((pPixmap->drawable.depth != 1) || error = BadMatch;
(pPixmap->drawable.pScreen != pGC->pScreen))
{
error = BadMatch;
}
else
{
pPixmap->refcnt++;
if (pGC->stipple)
(* pGC->pScreen->DestroyPixmap)(pGC->stipple);
pGC->stipple = pPixmap;
}
} }
else else
{ {
clientErrorValue = newstipple; pPixmap->refcnt++;
error = (rc == BadValue) ? BadPixmap : rc; if (pGC->stipple)
(* pGC->pScreen->DestroyPixmap)(pGC->stipple);
pGC->stipple = pPixmap;
} }
break; break;
}
case GCTileStipXOrigin: case GCTileStipXOrigin:
NEXTVAL(INT16, pGC->patOrg.x); NEXTVAL(INT16, pGC->patOrg.x);
break; break;
@ -344,30 +334,27 @@ dixChangeGC(ClientPtr client, GC *pGC, BITS32 mask, CARD32 *pC32, ChangeGCValPtr
case GCFont: case GCFont:
{ {
FontPtr pFont; FontPtr pFont;
XID newfont = 0;
if (pUnion) if (pUnion)
{ {
NEXT_PTR(FontPtr, pFont); NEXT_PTR(FontPtr, pFont);
rc = Success;
} }
else else
{ {
XID newfont;
NEXTVAL(XID, newfont) NEXTVAL(XID, newfont)
rc = dixLookupResourceByType((pointer *)&pFont, newfont, rc = dixLookupResourceByType((pointer *)&pFont, newfont,
RT_FONT, client, DixUseAccess); RT_FONT, client, DixUseAccess);
if (rc != Success)
{
clientErrorValue = newfont;
error = (rc == BadValue) ? BadFont : rc;
break;
}
} }
if (rc == Success) pFont->refcnt++;
{ if (pGC->font)
pFont->refcnt++; CloseFont(pGC->font, (Font)0);
if (pGC->font) pGC->font = pFont;
CloseFont(pGC->font, (Font)0);
pGC->font = pFont;
}
else
{
clientErrorValue = newfont;
error = (rc == BadValue) ? BadFont : rc;
}
break; break;
} }
case GCSubwindowMode: case GCSubwindowMode:
@ -403,22 +390,16 @@ dixChangeGC(ClientPtr client, GC *pGC, BITS32 mask, CARD32 *pC32, ChangeGCValPtr
NEXTVAL(INT16, pGC->clipOrg.y); NEXTVAL(INT16, pGC->clipOrg.y);
break; break;
case GCClipMask: case GCClipMask:
{
Pixmap pid = 0;
int clipType = 0;
if (pUnion) if (pUnion)
{ {
NEXT_PTR(PixmapPtr, pPixmap); NEXT_PTR(PixmapPtr, pPixmap);
} }
else else
{ {
Pixmap pid;
NEXTVAL(Pixmap, pid) NEXTVAL(Pixmap, pid)
if (pid == None) if (pid == None)
{
clipType = CT_NONE;
pPixmap = NullPixmap; pPixmap = NullPixmap;
}
else { else {
rc = dixLookupResourceByType((pointer *)&pPixmap, pid, rc = dixLookupResourceByType((pointer *)&pPixmap, pid,
RT_PIXMAP, client, RT_PIXMAP, client,
@ -426,6 +407,7 @@ dixChangeGC(ClientPtr client, GC *pGC, BITS32 mask, CARD32 *pC32, ChangeGCValPtr
if (rc != Success) { if (rc != Success) {
clientErrorValue = pid; clientErrorValue = pid;
error = (rc == BadValue) ? BadPixmap : rc; error = (rc == BadValue) ? BadPixmap : rc;
break;
} }
} }
} }
@ -436,20 +418,13 @@ dixChangeGC(ClientPtr client, GC *pGC, BITS32 mask, CARD32 *pC32, ChangeGCValPtr
(pPixmap->drawable.pScreen != pGC->pScreen)) (pPixmap->drawable.pScreen != pGC->pScreen))
{ {
error = BadMatch; error = BadMatch;
break;
} }
else pPixmap->refcnt++;
{
clipType = CT_PIXMAP;
pPixmap->refcnt++;
}
}
if(error == Success)
{
(*pGC->funcs->ChangeClip)(pGC, clipType,
(pointer)pPixmap, 0);
} }
(*pGC->funcs->ChangeClip)(pGC, pPixmap ? CT_PIXMAP : CT_NONE,
(pointer)pPixmap, 0);
break; break;
}
case GCDashOffset: case GCDashOffset:
NEXTVAL(INT16, pGC->dashOffset); NEXTVAL(INT16, pGC->dashOffset);
break; break;