]> git.wh0rd.org Git - fontconfig.git/commitdiff
add font widths and extend weight from OS/2 table
authorKeith Packard <keithp@keithp.com>
Wed, 12 Mar 2003 22:16:43 +0000 (22:16 +0000)
committerKeith Packard <keithp@keithp.com>
Wed, 12 Mar 2003 22:16:43 +0000 (22:16 +0000)
fontconfig/fontconfig.h
src/fcdefault.c
src/fcfreetype.c
src/fcmatch.c
src/fcname.c

index 4fa0d4844ba1e2ac019897daca34e691899fb5fa..0e101d60b16a0909ca966f79c3773c59d5511e08 100644 (file)
@@ -73,6 +73,7 @@ typedef int           FcBool;
 #define FC_VERTICAL_LAYOUT  "verticallayout"   /* Bool (false) */
 #define FC_AUTOHINT        "autohint"          /* Bool (false) */
 #define FC_GLOBAL_ADVANCE   "globaladvance"    /* Bool (true) */
+#define FC_WIDTH           "width"             /* Int */
 #define FC_FILE                    "file"              /* String */
 #define FC_INDEX           "index"             /* Int */
 #define FC_FT_FACE         "ftface"            /* FT_Face */
@@ -96,19 +97,36 @@ typedef int         FcBool;
 #define FC_CHAR_HEIGHT     "charheight"/* Int */
 #define FC_MATRIX          "matrix"    /* FcMatrix */
 
-#define FC_WEIGHT_LIGHT            0
-#define FC_WEIGHT_MEDIUM    100
-#define FC_WEIGHT_DEMIBOLD  180
-#define FC_WEIGHT_BOLD     200
-#define FC_WEIGHT_BLACK            210
-
-#define FC_SLANT_ROMAN     0
-#define FC_SLANT_ITALIC            100
-#define FC_SLANT_OBLIQUE    110
-
-#define FC_PROPORTIONAL            0
-#define FC_MONO                    100
-#define FC_CHARCELL        110
+#define FC_WEIGHT_THIN             0
+#define FC_WEIGHT_EXTRALIGHT       40
+#define FC_WEIGHT_ULTRALIGHT       FC_WEIGHT_EXTRALIGHT
+#define FC_WEIGHT_LIGHT                    50
+#define FC_WEIGHT_REGULAR          80
+#define FC_WEIGHT_NORMAL           FC_WEIGHT_REGULAR
+#define FC_WEIGHT_MEDIUM           100
+#define FC_WEIGHT_DEMIBOLD         180
+#define FC_WEIGHT_SEMIBOLD         FC_WEIGHT_DEMIBOLD
+#define FC_WEIGHT_BOLD             200
+#define FC_WEIGHT_EXTRABOLD        205
+#define FC_WEIGHT_BLACK                    210
+
+#define FC_SLANT_ROMAN             0
+#define FC_SLANT_ITALIC                    100
+#define FC_SLANT_OBLIQUE           110
+
+#define FC_WIDTH_ULTRACONDENSED            50
+#define FC_WIDTH_EXTRACONDENSED            63
+#define FC_WIDTH_CONDENSED         75
+#define FC_WIDTH_SEMICONDENSED     87
+#define FC_WIDTH_NORMAL                    100
+#define FC_WIDTH_SEMIEXPANDED      113
+#define FC_WIDTH_EXPANDED          125
+#define FC_WIDTH_EXTRAEXPANDED     150
+#define FC_WIDTH_ULTRAEXPANDED     200
+
+#define FC_PROPORTIONAL                    0
+#define FC_MONO                            100
+#define FC_CHARCELL                110
 
 /* sub-pixel order */
 #define FC_RGBA_UNKNOWN            0
index bd17a434e04da82a64535521442849e248ea6fc1..b070ea8430eb38d2fedb82db2a89461c424f4260 100644 (file)
@@ -55,6 +55,9 @@ FcDefaultSubstitute (FcPattern *pattern)
        }
     }
 
+    if (FcPatternGet (pattern, FC_WIDTH, 0, &v) == FcResultNoMatch)
+       FcPatternAddInteger (pattern, FC_WIDTH, FC_WIDTH_NORMAL);
+
     for (i = 0; i < NUM_FC_BOOL_DEFAULTS; i++)
        if (FcPatternGet (pattern, FcBoolDefaults[i].field, 0, &v) == FcResultNoMatch)
            FcPatternAddBool (pattern, FcBoolDefaults[i].field, FcBoolDefaults[i].value);
