2 * Copyright © 2000 Keith Packard
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that
7 * copyright notice and this permission notice appear in supporting
8 * documentation, and that the name of the author(s) not be used in
9 * advertising or publicity pertaining to distribution of the software without
10 * specific, written prior permission. The authors make no
11 * representations about the suitability of this software for any purpose. It
12 * is provided "as is" without express or implied warranty.
14 * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20 * PERFORMANCE OF THIS SOFTWARE.
30 FcPatternCreate (void)
34 p = (FcPattern *) malloc (sizeof (FcPattern));
39 p->elts_offset = FcPtrToOffset (p, NULL);
45 FcValueDestroy (FcValue v)
47 switch ((int) v.type) {
49 if (!FcSharedStrFree (v.u.s))
50 FcStrFree ((FcChar8 *) v.u.s);
53 FcMatrixFree ((FcMatrix *) v.u.m);
56 FcCharSetDestroy ((FcCharSet *) v.u.c);
59 FcLangSetDestroy ((FcLangSet *) v.u.l);
67 FcValueCanonicalize (const FcValue *v)
71 switch ((int) v->type)
74 new.u.s = FcValueString(v);
75 new.type = FcTypeString;
78 new.u.c = FcValueCharSet(v);
79 new.type = FcTypeCharSet;
82 new.u.l = FcValueLangSet(v);
83 new.type = FcTypeLangSet;
93 FcValueSave (FcValue v)
95 switch ((int) v.type) {
97 v.u.s = FcSharedStr (v.u.s);
102 v.u.m = FcMatrixCopy (v.u.m);
107 v.u.c = FcCharSetCopy ((FcCharSet *) v.u.c);
112 v.u.l = FcLangSetCopy (v.u.l);
123 FcValueListCreate (void)
125 return calloc (1, sizeof (FcValueList));
129 FcValueListDestroy (FcValueListPtr l)
134 switch ((int) l->value.type) {
136 if (!FcSharedStrFree ((FcChar8 *)l->value.u.s))
137 FcStrFree ((FcChar8 *)l->value.u.s);
140 FcMatrixFree ((FcMatrix *)l->value.u.m);
144 ((FcCharSet *) (l->value.u.c));
148 ((FcLangSet *) (l->value.u.l));
153 next = FcValueListNext(l);
159 FcValueListPrepend (FcValueListPtr vallist,
161 FcValueBinding binding)
165 if (value.type == FcTypeVoid)
167 new = FcValueListCreate ();
171 new->value = FcValueSave (value);
172 new->binding = binding;
179 FcValueListAppend (FcValueListPtr vallist,
181 FcValueBinding binding)
183 FcValueListPtr new, last;
185 if (value.type == FcTypeVoid)
187 new = FcValueListCreate ();
191 new->value = FcValueSave (value);
192 new->binding = binding;
197 for (last = vallist; FcValueListNext (last); last = FcValueListNext (last));
208 FcValueListDuplicate(FcValueListPtr orig)
210 FcValueListPtr new = NULL, l, t = NULL;
213 for (l = orig; l != NULL; l = FcValueListNext (l))
217 t = new = FcValueListCreate();
221 t->next = FcValueListCreate();
222 t = FcValueListNext (t);
224 v = FcValueCanonicalize (&l->value);
225 t->value = FcValueSave (v);
226 t->binding = l->binding;
234 FcValueEqual (FcValue va, FcValue vb)
236 if (va.type != vb.type)
238 if (va.type == FcTypeInteger)
240 va.type = FcTypeDouble;
243 if (vb.type == FcTypeInteger)
245 vb.type = FcTypeDouble;
248 if (va.type != vb.type)
255 return va.u.i == vb.u.i;
257 return va.u.d == vb.u.d;
259 return FcStrCmpIgnoreCase (va.u.s, vb.u.s) == 0;
261 return va.u.b == vb.u.b;
263 return FcMatrixEqual (va.u.m, vb.u.m);
265 return FcCharSetEqual (va.u.c, vb.u.c);
267 return va.u.f == vb.u.f;
269 return FcLangSetEqual (va.u.l, vb.u.l);
275 FcDoubleHash (double d)
285 FcStringHash (const FcChar8 *s)
292 h = ((h << 1) | (h >> 31)) ^ c;
297 FcValueHash (const FcValue *v)
303 return (FcChar32) v->u.i;
305 return FcDoubleHash (v->u.d);
307 return FcStringHash (FcValueString(v));
309 return (FcChar32) v->u.b;
311 return (FcDoubleHash (v->u.m->xx) ^
312 FcDoubleHash (v->u.m->xy) ^
313 FcDoubleHash (v->u.m->yx) ^
314 FcDoubleHash (v->u.m->yy));
316 return (FcChar32) FcValueCharSet(v)->num;
318 return FcStringHash ((const FcChar8 *) ((FT_Face) v->u.f)->family_name) ^
319 FcStringHash ((const FcChar8 *) ((FT_Face) v->u.f)->style_name);
321 return FcLangSetHash (FcValueLangSet(v));
327 FcValueListEqual (FcValueListPtr la, FcValueListPtr lb)
334 if (!FcValueEqual (la->value, lb->value))
336 la = FcValueListNext(la);
337 lb = FcValueListNext(lb);
345 FcValueListHash (FcValueListPtr l)
349 for (; l; l = FcValueListNext(l))
351 hash = ((hash << 1) | (hash >> 31)) ^ FcValueHash (&l->value);
357 FcPatternDestroy (FcPattern *p)
362 if (p->ref == FC_REF_CONSTANT)
364 FcCacheObjectDereference (p);
371 elts = FcPatternElts (p);
372 for (i = 0; i < p->num; i++)
373 FcValueListDestroy (FcPatternEltValues(&elts[i]));
380 FcPatternObjectPosition (const FcPattern *p, FcObject object)
382 int low, high, mid, c;
383 FcPatternElt *elts = FcPatternElts(p);
391 mid = (low + high) >> 1;
392 c = elts[mid].object - object;
406 FcPatternObjectFindElt (const FcPattern *p, FcObject object)
408 int i = FcPatternObjectPosition (p, object);
411 return &FcPatternElts(p)[i];
415 FcPatternObjectInsertElt (FcPattern *p, FcObject object)
420 i = FcPatternObjectPosition (p, object);
425 /* reallocate array */
426 if (p->num + 1 >= p->size)
428 int s = p->size + 16;
431 FcPatternElt *e0 = FcPatternElts(p);
432 e = (FcPatternElt *) realloc (e0, s * sizeof (FcPatternElt));
433 if (!e) /* maybe it was mmapped */
435 e = malloc(s * sizeof (FcPatternElt));
437 memcpy(e, e0, p->num * sizeof (FcPatternElt));
441 e = (FcPatternElt *) malloc (s * sizeof (FcPatternElt));
444 p->elts_offset = FcPtrToOffset (p, e);
447 e[p->size].object = 0;
448 e[p->size].values = NULL;
453 e = FcPatternElts(p);
457 sizeof (FcPatternElt) *
463 e[i].object = object;
467 return FcPatternElts(p) + i;
471 FcPatternEqual (const FcPattern *pa, const FcPattern *pb)
474 FcPatternElt *pae, *pbe;
479 if (pa->num != pb->num)
481 pae = FcPatternElts(pa);
482 pbe = FcPatternElts(pb);
483 for (i = 0; i < pa->num; i++)
485 if (pae[i].object != pbe[i].object)
487 if (!FcValueListEqual (FcPatternEltValues(&pae[i]),
488 FcPatternEltValues(&pbe[i])))
495 FcPatternHash (const FcPattern *p)
499 FcPatternElt *pe = FcPatternElts(p);
501 for (i = 0; i < p->num; i++)
503 h = (((h << 1) | (h >> 31)) ^
505 FcValueListHash (FcPatternEltValues(&pe[i])));
511 FcPatternEqualSubset (const FcPattern *pai, const FcPattern *pbi, const FcObjectSet *os)
513 FcPatternElt *ea, *eb;
516 for (i = 0; i < os->nobject; i++)
518 FcObject object = FcObjectFromName (os->objects[i]);
519 ea = FcPatternObjectFindElt (pai, object);
520 eb = FcPatternObjectFindElt (pbi, object);
525 if (!FcValueListEqual (FcPatternEltValues(ea), FcPatternEltValues(eb)))
538 FcPatternObjectListAdd (FcPattern *p,
544 FcValueListPtr l, *prev;
546 if (p->ref == FC_REF_CONSTANT)
550 * Make sure the stored type is valid for built-in objects
552 for (l = list; l != NULL; l = FcValueListNext (l))
554 if (!FcObjectValidType (object, l->value.type))
556 if (FcDebug() & FC_DBG_OBJTYPES)
558 printf ("FcPattern object %s does not accept value ",
559 FcObjectName (object));
560 FcValuePrint (l->value);
566 e = FcPatternObjectInsertElt (p, object);
572 for (prev = &e->values; *prev; prev = &(*prev)->next)
578 for (prev = &list; *prev; prev = &(*prev)->next)
591 FcPatternObjectAddWithBinding (FcPattern *p,
594 FcValueBinding binding,
598 FcValueListPtr new, *prev;
600 if (p->ref == FC_REF_CONSTANT)
603 new = FcValueListCreate ();
607 value = FcValueSave (value);
608 if (value.type == FcTypeVoid)
612 * Make sure the stored type is valid for built-in objects
614 if (!FcObjectValidType (object, value.type))
616 if (FcDebug() & FC_DBG_OBJTYPES)
618 printf ("FcPattern object %s does not accept value ",
619 FcObjectName (object));
620 FcValuePrint (value);
626 new->binding = binding;
629 e = FcPatternObjectInsertElt (p, object);
635 for (prev = &e->values; *prev; prev = &(*prev)->next)
641 new->next = e->values;
648 FcValueDestroy (value);
656 FcPatternObjectAdd (FcPattern *p, FcObject object, FcValue value, FcBool append)
658 return FcPatternObjectAddWithBinding (p, object,
659 value, FcValueBindingStrong, append);
663 FcPatternAdd (FcPattern *p, const char *object, FcValue value, FcBool append)
665 return FcPatternObjectAddWithBinding (p, FcObjectFromName (object),
666 value, FcValueBindingStrong, append);
670 FcPatternAddWeak (FcPattern *p, const char *object, FcValue value, FcBool append)
672 return FcPatternObjectAddWithBinding (p, FcObjectFromName (object),
673 value, FcValueBindingWeak, append);
677 FcPatternObjectDel (FcPattern *p, FcObject object)
681 e = FcPatternObjectFindElt (p, object);
686 FcValueListDestroy (e->values);
688 /* shuffle existing ones down */
690 (FcPatternElts(p) + p->num - (e + 1)) *
691 sizeof (FcPatternElt));
693 e = FcPatternElts(p) + p->num;
700 FcPatternDel (FcPattern *p, const char *object)
702 return FcPatternObjectDel (p, FcObjectFromName (object));
706 FcPatternRemove (FcPattern *p, const char *object, int id)
709 FcValueListPtr *prev, l;
711 e = FcPatternObjectFindElt (p, FcObjectFromName (object));
714 for (prev = &e->values; (l = *prev); prev = &l->next)
720 FcValueListDestroy (l);
722 FcPatternDel (p, object);
731 FcPatternObjectAddInteger (FcPattern *p, FcObject object, int i)
735 v.type = FcTypeInteger;
737 return FcPatternObjectAdd (p, object, v, FcTrue);
741 FcPatternAddInteger (FcPattern *p, const char *object, int i)
743 return FcPatternObjectAddInteger (p, FcObjectFromName (object), i);
747 FcPatternObjectAddDouble (FcPattern *p, FcObject object, double d)
751 v.type = FcTypeDouble;
753 return FcPatternObjectAdd (p, object, v, FcTrue);
758 FcPatternAddDouble (FcPattern *p, const char *object, double d)
760 return FcPatternObjectAddDouble (p, FcObjectFromName (object), d);
764 FcPatternObjectAddString (FcPattern *p, FcObject object, const FcChar8 *s)
772 return FcPatternObjectAdd (p, object, v, FcTrue);
775 v.type = FcTypeString;
777 return FcPatternObjectAdd (p, object, v, FcTrue);
781 FcPatternAddString (FcPattern *p, const char *object, const FcChar8 *s)
783 return FcPatternObjectAddString (p, FcObjectFromName (object), s);
787 FcPatternAddMatrix (FcPattern *p, const char *object, const FcMatrix *s)
791 v.type = FcTypeMatrix;
793 return FcPatternAdd (p, object, v, FcTrue);
798 FcPatternObjectAddBool (FcPattern *p, FcObject object, FcBool b)
804 return FcPatternObjectAdd (p, object, v, FcTrue);
808 FcPatternAddBool (FcPattern *p, const char *object, FcBool b)
810 return FcPatternObjectAddBool (p, FcObjectFromName (object), b);
814 FcPatternAddCharSet (FcPattern *p, const char *object, const FcCharSet *c)
818 v.type = FcTypeCharSet;
819 v.u.c = (FcCharSet *)c;
820 return FcPatternAdd (p, object, v, FcTrue);
824 FcPatternAddFTFace (FcPattern *p, const char *object, const FT_Face f)
828 v.type = FcTypeFTFace;
830 return FcPatternAdd (p, object, v, FcTrue);
834 FcPatternAddLangSet (FcPattern *p, const char *object, const FcLangSet *ls)
838 v.type = FcTypeLangSet;
839 v.u.l = (FcLangSet *)ls;
840 return FcPatternAdd (p, object, v, FcTrue);
844 FcPatternObjectGet (const FcPattern *p, FcObject object, int id, FcValue *v)
849 e = FcPatternObjectFindElt (p, object);
851 return FcResultNoMatch;
852 for (l = FcPatternEltValues(e); l; l = FcValueListNext(l))
856 *v = FcValueCanonicalize(&l->value);
857 return FcResultMatch;
865 FcPatternGet (const FcPattern *p, const char *object, int id, FcValue *v)
867 return FcPatternObjectGet (p, FcObjectFromName (object), id, v);
871 FcPatternObjectGetInteger (const FcPattern *p, FcObject object, int id, int *i)
876 r = FcPatternObjectGet (p, object, id, &v);
877 if (r != FcResultMatch)
879 switch ((int) v.type) {
887 return FcResultTypeMismatch;
889 return FcResultMatch;
893 FcPatternGetInteger (const FcPattern *p, const char *object, int id, int *i)
895 return FcPatternObjectGetInteger (p, FcObjectFromName (object), id, i);
900 FcPatternObjectGetDouble (const FcPattern *p, FcObject object, int id, double *d)
905 r = FcPatternObjectGet (p, object, id, &v);
906 if (r != FcResultMatch)
908 switch ((int) v.type) {
916 return FcResultTypeMismatch;
918 return FcResultMatch;
922 FcPatternGetDouble (const FcPattern *p, const char *object, int id, double *d)
924 return FcPatternObjectGetDouble (p, FcObjectFromName (object), id, d);
928 FcPatternObjectGetString (const FcPattern *p, FcObject object, int id, FcChar8 ** s)
933 r = FcPatternObjectGet (p, object, id, &v);
934 if (r != FcResultMatch)
936 if (v.type != FcTypeString)
937 return FcResultTypeMismatch;
939 *s = (FcChar8 *) v.u.s;
940 return FcResultMatch;
944 FcPatternGetString (const FcPattern *p, const char *object, int id, FcChar8 ** s)
946 return FcPatternObjectGetString (p, FcObjectFromName (object), id, s);
950 FcPatternGetMatrix(const FcPattern *p, const char *object, int id, FcMatrix **m)
955 r = FcPatternGet (p, object, id, &v);
956 if (r != FcResultMatch)
958 if (v.type != FcTypeMatrix)
959 return FcResultTypeMismatch;
960 *m = (FcMatrix *)v.u.m;
961 return FcResultMatch;
966 FcPatternGetBool(const FcPattern *p, const char *object, int id, FcBool *b)
971 r = FcPatternGet (p, object, id, &v);
972 if (r != FcResultMatch)
974 if (v.type != FcTypeBool)
975 return FcResultTypeMismatch;
977 return FcResultMatch;
981 FcPatternGetCharSet(const FcPattern *p, const char *object, int id, FcCharSet **c)
986 r = FcPatternGet (p, object, id, &v);
987 if (r != FcResultMatch)
989 if (v.type != FcTypeCharSet)
990 return FcResultTypeMismatch;
991 *c = (FcCharSet *)v.u.c;
992 return FcResultMatch;
996 FcPatternGetFTFace(const FcPattern *p, const char *object, int id, FT_Face *f)
1001 r = FcPatternGet (p, object, id, &v);
1002 if (r != FcResultMatch)
1004 if (v.type != FcTypeFTFace)
1005 return FcResultTypeMismatch;
1006 *f = (FT_Face) v.u.f;
1007 return FcResultMatch;
1011 FcPatternGetLangSet(const FcPattern *p, const char *object, int id, FcLangSet **ls)
1016 r = FcPatternGet (p, object, id, &v);
1017 if (r != FcResultMatch)
1019 if (v.type != FcTypeLangSet)
1020 return FcResultTypeMismatch;
1021 *ls = (FcLangSet *)v.u.l;
1022 return FcResultMatch;
1026 FcPatternDuplicate (const FcPattern *orig)
1033 new = FcPatternCreate ();
1037 e = FcPatternElts(orig);
1039 for (i = 0; i < orig->num; i++)
1041 for (l = FcPatternEltValues(e + i); l; l = FcValueListNext(l))
1043 if (!FcPatternObjectAddWithBinding (new, e[i].object,
1044 FcValueCanonicalize(&l->value),
1055 FcPatternDestroy (new);
1061 FcPatternReference (FcPattern *p)
1063 if (p->ref != FC_REF_CONSTANT)
1066 FcCacheObjectReference (p);
1070 FcPatternVaBuild (FcPattern *p, va_list va)
1074 FcPatternVapBuild (ret, p, va);
1079 FcPatternBuild (FcPattern *p, ...)
1084 FcPatternVapBuild (p, p, va);
1090 * Add all of the elements in 's' to 'p'
1093 FcPatternAppend (FcPattern *p, FcPattern *s)
1099 for (i = 0; i < s->num; i++)
1101 e = FcPatternElts(s)+i;
1102 for (v = FcPatternEltValues(e); v; v = FcValueListNext(v))
1104 if (!FcPatternObjectAddWithBinding (p, e->object,
1105 FcValueCanonicalize(&v->value),
1106 v->binding, FcTrue))
1114 FcPatternFilter (FcPattern *p, const FcObjectSet *os)
1122 return FcPatternDuplicate (p);
1124 ret = FcPatternCreate ();
1128 for (i = 0; i < os->nobject; i++)
1130 FcObject object = FcObjectFromName (os->objects[i]);
1131 e = FcPatternObjectFindElt (p, object);
1134 for (v = FcPatternEltValues(e); v; v = FcValueListNext(v))
1136 if (!FcPatternObjectAddWithBinding (ret, e->object,
1137 FcValueCanonicalize(&v->value),
1138 v->binding, FcTrue))
1146 FcPatternDestroy (ret);
1150 #define OBJECT_HASH_SIZE 251
1151 static struct objectBucket {
1152 struct objectBucket *next;
1155 } *FcObjectBuckets[OBJECT_HASH_SIZE];
1158 FcSharedStrFree (const FcChar8 *name)
1160 FcChar32 hash = FcStringHash (name);
1161 struct objectBucket **p;
1162 struct objectBucket *b;
1165 for (p = &FcObjectBuckets[hash % OBJECT_HASH_SIZE]; (b = *p); p = &(b->next))
1166 if (b->hash == hash && ((char *)name == (char *) (b + 1)))
1172 size = sizeof (struct objectBucket) + strlen ((char *)name) + 1;
1173 size = (size + 3) & ~3;
1182 FcSharedStr (const FcChar8 *name)
1184 FcChar32 hash = FcStringHash (name);
1185 struct objectBucket **p;
1186 struct objectBucket *b;
1189 for (p = &FcObjectBuckets[hash % OBJECT_HASH_SIZE]; (b = *p); p = &(b->next))
1190 if (b->hash == hash && !strcmp ((char *)name, (char *) (b + 1)))
1193 return (FcChar8 *) (b + 1);
1195 size = sizeof (struct objectBucket) + strlen ((char *)name) + 1;
1197 * workaround valgrind warning because glibc takes advantage of how it knows memory is
1198 * allocated to implement strlen by reading in groups of 4
1200 size = (size + 3) & ~3;
1207 strcpy ((char *) (b + 1), (char *)name);
1209 return (FcChar8 *) (b + 1);
1213 FcPatternSerializeAlloc (FcSerialize *serialize, const FcPattern *pat)
1216 FcPatternElt *elts = FcPatternElts(pat);
1218 if (!FcSerializeAlloc (serialize, pat, sizeof (FcPattern)))
1220 if (!FcSerializeAlloc (serialize, elts, pat->num * sizeof (FcPatternElt)))
1222 for (i = 0; i < pat->num; i++)
1223 if (!FcValueListSerializeAlloc (serialize, FcPatternEltValues(elts+i)))
1229 FcPatternSerialize (FcSerialize *serialize, const FcPattern *pat)
1231 FcPattern *pat_serialized;
1232 FcPatternElt *elts = FcPatternElts (pat);
1233 FcPatternElt *elts_serialized;
1234 FcValueList *values_serialized;
1237 pat_serialized = FcSerializePtr (serialize, pat);
1238 if (!pat_serialized)
1240 *pat_serialized = *pat;
1241 pat_serialized->size = pat->num;
1242 pat_serialized->ref = FC_REF_CONSTANT;
1244 elts_serialized = FcSerializePtr (serialize, elts);
1245 if (!elts_serialized)
1248 pat_serialized->elts_offset = FcPtrToOffset (pat_serialized,
1251 for (i = 0; i < pat->num; i++)
1253 values_serialized = FcValueListSerialize (serialize, FcPatternEltValues (elts+i));
1254 if (!values_serialized)
1256 elts_serialized[i].object = elts[i].object;
1257 elts_serialized[i].values = FcPtrToEncodedOffset (&elts_serialized[i],
1261 if (FcDebug() & FC_DBG_CACHEV) {
1262 printf ("Raw pattern:\n");
1263 FcPatternPrint (pat);
1264 printf ("Serialized pattern:\n");
1265 FcPatternPrint (pat_serialized);
1268 return pat_serialized;
1272 FcValueListSerializeAlloc (FcSerialize *serialize, const FcValueList *vl)
1276 if (!FcSerializeAlloc (serialize, vl, sizeof (FcValueList)))
1278 switch ((int) vl->value.type) {
1280 if (!FcStrSerializeAlloc (serialize, vl->value.u.s))
1284 if (!FcCharSetSerializeAlloc (serialize, vl->value.u.c))
1288 if (!FcLangSetSerializeAlloc (serialize, vl->value.u.l))
1300 FcValueListSerialize (FcSerialize *serialize, const FcValueList *vl)
1302 FcValueList *vl_serialized;
1303 FcChar8 *s_serialized;
1304 FcCharSet *c_serialized;
1305 FcLangSet *l_serialized;
1306 FcValueList *head_serialized = NULL;
1307 FcValueList *prev_serialized = NULL;
1311 vl_serialized = FcSerializePtr (serialize, vl);
1315 if (prev_serialized)
1316 prev_serialized->next = FcPtrToEncodedOffset (prev_serialized,
1320 head_serialized = vl_serialized;
1322 vl_serialized->next = NULL;
1323 vl_serialized->value.type = vl->value.type;
1324 switch ((int) vl->value.type) {
1326 vl_serialized->value.u.i = vl->value.u.i;
1329 vl_serialized->value.u.d = vl->value.u.d;
1332 s_serialized = FcStrSerialize (serialize, vl->value.u.s);
1335 vl_serialized->value.u.s = FcPtrToEncodedOffset (&vl_serialized->value,
1340 vl_serialized->value.u.b = vl->value.u.b;
1346 c_serialized = FcCharSetSerialize (serialize, vl->value.u.c);
1349 vl_serialized->value.u.c = FcPtrToEncodedOffset (&vl_serialized->value,
1357 l_serialized = FcLangSetSerialize (serialize, vl->value.u.l);
1360 vl_serialized->value.u.l = FcPtrToEncodedOffset (&vl_serialized->value,
1367 prev_serialized = vl_serialized;
1370 return head_serialized;
1373 #include "fcaliastail.h"
1374 #include "fcftaliastail.h"