2002-02-15 00:34:13 +01:00
|
|
|
/*
|
2003-03-05 06:51:27 +01:00
|
|
|
* $RCSId: $
|
2002-02-15 00:34:13 +01:00
|
|
|
*
|
2004-12-07 02:14:46 +01:00
|
|
|
* Copyright © 2000 Keith Packard
|
2002-02-15 00:34:13 +01:00
|
|
|
*
|
|
|
|
* Permission to use, copy, modify, distribute, and sell this software and its
|
|
|
|
* documentation for any purpose is hereby granted without fee, provided that
|
|
|
|
* the above copyright notice appear in all copies and that both that
|
|
|
|
* copyright notice and this permission notice appear in supporting
|
|
|
|
* documentation, and that the name of Keith Packard not be used in
|
|
|
|
* advertising or publicity pertaining to distribution of the software without
|
|
|
|
* specific, written prior permission. Keith Packard makes no
|
|
|
|
* representations about the suitability of this software for any purpose. It
|
|
|
|
* is provided "as is" without express or implied warranty.
|
|
|
|
*
|
|
|
|
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
|
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
|
|
|
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
|
|
|
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
|
|
|
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
|
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
|
|
* PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include "fcint.h"
|
|
|
|
|
|
|
|
FcFontSet *
|
|
|
|
FcFontSetCreate (void)
|
|
|
|
{
|
|
|
|
FcFontSet *s;
|
|
|
|
|
|
|
|
s = (FcFontSet *) malloc (sizeof (FcFontSet));
|
|
|
|
if (!s)
|
|
|
|
return 0;
|
|
|
|
FcMemAlloc (FC_MEM_FONTSET, sizeof (FcFontSet));
|
|
|
|
s->nfont = 0;
|
|
|
|
s->sfont = 0;
|
|
|
|
s->fonts = 0;
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
FcFontSetDestroy (FcFontSet *s)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < s->nfont; i++)
|
|
|
|
FcPatternDestroy (s->fonts[i]);
|
|
|
|
if (s->fonts)
|
|
|
|
{
|
|
|
|
FcMemFree (FC_MEM_FONTPTR, s->sfont * sizeof (FcPattern *));
|
|
|
|
free (s->fonts);
|
|
|
|
}
|
|
|
|
FcMemFree (FC_MEM_FONTSET, sizeof (FcFontSet));
|
|
|
|
free (s);
|
|
|
|
}
|
|
|
|
|
|
|
|
FcBool
|
|
|
|
FcFontSetAdd (FcFontSet *s, FcPattern *font)
|
|
|
|
{
|
|
|
|
FcPattern **f;
|
|
|
|
int sfont;
|
|
|
|
|
|
|
|
if (s->nfont == s->sfont)
|
|
|
|
{
|
|
|
|
sfont = s->sfont + 32;
|
|
|
|
if (s->fonts)
|
|
|
|
f = (FcPattern **) realloc (s->fonts, sfont * sizeof (FcPattern *));
|
|
|
|
else
|
|
|
|
f = (FcPattern **) malloc (sfont * sizeof (FcPattern *));
|
|
|
|
if (!f)
|
|
|
|
return FcFalse;
|
|
|
|
if (s->sfont)
|
|
|
|
FcMemFree (FC_MEM_FONTPTR, s->sfont * sizeof (FcPattern *));
|
|
|
|
FcMemAlloc (FC_MEM_FONTPTR, sfont * sizeof (FcPattern *));
|
|
|
|
s->sfont = sfont;
|
|
|
|
s->fonts = f;
|
|
|
|
}
|
|
|
|
s->fonts[s->nfont++] = font;
|
|
|
|
return FcTrue;
|
|
|
|
}
|
2005-06-28 05:41:02 +02:00
|
|
|
|
2005-08-24 08:21:30 +02:00
|
|
|
static int * fcfs_pat_count;
|
|
|
|
|
|
|
|
void
|
|
|
|
FcFontSetNewBank (void)
|
2005-06-28 05:41:02 +02:00
|
|
|
{
|
2005-08-24 08:21:30 +02:00
|
|
|
FcPatternNewBank();
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
FcFontSetNeededBytes (FcFontSet *s)
|
|
|
|
{
|
|
|
|
int i, c, cum = 0;
|
2005-06-28 05:41:02 +02:00
|
|
|
|
|
|
|
for (i = 0; i < s->nfont; i++)
|
2005-08-24 08:21:30 +02:00
|
|
|
{
|
|
|
|
c = FcPatternNeededBytes(s->fonts[i]);
|
|
|
|
if (c < 0)
|
|
|
|
return c;
|
|
|
|
cum += c;
|
|
|
|
}
|
2005-06-28 05:41:02 +02:00
|
|
|
|
2005-08-24 08:21:30 +02:00
|
|
|
if (cum > 0)
|
2005-08-27 04:34:24 +02:00
|
|
|
return cum + sizeof(int) + FcObjectNeededBytes();
|
2005-08-24 08:21:30 +02:00
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2005-11-16 16:55:17 +01:00
|
|
|
/* Returns an overestimate of the number of bytes that
|
|
|
|
* might later get eaten up by padding in the ALIGN macro. */
|
|
|
|
int
|
|
|
|
FcFontSetNeededBytesAlign (void)
|
|
|
|
{
|
2006-04-07 19:27:39 +02:00
|
|
|
return fc_alignof (int) +
|
2005-11-16 16:55:17 +01:00
|
|
|
FcPatternNeededBytesAlign () + FcObjectNeededBytesAlign ();
|
|
|
|
}
|
|
|
|
|
2005-08-24 08:21:30 +02:00
|
|
|
void *
|
|
|
|
FcFontSetDistributeBytes (FcCache * metadata, void * block_ptr)
|
|
|
|
{
|
2005-11-16 16:55:17 +01:00
|
|
|
block_ptr = ALIGN (block_ptr, int);
|
2005-08-24 08:21:30 +02:00
|
|
|
fcfs_pat_count = (int *)block_ptr;
|
|
|
|
block_ptr = (int *)block_ptr + 1;
|
2006-03-03 07:35:53 +01:00
|
|
|
/* we don't consume any bytes for the fontset itself, */
|
|
|
|
/* since we don't allocate it statically. */
|
2005-08-24 08:21:30 +02:00
|
|
|
block_ptr = FcPatternDistributeBytes (metadata, block_ptr);
|
|
|
|
|
2006-03-03 07:35:53 +01:00
|
|
|
/* for good measure, write out the object ids used for */
|
|
|
|
/* this bank to the file. */
|
2005-08-24 08:21:30 +02:00
|
|
|
return FcObjectDistributeBytes (metadata, block_ptr);
|
2005-06-28 05:41:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
FcBool
|
2005-08-24 08:21:30 +02:00
|
|
|
FcFontSetSerialize (int bank, FcFontSet * s)
|
2005-06-28 05:41:02 +02:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
FcPattern * p;
|
2005-08-24 08:21:30 +02:00
|
|
|
*fcfs_pat_count = s->nfont;
|
2005-06-28 05:41:02 +02:00
|
|
|
|
|
|
|
for (i = 0; i < s->nfont; i++)
|
|
|
|
{
|
2005-08-24 08:21:30 +02:00
|
|
|
p = FcPatternSerialize (bank, s->fonts[i]);
|
2005-06-28 05:41:02 +02:00
|
|
|
if (!p) return FcFalse;
|
|
|
|
}
|
2005-08-27 04:34:24 +02:00
|
|
|
FcObjectSerialize();
|
2005-06-28 05:41:02 +02:00
|
|
|
|
|
|
|
return FcTrue;
|
|
|
|
}
|
|
|
|
|
2005-07-25 06:10:09 +02:00
|
|
|
FcBool
|
2005-11-25 16:50:34 +01:00
|
|
|
FcFontSetUnserialize(FcCache * metadata, FcFontSet * s, void * block_ptr)
|
2005-07-25 06:10:09 +02:00
|
|
|
{
|
2005-08-24 08:21:30 +02:00
|
|
|
int nfont;
|
|
|
|
int i, n;
|
2005-07-25 06:10:09 +02:00
|
|
|
|
2005-11-17 16:43:39 +01:00
|
|
|
block_ptr = ALIGN (block_ptr, int);
|
2005-08-24 08:21:30 +02:00
|
|
|
nfont = *(int *)block_ptr;
|
|
|
|
block_ptr = (int *)block_ptr + 1;
|
2005-07-25 06:10:09 +02:00
|
|
|
|
2006-02-06 15:44:46 +01:00
|
|
|
/* comparing nfont and metadata.count is a bit like comparing
|
|
|
|
apples and oranges. Its just for rejecting totally insane
|
|
|
|
nfont values, and for that its good enough */
|
|
|
|
if (nfont > 0 && nfont < metadata->count / sizeof(void*))
|
2005-07-25 06:10:09 +02:00
|
|
|
{
|
2005-08-27 04:34:24 +02:00
|
|
|
FcPattern * p = (FcPattern *)block_ptr;
|
2005-11-17 16:43:39 +01:00
|
|
|
|
2006-02-04 01:04:00 +01:00
|
|
|
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;
|
|
|
|
|
2005-11-17 16:43:39 +01:00
|
|
|
/* 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);
|
2005-08-24 08:21:30 +02:00
|
|
|
for (i = 0; i < nfont; i++)
|
|
|
|
s->fonts[n + i] = p+i;
|
2005-08-27 04:34:24 +02:00
|
|
|
|
2005-11-17 16:43:39 +01:00
|
|
|
block_ptr = FcPatternUnserialize (metadata, block_ptr);
|
2005-08-27 04:34:24 +02:00
|
|
|
block_ptr = FcObjectUnserialize (metadata, block_ptr);
|
2006-02-04 01:04:00 +01:00
|
|
|
return block_ptr != 0;
|
2005-07-25 06:10:09 +02:00
|
|
|
}
|
|
|
|
|
2006-02-04 01:04:00 +01:00
|
|
|
return FcFalse;
|
2005-07-25 06:10:09 +02:00
|
|
|
}
|