X-Git-Url: https://git.wh0rd.org/?p=fontconfig.git;a=blobdiff_plain;f=src%2Ffcinit.c;h=b7966b6db08a466196ad9fb493cd234238d6450b;hp=f82e0182cb76b6bfa0863c85054bcd3cc6b49c76;hb=HEAD;hpb=24330d27f88bbf387d92128d2c21e005f2563e93 diff --git a/src/fcinit.c b/src/fcinit.c index f82e018..b7966b6 100644 --- a/src/fcinit.c +++ b/src/fcinit.c @@ -1,46 +1,31 @@ /* - * $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 #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 +static FcConfig * FcInitFallbackConfig (void) { FcConfig *config; @@ -48,68 +33,195 @@ FcInitFallbackConfig (void) config = FcConfigCreate (); if (!config) goto bail0; - if (!FcConfigAddDir (config, FC_FALLBACK_FONTS)) + 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 * +FcInitLoadConfig (void) { - FcConfig *config; - - if (FcConfigGetCurrent ()) - return FcTrue; - + FcConfig *config; + + FcInitDebug (); config = FcConfigCreate (); if (!config) - return FcFalse; - + return NULL; + if (!FcConfigParseAndLoad (config, 0, FcTrue)) { FcConfigDestroy (config); return FcInitFallbackConfig (); } - + + if (config->cacheDirs && config->cacheDirs->num == 0) + { + fprintf (stderr, + "Fontconfig warning: no elements found. Check configuration.\n"); + fprintf (stderr, + "Fontconfig warning: adding %s\n", + FC_CACHEDIR); + fprintf (stderr, + "Fontconfig warning: adding ~/.fontconfig\n"); + if (!FcConfigAddCacheDir (config, (FcChar8 *) FC_CACHEDIR) || + !FcConfigAddCacheDir (config, (FcChar8 *) "~/.fontconfig")) + { + fprintf (stderr, + "Fontconfig error: out of memory"); + FcConfigDestroy (config); + return FcInitFallbackConfig (); + } + } + + return config; +} + +/* + * Load the configuration files and scan for available fonts + */ +FcConfig * +FcInitLoadConfigAndFonts (void) +{ + FcConfig *config = FcInitLoadConfig (); + + FcInitDebug (); + if (!config) + return 0; + if (!FcConfigBuildFonts (config)) + { + FcConfigDestroy (config); + return 0; + } + return config; +} + +/* + * Initialize the default library configuration + */ +FcBool +FcInit (void) +{ + FcConfig *config; + + if (_fcConfig) + return FcTrue; + config = FcInitLoadConfigAndFonts (); + if (!config) + return FcFalse; + FcConfigSetCurrent (config); + if (FcDebug() & FC_DBG_MEMORY) + FcMemReport (); + return FcTrue; +} + +/* + * Free all library-allocated data structures. + */ +void +FcFini (void) +{ + if (_fcConfig) + FcConfigDestroy (_fcConfig); + + FcPatternFini (); + FcCacheFini (); + if (FcDebug() & FC_DBG_MEMORY) + FcMemReport (); +} + +/* + * Reread the configuration and available font lists + */ +FcBool +FcInitReinitialize (void) +{ + FcConfig *config; + + config = FcInitLoadConfigAndFonts (); + if (!config) + return FcFalse; FcConfigSetCurrent (config); return FcTrue; } FcBool -FcInit (void) +FcInitBringUptoDate (void) { - return FcInitConfig () && FcInitFonts (); + FcConfig *config = FcConfigGetCurrent (); + time_t now; + + /* + * 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 (); } static struct { - char *name; + char name[16]; 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 }, + { "charset" }, + { "charleaf" }, + { "fontset" }, + { "fontptr" }, + { "objectset" }, + { "objectptr" }, + { "matrix" }, + { "pattern" }, + { "patelt" }, + { "vallist" }, + { "substate" }, + { "string" }, + { "listbuck" }, + { "strset" }, + { "strlist" }, + { "config" }, + { "langset" }, + { "atomic" }, + { "blanks" }, + { "cache" }, + { "strbuf" }, + { "subst" }, + { "objecttype" }, + { "constant" }, + { "test" }, + { "expr" }, + { "vstack" }, + { "attr" }, + { "pstack" }, + { "staticstr" }, }; static int FcAllocCount, FcAllocMem; @@ -127,13 +239,13 @@ FcMemReport (void) 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", + printf ("%16.16s%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", + printf ("%16.16s%8d%8d%8d%8d%8d%8d\n", "Total", FcAllocCount, FcAllocMem, FcFreeCount, FcFreeMem, @@ -172,3 +284,6 @@ FcMemFree (int kind, int size) FcMemReport (); } } +#define __fcinit__ +#include "fcaliastail.h" +#undef __fcinit__