source: trunk/poppler/fontconfig-2.3.2-os2/src/fcinit.c @ 2

Last change on this file since 2 was 2, checked in by Eugene Romanenko, 15 years ago

First import

File size: 5.8 KB
Line 
1/*
2 * $RCSId: xc/lib/fontconfig/src/fcinit.c,v 1.7 2002/08/22 07:36:44 keithp Exp $
3 *
4 * Copyright © 2001 Keith Packard
5 *
6 * Permission to use, copy, modify, distribute, and sell this software and its
7 * documentation for any purpose is hereby granted without fee, provided that
8 * the above copyright notice appear in all copies and that both that
9 * copyright notice and this permission notice appear in supporting
10 * documentation, and that the name of Keith Packard not be used in
11 * advertising or publicity pertaining to distribution of the software without
12 * specific, written prior permission.  Keith Packard makes no
13 * representations about the suitability of this software for any purpose.  It
14 * is provided "as is" without express or implied warranty.
15 *
16 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
17 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
18 * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
19 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
20 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
21 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
22 * PERFORMANCE OF THIS SOFTWARE.
23 */
24
25#include <stdlib.h>
26#include "fcint.h"
27
28static FcConfig *
29FcInitFallbackConfig (void)
30{
31    FcConfig    *config;
32
33    config = FcConfigCreate ();
34    if (!config)
35      goto bail0;
36#ifdef __OS2__
37    if (!FcConfigAddDir (config, FcConfigHome()))
38      goto bail1;
39#else
40    if (!FcConfigAddDir (config, (FcChar8 *) FC_DEFAULT_FONTS))
41      goto bail1;
42#endif
43    return config;
44
45bail1:
46    FcConfigDestroy (config);
47bail0:
48    return 0;
49}
50
51int
52FcGetVersion (void)
53{
54    return FC_VERSION;
55}
56
57/*
58 * Load the configuration files
59 */
60FcConfig *
61FcInitLoadConfig (void)
62{
63    FcConfig    *config;
64
65    config = FcConfigCreate ();
66    if (!config)
67        return FcFalse;
68
69    if (!FcConfigParseAndLoad (config, 0, FcTrue))
70    {
71        FcConfigDestroy (config);
72        return FcInitFallbackConfig ();
73    }
74
75    return config;
76}
77
78/*
79 * Load the configuration files and scan for available fonts
80 */
81FcConfig *
82FcInitLoadConfigAndFonts (void)
83{
84    FcConfig    *config = FcInitLoadConfig ();
85
86    if (!config)
87        return 0;
88    if (!FcConfigBuildFonts (config))
89    {
90        FcConfigDestroy (config);
91        return 0;
92    }
93    return config;
94}
95
96/*
97 * Initialize the default library configuration
98 */
99FcBool
100FcInit (void)
101{
102    FcConfig    *config;
103
104    if (_fcConfig)
105        return FcTrue;
106
107    FcObjectStaticNameListInit ();
108
109    config = FcInitLoadConfigAndFonts ();
110    if (!config)
111        return FcTrue;
112    FcConfigSetCurrent (config);
113    if (FcDebug() & FC_DBG_MEMORY)
114        FcMemReport ();
115    return FcTrue;
116}
117
118/*
119 * Free all library-allocated data structures.
120 */
121void
122FcFini (void)
123{
124    if (_fcConfig)
125        FcConfigDestroy (_fcConfig);
126
127    FcPatternThawAll ();
128    FcCharSetThawAll ();
129    FcObjectStaticNameListFini ();
130}
131
132/*
133 * Reread the configuration and available font lists
134 */
135FcBool
136FcInitReinitialize (void)
137{
138    FcConfig    *config;
139
140    config = FcInitLoadConfigAndFonts ();
141    if (!config)
142        return FcFalse;
143    FcConfigSetCurrent (config);
144    return FcTrue;
145}
146
147FcBool
148FcInitBringUptoDate (void)
149{
150    FcConfig    *config = FcConfigGetCurrent ();
151    time_t      now;
152
153    /*
154     * rescanInterval == 0 disables automatic up to date
155     */
156    if (config->rescanInterval == 0)
157        return FcTrue;
158    /*
159     * Check no more often than rescanInterval seconds
160     */
161    now = time (0);
162    if (config->rescanTime + config->rescanInterval - now > 0)
163        return FcTrue;
164    /*
165     * If up to date, don't reload configuration
166     */
167    if (FcConfigUptoDate (0))
168        return FcTrue;
169    return FcInitReinitialize ();
170}
171
172static struct {
173    char    *name;
174    int     alloc_count;
175    int     alloc_mem;
176    int     free_count;
177    int     free_mem;
178} FcInUse[FC_MEM_NUM] = {
179    { "charset" },
180    { "charleaf" },
181    { "fontset" },
182    { "fontptr" },
183    { "objectset" },
184    { "objectptr" },
185    { "matrix" },
186    { "pattern" },
187    { "patelt" },
188    { "vallist" },
189    { "substate" },
190    { "string" },
191    { "listbuck" },
192    { "strset" },
193    { "strlist" },
194    { "config" },
195    { "langset" },
196    { "atomic" },
197    { "blanks" },
198    { "cache" },
199    { "strbuf" },
200    { "subst" },
201    { "objecttype" },
202    { "constant" },
203    { "test" },
204    { "expr" },
205    { "vstack" },
206    { "attr" },
207    { "pstack" },
208    { "staticstr" },
209};
210
211static int  FcAllocCount, FcAllocMem;
212static int  FcFreeCount, FcFreeMem;
213
214static int  FcMemNotice = 1*1024*1024;
215
216static int  FcAllocNotify, FcFreeNotify;
217
218void
219FcValueListReport (void);
220
221void
222FcMemReport (void)
223{
224    int i;
225    printf ("Fc Memory Usage:\n");
226    printf ("\t   Which       Alloc           Free           Active\n");
227    printf ("\t           count   bytes   count   bytes   count   bytes\n");
228    for (i = 0; i < FC_MEM_NUM; i++)
229        printf ("%16.16s%8d%8d%8d%8d%8d%8d\n",
230                FcInUse[i].name,
231                FcInUse[i].alloc_count, FcInUse[i].alloc_mem,
232                FcInUse[i].free_count, FcInUse[i].free_mem,
233                FcInUse[i].alloc_count - FcInUse[i].free_count,
234                FcInUse[i].alloc_mem - FcInUse[i].free_mem);
235    printf ("%16.16s%8d%8d%8d%8d%8d%8d\n",
236            "Total",
237            FcAllocCount, FcAllocMem,
238            FcFreeCount, FcFreeMem,
239            FcAllocCount - FcFreeCount,
240            FcAllocMem - FcFreeMem);
241    FcAllocNotify = 0;
242    FcFreeNotify = 0;
243    FcValueListReport ();
244}
245
246void
247FcMemAlloc (int kind, int size)
248{
249    if (FcDebug() & FC_DBG_MEMORY)
250    {
251        FcInUse[kind].alloc_count++;
252        FcInUse[kind].alloc_mem += size;
253        FcAllocCount++;
254        FcAllocMem += size;
255        FcAllocNotify += size;
256        if (FcAllocNotify > FcMemNotice)
257            FcMemReport ();
258    }
259}
260
261void
262FcMemFree (int kind, int size)
263{
264    if (FcDebug() & FC_DBG_MEMORY)
265    {
266        FcInUse[kind].free_count++;
267        FcInUse[kind].free_mem += size;
268        FcFreeCount++;
269        FcFreeMem += size;
270        FcFreeNotify += size;
271        if (FcFreeNotify > FcMemNotice)
272            FcMemReport ();
273    }
274}
Note: See TracBrowser for help on using the repository browser.