Подробности
[В начало]
Проблема в реализации № 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
[В начало]