* 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
+ * documentation, and that the name of the author(s) not be used in
* advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
+ * specific, written prior permission. The authors make 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,
+ * THE AUTHOR(S) 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
+ * EVENT SHALL THE AUTHOR(S) 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
#define FC_ENCODING_MAC_ROMAN "MACINTOSH"
static const FcFtEncoding fcFtEncoding[] = {
- { TT_PLATFORM_APPLE_UNICODE, TT_ENCODING_DONT_CARE, "UCS-2BE" },
+ { TT_PLATFORM_APPLE_UNICODE, TT_ENCODING_DONT_CARE, "UTF-16BE" },
{ TT_PLATFORM_MACINTOSH, TT_MAC_ID_ROMAN, "MACINTOSH" },
{ TT_PLATFORM_MACINTOSH, TT_MAC_ID_JAPANESE, "SJIS" },
+ { TT_PLATFORM_MICROSOFT, TT_MS_ID_SYMBOL_CS, "UTF-16BE" },
{ TT_PLATFORM_MICROSOFT, TT_MS_ID_UNICODE_CS, "UTF-16BE" },
{ TT_PLATFORM_MICROSOFT, TT_MS_ID_SJIS, "SJIS-WIN" },
- { TT_PLATFORM_MICROSOFT, TT_MS_ID_GB2312, "GB3212" },
+ { TT_PLATFORM_MICROSOFT, TT_MS_ID_GB2312, "GB2312" },
{ TT_PLATFORM_MICROSOFT, TT_MS_ID_BIG_5, "BIG-5" },
{ TT_PLATFORM_MICROSOFT, TT_MS_ID_WANSUNG, "Wansung" },
{ TT_PLATFORM_MICROSOFT, TT_MS_ID_JOHAB, "Johab" },
- { TT_PLATFORM_MICROSOFT, TT_MS_ID_UCS_4, "UCS4" },
+ { TT_PLATFORM_MICROSOFT, TT_MS_ID_UCS_4, "UTF-16BE" },
{ TT_PLATFORM_ISO, TT_ISO_ID_7BIT_ASCII, "ASCII" },
- { TT_PLATFORM_ISO, TT_ISO_ID_10646, "UCS-2BE" },
+ { TT_PLATFORM_ISO, TT_ISO_ID_10646, "UTF-16BE" },
{ TT_PLATFORM_ISO, TT_ISO_ID_8859_1, "ISO-8859-1" },
};
{ TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_DZONGKHA, "dz" },
{ TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_JAVANESE, "jw" },
{ TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_SUNDANESE, "su" },
-
+
#if 0 /* these seem to be errors that have been dropped */
{ TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_SCOTTISH_GAELIC },
{ TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_IRISH_GAELIC },
#endif
-
+
/* The following codes are new as of 2000-03-10 */
{ TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_GALICIAN, "gl" },
{ TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_AFRIKAANS, "af" },
{ TT_PLATFORM_MICROSOFT, TT_MS_LANGID_PASHTO_AFGHANISTAN, "ps" },
{ TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FILIPINO_PHILIPPINES, "phi" },
{ TT_PLATFORM_MICROSOFT, TT_MS_LANGID_DHIVEHI_MALDIVES, "div" },
-
+
{ TT_PLATFORM_MICROSOFT, TT_MS_LANGID_OROMO_ETHIOPIA, "om" },
{ TT_PLATFORM_MICROSOFT, TT_MS_LANGID_TIGRIGNA_ETHIOPIA, "ti" },
{ TT_PLATFORM_MICROSOFT, TT_MS_LANGID_TIGRIGNA_ERYTHREA, "ti" },
while (in_bytes_left)
{
- size_t did = iconv (cd,
+ size_t did = iconv (cd,
&inbuf, &in_bytes_left,
&outbuf, &out_bytes_left);
if (did == (size_t) (-1))
{
language_id = TT_MAC_LANGID_JAPANESE;
}
-
+
for (i = 0; i < NUM_FC_FT_LANGUAGE; i++)
if (fcFtLanguage[i].platform_id == platform_id &&
(fcFtLanguage[i].language_id == TT_LANGUAGE_DONT_CARE ||
{
/* vendor is not necessarily NUL-terminated. */
int i, len;
-
+
len = strlen((char *) vendor_string);
if (memcmp(vendor, vendor_string, len) != 0)
return FcFalse;
FcVendorFoundry(const FT_Char vendor[4])
{
int i;
-
+
if (vendor)
for(i = 0; i < NUM_VENDOR_FOUNDRIES; i++)
if (FcVendorMatch (vendor, FcVendorFoundries[i].vendor))
#define NUM_PLATFORM_ORDER (sizeof (platform_order) / sizeof (platform_order[0]))
static const FT_UShort nameid_order[] = {
+#ifdef TT_NAME_ID_WWS_FAMILY
+ TT_NAME_ID_WWS_FAMILY,
+#endif
TT_NAME_ID_PREFERRED_FAMILY,
TT_NAME_ID_FONT_FAMILY,
TT_NAME_ID_MAC_FULL_NAME,
TT_NAME_ID_FULL_NAME,
+#ifdef TT_NAME_ID_WWS_SUBFAMILY
+ TT_NAME_ID_WWS_SUBFAMILY,
+#endif
TT_NAME_ID_PREFERRED_SUBFAMILY,
TT_NAME_ID_FONT_SUBFAMILY,
TT_NAME_ID_TRADEMARK,
#if 0
FcChar8 *family = 0;
#endif
- FcChar8 *complex;
+ FcChar8 *complex_;
const FcChar8 *foundry = 0;
int spacing;
TT_OS2 *os2;
const FcChar8 *exclusiveLang = 0;
FT_SfntName sname;
FT_UInt snamei, snamec;
-
+
int nfamily = 0;
int nfamily_lang = 0;
int nstyle = 0;
FcChar8 *style = 0;
int st;
-
+
pat = FcPatternCreate ();
if (!pat)
goto bail0;
* the Postscript FontInfo dictionary. Finally, the
* BDF properties will queried.
*/
-
+
if (os2 && os2->version >= 0x0001 && os2->version != 0xffff)
foundry = FcVendorFoundry(os2->achVendID);
continue;
switch (sname.name_id) {
+#ifdef TT_NAME_ID_WWS_FAMILY
+ case TT_NAME_ID_WWS_FAMILY:
+#endif
case TT_NAME_ID_PREFERRED_FAMILY:
case TT_NAME_ID_FONT_FAMILY:
-#if 0
+#if 0
case TT_NAME_ID_PS_NAME:
case TT_NAME_ID_UNIQUE_ID:
#endif
np = &nfullname;
nlangp = &nfullname_lang;
break;
+#ifdef TT_NAME_ID_WWS_SUBFAMILY
+ case TT_NAME_ID_WWS_SUBFAMILY:
+#endif
case TT_NAME_ID_PREFERRED_SUBFAMILY:
case TT_NAME_ID_FONT_SUBFAMILY:
if (FcDebug () & FC_DBG_SCANV)
}
}
- if (!nfamily && face->family_name &&
+ if (!nfamily && face->family_name &&
FcStrCmpIgnoreBlanksAndCase ((FcChar8 *) face->family_name, (FcChar8 *) "") != 0)
{
if (FcDebug () & FC_DBG_SCANV)
goto bail1;
++nfamily;
}
-
+
if (!nstyle && face->style_name &&
FcStrCmpIgnoreBlanksAndCase ((FcChar8 *) face->style_name, (FcChar8 *) "") != 0)
{
goto bail1;
++nstyle;
}
-
+
if (!nfamily)
{
FcChar8 *start, *end;
}
if (bits & (1 << bit))
{
- /*
+ /*
* If the font advertises support for multiple
* "exclusive" languages, then include support
* for any language found to have coverage
printf ("\tos2 width class %d maps to width %d\n",
os2->usWidthClass, width);
}
- if (os2 && (complex = FcFontCapabilities(face)))
+ if (os2 && (complex_ = FcFontCapabilities(face)))
{
- if (!FcPatternAddString (pat, FC_CAPABILITY, complex))
+ if (!FcPatternAddString (pat, FC_CAPABILITY, complex_))
{
- free (complex);
+ free (complex_);
goto bail1;
}
- free (complex);
+ free (complex_);
}
/*
* Type 1: Check for FontInfo dictionary information
* Code from g2@magestudios.net (Gerard Escalante)
*/
-
+
#if HAVE_FT_GET_PS_FONT_INFO
if (FT_Get_PS_Font_Info(face, &psfontinfo) == 0)
{
printf ("\tType1 weight %s maps to %d\n",
psfontinfo.weight, weight);
}
-
+
#if 0
- /*
+ /*
* Don't bother with italic_angle; FreeType already extracts that
* information for us and sticks it into style_flags
*/
if (psfontinfo.italic_angle)
- slant = FC_SLANT_ITALIC;
+ slant = FC_SLANT_ITALIC;
else
- slant = FC_SLANT_ROMAN;
+ slant = FC_SLANT_ROMAN;
#endif
if(!foundry)
foundry = FcNoticeFoundry(psfontinfo.notice);
}
#endif /* HAVE_FT_GET_PS_FONT_INFO */
-
+
#if HAVE_FT_GET_BDF_PROPERTY
/*
* Finally, look for a FOUNDRY BDF property if no other
prop.type == BDF_PROPERTY_TYPE_CARDINAL))
{
FT_Int32 value;
-
+
if (prop.type == BDF_PROPERTY_TYPE_INTEGER)
value = prop.u.integer;
else
/*
* Skip over PCF fonts that have no encoded characters; they're
* usually just Unicode fonts transcoded to some legacy encoding
- * ftglue.c forces us to approximate whether a font is a PCF font
+ * FT forces us to approximate whether a font is a PCF font
* or not by whether it has any BDF properties. Try PIXEL_SIZE;
* I don't know how to get a list of BDF properties on the font. -PL
*/
* Drop our reference to the charset
*/
FcCharSetDestroy (cs);
-
+
return pat;
bail2:
}
FcPattern *
-FcFreeTypeQuery(const FcChar8 *file,
- int id,
- FcBlanks *blanks,
- int *count)
+FcFreeTypeQuery (const FcChar8 *file,
+ int id,
+ FcBlanks *blanks,
+ int *count)
+{
+ return FcFreeTypeQuery2 (FcConfigGetCurrent (), file, id, blanks, count);
+}
+
+FcPattern *
+FcFreeTypeQuery2 (FcConfig *config,
+ const FcChar8 *file,
+ int id,
+ FcBlanks *blanks,
+ int *count)
{
FT_Face face;
FT_Library ftLibrary;
FcPattern *pat = NULL;
-
+ const FcChar8 *ftFile = file;
+ FcChar8 *fullFile;
+
if (FT_Init_FreeType (&ftLibrary))
return NULL;
-
- if (FT_New_Face (ftLibrary, (char *) file, id, &face))
+
+ fullFile = FcConfigGetRootPlus (config, file);
+ if (fullFile)
+ ftFile = fullFile;
+
+ if (FT_New_Face (ftLibrary, (char *) ftFile, id, &face))
goto bail;
*count = face->num_faces;
FT_Done_Face (face);
bail:
+ if (fullFile)
+ FcStrFree (fullFile);
FT_Done_FreeType (ftLibrary);
return pat;
}
AdobeSymbolEnt,
sizeof (AdobeSymbolEnt) / sizeof (AdobeSymbolEnt[0]),
};
-
+
static const FcFontDecode fcFontDecoders[] = {
{ ft_encoding_unicode, 0, (1 << 21) - 1 },
{ ft_encoding_symbol, &AdobeSymbol, (1 << 16) - 1 },
FcFreeTypeUseNames (FT_Face face)
{
FT_Int map;
-
+
if (!FT_Has_PS_Glyph_Names (face))
return FcFalse;
for (map = 0; map < face->num_charmaps; map++)
int r = 0;
FcGlyphId gn;
- while ((gn = ucs_to_name[i]) != -1)
+ while ((gn = _fc_ucs_to_name[i]) != -1)
{
- if (glyphs[gn].ucs == ucs4)
- return glyphs[gn].name;
- if (!r)
+ if (_fc_glyph_names[gn].ucs == ucs4)
+ return _fc_glyph_names[gn].name;
+ if (!r)
{
r = (int) (ucs4 % FC_GLYPHNAME_REHASH);
if (!r)
int r = 0;
FcGlyphId gn;
- while ((gn = name_to_ucs[i]) != -1)
+ while ((gn = _fc_name_to_ucs[i]) != -1)
{
- if (!strcmp ((char *) name, (char *) glyphs[gn].name))
- return glyphs[gn].ucs;
- if (!r)
+ if (!strcmp ((char *) name, (char *) _fc_glyph_names[gn].name))
+ return _fc_glyph_names[gn].ucs;
+ if (!r)
{
r = (int) (h % FC_GLYPHNAME_REHASH);
if (!r)
}
static FcBool
-FcFreeTypeCheckGlyph (FT_Face face, FcChar32 ucs4,
+FcFreeTypeCheckGlyph (FT_Face face, FcChar32 ucs4,
FT_UInt glyph, FcBlanks *blanks,
FT_Pos *advance,
FcBool using_strike)
{
FT_Int load_flags = FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH | FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
FT_GlyphSlot slot;
-
+
if (using_strike)
load_flags &= ~FT_LOAD_NO_SCALE;
*/
if (face->face_flags & FT_FACE_FLAG_SCALABLE)
load_flags |= FT_LOAD_NO_BITMAP;
-
+
if (FT_Load_Glyph (face, glyph, load_flags))
return FcFalse;
-
+
slot = face->glyph;
if (!glyph)
return FcFalse;
-
+
*advance = slot->metrics.horiAdvance;
switch (slot->format) {
return FcFalse;
}
-#define FC_MIN(a,b) ((a) < (b) ? (a) : (b))
-#define FC_MAX(a,b) ((a) > (b) ? (a) : (b))
-#define FC_ABS(a) ((a) < 0 ? -(a) : (a))
#define APPROXIMATELY_EQUAL(x,y) (FC_ABS ((x) - (y)) <= FC_MAX (FC_ABS (x), FC_ABS (y)) / 33)
static FcCharSet *
fcs = FcCharSetCreate ();
if (!fcs)
goto bail0;
-
+
#if HAVE_FT_SELECT_SIZE
if (strike_index >= 0) {
if (FT_Select_Size (face, strike_index) != FT_Err_Ok)
{
ucs4 = map->ent[i].bmp;
glyph = FT_Get_Char_Index (face, map->ent[i].encode);
- if (glyph &&
+ if (glyph &&
FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike))
{
- /*
+ /*
* ignore glyphs with zero advance. They’re
* combining characters, and while their behaviour
* isn’t well defined for monospaced applications in
if (FT_Get_Glyph_Name (face, glyph, name_buf, FC_GLYPHNAME_BUFLEN+1) == 0)
{
ucs4 = FcGlyphNameToUcs4 (name_buf);
- if (ucs4 != 0xffff &&
+ if (ucs4 != 0xffff &&
FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike))
{
if (advance)
FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
{
FcCharSet *cs;
-
+
cs = FcFreeTypeCharSetAndSpacingForSize (face, blanks, spacing, -1);
/*
* Check for bitmap-only ttf fonts that are missing the glyf table.
* In that case, pick a size and look for glyphs in that size instead
*/
- if (FcCharSetCount (cs) == 0)
+ if (FcCharSetCount (cs) == 0)
{
/* Check for non-scalable TT fonts */
if (!(face->face_flags & FT_FACE_FLAG_SCALABLE) &&
/* Select the face closest to 16 pixels tall */
for (i = 1; i < face->num_fixed_sizes; i++) {
- if (abs (face->available_sizes[i].height - 16) <
+ if (abs (face->available_sizes[i].height - 16) <
abs (face->available_sizes[strike_index].height - 16))
strike_index = i;
}
#define TTAG_GPOS FT_MAKE_TAG( 'G', 'P', 'O', 'S' )
#define TTAG_GSUB FT_MAKE_TAG( 'G', 'S', 'U', 'B' )
#define TTAG_SILF FT_MAKE_TAG( 'S', 'i', 'l', 'f')
-#define TT_Err_Ok FT_Err_Ok
-#define TT_Err_Invalid_Face_Handle FT_Err_Invalid_Face_Handle
-#define TTO_Err_Empty_Script 0x1005
-#define TTO_Err_Invalid_SubTable 0x1001
#define OTLAYOUT_HEAD "otlayout:"
#define OTLAYOUT_HEAD_LEN 9
*/
#define FcIsSpace(x) (040 == (x))
#define FcIsValidScript(x) (FcIsLower(x) || FcIsUpper (x) || FcIsSpace(x))
-
+
static void
-addtag(FcChar8 *complex, FT_ULong tag)
+addtag(FcChar8 *complex_, FT_ULong tag)
{
FcChar8 tagstring[OTLAYOUT_ID_LEN + 1];
tagstring[2] = (FcChar8)(tag >> 8),
tagstring[3] = (FcChar8)(tag);
tagstring[4] = '\0';
-
+
/* skip tags which aren't alphabetic, under the assumption that
* they're probably broken
*/
!FcIsValidScript(tagstring[3]))
return;
- if (*complex != '\0')
- strcat ((char *) complex, " ");
- strcat ((char *) complex, "otlayout:");
- strcat ((char *) complex, (char *) tagstring);
+ if (*complex_ != '\0')
+ strcat ((char *) complex_, " ");
+ strcat ((char *) complex_, "otlayout:");
+ strcat ((char *) complex_, (char *) tagstring);
}
static int
}
-static FT_Error
-GetScriptTags(FT_Face face, FT_ULong tabletag, FT_ULong **stags, FT_UShort *script_count)
+static int
+GetScriptTags(FT_Face face, FT_ULong tabletag, FT_ULong **stags)
{
- FT_ULong cur_offset, new_offset, base_offset;
+ FT_ULong cur_offset, new_offset, base_offset;
FT_Stream stream = face->stream;
FT_Error error;
- FT_UShort n, p;
- FT_Memory memory;
-
- if ( !stream )
- return TT_Err_Invalid_Face_Handle;
+ FT_UShort n, p;
+ int script_count;
- memory = stream->memory;
+ if (!stream)
+ return 0;
if (( error = ftglue_face_goto_table( face, tabletag, stream ) ))
- return error;
+ return 0;
base_offset = ftglue_stream_pos ( stream );
/* skip version */
if ( ftglue_stream_seek ( stream, base_offset + 4L ) || ftglue_stream_frame_enter( stream, 2L ) )
- return error;
+ return 0;
new_offset = GET_UShort() + base_offset;
cur_offset = ftglue_stream_pos( stream );
- if ( ftglue_stream_seek( stream, new_offset ) != TT_Err_Ok )
- return error;
+ if ( ftglue_stream_seek( stream, new_offset ) != FT_Err_Ok )
+ return 0;
base_offset = ftglue_stream_pos( stream );
if ( ftglue_stream_frame_enter( stream, 2L ) )
- return error;
+ return 0;
- *script_count = GET_UShort ();
+ script_count = GET_UShort ();
ftglue_stream_frame_exit( stream );
- *stags = ftglue_alloc(memory, *script_count * sizeof( FT_ULong ), &error);
-
- if (error)
- return error;
+ *stags = malloc(script_count * sizeof (FT_ULong));
+ if (!stags)
+ return 0;
p = 0;
- for ( n = 0; n < *script_count; n++ )
+ for ( n = 0; n < script_count; n++ )
{
if ( ftglue_stream_frame_enter( stream, 6L ) )
goto Fail;
error = ftglue_stream_seek( stream, new_offset );
- if ( error == TT_Err_Ok )
+ if ( error == FT_Err_Ok )
p++;
(void)ftglue_stream_seek( stream, cur_offset );
}
if (!p)
- {
- error = TTO_Err_Invalid_SubTable;
goto Fail;
- }
/* sort the tag list before returning it */
- qsort(*stags, *script_count, sizeof(FT_ULong), compareulong);
+ qsort(*stags, script_count, sizeof(FT_ULong), compareulong);
- return TT_Err_Ok;
+ return script_count;
Fail:
- *script_count = 0;
- ftglue_free( memory, *stags );
+ free(*stags);
*stags = NULL;
- return error;
+ return 0;
}
static FcChar8 *
FT_ULong *gsubtags=NULL, *gpostags=NULL;
FT_UShort gsub_count=0, gpos_count=0;
FT_ULong maxsize;
- FT_Memory memory = face->stream->memory;
- FcChar8 *complex = NULL;
+ FcChar8 *complex_ = NULL;
int indx1 = 0, indx2 = 0;
err = FT_Load_Sfnt_Table(face, TTAG_SILF, 0, 0, &len);
issilgraphitefont = ( err == FT_Err_Ok);
- if (GetScriptTags(face, TTAG_GPOS, &gpostags, &gpos_count) != FT_Err_Ok)
- gpos_count = 0;
- if (GetScriptTags(face, TTAG_GSUB, &gsubtags, &gsub_count) != FT_Err_Ok)
- gsub_count = 0;
-
+ gpos_count = GetScriptTags(face, TTAG_GPOS, &gpostags);
+ gsub_count = GetScriptTags(face, TTAG_GSUB, &gsubtags);
+
if (!issilgraphitefont && !gsub_count && !gpos_count)
goto bail;
- maxsize = (((FT_ULong) gpos_count + (FT_ULong) gsub_count) * OTLAYOUT_LEN +
+ maxsize = (((FT_ULong) gpos_count + (FT_ULong) gsub_count) * OTLAYOUT_LEN +
(issilgraphitefont ? 13 : 0));
- complex = malloc (sizeof (FcChar8) * maxsize);
- if (!complex)
+ complex_ = malloc (sizeof (FcChar8) * maxsize);
+ if (!complex_)
goto bail;
- complex[0] = '\0';
+ complex_[0] = '\0';
if (issilgraphitefont)
- strcpy((char *) complex, "ttable:Silf ");
+ strcpy((char *) complex_, "ttable:Silf ");
while ((indx1 < gsub_count) || (indx2 < gpos_count)) {
if (indx1 == gsub_count) {
- addtag(complex, gpostags[indx2]);
+ addtag(complex_, gpostags[indx2]);
indx2++;
} else if ((indx2 == gpos_count) || (gsubtags[indx1] < gpostags[indx2])) {
- addtag(complex, gsubtags[indx1]);
+ addtag(complex_, gsubtags[indx1]);
indx1++;
} else if (gsubtags[indx1] == gpostags[indx2]) {
- addtag(complex, gsubtags[indx1]);
+ addtag(complex_, gsubtags[indx1]);
indx1++;
indx2++;
} else {
- addtag(complex, gpostags[indx2]);
+ addtag(complex_, gpostags[indx2]);
indx2++;
}
}
if (FcDebug () & FC_DBG_SCANV)
- printf("complex features in this font: %s\n", complex);
+ printf("complex_ features in this font: %s\n", complex_);
bail:
- ftglue_free(memory, gsubtags);
- ftglue_free(memory, gpostags);
- return complex;
+ free(gsubtags);
+ free(gpostags);
+ return complex_;
}
#define __fcfreetype__