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

Added FcStrContainsWord to detect strings on word boundaries.
This commit is contained in:
Keith Packard 2006-09-01 20:25:21 -07:00
parent 2a5ea80023
commit 4e21e6f6e6
3 changed files with 66 additions and 3 deletions

View File

@ -935,8 +935,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;
}
@ -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 },
};

View File

@ -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);

View File

@ -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)
{