]> git.wh0rd.org - fontconfig.git/blobdiff - src/fcfreetype.c
Replace 'KEITH PACKARD' with 'THE AUTHOR(S)' in license text in all files
[fontconfig.git] / src / fcfreetype.c
index c5d5251d9a6d87e9060463f409499a4725a6db8a..0bc52d121f621548517061202ff084096418ef7e 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
  *
@@ -13,9 +13,9 @@
  * 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
@@ -120,7 +120,7 @@ static const FcFtEncoding   fcFtEncoding[] = {
  {  TT_PLATFORM_MACINTOSH,     TT_MAC_ID_JAPANESE,     "SJIS" },
  {  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" },
@@ -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]))
@@ -1118,7 +1119,7 @@ FcFreeTypeQueryFace (const FT_Face  face,
 #if 0
     FcChar8        *family = 0;
 #endif
-    FcChar8        *complex;
+    FcChar8        *complex_;
     const FcChar8   *foundry = 0;
     int                    spacing;
     TT_OS2         *os2;
@@ -1477,14 +1478,14 @@ FcFreeTypeQueryFace (const FT_Face  face,
            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_);
     }
 
     /*
@@ -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,20 @@ 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 HAVE_FT_SELECT_SIZE
+    if (strike_index >= 0) {
+       if (FT_Select_Size (face, strike_index) != FT_Err_Ok)
+           goto bail1;
+       using_strike = FcTrue;
+    }
+#endif
+
 #ifdef CHECK
     printf ("Family %s style %s\n", face->family_name, face->style_name);
 #endif
@@ -2598,7 +2578,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 +2626,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 +2693,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 +2736,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 +2758,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)
 {
@@ -2809,7 +2822,7 @@ FcFreeTypeCharSet (FT_Face face, FcBlanks *blanks)
 #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];
 
@@ -2828,10 +2841,10 @@ addtag(FcChar8 *complex, FT_ULong tag)
        !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
@@ -2939,7 +2952,7 @@ FcFontCapabilities(FT_Face face)
     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);
@@ -2955,36 +2968,36 @@ FcFontCapabilities(FT_Face face)
 
     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;
+    return complex_;
 }
 
 #define __fcfreetype__