/*
- * $XFree86: $
+ * fontconfig/src/fcinit.c
*
- * Copyright © 2001 Keith Packard, member of The XFree86 Project, Inc.
+ * Copyright © 2001 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
+ * documentation, and that the name of the author(s) not be used in
* advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
+ * specific, written prior permission. The authors make no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
-#include <stdlib.h>
#include "fcint.h"
+#include <stdlib.h>
-FcBool
-FcInitFonts (void)
-{
- FcConfig *config;
-
- config = FcConfigGetCurrent ();
- if (!config)
- return FcFalse;
-
- if (FcConfigGetFonts (config, FcSetSystem))
- return FcTrue;
-
- return FcConfigBuildFonts (config);
-}
-
-static FcBool
-FcInitFallbackConfig (void)
+#if defined(FC_ATOMIC_INT_NIL)
+#pragma message("Could not find any system to define atomic_int macros, library may NOT be thread-safe.")
+#endif
+#if defined(FC_MUTEX_IMPL_NIL)
+#pragma message("Could not find any system to define mutex macros, library may NOT be thread-safe.")
+#endif
+#if defined(FC_ATOMIC_INT_NIL) || defined(FC_MUTEX_IMPL_NIL)
+#pragma message("To suppress these warnings, define FC_NO_MT.")
+#endif
+
+static FcConfig *
+FcInitFallbackConfig (const FcChar8 *sysroot)
{
FcConfig *config;
config = FcConfigCreate ();
if (!config)
goto bail0;
- if (!FcConfigAddDir (config, (FcChar8 *) FC_FALLBACK_FONTS))
+ FcConfigSetSysRoot (config, sysroot);
+ if (!FcConfigAddDir (config, (FcChar8 *) FC_DEFAULT_FONTS))
goto bail1;
- FcConfigSetCurrent (config);
- return FcTrue;
+ if (!FcConfigAddCacheDir (config, (FcChar8 *) FC_CACHEDIR))
+ goto bail1;
+ return config;
bail1:
FcConfigDestroy (config);
bail0:
- return FcFalse;
+ return 0;
+}
+
+int
+FcGetVersion (void)
+{
+ return FC_VERSION;
}
/*
- * Locate and parse the configuration file
+ * Load the configuration files
*/
-FcBool
-FcInitConfig (void)
+FcConfig *
+FcInitLoadOwnConfig (FcConfig *config)
{
- FcConfig *config;
-
- if (FcConfigGetCurrent ())
- return FcTrue;
-
- config = FcConfigCreate ();
if (!config)
- return FcFalse;
-
+ {
+ config = FcConfigCreate ();
+ if (!config)
+ return NULL;
+ }
+
+ FcInitDebug ();
+
if (!FcConfigParseAndLoad (config, 0, FcTrue))
{
+ const FcChar8 *sysroot = FcConfigGetSysRoot (config);
+ FcConfig *fallback = FcInitFallbackConfig (sysroot);
+
+ FcConfigDestroy (config);
+
+ return fallback;
+ }
+
+ if (config->cacheDirs && config->cacheDirs->num == 0)
+ {
+ FcChar8 *prefix, *p;
+ size_t plen;
+ FcBool have_own = FcFalse;
+ char *env_file, *env_path;
+
+ env_file = getenv ("FONTCONFIG_FILE");
+ env_path = getenv ("FONTCONFIG_PATH");
+ if ((env_file != NULL && env_file[0] != 0) ||
+ (env_path != NULL && env_path[0] != 0))
+ have_own = FcTrue;
+
+ if (!have_own)
+ {
+ fprintf (stderr,
+ "Fontconfig warning: no <cachedir> elements found. Check configuration.\n");
+ fprintf (stderr,
+ "Fontconfig warning: adding <cachedir>%s</cachedir>\n",
+ FC_CACHEDIR);
+ }
+ prefix = FcConfigXdgCacheHome ();
+ if (!prefix)
+ goto bail;
+ plen = strlen ((const char *)prefix);
+ p = realloc (prefix, plen + 12);
+ if (!p)
+ goto bail;
+ prefix = p;
+ memcpy (&prefix[plen], FC_DIR_SEPARATOR_S "fontconfig", 11);
+ prefix[plen + 11] = 0;
+ if (!have_own)
+ fprintf (stderr,
+ "Fontconfig warning: adding <cachedir prefix=\"xdg\">fontconfig</cachedir>\n");
+
+ if (!FcConfigAddCacheDir (config, (FcChar8 *) FC_CACHEDIR) ||
+ !FcConfigAddCacheDir (config, (FcChar8 *) prefix))
+ {
+ FcConfig *fallback;
+ const FcChar8 *sysroot;
+
+ bail:
+ sysroot = FcConfigGetSysRoot (config);
+ fprintf (stderr,
+ "Fontconfig error: out of memory");
+ if (prefix)
+ FcStrFree (prefix);
+ fallback = FcInitFallbackConfig (sysroot);
+ FcConfigDestroy (config);
+
+ return fallback;
+ }
+ FcStrFree (prefix);
+ }
+
+ return config;
+}
+
+FcConfig *
+FcInitLoadConfig (void)
+{
+ return FcInitLoadOwnConfig (NULL);
+}
+
+/*
+ * Load the configuration files and scan for available fonts
+ */
+FcConfig *
+FcInitLoadOwnConfigAndFonts (FcConfig *config)
+{
+ config = FcInitLoadOwnConfig (config);
+ if (!config)
+ return 0;
+ if (!FcConfigBuildFonts (config))
+ {
FcConfigDestroy (config);
- return FcInitFallbackConfig ();
+ return 0;
}
-
- FcConfigSetCurrent (config);
- return FcTrue;
+ return config;
}
+FcConfig *
+FcInitLoadConfigAndFonts (void)
+{
+ return FcInitLoadOwnConfigAndFonts (NULL);
+}
+
+/*
+ * Initialize the default library configuration
+ */
FcBool
FcInit (void)
{
- return FcInitConfig () && FcInitFonts ();
+ return FcConfigInit ();
}
-static struct {
- char *name;
- int alloc_count;
- int alloc_mem;
- int free_count;
- int free_mem;
-} FcInUse[FC_MEM_NUM] = {
- { "charset", 0, 0 },
- { "charnode", 0 ,0 },
- { "fontset", 0, 0 },
- { "fontptr", 0, 0 },
- { "objectset", 0, 0 },
- { "objectptr", 0, 0 },
- { "matrix", 0, 0 },
- { "pattern", 0, 0 },
- { "patelt", 0, 0 },
- { "vallist", 0, 0 },
- { "substate", 0, 0 },
- { "string", 0, 0 },
- { "listbuck", 0, 0 },
-};
-
-static int FcAllocCount, FcAllocMem;
-static int FcFreeCount, FcFreeMem;
-
-static int FcMemNotice = 1*1024*1024;
-
-static int FcAllocNotify, FcFreeNotify;
-
+/*
+ * Free all library-allocated data structures.
+ */
void
-FcMemReport (void)
+FcFini (void)
{
- int i;
- printf ("Fc Memory Usage:\n");
- printf ("\t Which Alloc Free Active\n");
- printf ("\t count bytes count bytes count bytes\n");
- for (i = 0; i < FC_MEM_NUM; i++)
- printf ("\t%8.8s%8d%8d%8d%8d%8d%8d\n",
- FcInUse[i].name,
- FcInUse[i].alloc_count, FcInUse[i].alloc_mem,
- FcInUse[i].free_count, FcInUse[i].free_mem,
- FcInUse[i].alloc_count - FcInUse[i].free_count,
- FcInUse[i].alloc_mem - FcInUse[i].free_mem);
- printf ("\t%8.8s%8d%8d%8d%8d%8d%8d\n",
- "Total",
- FcAllocCount, FcAllocMem,
- FcFreeCount, FcFreeMem,
- FcAllocCount - FcFreeCount,
- FcAllocMem - FcFreeMem);
- FcAllocNotify = 0;
- FcFreeNotify = 0;
+ FcConfigFini ();
+ FcCacheFini ();
+ FcDefaultFini ();
+ FcObjectFini ();
+ FcConfigPathFini ();
}
-void
-FcMemAlloc (int kind, int size)
+/*
+ * Reread the configuration and available font lists
+ */
+FcBool
+FcInitReinitialize (void)
{
- if (FcDebug() & FC_DBG_MEMORY)
- {
- FcInUse[kind].alloc_count++;
- FcInUse[kind].alloc_mem += size;
- FcAllocCount++;
- FcAllocMem += size;
- FcAllocNotify += size;
- if (FcAllocNotify > FcMemNotice)
- FcMemReport ();
- }
+ FcConfig *config;
+ FcBool ret;
+
+ config = FcInitLoadConfigAndFonts ();
+ if (!config)
+ return FcFalse;
+ ret = FcConfigSetCurrent (config);
+ /* FcConfigSetCurrent() increases the refcount.
+ * decrease it here to avoid the memory leak.
+ */
+ FcConfigDestroy (config);
+
+ return ret;
}
-void
-FcMemFree (int kind, int size)
+FcBool
+FcInitBringUptoDate (void)
{
- if (FcDebug() & FC_DBG_MEMORY)
- {
- FcInUse[kind].free_count++;
- FcInUse[kind].free_mem += size;
- FcFreeCount++;
- FcFreeMem += size;
- FcFreeNotify += size;
- if (FcFreeNotify > FcMemNotice)
- FcMemReport ();
- }
+ FcConfig *config = FcConfigGetCurrent ();
+ time_t now;
+
+ if (!config)
+ return FcFalse;
+ /*
+ * rescanInterval == 0 disables automatic up to date
+ */
+ if (config->rescanInterval == 0)
+ return FcTrue;
+ /*
+ * Check no more often than rescanInterval seconds
+ */
+ now = time (0);
+ if (config->rescanTime + config->rescanInterval - now > 0)
+ return FcTrue;
+ /*
+ * If up to date, don't reload configuration
+ */
+ if (FcConfigUptoDate (0))
+ return FcTrue;
+ return FcInitReinitialize ();
}
+
+#define __fcinit__
+#include "fcaliastail.h"
+#undef __fcinit__