]> git.wh0rd.org Git - fontconfig.git/blob - src/fcfs.c
Overhaul the serialization system to create one mmapable file per directory
[fontconfig.git] / src / fcfs.c
1 /*
2  * $RCSId: $
3  *
4  * Copyright © 2000 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
28 FcFontSet *
29 FcFontSetCreate (void)
30 {
31     FcFontSet   *s;
32
33     s = (FcFontSet *) malloc (sizeof (FcFontSet));
34     if (!s)
35         return 0;
36     FcMemAlloc (FC_MEM_FONTSET, sizeof (FcFontSet));
37     s->nfont = 0;
38     s->sfont = 0;
39     s->fonts = 0;
40     return s;
41 }
42
43 void
44 FcFontSetDestroy (FcFontSet *s)
45 {
46     int     i;
47
48     for (i = 0; i < s->nfont; i++)
49         FcPatternDestroy (s->fonts[i]);
50     if (s->fonts)
51     {
52         FcMemFree (FC_MEM_FONTPTR, s->sfont * sizeof (FcPattern *));
53         free (s->fonts);
54     }
55     FcMemFree (FC_MEM_FONTSET, sizeof (FcFontSet));
56     free (s);
57 }
58
59 FcBool
60 FcFontSetAdd (FcFontSet *s, FcPattern *font)
61 {
62     FcPattern   **f;
63     int         sfont;
64     
65     if (s->nfont == s->sfont)
66     {
67         sfont = s->sfont + 32;
68         if (s->fonts)
69             f = (FcPattern **) realloc (s->fonts, sfont * sizeof (FcPattern *));
70         else
71             f = (FcPattern **) malloc (sfont * sizeof (FcPattern *));
72         if (!f)
73             return FcFalse;
74         if (s->sfont)
75             FcMemFree (FC_MEM_FONTPTR, s->sfont * sizeof (FcPattern *));
76         FcMemAlloc (FC_MEM_FONTPTR, sfont * sizeof (FcPattern *));
77         s->sfont = sfont;
78         s->fonts = f;
79     }
80     s->fonts[s->nfont++] = font;
81     return FcTrue;
82 }
83
84 static int * fcfs_pat_count;
85
86 void
87 FcFontSetNewBank (void)
88 {
89     FcPatternNewBank();
90     FcObjectNewBank();
91 }
92
93 int
94 FcFontSetNeededBytes (FcFontSet *s)
95 {
96     int i, c, cum = 0;
97
98     for (i = 0; i < s->nfont; i++)
99     {
100         c = FcPatternNeededBytes(s->fonts[i]);
101         if (c < 0)
102             return c;
103         cum += c;
104     }
105
106     if (cum > 0)
107         return cum + sizeof(int);
108     else
109         return 0;
110 }
111
112 void *
113 FcFontSetDistributeBytes (FcCache * metadata, void * block_ptr)
114 {
115     fcfs_pat_count = (int *)block_ptr;
116     block_ptr = (int *)block_ptr + 1;
117     // we don't consume any bytes for the fontset itself,
118     // since we don't allocate it statically.
119     block_ptr = FcPatternDistributeBytes (metadata, block_ptr);
120
121     // for good measure, write out the object ids used for
122     // this bank to the file.
123     return FcObjectDistributeBytes (metadata, block_ptr);
124 }
125
126 FcBool
127 FcFontSetSerialize (int bank, FcFontSet * s)
128 {
129     int i;
130     FcPattern * p;
131     *fcfs_pat_count = s->nfont;
132
133     for (i = 0; i < s->nfont; i++)
134     {
135         p = FcPatternSerialize (bank, s->fonts[i]);
136         if (!p) return FcFalse;
137         FcPatternDestroy (s->fonts[i]);
138
139         s->fonts[i] = p;
140     }
141
142     return FcTrue;
143 }
144
145 FcBool
146 FcFontSetUnserialize(FcCache metadata, FcFontSet * s, void * block_ptr)
147 {
148     int nfont;
149     int i, n;
150
151     nfont = *(int *)block_ptr;
152     block_ptr = (int *)block_ptr + 1;
153
154     if (s->sfont < s->nfont + nfont)
155     {
156         int sfont = s->nfont + nfont;
157         FcPattern ** pp;
158         pp = realloc (s->fonts, sfont * sizeof (FcPattern));
159         if (!pp)
160             return FcFalse;
161         s->fonts = pp;
162         s->sfont = sfont;
163     }
164     n = s->nfont;
165     s->nfont += nfont;
166
167     if (nfont > 0)
168     {
169         FcPattern * p = FcPatternUnserialize (metadata, block_ptr);
170         for (i = 0; i < nfont; i++)
171             s->fonts[n + i] = p+i;
172     }
173
174     return FcTrue;
175 }