Подробности
[В начало]
Проблема в реализации № S0592
Краткое описание
Неадекватное поведение функции FcFontSort
Подробное описание
В описании функции FcFontSort сказано: "Returns the list of fonts sorted by closeness to p". То есть, если шрифт p присутствует среди множества сортируемых системных шрифтов, то этот шрифт должен присутствовать в отсортированном списке и стоять в самом его начале.
Но в действительности функция FcPatternEqual возвращает FcFalse при сравнении шрифта p с первым шрифтом из отсортированного списка. Печать обоих шрифтов при помощи функции FcPatternPrint показывает,
что сравниваемые шрифты очень похожи между собой, но в шрифте, являющемся первым элементом списка, отсутствует ряд свойств искомого шрифта p.
Раздел стандарта
Fontconfig Developers Reference, Version 2.4.2
Способ воспроизведения
- Для некоторого шаблона p1 с помощью функции FcFontMatch получаем системный шрифт, больше всего похожий на него - p2.
- Далее сортируем все системные шрифты по степени "похожести" на p2.
- Сравниваем p2 с первым элементом отсортированного списка.
Пример
FcConfig *fc;
FcResult *result;
FcPattern *p1, *p2;
FcFontSet *fs;
if (!(fc = FcConfigGetCurrent ()))
{
printf ("Could not get current config\n");
}
if (!(p1 = FcPatternCreate ()))
{
printf ("Could not create the pattern\n");
}
FcConfigSubstitute (fc, p1, FcMatchPattern);
FcDefaultSubstitute (p1);
p2 = FcFontMatch (fc, p1, result);
fs = FcFontSort (fc, p2, FcFalse, NULL, result);
/*
* Returns the list of fonts sorted by closeness to p
*
* The following condition should be true:
* FcPatternEqual (p2, fs->fonts[0]) == FcTrue;
*/
if (FcPatternEqual (p2, fs->fonts[0]) != FcTrue)
{
printf("[p1 ]---------------------\n");
FcPatternPrint(p1);
printf("[p2 ]---------------------\n");
FcPatternPrint(p2);
printf("[fs[0]]---------------------\n");
FcPatternPrint(fs->fonts[0]);
}
Компонент
fontconfig 2.2.3 or later
Принято
freedesktop.org Bugzilla 13162
Статус
Исправлено в fontconfig 2.5.0
[В начало]