GCperDepth is the scratch GC pool. When we look up a scratch GC we match against depth and pay no attention to MAXFORMATS, so we can size the array dynamically based on how many depths are supported.
Signed-off-by: Adam Jackson <[email protected]> --- dix/gc.c | 15 +++++++-------- include/scrnintstr.h | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/dix/gc.c b/dix/gc.c index 73bb3b4..5d68ae9 100644 --- a/dix/gc.c +++ b/dix/gc.c @@ -825,10 +825,10 @@ FreeGCperDepth(int screenNum) pScreen = screenInfo.screens[screenNum]; ppGC = pScreen->GCperDepth; - for (i = 0; i < pScreen->numDepths; i++) { + for (i = 0; i < pScreen->numDepths; i++) (void) FreeGC(ppGC[i], (XID) 0); - ppGC[i] = NULL; - } + free(ppGC); + pScreen->GCperDepth = NULL; } Bool @@ -840,20 +840,19 @@ CreateGCperDepth(int screenNum) GCPtr *ppGC; pScreen = screenInfo.screens[screenNum]; - ppGC = pScreen->GCperDepth; - - /* Make sure we don't overflow GCperDepth[] */ - if (pScreen->numDepths > MAXFORMATS) - return FALSE; + ppGC = calloc(pScreen->numDepths, sizeof(GCPtr)); pDepth = pScreen->allowedDepths; for (i = 0; i < pScreen->numDepths; i++, pDepth++) { if (!(ppGC[i] = CreateScratchGC(pScreen, pDepth->depth))) { for (; i >= 0; i--) (void) FreeGC(ppGC[i], (XID) 0); + free(ppGC); return FALSE; } } + + pScreen->GCperDepth = ppGC; return TRUE; } diff --git a/include/scrnintstr.h b/include/scrnintstr.h index f174549..965821a 100644 --- a/include/scrnintstr.h +++ b/include/scrnintstr.h @@ -503,7 +503,7 @@ typedef struct _Screen { short minInstalledCmaps, maxInstalledCmaps; char backingStoreSupport, saveUnderSupport; unsigned long whitePixel, blackPixel; - GCPtr GCperDepth[MAXFORMATS + 1]; + GCPtr *GCperDepth; /* next field is a stipple to use as default in a GC. we don't build * default tiles of all depths because they are likely to be of a color * different from the default fg pixel, so we don't win anything by -- 2.9.3 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel
