mirror of
https://github.com/X11Libre/xserver.git
synced 2026-04-14 17:18:09 +00:00
devPrivates rework: since API is already broken, switch everything
over to new system. Need to update documentation and address some remaining vestiges of old system such as CursorRec structure, fb "offman" structure, and FontRec privates.
This commit is contained in:
321
render/glyph.c
321
render/glyph.c
@@ -81,220 +81,18 @@ static const CARD8 glyphDepths[GlyphFormatNum] = { 1, 4, 8, 16, 32 };
|
||||
|
||||
static GlyphHashRec globalGlyphs[GlyphFormatNum];
|
||||
|
||||
static int globalTotalGlyphPrivateSize = 0;
|
||||
|
||||
static int glyphPrivateCount = 0;
|
||||
|
||||
void
|
||||
ResetGlyphPrivates (void)
|
||||
{
|
||||
glyphPrivateCount = 0;
|
||||
}
|
||||
|
||||
int
|
||||
AllocateGlyphPrivateIndex (void)
|
||||
{
|
||||
return glyphPrivateCount++;
|
||||
}
|
||||
|
||||
Bool
|
||||
AllocateGlyphPrivate (ScreenPtr pScreen,
|
||||
int index2,
|
||||
unsigned amount)
|
||||
{
|
||||
PictureScreenPtr ps;
|
||||
unsigned oldamount;
|
||||
|
||||
ps = GetPictureScreenIfSet (pScreen);
|
||||
if (!ps)
|
||||
return FALSE;
|
||||
|
||||
/* Round up sizes for proper alignment */
|
||||
amount = ((amount + (sizeof (DevUnion) - 1)) / sizeof (DevUnion)) *
|
||||
sizeof (DevUnion);
|
||||
|
||||
if (index2 >= ps->glyphPrivateLen)
|
||||
{
|
||||
unsigned *nsizes;
|
||||
nsizes = (unsigned *) xrealloc (ps->glyphPrivateSizes,
|
||||
(index2 + 1) * sizeof (unsigned));
|
||||
if (!nsizes)
|
||||
return FALSE;
|
||||
|
||||
while (ps->glyphPrivateLen <= index2)
|
||||
{
|
||||
nsizes[ps->glyphPrivateLen++] = 0;
|
||||
ps->totalGlyphPrivateSize += sizeof (DevUnion);
|
||||
}
|
||||
ps->glyphPrivateSizes = nsizes;
|
||||
}
|
||||
oldamount = ps->glyphPrivateSizes[index2];
|
||||
if (amount > oldamount)
|
||||
{
|
||||
ps->glyphPrivateSizes[index2] = amount;
|
||||
ps->totalGlyphPrivateSize += (amount - oldamount);
|
||||
}
|
||||
ps->totalGlyphPrivateSize = BitmapBytePad (ps->totalGlyphPrivateSize * 8);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
SetGlyphScreenPrivateOffsets (void)
|
||||
FreeGlyphPrivates (GlyphPtr glyph)
|
||||
{
|
||||
PictureScreenPtr ps;
|
||||
int offset = 0;
|
||||
int i;
|
||||
ScreenPtr pScreen;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < screenInfo.numScreens; i++)
|
||||
{
|
||||
ps = GetPictureScreenIfSet (screenInfo.screens[i]);
|
||||
if (ps && ps->totalGlyphPrivateSize)
|
||||
{
|
||||
ps->glyphPrivateOffset = offset;
|
||||
offset += ps->totalGlyphPrivateSize / sizeof (DevUnion);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
SetGlyphPrivatePointers (GlyphPtr glyph)
|
||||
{
|
||||
PictureScreenPtr ps;
|
||||
int i;
|
||||
char *ptr;
|
||||
DevUnion *ppriv;
|
||||
unsigned *sizes;
|
||||
unsigned size;
|
||||
int len;
|
||||
|
||||
for (i = 0; i < screenInfo.numScreens; i++)
|
||||
{
|
||||
ps = GetPictureScreenIfSet (screenInfo.screens[i]);
|
||||
if (ps && ps->totalGlyphPrivateSize)
|
||||
{
|
||||
ppriv = glyph->devPrivates + ps->glyphPrivateOffset;
|
||||
sizes = ps->glyphPrivateSizes;
|
||||
ptr = (char *) (ppriv + ps->glyphPrivateLen);
|
||||
for (len = ps->glyphPrivateLen; --len >= 0; ppriv++, sizes++)
|
||||
{
|
||||
if ((size = *sizes) != 0)
|
||||
{
|
||||
ppriv->ptr = (pointer) ptr;
|
||||
ptr += size;
|
||||
}
|
||||
else
|
||||
ppriv->ptr = (pointer) 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static Bool
|
||||
ReallocGlobalGlyphPrivate (GlyphPtr glyph)
|
||||
{
|
||||
PictureScreenPtr ps;
|
||||
DevUnion *devPrivates;
|
||||
char *ptr;
|
||||
int i;
|
||||
|
||||
devPrivates = xalloc (globalTotalGlyphPrivateSize);
|
||||
if (!devPrivates)
|
||||
return FALSE;
|
||||
|
||||
ptr = (char *) devPrivates;
|
||||
for (i = 0; i < screenInfo.numScreens; i++)
|
||||
{
|
||||
ps = GetPictureScreenIfSet (screenInfo.screens[i]);
|
||||
if (ps && ps->totalGlyphPrivateSize)
|
||||
{
|
||||
if (ps->glyphPrivateOffset != -1)
|
||||
{
|
||||
memcpy (ptr, glyph->devPrivates + ps->glyphPrivateOffset,
|
||||
ps->totalGlyphPrivateSize);
|
||||
}
|
||||
else if (ps->totalGlyphPrivateSize)
|
||||
{
|
||||
memset (ptr, 0, ps->totalGlyphPrivateSize);
|
||||
}
|
||||
|
||||
ptr += ps->totalGlyphPrivateSize;
|
||||
}
|
||||
for (i = 0; i < screenInfo.numScreens; i++) {
|
||||
pScreen = screenInfo.screens[i];
|
||||
dixFreePrivates(*GetGlyphPrivatesForScreen(glyph, pScreen));
|
||||
}
|
||||
|
||||
if (glyph->devPrivates)
|
||||
xfree (glyph->devPrivates);
|
||||
|
||||
glyph->devPrivates = devPrivates;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Bool
|
||||
GlyphInit (ScreenPtr pScreen)
|
||||
{
|
||||
PictureScreenPtr ps = GetPictureScreen (pScreen);
|
||||
|
||||
ps->totalGlyphPrivateSize = 0;
|
||||
ps->glyphPrivateSizes = 0;
|
||||
ps->glyphPrivateLen = 0;
|
||||
ps->glyphPrivateOffset = -1;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Bool
|
||||
GlyphFinishInit (ScreenPtr pScreen)
|
||||
{
|
||||
PictureScreenPtr ps = GetPictureScreen (pScreen);
|
||||
|
||||
if (ps->totalGlyphPrivateSize)
|
||||
{
|
||||
GlyphPtr glyph;
|
||||
int fdepth, i;
|
||||
|
||||
globalTotalGlyphPrivateSize += ps->totalGlyphPrivateSize;
|
||||
|
||||
for (fdepth = 0; fdepth < GlyphFormatNum; fdepth++)
|
||||
{
|
||||
if (!globalGlyphs[fdepth].hashSet)
|
||||
continue;
|
||||
|
||||
for (i = 0; i < globalGlyphs[fdepth].hashSet->size; i++)
|
||||
{
|
||||
glyph = globalGlyphs[fdepth].table[i].glyph;
|
||||
if (glyph && glyph != DeletedGlyph)
|
||||
{
|
||||
if (!ReallocGlobalGlyphPrivate (glyph))
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SetGlyphScreenPrivateOffsets ();
|
||||
|
||||
for (fdepth = 0; fdepth < GlyphFormatNum; fdepth++)
|
||||
{
|
||||
if (!globalGlyphs[fdepth].hashSet)
|
||||
continue;
|
||||
|
||||
for (i = 0; i < globalGlyphs[fdepth].hashSet->size; i++)
|
||||
{
|
||||
glyph = globalGlyphs[fdepth].table[i].glyph;
|
||||
if (glyph && glyph != DeletedGlyph)
|
||||
{
|
||||
SetGlyphPrivatePointers (glyph);
|
||||
|
||||
if (!(*ps->RealizeGlyph) (pScreen, glyph))
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
ps->glyphPrivateOffset = 0;
|
||||
|
||||
return TRUE;
|
||||
dixFreePrivates(glyph->devPrivates);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -304,8 +102,6 @@ GlyphUninit (ScreenPtr pScreen)
|
||||
GlyphPtr glyph;
|
||||
int fdepth, i;
|
||||
|
||||
globalTotalGlyphPrivateSize -= ps->totalGlyphPrivateSize;
|
||||
|
||||
for (fdepth = 0; fdepth < GlyphFormatNum; fdepth++)
|
||||
{
|
||||
if (!globalGlyphs[fdepth].hashSet)
|
||||
@@ -317,43 +113,20 @@ GlyphUninit (ScreenPtr pScreen)
|
||||
if (glyph && glyph != DeletedGlyph)
|
||||
{
|
||||
(*ps->UnrealizeGlyph) (pScreen, glyph);
|
||||
|
||||
if (globalTotalGlyphPrivateSize)
|
||||
{
|
||||
if (!ReallocGlobalGlyphPrivate (glyph))
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (glyph->devPrivates)
|
||||
xfree (glyph->devPrivates);
|
||||
glyph->devPrivates = NULL;
|
||||
}
|
||||
FreeGlyphPrivates(glyph);
|
||||
glyph->devPrivates = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (globalTotalGlyphPrivateSize)
|
||||
SetGlyphScreenPrivateOffsets ();
|
||||
|
||||
for (fdepth = 0; fdepth < GlyphFormatNum; fdepth++)
|
||||
{
|
||||
if (!globalGlyphs[fdepth].hashSet)
|
||||
continue;
|
||||
|
||||
for (i = 0; i < globalGlyphs[fdepth].hashSet->size; i++)
|
||||
{
|
||||
glyph = globalGlyphs[fdepth].table[i].glyph;
|
||||
if (glyph && glyph != DeletedGlyph)
|
||||
{
|
||||
if (globalTotalGlyphPrivateSize)
|
||||
SetGlyphPrivatePointers (glyph);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ps->glyphPrivateSizes)
|
||||
xfree (ps->glyphPrivateSizes);
|
||||
}
|
||||
|
||||
GlyphHashSetPtr
|
||||
@@ -367,50 +140,6 @@ FindGlyphHashSet (CARD32 filled)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int _GlyphSetPrivateAllocateIndex = 0;
|
||||
|
||||
int
|
||||
AllocateGlyphSetPrivateIndex (void)
|
||||
{
|
||||
return _GlyphSetPrivateAllocateIndex++;
|
||||
}
|
||||
|
||||
void
|
||||
ResetGlyphSetPrivateIndex (void)
|
||||
{
|
||||
_GlyphSetPrivateAllocateIndex = 0;
|
||||
}
|
||||
|
||||
Bool
|
||||
_GlyphSetSetNewPrivate (GlyphSetPtr glyphSet, int n, pointer ptr)
|
||||
{
|
||||
pointer *new;
|
||||
|
||||
if (n > glyphSet->maxPrivate) {
|
||||
if (glyphSet->devPrivates &&
|
||||
glyphSet->devPrivates != (pointer)(&glyphSet[1])) {
|
||||
new = (pointer *) xrealloc (glyphSet->devPrivates,
|
||||
(n + 1) * sizeof (pointer));
|
||||
if (!new)
|
||||
return FALSE;
|
||||
} else {
|
||||
new = (pointer *) xalloc ((n + 1) * sizeof (pointer));
|
||||
if (!new)
|
||||
return FALSE;
|
||||
if (glyphSet->devPrivates)
|
||||
memcpy (new,
|
||||
glyphSet->devPrivates,
|
||||
(glyphSet->maxPrivate + 1) * sizeof (pointer));
|
||||
}
|
||||
glyphSet->devPrivates = new;
|
||||
/* Zero out new, uninitialize privates */
|
||||
while (++glyphSet->maxPrivate < n)
|
||||
glyphSet->devPrivates[glyphSet->maxPrivate] = (pointer)0;
|
||||
}
|
||||
glyphSet->devPrivates[n] = ptr;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
GlyphRefPtr
|
||||
FindGlyphRef (GlyphHashPtr hash, CARD32 signature, Bool match, GlyphPtr compare)
|
||||
{
|
||||
@@ -539,8 +268,7 @@ FreeGlyph (GlyphPtr glyph, int format)
|
||||
(*ps->UnrealizeGlyph) (screenInfo.screens[i], glyph);
|
||||
}
|
||||
|
||||
if (glyph->devPrivates)
|
||||
xfree (glyph->devPrivates);
|
||||
FreeGlyphPrivates(glyph);
|
||||
xfree (glyph);
|
||||
}
|
||||
}
|
||||
@@ -566,8 +294,7 @@ AddGlyph (GlyphSetPtr glyphSet, GlyphPtr glyph, Glyph id)
|
||||
if (ps)
|
||||
(*ps->UnrealizeGlyph) (screenInfo.screens[i], glyph);
|
||||
}
|
||||
if (glyph->devPrivates)
|
||||
xfree (glyph->devPrivates);
|
||||
FreeGlyphPrivates(glyph);
|
||||
xfree (glyph);
|
||||
glyph = gr->glyph;
|
||||
}
|
||||
@@ -634,16 +361,7 @@ AllocateGlyph (xGlyphInfo *gi, int fdepth)
|
||||
glyph->refcnt = 0;
|
||||
glyph->size = size + sizeof (xGlyphInfo);
|
||||
glyph->info = *gi;
|
||||
|
||||
if (globalTotalGlyphPrivateSize)
|
||||
{
|
||||
glyph->devPrivates = xalloc (globalTotalGlyphPrivateSize);
|
||||
if (!glyph->devPrivates)
|
||||
return 0;
|
||||
|
||||
SetGlyphPrivatePointers (glyph);
|
||||
} else
|
||||
glyph->devPrivates = NULL;
|
||||
glyph->devPrivates = NULL;
|
||||
|
||||
for (i = 0; i < screenInfo.numScreens; i++)
|
||||
{
|
||||
@@ -659,8 +377,7 @@ AllocateGlyph (xGlyphInfo *gi, int fdepth)
|
||||
(*ps->UnrealizeGlyph) (screenInfo.screens[i], glyph);
|
||||
}
|
||||
|
||||
if (glyph->devPrivates)
|
||||
xfree (glyph->devPrivates);
|
||||
FreeGlyphPrivates(glyph);
|
||||
xfree (glyph);
|
||||
return 0;
|
||||
}
|
||||
@@ -744,15 +461,11 @@ AllocateGlyphSet (int fdepth, PictFormatPtr format)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
size = (sizeof (GlyphSetRec) +
|
||||
(sizeof (pointer) * _GlyphSetPrivateAllocateIndex));
|
||||
size = sizeof (GlyphSetRec);
|
||||
glyphSet = xalloc (size);
|
||||
if (!glyphSet)
|
||||
return FALSE;
|
||||
bzero((char *)glyphSet, size);
|
||||
glyphSet->maxPrivate = _GlyphSetPrivateAllocateIndex - 1;
|
||||
if (_GlyphSetPrivateAllocateIndex)
|
||||
glyphSet->devPrivates = (pointer)(&glyphSet[1]);
|
||||
|
||||
if (!AllocateGlyphHash (&glyphSet->hash, &glyphHashSets[0]))
|
||||
{
|
||||
@@ -792,11 +505,7 @@ FreeGlyphSet (pointer value,
|
||||
else
|
||||
ResizeGlyphHash (&globalGlyphs[glyphSet->fdepth], 0, TRUE);
|
||||
xfree (table);
|
||||
|
||||
if (glyphSet->devPrivates &&
|
||||
glyphSet->devPrivates != (pointer)(&glyphSet[1]))
|
||||
xfree(glyphSet->devPrivates);
|
||||
|
||||
dixFreePrivates(glyphSet->devPrivates);
|
||||
xfree (glyphSet);
|
||||
}
|
||||
return Success;
|
||||
|
||||
Reference in New Issue
Block a user