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:
parent
349182784f
commit
4ee9ca6786
|
@ -959,8 +959,18 @@ FcStringContainsConst (const FcChar8 *string,
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < nc; 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;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -985,6 +995,7 @@ static const FcStringConst weightConsts[] = {
|
||||||
{ (FC8) "ultrablack", FC_WEIGHT_ULTRABLACK },
|
{ (FC8) "ultrablack", FC_WEIGHT_ULTRABLACK },
|
||||||
{ (FC8) "superblack", FC_WEIGHT_EXTRABLACK },
|
{ (FC8) "superblack", FC_WEIGHT_EXTRABLACK },
|
||||||
{ (FC8) "extrablack", FC_WEIGHT_EXTRABLACK },
|
{ (FC8) "extrablack", FC_WEIGHT_EXTRABLACK },
|
||||||
|
{ (FC8) "<ultra", FC_WEIGHT_ULTRABOLD }, /* only if a word */
|
||||||
{ (FC8) "black", FC_WEIGHT_BLACK },
|
{ (FC8) "black", FC_WEIGHT_BLACK },
|
||||||
{ (FC8) "heavy", FC_WEIGHT_HEAVY },
|
{ (FC8) "heavy", FC_WEIGHT_HEAVY },
|
||||||
};
|
};
|
||||||
|
|
|
@ -1030,6 +1030,9 @@ FcStrContainsIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2);
|
||||||
FcPrivate const FcChar8 *
|
FcPrivate const FcChar8 *
|
||||||
FcStrContainsIgnoreCase (const FcChar8 *s1, const FcChar8 *s2);
|
FcStrContainsIgnoreCase (const FcChar8 *s1, const FcChar8 *s2);
|
||||||
|
|
||||||
|
FcPrivate const FcChar8 *
|
||||||
|
FcStrContainsWord (const FcChar8 *s1, const FcChar8 *s2);
|
||||||
|
|
||||||
FcPrivate FcBool
|
FcPrivate FcBool
|
||||||
FcStrUsesHome (const FcChar8 *s);
|
FcStrUsesHome (const FcChar8 *s);
|
||||||
|
|
||||||
|
|
50
src/fcstr.c
50
src/fcstr.c
|
@ -323,6 +323,26 @@ FcStrContainsIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2)
|
||||||
return 0;
|
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?
|
* 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 *
|
const FcChar8 *
|
||||||
|
@ -362,6 +382,34 @@ FcStrContainsIgnoreCase (const FcChar8 *s1, const FcChar8 *s2)
|
||||||
return 0;
|
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 *
|
const FcChar8 *
|
||||||
FcStrStrIgnoreCase (const FcChar8 *s1, const FcChar8 *s2)
|
FcStrStrIgnoreCase (const FcChar8 *s1, const FcChar8 *s2)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue