]> git.wh0rd.org - fontconfig.git/blobdiff - src/fcfs.c
Replace FcObjectStaticName by FcStrStaticName. Implement serialization of
[fontconfig.git] / src / fcfs.c
index fddba57ba9aa3c735a318d7e8c0cff7f4488f29f..90e858082f13d1483b96f744e3fddfd906e5b8f3 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * $RCSId: $
  *
- * Copyright © 2000 Keith Packard
+ * Copyright Â© 2000 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -80,3 +80,99 @@ FcFontSetAdd (FcFontSet *s, FcPattern *font)
     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;
+}
+
+void *
+FcFontSetDistributeBytes (FcCache * metadata, void * block_ptr)
+{
+    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;
+       FcPatternDestroy (s->fonts[i]);
+
+       s->fonts[i] = p;
+    }
+    FcObjectSerialize();
+
+    return FcTrue;
+}
+
+FcBool
+FcFontSetUnserialize(FcCache metadata, FcFontSet * s, void * block_ptr)
+{
+    int nfont;
+    int i, n;
+
+    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;
+       block_ptr = FcPatternUnserialize (metadata, block_ptr);
+       for (i = 0; i < nfont; i++)
+           s->fonts[n + i] = p+i;
+
+       block_ptr = FcObjectUnserialize (metadata, block_ptr);
+    }
+
+    return block_ptr != 0;
+}