fcinit.c revision 6338c9e2
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 *
392c393a42SmrgFcInitFallbackConfig (void)
402c393a42Smrg{
412c393a42Smrg    FcConfig	*config;
422c393a42Smrg
432c393a42Smrg    config = FcConfigCreate ();
442c393a42Smrg    if (!config)
452c393a42Smrg	goto bail0;
462c393a42Smrg    if (!FcConfigAddDir (config, (FcChar8 *) FC_DEFAULT_FONTS))
472c393a42Smrg	goto bail1;
482c393a42Smrg    if (!FcConfigAddCacheDir (config, (FcChar8 *) FC_CACHEDIR))
492c393a42Smrg	goto bail1;
502c393a42Smrg    return config;
512c393a42Smrg
522c393a42Smrgbail1:
532c393a42Smrg    FcConfigDestroy (config);
542c393a42Smrgbail0:
552c393a42Smrg    return 0;
562c393a42Smrg}
572c393a42Smrg
582c393a42Smrgint
592c393a42SmrgFcGetVersion (void)
602c393a42Smrg{
612c393a42Smrg    return FC_VERSION;
622c393a42Smrg}
632c393a42Smrg
642c393a42Smrg/*
652c393a42Smrg * Load the configuration files
662c393a42Smrg */
672c393a42SmrgFcConfig *
68c9710b42SmrgFcInitLoadOwnConfig (FcConfig *config)
692c393a42Smrg{
70c9710b42Smrg    if (!config)
71c9710b42Smrg    {
72c9710b42Smrg	config = FcConfigCreate ();
73c9710b42Smrg	if (!config)
74c9710b42Smrg	    return NULL;
75c9710b42Smrg    }
76ca08ab68Smrg
772c393a42Smrg    FcInitDebug ();
78ca08ab68Smrg
792c393a42Smrg    if (!FcConfigParseAndLoad (config, 0, FcTrue))
802c393a42Smrg    {
812c393a42Smrg	FcConfigDestroy (config);
822c393a42Smrg	return FcInitFallbackConfig ();
832c393a42Smrg    }
84ca08ab68Smrg
852c393a42Smrg    if (config->cacheDirs && config->cacheDirs->num == 0)
862c393a42Smrg    {
87c9710b42Smrg	FcChar8 *prefix, *p;
88ca08ab68Smrg	size_t plen;
89ca08ab68Smrg
902c393a42Smrg	fprintf (stderr,
912c393a42Smrg		 "Fontconfig warning: no <cachedir> elements found. Check configuration.\n");
922c393a42Smrg	fprintf (stderr,
932c393a42Smrg		 "Fontconfig warning: adding <cachedir>%s</cachedir>\n",
942c393a42Smrg		 FC_CACHEDIR);
95ca08ab68Smrg	prefix = FcConfigXdgCacheHome ();
96ca08ab68Smrg	if (!prefix)
97ca08ab68Smrg	    goto bail;
98c9710b42Smrg	plen = strlen ((const char *)prefix);
99c9710b42Smrg	p = realloc (prefix, plen + 12);
100c9710b42Smrg	if (!p)
101ca08ab68Smrg	    goto bail;
102c9710b42Smrg	prefix = p;
103ca08ab68Smrg	memcpy (&prefix[plen], FC_DIR_SEPARATOR_S "fontconfig", 11);
104ca08ab68Smrg	prefix[plen + 11] = 0;
1052c393a42Smrg	fprintf (stderr,
106ca08ab68Smrg		 "Fontconfig warning: adding <cachedir prefix=\"xdg\">fontconfig</cachedir>\n");
107ca08ab68Smrg
1082c393a42Smrg	if (!FcConfigAddCacheDir (config, (FcChar8 *) FC_CACHEDIR) ||
109ca08ab68Smrg	    !FcConfigAddCacheDir (config, (FcChar8 *) prefix))
1102c393a42Smrg	{
111ca08ab68Smrg	  bail:
1122c393a42Smrg	    fprintf (stderr,
1132c393a42Smrg		     "Fontconfig error: out of memory");
114c9710b42Smrg	    if (prefix)
115c9710b42Smrg		FcStrFree (prefix);
1162c393a42Smrg	    FcConfigDestroy (config);
1172c393a42Smrg	    return FcInitFallbackConfig ();
1182c393a42Smrg	}
119c9710b42Smrg	FcStrFree (prefix);
1202c393a42Smrg    }
1212c393a42Smrg
1222c393a42Smrg    return config;
1232c393a42Smrg}
1242c393a42Smrg
125c9710b42SmrgFcConfig *
126c9710b42SmrgFcInitLoadConfig (void)
127c9710b42Smrg{
128c9710b42Smrg    return FcInitLoadOwnConfig (NULL);
129c9710b42Smrg}
130c9710b42Smrg
1312c393a42Smrg/*
1322c393a42Smrg * Load the configuration files and scan for available fonts
1332c393a42Smrg */
1342c393a42SmrgFcConfig *
135c9710b42SmrgFcInitLoadOwnConfigAndFonts (FcConfig *config)
1362c393a42Smrg{
137c9710b42Smrg    config = FcInitLoadOwnConfig (config);
1382c393a42Smrg    if (!config)
1392c393a42Smrg	return 0;
1402c393a42Smrg    if (!FcConfigBuildFonts (config))
1412c393a42Smrg    {
1422c393a42Smrg	FcConfigDestroy (config);
1432c393a42Smrg	return 0;
1442c393a42Smrg    }
1452c393a42Smrg    return config;
1462c393a42Smrg}
1472c393a42Smrg
148c9710b42SmrgFcConfig *
149c9710b42SmrgFcInitLoadConfigAndFonts (void)
150c9710b42Smrg{
151c9710b42Smrg    return FcInitLoadOwnConfigAndFonts (NULL);
152c9710b42Smrg}
153c9710b42Smrg
1542c393a42Smrg/*
1552c393a42Smrg * Initialize the default library configuration
1562c393a42Smrg */
1572c393a42SmrgFcBool
1582c393a42SmrgFcInit (void)
1592c393a42Smrg{
160c9710b42Smrg    return FcConfigInit ();
1612c393a42Smrg}
1622c393a42Smrg
1632c393a42Smrg/*
1642c393a42Smrg * Free all library-allocated data structures.
1652c393a42Smrg */
1662c393a42Smrgvoid
1672c393a42SmrgFcFini (void)
1682c393a42Smrg{
169c9710b42Smrg    FcConfigFini ();
1702c393a42Smrg    FcCacheFini ();
171c9710b42Smrg    FcDefaultFini ();
1722c393a42Smrg}
1732c393a42Smrg
1742c393a42Smrg/*
1752c393a42Smrg * Reread the configuration and available font lists
1762c393a42Smrg */
1772c393a42SmrgFcBool
1782c393a42SmrgFcInitReinitialize (void)
1792c393a42Smrg{
1802c393a42Smrg    FcConfig	*config;
1812c393a42Smrg
1822c393a42Smrg    config = FcInitLoadConfigAndFonts ();
1832c393a42Smrg    if (!config)
1842c393a42Smrg	return FcFalse;
185c9710b42Smrg    return FcConfigSetCurrent (config);
1862c393a42Smrg}
1872c393a42Smrg
1882c393a42SmrgFcBool
1892c393a42SmrgFcInitBringUptoDate (void)
1902c393a42Smrg{
1912c393a42Smrg    FcConfig	*config = FcConfigGetCurrent ();
1922c393a42Smrg    time_t	now;
1932c393a42Smrg
1942c393a42Smrg    /*
1952c393a42Smrg     * rescanInterval == 0 disables automatic up to date
1962c393a42Smrg     */
1972c393a42Smrg    if (config->rescanInterval == 0)
1982c393a42Smrg	return FcTrue;
1992c393a42Smrg    /*
2002c393a42Smrg     * Check no more often than rescanInterval seconds
2012c393a42Smrg     */
2022c393a42Smrg    now = time (0);
2032c393a42Smrg    if (config->rescanTime + config->rescanInterval - now > 0)
2042c393a42Smrg	return FcTrue;
2052c393a42Smrg    /*
2062c393a42Smrg     * If up to date, don't reload configuration
2072c393a42Smrg     */
2082c393a42Smrg    if (FcConfigUptoDate (0))
2092c393a42Smrg	return FcTrue;
2102c393a42Smrg    return FcInitReinitialize ();
2112c393a42Smrg}
2122c393a42Smrg
2132c393a42Smrg#define __fcinit__
2142c393a42Smrg#include "fcaliastail.h"
2152c393a42Smrg#undef __fcinit__
216