s->fonts[s->nfont++] = font;
return FcTrue;
}
+
+static int * fcfs_pat_count;
+
+void
+FcFontSetNewBank (void)
+{
+ FcPatternNewBank();
+}
+
+int
+FcFontSetNeededBytes (FcFontSet *s)
+{
+ int i, c, cum = 0;
+
+ for (i = 0; i < s->nfont; i++)
+ {
+ c = FcPatternNeededBytes(s->fonts[i]);
+ if (c < 0)
+ return c;
+ cum += c;
+ }
+
+ if (cum > 0)
+ return cum + sizeof(int) + FcObjectNeededBytes();
+ else
+ return 0;
+}
+
+/* Returns an overestimate of the number of bytes that
+ * might later get eaten up by padding in the ALIGN macro. */
+int
+FcFontSetNeededBytesAlign (void)
+{
+ return __alignof__(int) +
+ FcPatternNeededBytesAlign () + FcObjectNeededBytesAlign ();
+}
+
+void *
+FcFontSetDistributeBytes (FcCache * metadata, void * block_ptr)
+{
+ block_ptr = ALIGN (block_ptr, int);
+ fcfs_pat_count = (int *)block_ptr;
+ block_ptr = (int *)block_ptr + 1;
+ // we don't consume any bytes for the fontset itself,
+ // since we don't allocate it statically.
+ block_ptr = FcPatternDistributeBytes (metadata, block_ptr);
+
+ // for good measure, write out the object ids used for
+ // this bank to the file.
+ return FcObjectDistributeBytes (metadata, block_ptr);
+}
+
+FcBool
+FcFontSetSerialize (int bank, FcFontSet * s)
+{
+ int i;
+ FcPattern * p;
+ *fcfs_pat_count = s->nfont;
+
+ for (i = 0; i < s->nfont; i++)
+ {
+ p = FcPatternSerialize (bank, s->fonts[i]);
+ if (!p) return FcFalse;
+ }
+ FcObjectSerialize();
+
+ return FcTrue;
+}
+
+FcBool
+FcFontSetUnserialize(FcCache metadata, FcFontSet * s, void * block_ptr)
+{
+ int nfont;
+ int i, n;
+
+ block_ptr = ALIGN (block_ptr, int);
+ nfont = *(int *)block_ptr;
+ block_ptr = (int *)block_ptr + 1;
+
+ if (s->sfont < s->nfont + nfont)
+ {
+ int sfont = s->nfont + nfont;
+ FcPattern ** pp;
+ pp = realloc (s->fonts, sfont * sizeof (FcPattern));
+ if (!pp)
+ return FcFalse;
+ s->fonts = pp;
+ s->sfont = sfont;
+ }
+ n = s->nfont;
+ s->nfont += nfont;
+
+ if (nfont > 0)
+ {
+ FcPattern * p = (FcPattern *)block_ptr;
+
+ /* The following line is a bit counterintuitive. The usual
+ * convention is that FcPatternUnserialize is responsible for
+ * aligning the FcPattern. However, the FontSet also stores
+ * the FcPatterns in its own array, so we need to align here
+ * too. */
+ p = ALIGN(p, FcPattern);
+ for (i = 0; i < nfont; i++)
+ s->fonts[n + i] = p+i;
+
+ block_ptr = FcPatternUnserialize (metadata, block_ptr);
+ block_ptr = FcObjectUnserialize (metadata, block_ptr);
+ }
+
+ return block_ptr != 0;
+}