fcinit.c revision 1887081f
12c393a42Smrg/*
2a6844aabSmrg * fontconfig/src/fcinit.c
32c393a42Smrg *
42c393a42Smrg * Copyright © 2001 Keith Packard
52c393a42Smrg *
62c393a42Smrg * Permission to use, copy, modify, distribute, and sell this software and its
72c393a42Smrg * documentation for any purpose is hereby granted without fee, provided that
82c393a42Smrg * the above copyright notice appear in all copies and that both that
92c393a42Smrg * copyright notice and this permission notice appear in supporting
10ca08ab68Smrg * documentation, and that the name of the author(s) not be used in
112c393a42Smrg * advertising or publicity pertaining to distribution of the software without
12ca08ab68Smrg * specific, written prior permission.  The authors make no
132c393a42Smrg * representations about the suitability of this software for any purpose.  It
142c393a42Smrg * is provided "as is" without express or implied warranty.
152c393a42Smrg *
16a6844aabSmrg * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
172c393a42Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
18a6844aabSmrg * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
192c393a42Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
202c393a42Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
212c393a42Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
222c393a42Smrg * PERFORMANCE OF THIS SOFTWARE.
232c393a42Smrg */
242c393a42Smrg
252c393a42Smrg#include "fcint.h"
262c393a42Smrg#include <stdlib.h>
272c393a42Smrg
28c9710b42Smrg#if defined(FC_ATOMIC_INT_NIL)
296338c9e2Sriastradh#warning Could not find any system to define atomic_int macros, library may NOT be thread-safe.
30c9710b42Smrg#endif
31c9710b42Smrg#if defined(FC_MUTEX_IMPL_NIL)
326338c9e2Sriastradh#warning Could not find any system to define mutex macros, library may NOT be thread-safe.
33c9710b42Smrg#endif
34c9710b42Smrg#if defined(FC_ATOMIC_INT_NIL) || defined(FC_MUTEX_IMPL_NIL)
356338c9e2Sriastradh#warning To suppress these warnings, define FC_NO_MT.
36c9710b42Smrg#endif
37c9710b42Smrg
382c393a42Smrgstatic FcConfig *
3918bd4a06SmrgFcInitFallbackConfig (const FcChar8 *sysroot)
402c393a42Smrg{
412c393a42Smrg    FcConfig	*config;
421887081fSmrg    const FcChar8 *fallback = (const FcChar8 *) ""	\
431887081fSmrg	"<fontconfig>" \
441887081fSmrg	"  <dir>" FC_DEFAULT_FONTS "</dir>" \
451887081fSmrg	"  <dir prefix=\"xdg\">fonts</dir>" \
461887081fSmrg	"  <cachedir>" FC_CACHEDIR "</cachedir>" \
471887081fSmrg	"  <cachedir prefix=\"xdg\">fontconfig</cachedir>" \
481887081fSmrg	"  <include ignore_missing=\"yes\" prefix=\"xdg\">fontconfig/conf.d</include>" \
491887081fSmrg	"  <include ignore_missing=\"yes\" prefix=\"xdg\">fontconfig/fonts.conf</include>" \
501887081fSmrg	"</fontconfig>";
512c393a42Smrg
522c393a42Smrg    config = FcConfigCreate ();
532c393a42Smrg    if (!config)
542c393a42Smrg	goto bail0;
5518bd4a06Smrg    FcConfigSetSysRoot (config, sysroot);
561887081fSmrg    if (!FcConfigParseAndLoadFromMemory (config, fallback, FcFalse))
572c393a42Smrg	goto bail1;
581887081fSmrg
592c393a42Smrg    return config;
602c393a42Smrg
612c393a42Smrgbail1:
622c393a42Smrg    FcConfigDestroy (config);
632c393a42Smrgbail0:
642c393a42Smrg    return 0;
652c393a42Smrg}
662c393a42Smrg
672c393a42Smrgint
682c393a42SmrgFcGetVersion (void)
692c393a42Smrg{
702c393a42Smrg    return FC_VERSION;
712c393a42Smrg}
722c393a42Smrg
732c393a42Smrg/*
742c393a42Smrg * Load the configuration files
752c393a42Smrg */
762c393a42SmrgFcConfig *
77c9710b42SmrgFcInitLoadOwnConfig (FcConfig *config)
782c393a42Smrg{
79c9710b42Smrg    if (!config)
80c9710b42Smrg    {
81c9710b42Smrg	config = FcConfigCreate ();
82c9710b42Smrg	if (!config)
83c9710b42Smrg	    return NULL;
84c9710b42Smrg    }
85ca08ab68Smrg
862c393a42Smrg    FcInitDebug ();
87ca08ab68Smrg
882c393a42Smrg    if (!FcConfigParseAndLoad (config, 0, FcTrue))
892c393a42Smrg    {
9018bd4a06Smrg	const FcChar8 *sysroot = FcConfigGetSysRoot (config);
9118bd4a06Smrg	FcConfig *fallback = FcInitFallbackConfig (sysroot);
9218bd4a06Smrg
932c393a42Smrg	FcConfigDestroy (config);
9418bd4a06Smrg
9518bd4a06Smrg	return fallback;
962c393a42Smrg    }
971887081fSmrg    (void) FcConfigParseOnly (config, (const FcChar8 *)FC_TEMPLATEDIR, FcFalse);
98ca08ab68Smrg
992c393a42Smrg    if (config->cacheDirs && config->cacheDirs->num == 0)
1002c393a42Smrg    {
101c9710b42Smrg	FcChar8 *prefix, *p;
102ca08ab68Smrg	size_t plen;
10318bd4a06Smrg	FcBool have_own = FcFalse;
10418bd4a06Smrg	char *env_file, *env_path;
105ca08ab68Smrg
10618bd4a06Smrg	env_file = getenv ("FONTCONFIG_FILE");
10718bd4a06Smrg	env_path = getenv ("FONTCONFIG_PATH");
10818bd4a06Smrg	if ((env_file != NULL && env_file[0] != 0) ||
10918bd4a06Smrg	    (env_path != NULL && env_path[0] != 0))
11018bd4a06Smrg	    have_own = FcTrue;
11118bd4a06Smrg
11218bd4a06Smrg	if (!have_own)
11318bd4a06Smrg	{
11418bd4a06Smrg	    fprintf (stderr,
11518bd4a06Smrg		     "Fontconfig warning: no <cachedir> elements found. Check configuration.\n");
11618bd4a06Smrg	    fprintf (stderr,
11718bd4a06Smrg		     "Fontconfig warning: adding <cachedir>%s</cachedir>\n",
11818bd4a06Smrg		     FC_CACHEDIR);
11918bd4a06Smrg	}
120ca08ab68Smrg	prefix = FcConfigXdgCacheHome ();
121ca08ab68Smrg	if (!prefix)
122ca08ab68Smrg	    goto bail;
123c9710b42Smrg	plen = strlen ((const char *)prefix);
124c9710b42Smrg	p = realloc (prefix, plen + 12);
125c9710b42Smrg	if (!p)
126ca08ab68Smrg	    goto bail;
127c9710b42Smrg	prefix = p;
128ca08ab68Smrg	memcpy (&prefix[plen], FC_DIR_SEPARATOR_S "fontconfig", 11);
129ca08ab68Smrg	prefix[plen + 11] = 0;
13018bd4a06Smrg	if (!have_own)
13118bd4a06Smrg	    fprintf (stderr,
13218bd4a06Smrg		     "Fontconfig warning: adding <cachedir prefix=\"xdg\">fontconfig</cachedir>\n");
133ca08ab68Smrg
1342c393a42Smrg	if (!FcConfigAddCacheDir (config, (FcChar8 *) FC_CACHEDIR) ||
135ca08ab68Smrg	    !FcConfigAddCacheDir (config, (FcChar8 *) prefix))
1362c393a42Smrg	{
13718bd4a06Smrg	    FcConfig *fallback;
13818bd4a06Smrg	    const FcChar8 *sysroot;
13918bd4a06Smrg
140ca08ab68Smrg	  bail:
14118bd4a06Smrg	    sysroot = FcConfigGetSysRoot (config);
1422c393a42Smrg	    fprintf (stderr,
1432c393a42Smrg		     "Fontconfig error: out of memory");
144c9710b42Smrg	    if (prefix)
145c9710b42Smrg		FcStrFree (prefix);
14618bd4a06Smrg	    fallback = FcInitFallbackConfig (sysroot);
1472c393a42Smrg	    FcConfigDestroy (config);
14818bd4a06Smrg
14918bd4a06Smrg	    return fallback;
1502c393a42Smrg	}
151c9710b42Smrg	FcStrFree (prefix);
1522c393a42Smrg    }
1532c393a42Smrg
1542c393a42Smrg    return config;
1552c393a42Smrg}
1562c393a42Smrg
157c9710b42SmrgFcConfig *
158c9710b42SmrgFcInitLoadConfig (void)
159c9710b42Smrg{
160c9710b42Smrg    return FcInitLoadOwnConfig (NULL);
161c9710b42Smrg}
162c9710b42Smrg
1632c393a42Smrg/*
1642c393a42Smrg * Load the configuration files and scan for available fonts
1652c393a42Smrg */
1662c393a42SmrgFcConfig *
167c9710b42SmrgFcInitLoadOwnConfigAndFonts (FcConfig *config)
1682c393a42Smrg{
169c9710b42Smrg    config = FcInitLoadOwnConfig (config);
1702c393a42Smrg    if (!config)
1712c393a42Smrg	return 0;
1722c393a42Smrg    if (!FcConfigBuildFonts (config))
1732c393a42Smrg    {
1742c393a42Smrg	FcConfigDestroy (config);
1752c393a42Smrg	return 0;
1762c393a42Smrg    }
1772c393a42Smrg    return config;
1782c393a42Smrg}
1792c393a42Smrg
180c9710b42SmrgFcConfig *
181c9710b42SmrgFcInitLoadConfigAndFonts (void)
182c9710b42Smrg{
183c9710b42Smrg    return FcInitLoadOwnConfigAndFonts (NULL);
184c9710b42Smrg}
185c9710b42Smrg
1862c393a42Smrg/*
1872c393a42Smrg * Initialize the default library configuration
1882c393a42Smrg */
1892c393a42SmrgFcBool
1902c393a42SmrgFcInit (void)
1912c393a42Smrg{
192c9710b42Smrg    return FcConfigInit ();
1932c393a42Smrg}
1942c393a42Smrg
1952c393a42Smrg/*
1962c393a42Smrg * Free all library-allocated data structures.
1972c393a42Smrg */
1982c393a42Smrgvoid
1992c393a42SmrgFcFini (void)
2002c393a42Smrg{
201c9710b42Smrg    FcConfigFini ();
2022c393a42Smrg    FcCacheFini ();
203c9710b42Smrg    FcDefaultFini ();
20418bd4a06Smrg    FcObjectFini ();
20518bd4a06Smrg    FcConfigPathFini ();
2062c393a42Smrg}
2072c393a42Smrg
2082c393a42Smrg/*
2092c393a42Smrg * Reread the configuration and available font lists
2102c393a42Smrg */
2112c393a42SmrgFcBool
2122c393a42SmrgFcInitReinitialize (void)
2132c393a42Smrg{
2142c393a42Smrg    FcConfig	*config;
21518bd4a06Smrg    FcBool	ret;
2162c393a42Smrg
2172c393a42Smrg    config = FcInitLoadConfigAndFonts ();
2182c393a42Smrg    if (!config)
2192c393a42Smrg	return FcFalse;
22018bd4a06Smrg    ret = FcConfigSetCurrent (config);
22118bd4a06Smrg    /* FcConfigSetCurrent() increases the refcount.
22218bd4a06Smrg     * decrease it here to avoid the memory leak.
22318bd4a06Smrg     */
22418bd4a06Smrg    FcConfigDestroy (config);
22518bd4a06Smrg
22618bd4a06Smrg    return ret;
2272c393a42Smrg}
2282c393a42Smrg
2292c393a42SmrgFcBool
2302c393a42SmrgFcInitBringUptoDate (void)
2312c393a42Smrg{
2322c393a42Smrg    FcConfig	*config = FcConfigGetCurrent ();
2332c393a42Smrg    time_t	now;
2342c393a42Smrg
23518bd4a06Smrg    if (!config)
23618bd4a06Smrg	return FcFalse;
2372c393a42Smrg    /*
2382c393a42Smrg     * rescanInterval == 0 disables automatic up to date
2392c393a42Smrg     */
2402c393a42Smrg    if (config->rescanInterval == 0)
2412c393a42Smrg	return FcTrue;
2422c393a42Smrg    /*
2432c393a42Smrg     * Check no more often than rescanInterval seconds
2442c393a42Smrg     */
2452c393a42Smrg    now = time (0);
2462c393a42Smrg    if (config->rescanTime + config->rescanInterval - now > 0)
2472c393a42Smrg	return FcTrue;
2482c393a42Smrg    /*
2492c393a42Smrg     * If up to date, don't reload configuration
2502c393a42Smrg     */
2512c393a42Smrg    if (FcConfigUptoDate (0))
2522c393a42Smrg	return FcTrue;
2532c393a42Smrg    return FcInitReinitialize ();
2542c393a42Smrg}
2552c393a42Smrg
2562c393a42Smrg#define __fcinit__
2572c393a42Smrg#include "fcaliastail.h"
2582c393a42Smrg#undef __fcinit__
259