X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Ffcinit.c;h=5e7c2f156626d8ba03c9713128723f9c2876806f;hb=a61280bf986f96bc95db1c66f20cae1f043dbed2;hp=80324fbe71ae1c8194fb30ee677a51c5f11370a0;hpb=6e9fc5ded4a36fb3e9e31b96f837b2e54f1cd77c;p=platform%2Fupstream%2Ffontconfig.git diff --git a/src/fcinit.c b/src/fcinit.c index 80324fb..5e7c2f1 100644 --- a/src/fcinit.c +++ b/src/fcinit.c @@ -1,174 +1,249 @@ /* - * $XFree86: xc/lib/fontconfig/src/fcinit.c,v 1.2 2002/02/15 06:01:28 keithp Exp $ + * 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 #include "fcint.h" +#include -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 (_fcConfig) - 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 elements found. Check configuration.\n"); + fprintf (stderr, + "Fontconfig warning: adding %s\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 fontconfig\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__