index 72b4181748e727c07779841db73cb3deaec6a059..c4d4cfc627f5f029826b81fcd53b7246328ebc04 100644 (file)
@@ -121,6 +121,7 @@ FcFreeTypeQuery (const FcChar8      *file,
     FcPattern      *pat;
     int                    slant;
     int                    weight;
+    int                    width = -1;
     int                    i;
     FcCharSet      *cs;
     FcLangSet      *ls;
@@ -162,16 +163,11 @@ FcFreeTypeQuery (const FcChar8    *file,
     if (face->style_flags & FT_STYLE_FLAG_ITALIC)
        slant = FC_SLANT_ITALIC;
 
-    if (!FcPatternAddInteger (pat, FC_SLANT, slant))
-       goto bail1;
 
     weight = FC_WEIGHT_MEDIUM;
     if (face->style_flags & FT_STYLE_FLAG_BOLD)
        weight = FC_WEIGHT_BOLD;
 
-    if (!FcPatternAddInteger (pat, FC_WEIGHT, weight))
-       goto bail1;
-
     /*
      * Grub through the name table looking for family
      * and style names.  FreeType makes quite a hash
@@ -530,6 +526,54 @@ FcFreeTypeQuery (const FcChar8     *file,
        }
     }
 
+    if (os2 && os2->version != 0xffff)
+    {
+       if (os2->usWeightClass == 0)
+           weight = -1;
+       else if (os2->usWeightClass < 150)
+           weight = FC_WEIGHT_THIN;
+       else if (os2->usWeightClass < 250)
+           weight = FC_WEIGHT_EXTRALIGHT;
+       else if (os2->usWeightClass < 350)
+           weight = FC_WEIGHT_LIGHT;
+       else if (os2->usWeightClass < 450)
+           weight = FC_WEIGHT_REGULAR;
+       else if (os2->usWeightClass < 550)
+           weight = FC_WEIGHT_MEDIUM;
+       else if (os2->usWeightClass < 650)
+           weight = FC_WEIGHT_SEMIBOLD;
+       else if (os2->usWeightClass < 750)
+           weight = FC_WEIGHT_BOLD;
+       else if (os2->usWeightClass < 850)
+           weight = FC_WEIGHT_EXTRABOLD;
+       else if (os2->usWeightClass < 950)
+           weight = FC_WEIGHT_BLACK;
+       else
+           weight = FC_WEIGHT_MEDIUM;
+
+       switch (os2->usWidthClass) {
+       case 1: width = FC_WIDTH_ULTRACONDENSED; break;
+       case 2: width = FC_WIDTH_EXTRACONDENSED; break;
+       case 3: width = FC_WIDTH_CONDENSED; break;
+       case 4: width = FC_WIDTH_SEMICONDENSED; break;
+       case 5: width = FC_WIDTH_NORMAL; break;
+       case 6: width = FC_WIDTH_SEMIEXPANDED; break;
+       case 7: width = FC_WIDTH_EXPANDED; break;
+       case 8: width = FC_WIDTH_EXTRAEXPANDED; break;
+       case 9: width = FC_WIDTH_ULTRAEXPANDED; break;
+       }
+    }
+    
+    if (!FcPatternAddInteger (pat, FC_SLANT, slant))
+       goto bail1;
+
+    if (!FcPatternAddInteger (pat, FC_WEIGHT, weight))
+       goto bail1;
+
+    if (width != -1)
+       if (!FcPatternAddInteger (pat, FC_WIDTH, width))
+           goto bail1;
+
     /*
      * Compute the unicode coverage for the font
      */
index 6ec500adb89042068135ae1882350079232271c8..4bb3d46d5e5b17888294f8de5d2b4c27887877b5 100644 (file)
@@ -206,20 +206,23 @@ static FcMatcher _FcMatchers [] = {
     { FC_WEIGHT,       FcCompareNumber,        9, 9 },
 #define MATCH_WEIGHT       8
     
-    { FC_ANTIALIAS,    FcCompareBool,          10, 10 },
-#define MATCH_ANTIALIAS            9
+    { FC_WIDTH,                FcCompareNumber,        10, 10 },
+#define MATCH_WIDTH        9
     
-    { FC_RASTERIZER,   FcCompareString,        11, 11 },
-#define MATCH_RASTERIZER    10
+    { FC_ANTIALIAS,    FcCompareBool,          11, 11 },
+#define MATCH_ANTIALIAS            10
     
-    { FC_OUTLINE,      FcCompareBool,          12, 12 },
-#define MATCH_OUTLINE      11
+    { FC_RASTERIZER,   FcCompareString,        12, 12 },
+#define MATCH_RASTERIZER    11
+    
+    { FC_OUTLINE,      FcCompareBool,          13, 13 },
+#define MATCH_OUTLINE      12
 
-    { FC_FONTVERSION,  FcCompareNumber,        13, 13 },
-#define MATCH_FONTVERSION   12
+    { FC_FONTVERSION,  FcCompareNumber,        14, 14 },
+#define MATCH_FONTVERSION   13
 };
 
-#define NUM_MATCH_VALUES    14
+#define NUM_MATCH_VALUES    15
 
 static FcBool
 FcCompareValueList (const char  *object,
@@ -273,7 +276,13 @@ FcCompareValueList (const char  *object,
     case 'p':
        i = MATCH_PIXEL_SIZE; break;
     case 'w':
-       i = MATCH_WEIGHT; break;
+       switch (FcToLower (object[1])) {
+       case 'i':
+           i = MATCH_WIDTH; break;
+       case 'e':
+           i = MATCH_WEIGHT; break;
+       }
+       break;
     case 'r':
        i = MATCH_RASTERIZER; break;
     case 'o':
index 1f3f2ed6cd2d4da6b001471ab4fe4ff66291310b..e211ab3c63674898c469f10da784113129aea561 100644 (file)
@@ -33,6 +33,7 @@ static const FcObjectType _FcBaseObjectTypes[] = {
     { FC_STYLE,                FcTypeString, },
     { FC_SLANT,                FcTypeInteger, },
     { FC_WEIGHT,       FcTypeInteger, },
+    { FC_WIDTH,                FcTypeInteger, },
     { FC_SIZE,         FcTypeDouble, },
     { FC_ASPECT,       FcTypeDouble, },
     { FC_PIXEL_SIZE,   FcTypeDouble, },
@@ -137,16 +138,33 @@ FcNameGetObjectType (const char *object)
 }
 
 static const FcConstant _FcBaseConstants[] = {
+    { (FcChar8 *) "thin",          "weight",   FC_WEIGHT_THIN, },
+    { (FcChar8 *) "extralight",            "weight",   FC_WEIGHT_EXTRALIGHT, },
+    { (FcChar8 *) "ultralight",            "weight",   FC_WEIGHT_EXTRALIGHT, },
     { (FcChar8 *) "light",         "weight",   FC_WEIGHT_LIGHT, },
+    { (FcChar8 *) "regular",       "weight",   FC_WEIGHT_REGULAR, },
     { (FcChar8 *) "medium",        "weight",   FC_WEIGHT_MEDIUM, },
     { (FcChar8 *) "demibold",      "weight",   FC_WEIGHT_DEMIBOLD, },
+    { (FcChar8 *) "semibold",      "weight",   FC_WEIGHT_DEMIBOLD, },
     { (FcChar8 *) "bold",          "weight",   FC_WEIGHT_BOLD, },
+    { (FcChar8 *) "extrabold",     "weight",   FC_WEIGHT_EXTRABOLD, },
+    { (FcChar8 *) "ultrabold",     "weight",   FC_WEIGHT_EXTRABOLD, },
     { (FcChar8 *) "black",         "weight",   FC_WEIGHT_BLACK, },
 
     { (FcChar8 *) "roman",         "slant",    FC_SLANT_ROMAN, },
     { (FcChar8 *) "italic",        "slant",    FC_SLANT_ITALIC, },
     { (FcChar8 *) "oblique",       "slant",    FC_SLANT_OBLIQUE, },
 
+    { (FcChar8 *) "ultracondensed", "width",   FC_WIDTH_ULTRACONDENSED },
+    { (FcChar8 *) "extracondensed", "width",   FC_WIDTH_EXTRACONDENSED },
+    { (FcChar8 *) "condensed",     "width",    FC_WIDTH_CONDENSED },
+    { (FcChar8 *) "semicondensed", "width",    FC_WIDTH_SEMICONDENSED },
+    { (FcChar8 *) "normal",        "width",    FC_WIDTH_NORMAL },
+    { (FcChar8 *) "semiexpanded",   "width",   FC_WIDTH_SEMIEXPANDED },
+    { (FcChar8 *) "expanded",      "width",    FC_WIDTH_EXPANDED },
+    { (FcChar8 *) "extraexpanded",  "width",   FC_WIDTH_EXTRAEXPANDED },
+    { (FcChar8 *) "ultraexpanded",  "width",   FC_WIDTH_ULTRAEXPANDED },
+    
     { (FcChar8 *) "proportional",   "spacing",  FC_PROPORTIONAL, },
     { (FcChar8 *) "mono",          "spacing",  FC_MONO, },
     { (FcChar8 *) "charcell",      "spacing",  FC_CHARCELL, },