]>
git.wh0rd.org - fontconfig.git/blob - src/fcfs.c
4 * Copyright © 2000 Keith Packard
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.
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.
29 FcFontSetCreate (void)
33 s
= (FcFontSet
*) malloc (sizeof (FcFontSet
));
36 FcMemAlloc (FC_MEM_FONTSET
, sizeof (FcFontSet
));
44 FcFontSetDestroy (FcFontSet
*s
)
48 for (i
= 0; i
< s
->nfont
; i
++)
49 FcPatternDestroy (s
->fonts
[i
]);
52 FcMemFree (FC_MEM_FONTPTR
, s
->sfont
* sizeof (FcPattern
*));
55 FcMemFree (FC_MEM_FONTSET
, sizeof (FcFontSet
));
60 FcFontSetAdd (FcFontSet
*s
, FcPattern
*font
)
65 if (s
->nfont
== s
->sfont
)
67 sfont
= s
->sfont
+ 32;
69 f
= (FcPattern
**) realloc (s
->fonts
, sfont
* sizeof (FcPattern
*));
71 f
= (FcPattern
**) malloc (sfont
* sizeof (FcPattern
*));
75 FcMemFree (FC_MEM_FONTPTR
, s
->sfont
* sizeof (FcPattern
*));
76 FcMemAlloc (FC_MEM_FONTPTR
, sfont
* sizeof (FcPattern
*));
80 s
->fonts
[s
->nfont
++] = font
;
84 static int * fcfs_pat_count
;
87 FcFontSetNewBank (void)
93 FcFontSetNeededBytes (FcFontSet
*s
)
97 for (i
= 0; i
< s
->nfont
; i
++)
99 c
= FcPatternNeededBytes(s
->fonts
[i
]);
106 return cum
+ sizeof(int) + FcObjectNeededBytes();
111 /* Returns an overestimate of the number of bytes that
112 * might later get eaten up by padding in the ALIGN macro. */
114 FcFontSetNeededBytesAlign (void)
116 return __alignof__(int) +
117 FcPatternNeededBytesAlign () + FcObjectNeededBytesAlign ();
121 FcFontSetDistributeBytes (FcCache
* metadata
, void * block_ptr
)
123 block_ptr
= ALIGN (block_ptr
, int);
124 fcfs_pat_count
= (int *)block_ptr
;
125 block_ptr
= (int *)block_ptr
+ 1;
126 /* we don't consume any bytes for the fontset itself, */
127 /* since we don't allocate it statically. */
128 block_ptr
= FcPatternDistributeBytes (metadata
, block_ptr
);
130 /* for good measure, write out the object ids used for */
131 /* this bank to the file. */
132 return FcObjectDistributeBytes (metadata
, block_ptr
);
136 FcFontSetSerialize (int bank
, FcFontSet
* s
)
140 *fcfs_pat_count
= s
->nfont
;
142 for (i
= 0; i
< s
->nfont
; i
++)
144 p
= FcPatternSerialize (bank
, s
->fonts
[i
]);
145 if (!p
) return FcFalse
;
153 FcFontSetUnserialize(FcCache
* metadata
, FcFontSet
* s
, void * block_ptr
)
158 block_ptr
= ALIGN (block_ptr
, int);
159 nfont
= *(int *)block_ptr
;
160 block_ptr
= (int *)block_ptr
+ 1;
162 /* comparing nfont and metadata.count is a bit like comparing
163 apples and oranges. Its just for rejecting totally insane
164 nfont values, and for that its good enough */
165 if (nfont
> 0 && nfont
< metadata
->count
/ sizeof(void*))
167 FcPattern
* p
= (FcPattern
*)block_ptr
;
169 if (s
->sfont
< s
->nfont
+ nfont
)
171 int sfont
= s
->nfont
+ nfont
;
173 pp
= realloc (s
->fonts
, sfont
* sizeof (FcPattern
));
182 /* The following line is a bit counterintuitive. The usual
183 * convention is that FcPatternUnserialize is responsible for
184 * aligning the FcPattern. However, the FontSet also stores
185 * the FcPatterns in its own array, so we need to align here
187 p
= ALIGN(p
, FcPattern
);
188 for (i
= 0; i
< nfont
; i
++)
189 s
->fonts
[n
+ i
] = p
+i
;
191 block_ptr
= FcPatternUnserialize (metadata
, block_ptr
);
192 block_ptr
= FcObjectUnserialize (metadata
, block_ptr
);
193 return block_ptr
!= 0;