2002-02-15 00:34:13 +01:00
|
|
|
/*
|
2008-08-12 22:34:24 +02:00
|
|
|
* fontconfig/src/fcinit.c
|
2002-02-15 00:34:13 +01:00
|
|
|
*
|
2004-12-07 02:14:46 +01:00
|
|
|
* Copyright © 2001 Keith Packard
|
2002-02-15 00:34:13 +01:00
|
|
|
*
|
|
|
|
* 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
|
2010-11-10 22:45:42 +01:00
|
|
|
* documentation, and that the name of the author(s) not be used in
|
2002-02-15 00:34:13 +01:00
|
|
|
* advertising or publicity pertaining to distribution of the software without
|
2010-11-10 22:45:42 +01:00
|
|
|
* specific, written prior permission. The authors make no
|
2002-02-15 00:34:13 +01:00
|
|
|
* representations about the suitability of this software for any purpose. It
|
|
|
|
* is provided "as is" without express or implied warranty.
|
|
|
|
*
|
2009-03-12 21:00:08 +01:00
|
|
|
* THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
2002-02-15 00:34:13 +01:00
|
|
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
2009-03-12 21:00:08 +01:00
|
|
|
* EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
2002-02-15 00:34:13 +01:00
|
|
|
* 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 "fcint.h"
|
2006-04-25 07:57:41 +02:00
|
|
|
#include <stdlib.h>
|
2002-02-15 00:34:13 +01:00
|
|
|
|
2013-01-03 01:57:47 +01:00
|
|
|
#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
|
|
|
|
|
2002-05-21 19:06:22 +02:00
|
|
|
static FcConfig *
|
2014-06-17 13:08:24 +02:00
|
|
|
FcInitFallbackConfig (const FcChar8 *sysroot)
|
2002-02-15 00:34:13 +01:00
|
|
|
{
|
|
|
|
FcConfig *config;
|
|
|
|
|
|
|
|
config = FcConfigCreate ();
|
|
|
|
if (!config)
|
|
|
|
goto bail0;
|
2014-06-17 13:08:24 +02:00
|
|
|
FcConfigSetSysRoot (config, sysroot);
|
2002-05-21 19:48:15 +02:00
|
|
|
if (!FcConfigAddDir (config, (FcChar8 *) FC_DEFAULT_FONTS))
|
2002-02-15 00:34:13 +01:00
|
|
|
goto bail1;
|
2006-08-04 18:13:00 +02:00
|
|
|
if (!FcConfigAddCacheDir (config, (FcChar8 *) FC_CACHEDIR))
|
|
|
|
goto bail1;
|
2002-05-21 19:06:22 +02:00
|
|
|
return config;
|
2002-02-15 00:34:13 +01:00
|
|
|
|
|
|
|
bail1:
|
|
|
|
FcConfigDestroy (config);
|
|
|
|
bail0:
|
2002-05-21 19:06:22 +02:00
|
|
|
return 0;
|
2002-02-15 00:34:13 +01:00
|
|
|
}
|
|
|
|
|
2002-05-24 01:00:46 +02:00
|
|
|
int
|
|
|
|
FcGetVersion (void)
|
|
|
|
{
|
|
|
|
return FC_VERSION;
|
|
|
|
}
|
|
|
|
|
2002-02-15 00:34:13 +01:00
|
|
|
/*
|
2002-05-21 19:06:22 +02:00
|
|
|
* Load the configuration files
|
2002-02-15 00:34:13 +01:00
|
|
|
*/
|
2002-05-21 19:06:22 +02:00
|
|
|
FcConfig *
|
2013-02-06 11:35:30 +01:00
|
|
|
FcInitLoadOwnConfig (FcConfig *config)
|
2002-02-15 00:34:13 +01:00
|
|
|
{
|
2013-02-06 11:35:30 +01:00
|
|
|
if (!config)
|
|
|
|
{
|
|
|
|
config = FcConfigCreate ();
|
|
|
|
if (!config)
|
|
|
|
return NULL;
|
|
|
|
}
|
2010-04-12 18:18:50 +02:00
|
|
|
|
2005-11-24 20:38:05 +01:00
|
|
|
FcInitDebug ();
|
2010-04-12 18:18:50 +02:00
|
|
|
|
2002-02-15 00:34:13 +01:00
|
|
|
if (!FcConfigParseAndLoad (config, 0, FcTrue))
|
|
|
|
{
|
2014-06-17 13:08:24 +02:00
|
|
|
const FcChar8 *sysroot = FcConfigGetSysRoot (config);
|
|
|
|
FcConfig *fallback = FcInitFallbackConfig (sysroot);
|
|
|
|
|
2002-02-15 00:34:13 +01:00
|
|
|
FcConfigDestroy (config);
|
2014-06-17 13:08:24 +02:00
|
|
|
|
|
|
|
return fallback;
|
2002-02-15 00:34:13 +01:00
|
|
|
}
|
2014-03-27 07:10:44 +01:00
|
|
|
(void) FcConfigParseOnly (config, (const FcChar8 *)FC_TEMPLATEDIR, FcFalse);
|
2010-04-12 18:18:50 +02:00
|
|
|
|
2006-12-02 21:14:49 +01:00
|
|
|
if (config->cacheDirs && config->cacheDirs->num == 0)
|
|
|
|
{
|
2012-12-07 11:09:36 +01:00
|
|
|
FcChar8 *prefix, *p;
|
2012-03-12 11:18:19 +01:00
|
|
|
size_t plen;
|
2015-05-18 07:03:50 +02:00
|
|
|
FcBool have_own = FcFalse;
|
|
|
|
char *env_file, *env_path;
|
2012-03-12 11:18:19 +01:00
|
|
|
|
2015-05-18 07:03:50 +02:00
|
|
|
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);
|
|
|
|
}
|
2012-03-12 11:18:19 +01:00
|
|
|
prefix = FcConfigXdgCacheHome ();
|
|
|
|
if (!prefix)
|
|
|
|
goto bail;
|
2012-12-10 02:54:47 +01:00
|
|
|
plen = strlen ((const char *)prefix);
|
2012-12-07 11:09:36 +01:00
|
|
|
p = realloc (prefix, plen + 12);
|
|
|
|
if (!p)
|
2012-03-12 11:18:19 +01:00
|
|
|
goto bail;
|
2012-12-07 11:09:36 +01:00
|
|
|
prefix = p;
|
2012-03-12 11:18:19 +01:00
|
|
|
memcpy (&prefix[plen], FC_DIR_SEPARATOR_S "fontconfig", 11);
|
|
|
|
prefix[plen + 11] = 0;
|
2015-05-18 07:03:50 +02:00
|
|
|
if (!have_own)
|
|
|
|
fprintf (stderr,
|
|
|
|
"Fontconfig warning: adding <cachedir prefix=\"xdg\">fontconfig</cachedir>\n");
|
2012-03-12 11:18:19 +01:00
|
|
|
|
2006-12-02 21:14:49 +01:00
|
|
|
if (!FcConfigAddCacheDir (config, (FcChar8 *) FC_CACHEDIR) ||
|
2012-03-12 11:18:19 +01:00
|
|
|
!FcConfigAddCacheDir (config, (FcChar8 *) prefix))
|
2006-12-02 21:14:49 +01:00
|
|
|
{
|
2014-06-17 13:08:24 +02:00
|
|
|
FcConfig *fallback;
|
|
|
|
const FcChar8 *sysroot;
|
|
|
|
|
2012-03-12 11:18:19 +01:00
|
|
|
bail:
|
2014-06-17 13:08:24 +02:00
|
|
|
sysroot = FcConfigGetSysRoot (config);
|
2006-12-02 21:14:49 +01:00
|
|
|
fprintf (stderr,
|
|
|
|
"Fontconfig error: out of memory");
|
2012-12-07 11:09:36 +01:00
|
|
|
if (prefix)
|
|
|
|
FcStrFree (prefix);
|
2014-06-17 13:08:24 +02:00
|
|
|
fallback = FcInitFallbackConfig (sysroot);
|
2006-12-02 21:14:49 +01:00
|
|
|
FcConfigDestroy (config);
|
2014-06-17 13:08:24 +02:00
|
|
|
|
|
|
|
return fallback;
|
2006-12-02 21:14:49 +01:00
|
|
|
}
|
2012-12-07 11:09:36 +01:00
|
|
|
FcStrFree (prefix);
|
2006-12-02 21:14:49 +01:00
|
|
|
}
|
2002-05-21 19:06:22 +02:00
|
|
|
|
|
|
|
return config;
|
|
|
|
}
|
|
|
|
|
2013-02-06 11:35:30 +01:00
|
|
|
FcConfig *
|
|
|
|
FcInitLoadConfig (void)
|
|
|
|
{
|
|
|
|
return FcInitLoadOwnConfig (NULL);
|
|
|
|
}
|
|
|
|
|
2002-05-21 19:06:22 +02:00
|
|
|
/*
|
|
|
|
* Load the configuration files and scan for available fonts
|
|
|
|
*/
|
|
|
|
FcConfig *
|
2013-02-06 11:35:30 +01:00
|
|
|
FcInitLoadOwnConfigAndFonts (FcConfig *config)
|
2002-05-21 19:06:22 +02:00
|
|
|
{
|
2013-02-06 11:35:30 +01:00
|
|
|
config = FcInitLoadOwnConfig (config);
|
2002-05-21 19:06:22 +02:00
|
|
|
if (!config)
|
|
|
|
return 0;
|
|
|
|
if (!FcConfigBuildFonts (config))
|
|
|
|
{
|
|
|
|
FcConfigDestroy (config);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
return config;
|
|
|
|
}
|
|
|
|
|
2013-02-06 11:35:30 +01:00
|
|
|
FcConfig *
|
|
|
|
FcInitLoadConfigAndFonts (void)
|
|
|
|
{
|
|
|
|
return FcInitLoadOwnConfigAndFonts (NULL);
|
|
|
|
}
|
|
|
|
|
2002-05-21 19:06:22 +02:00
|
|
|
/*
|
|
|
|
* Initialize the default library configuration
|
|
|
|
*/
|
|
|
|
FcBool
|
|
|
|
FcInit (void)
|
|
|
|
{
|
2012-10-07 22:37:03 +02:00
|
|
|
return FcConfigInit ();
|
2002-05-21 19:06:22 +02:00
|
|
|
}
|
|
|
|
|
2003-08-15 21:45:20 +02:00
|
|
|
/*
|
|
|
|
* Free all library-allocated data structures.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
FcFini (void)
|
|
|
|
{
|
2012-10-07 22:37:03 +02:00
|
|
|
FcConfigFini ();
|
2006-09-04 22:59:58 +02:00
|
|
|
FcCacheFini ();
|
2012-10-07 21:52:25 +02:00
|
|
|
FcDefaultFini ();
|
2015-05-22 09:53:34 +02:00
|
|
|
FcObjectFini ();
|
|
|
|
FcConfigPathFini ();
|
2003-08-15 21:45:20 +02:00
|
|
|
}
|
|
|
|
|
2002-05-21 19:06:22 +02:00
|
|
|
/*
|
|
|
|
* Reread the configuration and available font lists
|
|
|
|
*/
|
|
|
|
FcBool
|
|
|
|
FcInitReinitialize (void)
|
|
|
|
{
|
|
|
|
FcConfig *config;
|
2014-08-12 11:48:00 +02:00
|
|
|
FcBool ret;
|
2002-05-21 19:06:22 +02:00
|
|
|
|
|
|
|
config = FcInitLoadConfigAndFonts ();
|
|
|
|
if (!config)
|
|
|
|
return FcFalse;
|
2014-08-12 11:48:00 +02:00
|
|
|
ret = FcConfigSetCurrent (config);
|
|
|
|
/* FcConfigSetCurrent() increases the refcount.
|
|
|
|
* decrease it here to avoid the memory leak.
|
|
|
|
*/
|
|
|
|
FcConfigDestroy (config);
|
|
|
|
|
|
|
|
return ret;
|
2002-02-15 00:34:13 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
FcBool
|
2002-05-21 19:06:22 +02:00
|
|
|
FcInitBringUptoDate (void)
|
2002-02-15 00:34:13 +01:00
|
|
|
{
|
2002-05-21 19:06:22 +02:00
|
|
|
FcConfig *config = FcConfigGetCurrent ();
|
|
|
|
time_t now;
|
|
|
|
|
2015-03-06 03:05:23 +01:00
|
|
|
if (!config)
|
|
|
|
return FcFalse;
|
2002-05-21 19:06:22 +02:00
|
|
|
/*
|
|
|
|
* 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 ();
|
2002-02-15 00:34:13 +01:00
|
|
|
}
|
|
|
|
|
2006-09-05 11:24:01 +02:00
|
|
|
#define __fcinit__
|
|
|
|
#include "fcaliastail.h"
|
|
|
|
#undef __fcinit__
|