Commit df9d37da authored by Ulrich Sibiller's avatar Ulrich Sibiller Committed by Mike Gabriel

GC.c: introduce helper macros for GC management

parent 9693d8b9
...@@ -297,85 +297,27 @@ void nxagentValidateGC(GCPtr pGC, unsigned long changes, DrawablePtr pDrawable) ...@@ -297,85 +297,27 @@ void nxagentValidateGC(GCPtr pGC, unsigned long changes, DrawablePtr pDrawable)
pGC->stipple = lastStipple; pGC->stipple = lastStipple;
} }
#define CHECKGCVAL(cmask, member, val) do {if (mask & cmask) { values.member = (val); changeFlag += nxagentTestGC(values.member, member); } } while (0)
void nxagentChangeGC(GCPtr pGC, unsigned long mask) void nxagentChangeGC(GCPtr pGC, unsigned long mask)
{ {
#ifdef TEST #ifdef TEST
static int nDiscarded; static int nDiscarded;
#endif #endif
XGCValues values; XGCValues values = {0};
int changeFlag = 0; int changeFlag = 0;
if (mask & GCFunction) CHECKGCVAL(GCFunction, function, pGC->alu);
{ CHECKGCVAL(GCPlaneMask, plane_mask, pGC->planemask);
values.function = pGC->alu; CHECKGCVAL(GCForeground, foreground, nxagentPixel(pGC->fgPixel));
CHECKGCVAL(GCBackground, background, nxagentPixel(pGC->bgPixel));
changeFlag |= nxagentTestGC(values.function, function); CHECKGCVAL(GCLineWidth, line_width, pGC->lineWidth);
} CHECKGCVAL(GCLineStyle, line_style, pGC->lineStyle);
CHECKGCVAL(GCCapStyle, cap_style, pGC->capStyle);
if (mask & GCPlaneMask) CHECKGCVAL(GCJoinStyle, join_style, pGC->joinStyle);
{ CHECKGCVAL(GCFillStyle, fill_style, pGC->fillStyle);
values.plane_mask = pGC->planemask; CHECKGCVAL(GCFillRule, fill_rule, pGC->fillRule);
changeFlag += nxagentTestGC(values.plane_mask, plane_mask);
}
if (mask & GCForeground)
{
values.foreground = nxagentPixel(pGC->fgPixel);
changeFlag += nxagentTestGC(values.foreground, foreground);
}
if (mask & GCBackground)
{
values.background = nxagentPixel(pGC->bgPixel);
changeFlag += nxagentTestGC(values.background, background);
}
if (mask & GCLineWidth)
{
values.line_width = pGC->lineWidth;
changeFlag += nxagentTestGC(values.line_width, line_width);
}
if (mask & GCLineStyle)
{
values.line_style = pGC->lineStyle;
changeFlag += nxagentTestGC(values.line_style, line_style);
}
if (mask & GCCapStyle)
{
values.cap_style = pGC->capStyle;
changeFlag += nxagentTestGC(values.cap_style, cap_style);
}
if (mask & GCJoinStyle)
{
values.join_style = pGC->joinStyle;
changeFlag += nxagentTestGC(values.join_style, join_style);
}
if (mask & GCFillStyle)
{
values.fill_style = pGC->fillStyle;
changeFlag += nxagentTestGC(values.fill_style, fill_style);
}
if (mask & GCFillRule)
{
values.fill_rule = pGC->fillRule;
changeFlag += nxagentTestGC(values.fill_rule, fill_rule);
}
if (mask & GCTile) if (mask & GCTile)
{ {
...@@ -460,19 +402,8 @@ void nxagentChangeGC(GCPtr pGC, unsigned long mask) ...@@ -460,19 +402,8 @@ void nxagentChangeGC(GCPtr pGC, unsigned long mask)
changeFlag += nxagentTestGC(values.stipple, stipple); changeFlag += nxagentTestGC(values.stipple, stipple);
} }
if (mask & GCTileStipXOrigin) CHECKGCVAL(GCTileStipXOrigin, ts_x_origin, pGC->patOrg.x);
{ CHECKGCVAL(GCTileStipYOrigin, ts_y_origin, pGC->patOrg.y);
values.ts_x_origin = pGC->patOrg.x;
changeFlag += nxagentTestGC(values.ts_x_origin, ts_x_origin);
}
if (mask & GCTileStipYOrigin)
{
values.ts_y_origin = pGC->patOrg.y;
changeFlag += nxagentTestGC(values.ts_y_origin, ts_y_origin);
}
if (mask & GCFont) if (mask & GCFont)
{ {
...@@ -483,38 +414,14 @@ void nxagentChangeGC(GCPtr pGC, unsigned long mask) ...@@ -483,38 +414,14 @@ void nxagentChangeGC(GCPtr pGC, unsigned long mask)
else else
{ {
values.font = nxagentFont(pGC->font); values.font = nxagentFont(pGC->font);
changeFlag += nxagentTestGC(values.font, font); changeFlag += nxagentTestGC(values.font, font);
} }
} }
if (mask & GCSubwindowMode) CHECKGCVAL(GCSubwindowMode, subwindow_mode, pGC->subWindowMode);
{ CHECKGCVAL(GCGraphicsExposures, graphics_exposures, pGC->graphicsExposures);
values.subwindow_mode = pGC->subWindowMode; CHECKGCVAL(GCClipXOrigin, clip_x_origin, pGC->clipOrg.x);
CHECKGCVAL(GCClipYOrigin, clip_y_origin, pGC->clipOrg.y);
changeFlag += nxagentTestGC(values.subwindow_mode, subwindow_mode);
}
if (mask & GCGraphicsExposures)
{
values.graphics_exposures = pGC->graphicsExposures;
changeFlag += nxagentTestGC(values.graphics_exposures, graphics_exposures);
}
if (mask & GCClipXOrigin)
{
values.clip_x_origin = pGC->clipOrg.x;
changeFlag += nxagentTestGC(values.clip_x_origin, clip_x_origin);
}
if (mask & GCClipYOrigin)
{
values.clip_y_origin = pGC->clipOrg.y;
changeFlag += nxagentTestGC(values.clip_y_origin, clip_y_origin);
}
if (mask & GCClipMask) if (mask & GCClipMask)
{ {
...@@ -525,12 +432,7 @@ void nxagentChangeGC(GCPtr pGC, unsigned long mask) ...@@ -525,12 +432,7 @@ void nxagentChangeGC(GCPtr pGC, unsigned long mask)
mask &= ~GCClipMask; mask &= ~GCClipMask;
} }
if (mask & GCDashOffset) CHECKGCVAL(GCDashOffset, dash_offset, pGC->dashOffset);
{
values.dash_offset = pGC->dashOffset;
changeFlag += nxagentTestGC(values.dash_offset, dash_offset);
}
if (mask & GCDashList) if (mask & GCDashList)
{ {
...@@ -543,12 +445,7 @@ void nxagentChangeGC(GCPtr pGC, unsigned long mask) ...@@ -543,12 +445,7 @@ void nxagentChangeGC(GCPtr pGC, unsigned long mask)
} }
} }
if (mask & GCArcMode) CHECKGCVAL(GCArcMode, arc_mode, pGC->arcMode);
{
values.arc_mode = pGC->arcMode;
changeFlag += nxagentTestGC(values.arc_mode, arc_mode);
}
if (nxagentGCTrap == 1) if (nxagentGCTrap == 1)
{ {
...@@ -1008,10 +905,10 @@ int nxagentDestroyNewGCResourceType(void * p, XID id) ...@@ -1008,10 +905,10 @@ int nxagentDestroyNewGCResourceType(void * p, XID id)
return 1; return 1;
} }
#define SETGCVAL(mask, member, val) valuemask |= mask; values.member = (val)
static void nxagentReconnectGC(void *param0, XID param1, void * param2) static void nxagentReconnectGC(void *param0, XID param1, void * param2)
{ {
XGCValues values;
unsigned long valuemask;
GCPtr pGC = (GCPtr) param0; GCPtr pGC = (GCPtr) param0;
Bool *pBool = (Bool*)param2; Bool *pBool = (Bool*)param2;
...@@ -1035,42 +932,29 @@ static void nxagentReconnectGC(void *param0, XID param1, void * param2) ...@@ -1035,42 +932,29 @@ static void nxagentReconnectGC(void *param0, XID param1, void * param2)
fprintf(stderr, "nxagentReconnectGC: GC at [%p].\n", (void *) pGC); fprintf(stderr, "nxagentReconnectGC: GC at [%p].\n", (void *) pGC);
#endif #endif
valuemask = 0; XGCValues values = {0};
memset(&values,0,sizeof(XGCValues)); unsigned long valuemask = 0;
values.function = pGC->alu; SETGCVAL(GCFunction, function, pGC->alu);
valuemask |= GCFunction; SETGCVAL(GCPlaneMask, plane_mask, pGC->planemask);
values.plane_mask = pGC->planemask; SETGCVAL(GCForeground, foreground, nxagentPixel(pGC->fgPixel));
valuemask |= GCPlaneMask; SETGCVAL(GCBackground, background, nxagentPixel(pGC->bgPixel));
values.foreground = nxagentPixel(pGC->fgPixel); SETGCVAL(GCLineWidth, line_width, pGC->lineWidth);
valuemask |= GCForeground; SETGCVAL(GCLineStyle, line_style, pGC->lineStyle);
values.background = nxagentPixel(pGC->bgPixel); SETGCVAL(GCCapStyle, cap_style, pGC->capStyle);
valuemask |= GCBackground; SETGCVAL(GCJoinStyle, join_style, pGC->joinStyle);
SETGCVAL(GCFillStyle, fill_style, pGC->fillStyle);
values.line_width = pGC->lineWidth; SETGCVAL(GCFillRule, fill_rule, pGC->fillRule);
valuemask |= GCLineWidth;
values.line_style = pGC->lineStyle; if (!pGC -> tileIsPixel && (pGC -> tile.pixmap != NULL))
valuemask |= GCLineStyle;
values.cap_style = pGC->capStyle;
valuemask |= GCCapStyle;
values.join_style = pGC->joinStyle;
valuemask |= GCJoinStyle;
values.fill_style = pGC->fillStyle;
valuemask |= GCFillStyle;
values.fill_rule = pGC->fillRule;
valuemask |= GCFillRule;
if (!pGC -> tileIsPixel && (pGC -> tile.pixmap != NULL))
{ {
if (nxagentPixmapIsVirtual(pGC -> tile.pixmap)) if (nxagentPixmapIsVirtual(pGC -> tile.pixmap))
{ {
values.tile = nxagentPixmap(nxagentRealPixmap(pGC -> tile.pixmap)); SETGCVAL(GCTile, tile, nxagentPixmap(nxagentRealPixmap(pGC -> tile.pixmap)));
} }
else else
{ {
values.tile = nxagentPixmap(pGC -> tile.pixmap); SETGCVAL(GCTile, tile, nxagentPixmap(pGC -> tile.pixmap));
} }
valuemask |= GCTile;
} }
if (pGC->stipple != NULL) if (pGC->stipple != NULL)
...@@ -1087,7 +971,7 @@ static void nxagentReconnectGC(void *param0, XID param1, void * param2) ...@@ -1087,7 +971,7 @@ static void nxagentReconnectGC(void *param0, XID param1, void * param2)
nxagentReconnectPixmap(nxagentRealPixmap(pGC -> stipple), 0, pBool); nxagentReconnectPixmap(nxagentRealPixmap(pGC -> stipple), 0, pBool);
} }
values.stipple = nxagentPixmap(nxagentRealPixmap(pGC -> stipple)); SETGCVAL(GCStipple, stipple, nxagentPixmap(nxagentRealPixmap(pGC -> stipple)));
} }
else else
{ {
...@@ -1101,42 +985,31 @@ static void nxagentReconnectGC(void *param0, XID param1, void * param2) ...@@ -1101,42 +985,31 @@ static void nxagentReconnectGC(void *param0, XID param1, void * param2)
nxagentReconnectPixmap(pGC -> stipple, 0, pBool); nxagentReconnectPixmap(pGC -> stipple, 0, pBool);
} }
values.stipple = nxagentPixmap(pGC->stipple); SETGCVAL(GCStipple, stipple, nxagentPixmap(pGC->stipple));
} }
valuemask |= GCStipple;
} }
values.ts_x_origin = pGC->patOrg.x; SETGCVAL(GCTileStipXOrigin, ts_x_origin, pGC->patOrg.x);
valuemask |= GCTileStipXOrigin; SETGCVAL(GCTileStipYOrigin, ts_y_origin, pGC->patOrg.y);
values.ts_y_origin = pGC->patOrg.y;
valuemask |= GCTileStipYOrigin;
if (pGC->font != NULL) if (pGC->font != NULL)
{ {
values.font = nxagentFont(pGC->font); SETGCVAL(GCFont, font, nxagentFont(pGC->font));
valuemask |= GCFont;
} }
values.subwindow_mode = pGC->subWindowMode; SETGCVAL(GCSubwindowMode, subwindow_mode, pGC->subWindowMode);
valuemask |= GCSubwindowMode; SETGCVAL(GCGraphicsExposures, graphics_exposures, pGC->graphicsExposures);
values.graphics_exposures = pGC->graphicsExposures; SETGCVAL(GCClipXOrigin, clip_x_origin, pGC->clipOrg.x);
valuemask |= GCGraphicsExposures; SETGCVAL(GCClipYOrigin, clip_y_origin, pGC->clipOrg.y);
values.clip_x_origin = pGC->clipOrg.x; valuemask |= GCClipMask; /* FIXME: where's the ClipMask pixmap?? */
valuemask |= GCClipXOrigin; SETGCVAL(GCDashOffset, dash_offset, pGC->dashOffset);
values.clip_y_origin = pGC->clipOrg.y;
valuemask |= GCClipYOrigin;
valuemask |= GCClipMask;
values.dash_offset = pGC->dashOffset;
valuemask |= GCDashOffset;
if (pGC->dash != NULL) if (pGC->dash != NULL)
{ {
values.dashes = *pGC->dash; SETGCVAL(GCDashList, dashes, *pGC->dash);
valuemask |= GCDashList;
} }
values.arc_mode = pGC->arcMode; SETGCVAL(GCArcMode, arc_mode, pGC->arcMode);
valuemask |= GCArcMode;
if ((nxagentGC(pGC) = XCreateGC(nxagentDisplay, if ((nxagentGC(pGC) = XCreateGC(nxagentDisplay,
nxagentDefaultDrawables[pGC->depth], nxagentDefaultDrawables[pGC->depth],
...@@ -1440,22 +1313,17 @@ static int nxagentCompareRegions(RegionPtr r1, RegionPtr r2) ...@@ -1440,22 +1313,17 @@ static int nxagentCompareRegions(RegionPtr r1, RegionPtr r2)
*/ */
GCPtr nxagentGetScratchGC(unsigned depth, ScreenPtr pScreen) GCPtr nxagentGetScratchGC(unsigned depth, ScreenPtr pScreen)
{ {
GCPtr pGC;
XGCValues values;
unsigned long mask;
int nxagentSaveGCTrap;
/* /*
* The GC trap is temporarily disabled in * The GC trap is temporarily disabled in
* order to allow the remote clipmask reset * order to allow the remote clipmask reset
* requested by GetScratchGC(). * requested by GetScratchGC().
*/ */
nxagentSaveGCTrap = nxagentGCTrap; int nxagentSaveGCTrap = nxagentGCTrap;
nxagentGCTrap = 0; nxagentGCTrap = 0;
pGC = GetScratchGC(depth, pScreen); GCPtr pGC = GetScratchGC(depth, pScreen);
nxagentGCTrap = nxagentSaveGCTrap; nxagentGCTrap = nxagentSaveGCTrap;
...@@ -1468,65 +1336,31 @@ GCPtr nxagentGetScratchGC(unsigned depth, ScreenPtr pScreen) ...@@ -1468,65 +1336,31 @@ GCPtr nxagentGetScratchGC(unsigned depth, ScreenPtr pScreen)
return NULL; return NULL;
} }
mask = 0; unsigned long valuemask = 0;
XGCValues values = {0};
values.function = pGC -> alu; SETGCVAL(GCFunction, function, pGC -> alu);
mask |= GCFunction; SETGCVAL(GCPlaneMask, plane_mask, pGC -> planemask);
SETGCVAL(GCForeground, foreground, nxagentPixel(pGC -> fgPixel));
values.plane_mask = pGC -> planemask; SETGCVAL(GCBackground, background, nxagentPixel(pGC -> bgPixel));
mask |= GCPlaneMask; SETGCVAL(GCLineWidth, line_width, pGC -> lineWidth);
SETGCVAL(GCLineStyle, line_style, pGC -> lineStyle);
values.foreground = nxagentPixel(pGC -> fgPixel); SETGCVAL(GCCapStyle, cap_style, pGC -> capStyle);
mask |= GCForeground; SETGCVAL(GCJoinStyle, join_style, pGC -> joinStyle);
SETGCVAL(GCFillStyle, fill_style, pGC -> fillStyle);
values.background = nxagentPixel(pGC -> bgPixel); SETGCVAL(GCFillRule, fill_rule, pGC -> fillRule);
mask |= GCBackground; SETGCVAL(GCArcMode, arc_mode, pGC -> arcMode);
SETGCVAL(GCTileStipXOrigin, ts_x_origin, pGC -> patOrg.x);
values.line_width = pGC -> lineWidth; SETGCVAL(GCTileStipYOrigin, ts_y_origin, pGC -> patOrg.y);
mask |= GCLineWidth; SETGCVAL(GCSubwindowMode, subwindow_mode, pGC -> subWindowMode);
SETGCVAL(GCGraphicsExposures, graphics_exposures, pGC -> graphicsExposures);
values.line_style = pGC -> lineStyle; SETGCVAL(GCClipXOrigin, clip_x_origin, pGC -> clipOrg.x);
mask |= GCLineStyle; SETGCVAL(GCClipYOrigin, clip_y_origin, pGC -> clipOrg.y);
values.cap_style = pGC -> capStyle; /* The GCClipMask is set to none inside the GetScratchGC() function. */
mask |= GCCapStyle;
/* FIXME: What about GCDashOffset? */
values.join_style = pGC -> joinStyle;
mask |= GCJoinStyle; XChangeGC(nxagentDisplay, nxagentGC(pGC), valuemask, &values);
values.fill_style = pGC -> fillStyle;
mask |= GCFillStyle;
values.fill_rule = pGC -> fillRule;
mask |= GCFillRule;
values.arc_mode = pGC -> arcMode;
mask |= GCArcMode;
values.ts_x_origin = pGC -> patOrg.x;
mask |= GCTileStipXOrigin;
values.ts_y_origin = pGC -> patOrg.y;
mask |= GCTileStipYOrigin;
values.subwindow_mode = pGC -> subWindowMode;
mask |= GCSubwindowMode;
values.graphics_exposures = pGC -> graphicsExposures;
mask |= GCGraphicsExposures;
/*
* The GCClipMask is set to none inside
* the GetScratchGC() function.
*/
values.clip_x_origin = pGC -> clipOrg.x;
mask |= GCClipXOrigin;
values.clip_y_origin = pGC -> clipOrg.y;
mask |= GCClipYOrigin;
XChangeGC(nxagentDisplay, nxagentGC(pGC), mask, &values);
memset(&(nxagentGCPriv(pGC) -> lastServerValues), 0, sizeof(XGCValues)); memset(&(nxagentGCPriv(pGC) -> lastServerValues), 0, sizeof(XGCValues));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment