]> git.wh0rd.org - fontconfig.git/blobdiff - src/fcfreetype.c
Replace RCS Id tags with the file name
[fontconfig.git] / src / fcfreetype.c
index 53fe86b67d8a008a88116c2023554529f1074189..d6197de6df129b900673f2219adcf4db7cca49d4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $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
  *
@@ -1016,6 +1016,7 @@ static const FcStringConst  widthConsts[] = {
     { (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]))
@@ -1036,11 +1037,11 @@ static const FcStringConst  slantConsts[] = {
 
 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]))
@@ -1700,40 +1701,6 @@ FcFreeTypeQueryFace (const FT_Face  face,
                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
     /*
@@ -2501,11 +2468,15 @@ FcFreeTypeCharIndex (FT_Face face, FcChar32 ucs4)
 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
@@ -2559,8 +2530,8 @@ FcFreeTypeCheckGlyph (FT_Face face, FcChar32 ucs4,
 #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
@@ -2574,11 +2545,18 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
     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
@@ -2598,7 +2576,7 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
                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
@@ -2646,7 +2624,7 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
             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)
                    {
@@ -2713,7 +2691,7 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
            {
                ucs4 = FcGlyphNameToUcs4 (name_buf);
                if (ucs4 != 0xffff && 
-                   FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance))
+                   FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike))
                {
                    if (advance)
                    {
@@ -2756,7 +2734,7 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
 
        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);
@@ -2778,6 +2756,39 @@ bail0:
     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)
 {
@@ -2989,4 +3000,5 @@ bail:
 
 #define __fcfreetype__
 #include "fcaliastail.h"
+#include "fcftaliastail.h"
 #undef __fcfreetype__