#include "fntfilst.h"
BitmapSourcesRec FontFileBitmapSources;
Bool
FontFileRegisterBitmapSource (FontPathElementPtr fpe)
{
FontPathElementPtr *new;
int i;
int newsize;
for (i = 0; i < FontFileBitmapSources.count; i++)
if (FontFileBitmapSources.fpe[i] == fpe)
return TRUE;
if (FontFileBitmapSources.count == FontFileBitmapSources.size)
{
newsize = FontFileBitmapSources.size + 4;
new = (FontPathElementPtr *) xrealloc (FontFileBitmapSources.fpe, newsize * sizeof *new);
if (!new)
return FALSE;
FontFileBitmapSources.size = newsize;
FontFileBitmapSources.fpe = new;
}
FontFileBitmapSources.fpe[FontFileBitmapSources.count++] = fpe;
return TRUE;
}
void
FontFileUnregisterBitmapSource (FontPathElementPtr fpe)
{
int i;
for (i = 0; i < FontFileBitmapSources.count; i++)
if (FontFileBitmapSources.fpe[i] == fpe)
{
FontFileBitmapSources.count--;
if (FontFileBitmapSources.count == 0)
{
FontFileBitmapSources.size = 0;
xfree (FontFileBitmapSources.fpe);
FontFileBitmapSources.fpe = 0;
}
else
{
for (; i < FontFileBitmapSources.count; i++)
FontFileBitmapSources.fpe[i] = FontFileBitmapSources.fpe[i+1];
}
break;
}
}
void
FontFileEmptyBitmapSource(void)
{
if (FontFileBitmapSources.count == 0)
return;
FontFileBitmapSources.count = 0;
FontFileBitmapSources.size = 0;
xfree (FontFileBitmapSources.fpe);
FontFileBitmapSources.fpe = 0;
}
int
FontFileMatchBitmapSource (FontPathElementPtr fpe,
FontPtr *pFont,
int flags,
FontEntryPtr entry,
FontNamePtr zeroPat,
FontScalablePtr vals,
fsBitmapFormat format,
fsBitmapFormatMask fmask,
Bool noSpecificSize)
{
int source;
FontEntryPtr zero;
FontBitmapEntryPtr bitmap;
int ret;
FontDirectoryPtr dir;
FontScaledPtr scaled;
ret = BadFontName;
for (source = 0; source < FontFileBitmapSources.count; source++)
{
if (FontFileBitmapSources.fpe[source] == fpe)
continue;
dir = (FontDirectoryPtr) FontFileBitmapSources.fpe[source]->private;
zero = FontFileFindNameInDir (&dir->scalable, zeroPat);
if (!zero)
continue;
scaled = FontFileFindScaledInstance (zero, vals, noSpecificSize);
if (scaled)
{
if (scaled->pFont)
{
*pFont = scaled->pFont;
(*pFont)->fpe = FontFileBitmapSources.fpe[source];
ret = Successful;
}
else if (scaled->bitmap)
{
entry = scaled->bitmap;
bitmap = &entry->u.bitmap;
if (bitmap->pFont)
{
*pFont = bitmap->pFont;
(*pFont)->fpe = FontFileBitmapSources.fpe[source];
ret = Successful;
}
else
{
ret = FontFileOpenBitmap (
FontFileBitmapSources.fpe[source],
pFont, flags, entry, format, fmask);
if (ret == Successful && *pFont)
(*pFont)->fpe = FontFileBitmapSources.fpe[source];
}
}
else
{
ret = BadFontName;
}
break;
}
}
return ret;
}