THE SOFTWARE.
*/
+#include "fcint.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
-#include <libgen.h>
-#include "fcint.h"
#include <ft2build.h>
#include FT_FREETYPE_H
-#include FT_INTERNAL_OBJECTS_H
#include FT_TRUETYPE_TABLES_H
#include FT_SFNT_NAMES_H
#include FT_TRUETYPE_IDS_H
#include FT_TYPE1_TABLES_H
-#include FT_INTERNAL_STREAM_H
-#include FT_INTERNAL_SFNT_H
-#include FT_INTERNAL_TRUETYPE_TYPES_H
#if HAVE_FT_GET_X11_FONT_FORMAT
#include FT_XFREE86_H
#endif
-
#if HAVE_FT_GET_BDF_PROPERTY
#include FT_BDF_H
#include FT_MODULE_H
-#define HAS_BDF_PROPERTY(f) ((f) && (f)->driver && \
- (f)->driver->root.clazz->get_interface)
-#define MY_Get_BDF_Property(f,n,p) (HAS_BDF_PROPERTY(f) ? \
- FT_Get_BDF_Property(f,n,p) : \
- FT_Err_Invalid_Argument)
#endif
+#include "ftglue.h"
+
#if !HAVE_FT_GET_BDF_PROPERTY
#warning "No FT_Get_BDF_Property: Please install freetype 2.1.4 or later"
#endif
for (i = 0; i < NUM_CODE_PAGE_RANGE; i++)
{
- if (FcLangCompare (lang, FcCodePageRange[i].lang) != FcLangDifferentLang)
+ if (FcLangCompare (lang, FcCodePageRange[i].lang) == FcLangEqual)
return FcTrue;
}
return FcFalse;
#define NUM_FC_MAC_ROMAN_FAKE (int) (sizeof (fcMacRomanFake) / sizeof (fcMacRomanFake[0]))
-#if HAVE_ICONV && HAVE_ICONV_H
-#define USE_ICONV 1
+#if USE_ICONV
#include <iconv.h>
#endif
BDF_PropertyRec prop;
int rc;
- rc = MY_Get_BDF_Property (face, "PIXEL_SIZE", &prop);
+ rc = FT_Get_BDF_Property (face, "PIXEL_SIZE", &prop);
if (rc == 0 && prop.type == BDF_PROPERTY_TYPE_INTEGER)
return (double) prop.u.integer;
}
if (!FcStrCmpIgnoreBlanksAndCase (old, string))
{
return FcTrue;
- break;
}
return FcFalse;
}
* or which are simply a FC_FAMILY and FC_STYLE glued together
*/
{
- int fn, fa, st;
+ int fn, fa;
FcChar8 *full;
FcChar8 *fam;
FcChar8 *style;
printf ("Saving unique fullname %s\n", full);
}
- if (!FcPatternAddString (pat, FC_FILE, (FcChar8 *)basename((char *)file)))
+ if (!FcPatternAddString (pat, FC_FILE, file))
goto bail1;
- FcPatternAddFullFname (pat, (const char *)file);
-
if (!FcPatternAddInteger (pat, FC_INDEX, id))
goto bail1;
if (!foundry)
{
int rc;
- BDF_PropertyRec prop;
- rc = MY_Get_BDF_Property(face, "FOUNDRY", &prop);
+ rc = FT_Get_BDF_Property(face, "FOUNDRY", &prop);
if(rc == 0 && prop.type == BDF_PROPERTY_TYPE_ATOM)
foundry = (FcChar8 *) prop.u.atom;
}
if (width == -1)
{
- if (MY_Get_BDF_Property(face, "RELATIVE_SETWIDTH", &prop) == 0 &&
+ if (FT_Get_BDF_Property(face, "RELATIVE_SETWIDTH", &prop) == 0 &&
(prop.type == BDF_PROPERTY_TYPE_INTEGER ||
prop.type == BDF_PROPERTY_TYPE_CARDINAL))
{
}
}
if (width == -1 &&
- MY_Get_BDF_Property (face, "SETWIDTH_NAME", &prop) == 0 &&
+ FT_Get_BDF_Property (face, "SETWIDTH_NAME", &prop) == 0 &&
prop.type == BDF_PROPERTY_TYPE_ATOM)
{
width = FcIsWidth ((FcChar8 *) prop.u.atom);
#if HAVE_FT_GET_BDF_PROPERTY
/* For PCF fonts, override the computed spacing with the one from
the property */
- if(MY_Get_BDF_Property(face, "SPACING", &prop) == 0 &&
+ if(FT_Get_BDF_Property(face, "SPACING", &prop) == 0 &&
prop.type == BDF_PROPERTY_TYPE_ATOM) {
if(!strcmp(prop.u.atom, "c") || !strcmp(prop.u.atom, "C"))
spacing = FC_CHARCELL;
/*
* 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
+ * 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
*/
if (FcCharSetCount (cs) == 0)
{
- if (!strcmp(FT_MODULE_CLASS(&face->driver->root)->module_name, "pcf"))
+#if HAVE_FT_GET_BDF_PROPERTY
+ if(FT_Get_BDF_Property(face, "PIXEL_SIZE", &prop) == 0)
goto bail2;
+#endif
}
if (!FcPatternAddCharSet (pat, FC_CHARSET, cs))
for (i = 0; i < face->num_fixed_sizes; i++)
if (!FcPatternAddDouble (pat, FC_PIXEL_SIZE,
FcGetPixelSize (face, i)))
- goto bail1;
+ goto bail2;
if (!FcPatternAddBool (pat, FC_ANTIALIAS, FcFalse))
- goto bail1;
+ goto bail2;
#if HAVE_FT_GET_BDF_PROPERTY
if(face->num_fixed_sizes == 1) {
int rc;
int value;
- BDF_PropertyRec prop;
- rc = MY_Get_BDF_Property(face, "POINT_SIZE", &prop);
+ /* skip bitmap fonts which do not even have a family name */
+ rc = FT_Get_BDF_Property(face, "FAMILY_NAME", &prop);
+ if (rc != 0 || prop.type != BDF_PROPERTY_TYPE_ATOM)
+ goto bail2;
+
+ rc = FT_Get_BDF_Property(face, "POINT_SIZE", &prop);
if(rc == 0 && prop.type == BDF_PROPERTY_TYPE_INTEGER)
value = prop.u.integer;
else if(rc == 0 && prop.type == BDF_PROPERTY_TYPE_CARDINAL)
if(!FcPatternAddDouble(pat, FC_SIZE, value / 10.0))
goto nevermind;
- rc = MY_Get_BDF_Property(face, "RESOLUTION_Y", &prop);
+ rc = FT_Get_BDF_Property(face, "RESOLUTION_Y", &prop);
if(rc == 0 && prop.type == BDF_PROPERTY_TYPE_INTEGER)
value = prop.u.integer;
else if(rc == 0 && prop.type == BDF_PROPERTY_TYPE_CARDINAL)
int p;
initial = 0;
+
+ if (!face)
+ return 0;
+
/*
* Find the current encoding
*/
FcCharSet *
FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
{
- FcChar32 page, off, max, ucs4;
+ FcChar32 page, off, ucs4;
#ifdef CHECK
FcChar32 font_max = 0;
#endif
{
FT_UInt gindex;
- max = fcFontDecoders[o].max;
/*
* Find the first encoded character in the font
*/
GetScriptTags(FT_Face face, FT_ULong tabletag, FT_ULong **stags, FT_UShort *script_count)
{
FT_ULong cur_offset, new_offset, base_offset;
- TT_Face tt_face = (TT_Face)face;
FT_Stream stream = face->stream;
FT_Error error;
FT_UShort n, p;
- FT_Memory memory = stream->memory;
+ FT_Memory memory;
if ( !stream )
return TT_Err_Invalid_Face_Handle;
- if (( error = tt_face->goto_table( tt_face, tabletag, stream, 0 ) ))
+ memory = stream->memory;
+
+ if (( error = ftglue_face_goto_table( face, tabletag, stream ) ))
return error;
- base_offset = FT_STREAM_POS();
+ base_offset = ftglue_stream_pos ( stream );
/* skip version */
- if ( FT_STREAM_SEEK( base_offset + 4L ) || FT_FRAME_ENTER( 2L ) )
+ if ( ftglue_stream_seek ( stream, base_offset + 4L ) || ftglue_stream_frame_enter( stream, 2L ) )
return error;
- new_offset = FT_GET_USHORT() + base_offset;
+ new_offset = GET_UShort() + base_offset;
- FT_FRAME_EXIT();
+ ftglue_stream_frame_exit( stream );
- cur_offset = FT_STREAM_POS();
+ cur_offset = ftglue_stream_pos( stream );
- if ( FT_STREAM_SEEK( new_offset ) != TT_Err_Ok )
+ if ( ftglue_stream_seek( stream, new_offset ) != TT_Err_Ok )
return error;
- base_offset = FT_STREAM_POS();
+ base_offset = ftglue_stream_pos( stream );
- if ( FT_FRAME_ENTER( 2L ) )
+ if ( ftglue_stream_frame_enter( stream, 2L ) )
return error;
- *script_count = FT_GET_USHORT();
+ *script_count = GET_UShort ();
+
+ ftglue_stream_frame_exit( stream );
- FT_FRAME_EXIT();
+ *stags = ftglue_alloc(memory, *script_count * sizeof( FT_ULong ), &error);
- if ( FT_SET_ERROR (FT_MEM_ALLOC_ARRAY( *stags, *script_count, FT_ULong )) )
+ if (error)
return error;
p = 0;
for ( n = 0; n < *script_count; n++ )
{
- if ( FT_FRAME_ENTER( 6L ) )
+ if ( ftglue_stream_frame_enter( stream, 6L ) )
goto Fail;
- (*stags)[p] = FT_GET_ULONG();
- new_offset = FT_GET_USHORT() + base_offset;
+ (*stags)[p] = GET_ULong ();
+ new_offset = GET_UShort () + base_offset;
- FT_FRAME_EXIT();
+ ftglue_stream_frame_exit( stream );
- cur_offset = FT_STREAM_POS();
+ cur_offset = ftglue_stream_pos( stream );
- if ( FT_STREAM_SEEK( new_offset ) )
- goto Fail;
+ error = ftglue_stream_seek( stream, new_offset );
if ( error == TT_Err_Ok )
p++;
- else if ( error != TTO_Err_Empty_Script )
- goto Fail;
- (void)FT_STREAM_SEEK( cur_offset );
+ (void)ftglue_stream_seek( stream, cur_offset );
}
if (!p)
goto Fail;
}
- // sort the tag list before returning it
+ /* sort the tag list before returning it */
qsort(*stags, *script_count, sizeof(FT_ULong), compareulong);
return TT_Err_Ok;
Fail:
*script_count = 0;
- FT_FREE( *stags );
+ ftglue_free( memory, *stags );
+ *stags = NULL;
return error;
}
if (FcDebug () & FC_DBG_SCANV)
printf("complex features in this font: %s\n", complex);
bail:
- FT_FREE(gsubtags);
- FT_FREE(gpostags);
+ ftglue_free(memory, gsubtags);
+ ftglue_free(memory, gpostags);
return complex;
}