]> git.wh0rd.org - fontconfig.git/commitdiff
Match 'ultra' on word boundaries to detect ultra bold fonts. (bug 2511)
authorKeith Packard <keithp@neko.keithp.com>
Sat, 2 Sep 2006 03:25:21 +0000 (20:25 -0700)
committerKeith Packard <keithp@koto.keithp.com>
Thu, 25 Oct 2007 21:00:15 +0000 (14:00 -0700)
Added FcStrContainsWord to detect strings on word boundaries.

src/fcfreetype.c
src/fcint.h
src/fcstr.c

index 3265a3879b7f9235e9421024e4580f0fa2c9c2ed..572e7f2a05925dee6624156c29886a165275652d 100644 (file)
@@ -959,8 +959,18 @@ FcStringContainsConst (const FcChar8           *string,
     int        i;
 
     for (i = 0; i < nc; i++)
-       if (FcStrContainsIgnoreBlanksAndCase (string, c[i].name))
-           return c[i].value;
+    {
+       if (c[i].name[0] == '<')
+       {
+           if (FcStrContainsWord (string, c[i].name + 1))
+               return c[i].value;
+       }
+       else
+       {
+           if (FcStrContainsIgnoreBlanksAndCase (string, c[i].name))
+               return c[i].value;
+       }
+    }
     return -1;
 }
 
@@ -985,6 +995,7 @@ static const FcStringConst  weightConsts[] = {
     { (FC8) "ultrablack",      FC_WEIGHT_ULTRABLACK },
     { (FC8) "superblack",      FC_WEIGHT_EXTRABLACK },
     { (FC8) "extrablack",      FC_WEIGHT_EXTRABLACK },
+    { (FC8) "<ultra",          FC_WEIGHT_ULTRABOLD }, /* only if a word */
     { (FC8) "black",           FC_WEIGHT_BLACK },
     { (FC8) "heavy",           FC_WEIGHT_HEAVY },
 };
index 73bf875c1f483be5290ce6ab9d53f9043bdd538a..c24d7885d9843fceec0c21565c973f7ecf27962d 100644 (file)
@@ -1030,6 +1030,9 @@ FcStrContainsIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2);
 FcPrivate const FcChar8 *
 FcStrContainsIgnoreCase (const FcChar8 *s1, const FcChar8 *s2);
 
+FcPrivate const FcChar8 *
+FcStrContainsWord (const FcChar8 *s1, const FcChar8 *s2);
+
 FcPrivate FcBool
 FcStrUsesHome (const FcChar8 *s);
 
index eaae935c5e68f2db2642ca0cffbe98cb84879dfe..6068596679929c8af6c15ca98620b5d39a1a275d 100644 (file)
@@ -323,6 +323,26 @@ FcStrContainsIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2)
     return 0;
 }
 
+static FcBool
+FcCharIsPunct (const FcChar8 c)
+{
+    if (c < '0')
+       return FcTrue;
+    if (c <= '9')
+       return FcFalse;
+    if (c < 'A')
+       return FcTrue;
+    if (c <= 'Z')
+       return FcFalse;
+    if (c < 'a')
+       return FcTrue;
+    if (c <= 'z')
+       return FcFalse;
+    if (c <= '~')
+       return FcTrue;
+    return FcFalse;
+}
+
 /*
  * Is the head of s1 equal to s2?
  */
@@ -347,7 +367,7 @@ FcStrIsAtIgnoreCase (const FcChar8 *s1, const FcChar8 *s2)
 }
 
 /*
- * Does s1 contain an instance of s2 (ignoring blanks and case)?
+ * Does s1 contain an instance of s2 (ignoring case)?
  */
 
 const FcChar8 *
@@ -362,6 +382,34 @@ FcStrContainsIgnoreCase (const FcChar8 *s1, const FcChar8 *s2)
     return 0;
 }
 
+/*
+ * Does s1 contain an instance of s2 on a word boundary (ignoring case)?
+ */
+
+const FcChar8 *
+FcStrContainsWord (const FcChar8 *s1, const FcChar8 *s2)
+{
+    FcBool  wordStart = FcTrue;
+    int            s1len = strlen ((char *) s1);
+    int            s2len = strlen ((char *) s2);
+       
+    while (s1len >= s2len)
+    {
+       if (wordStart && 
+           FcStrIsAtIgnoreCase (s1, s2) &&
+           (s1len == s2len || FcCharIsPunct (s1[s2len])))
+       {
+           return s1;
+       }
+       wordStart = FcFalse;
+       if (FcCharIsPunct (*s1))
+           wordStart = FcTrue;
+       s1++;
+       s1len--;
+    }
+    return 0;
+}
+
 const FcChar8 *
 FcStrStrIgnoreCase (const FcChar8 *s1, const FcChar8 *s2)
 {