Commit 4e21e6f6 authored by Keith Packard's avatar Keith Packard
Browse files

Match 'ultra' on word boundaries to detect ultra bold fonts. (bug 2511)

Added FcStrContainsWord to detect strings on word boundaries.
parent 2a5ea800
......@@ -935,8 +935,18 @@ FcStringContainsConst (const FcChar8 *string,
int i;
for (i = 0; i < nc; i++)
{
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;
}
......@@ -958,6 +968,8 @@ static const FcStringConst weightConsts[] = {
{ (FC8) "superbold", FC_WEIGHT_EXTRABOLD },
{ (FC8) "ultrabold", FC_WEIGHT_ULTRABOLD },
{ (FC8) "bold", FC_WEIGHT_BOLD },
{ (FC8) "<ultra", FC_WEIGHT_ULTRABOLD }, /* only if a word */
{ (FC8) "bold", FC_WEIGHT_BOLD },
{ (FC8) "black", FC_WEIGHT_BLACK },
{ (FC8) "heavy", FC_WEIGHT_HEAVY },
};
......
......@@ -1046,6 +1046,9 @@ FcStrContainsIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2);
const FcChar8 *
FcStrContainsIgnoreCase (const FcChar8 *s1, const FcChar8 *s2);
const FcChar8 *
FcStrContainsWord (const FcChar8 *s1, const FcChar8 *s2);
FcBool
FcStrUsesHome (const FcChar8 *s);
......
......@@ -320,6 +320,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?
*/
......@@ -344,7 +364,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 *
......@@ -359,6 +379,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)
{
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment