/*
- * $RCSId: xc/lib/fontconfig/src/fcfreetype.c,v 1.11 2002/08/31 22:17:32 keithp Exp $
+ * fontconfig/src/fcfreetype.c
*
* Copyright © 2001 Keith Packard
*
{ (FC8) "extraexpanded", FC_WIDTH_EXTRAEXPANDED },
{ (FC8) "ultraexpanded", FC_WIDTH_ULTRAEXPANDED },
{ (FC8) "expanded", FC_WIDTH_EXPANDED }, /* must be after *expanded */
+ { (FC8) "extended", FC_WIDTH_EXPANDED },
};
#define NUM_WIDTH_CONSTS (int) (sizeof (widthConsts) / sizeof (widthConsts[0]))
static const FcStringConst decorativeConsts[] = {
{ (FC8) "shadow", FcTrue },
- { (FC8) "smallcaps", FcTrue },
+ { (FC8) "caps", FcTrue },
{ (FC8) "antiqua", FcTrue },
{ (FC8) "romansc", FcTrue },
{ (FC8) "embosed", FcTrue },
- { (FC8) "romansmallcaps", FcTrue },
+ { (FC8) "dunhill", FcTrue },
};
#define NUM_DECORATIVE_CONSTS (int) (sizeof (decorativeConsts) / sizeof (decorativeConsts[0]))
goto bail2;
if (!FcPatternAddBool (pat, FC_ANTIALIAS, FcFalse))
goto bail2;
-#if HAVE_FT_GET_BDF_PROPERTY
- if(face->num_fixed_sizes == 1) {
- int rc;
- int value;
-
- /* 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)
- value = prop.u.cardinal;
- else
- goto nevermind;
- if(!FcPatternAddDouble(pat, FC_SIZE, value / 10.0))
- goto nevermind;
-
- 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)
- value = prop.u.cardinal;
- else
- goto nevermind;
- if(!FcPatternAddDouble(pat, FC_DPI, (double)value))
- goto nevermind;
-
- }
- nevermind:
- ;
-#endif
}
#if HAVE_FT_GET_X11_FONT_FORMAT
/*
static FcBool
FcFreeTypeCheckGlyph (FT_Face face, FcChar32 ucs4,
FT_UInt glyph, FcBlanks *blanks,
- FT_Pos *advance)
+ 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;
+
/*
* When using scalable fonts, only report those glyphs
* which can be scaled; otherwise those fonts will
#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)
-FcCharSet *
-FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
+static FcCharSet *
+FcFreeTypeCharSetAndSpacingForSize (FT_Face face, FcBlanks *blanks, int *spacing, FT_Int strike_index)
{
FcChar32 page, off, ucs4;
#ifdef CHECK
FT_UInt glyph;
FT_Pos advance, advance_one = 0, advance_two = 0;
FcBool has_advance = FcFalse, fixed_advance = FcTrue, dual_advance = FcFalse;
+ FcBool using_strike = FcFalse;
fcs = FcCharSetCreate ();
if (!fcs)
goto bail0;
+ if (strike_index >= 0) {
+ if (FT_Select_Size (face, strike_index) != FT_Err_Ok)
+ goto bail1;
+ using_strike = FcTrue;
+ }
+
#ifdef CHECK
printf ("Family %s style %s\n", face->family_name, face->style_name);
#endif
ucs4 = map->ent[i].bmp;
glyph = FT_Get_Char_Index (face, map->ent[i].encode);
if (glyph &&
- FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance))
+ FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike))
{
/*
* ignore glyphs with zero advance. They’re
ucs4 = FT_Get_First_Char (face, &glyph);
while (glyph != 0)
{
- if (FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance))
+ if (FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike))
{
if (advance)
{
{
ucs4 = FcGlyphNameToUcs4 (name_buf);
if (ucs4 != 0xffff &&
- FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance))
+ FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike))
{
if (advance)
{
if (has_char && !has_bit)
{
- if (!FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance))
+ if (!FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike))
printf ("Bitmap missing broken char 0x%x\n", ucs4);
else
printf ("Bitmap missing char 0x%x\n", ucs4);
return 0;
}
+FcCharSet *
+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)
+ {
+ /* Check for non-scalable TT fonts */
+ if (!(face->face_flags & FT_FACE_FLAG_SCALABLE) &&
+ face->num_fixed_sizes > 0 &&
+ FT_Get_Sfnt_Table (face, ft_sfnt_head))
+ {
+ FT_Int strike_index = 0;
+ int i;
+
+ /* 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) <
+ abs (face->available_sizes[strike_index].height - 16))
+ strike_index = i;
+ }
+ FcCharSetDestroy (cs);
+ cs = FcFreeTypeCharSetAndSpacingForSize (face, blanks, spacing, strike_index);
+ }
+ }
+ return cs;
+}
+
FcCharSet *
FcFreeTypeCharSet (FT_Face face, FcBlanks *blanks)
{