#include "fntfilst.h"
extern void ErrorF(const char *f, ...);
static FontRenderersRec renderers;
extern unsigned long serverGeneration;
static unsigned long rendererGeneration = 0;
Bool
FontFileRegisterRenderer (FontRendererPtr renderer)
{
return FontFilePriorityRegisterRenderer(renderer, 0);
}
Bool
FontFilePriorityRegisterRenderer (FontRendererPtr renderer, int priority)
{
int i;
struct _FontRenderersElement *new;
if (rendererGeneration != serverGeneration) {
rendererGeneration = serverGeneration;
renderers.number = 0;
if (renderers.renderers)
xfree(renderers.renderers);
renderers.renderers = NULL;
}
for (i = 0; i < renderers.number; i++) {
if (!strcmp (renderers.renderers[i].renderer->fileSuffix,
renderer->fileSuffix)) {
if(renderers.renderers[i].priority >= priority) {
if(renderers.renderers[i].priority == priority) {
if (rendererGeneration == 1)
ErrorF("Warning: font renderer for \"%s\" "
"already registered at priority %d\n",
renderer->fileSuffix, priority);
}
return TRUE;
} else {
break;
}
}
}
if(i >= renderers.number) {
new = xrealloc (renderers.renderers, sizeof(*new) * (i + 1));
if (!new)
return FALSE;
renderers.renderers = new;
renderers.number = i + 1;
}
renderer->number = i;
renderers.renderers[i].renderer = renderer;
renderers.renderers[i].priority = priority;
return TRUE;
}
FontRendererPtr
FontFileMatchRenderer (char *fileName)
{
int i;
int fileLen;
FontRendererPtr r;
fileLen = strlen (fileName);
for (i = 0; i < renderers.number; i++)
{
r = renderers.renderers[i].renderer;
if (fileLen >= r->fileSuffixLen &&
!strcmp (fileName + fileLen - r->fileSuffixLen, r->fileSuffix))
{
return r;
}
}
return 0;
}