Подробности

[В начало]

Проблема в реализации № 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

Способ воспроизведения

  1. Для некоторого шаблона p1 с помощью функции FcFontMatch получаем системный шрифт, больше всего похожий на него - p2.
  2. Далее сортируем все системные шрифты по степени "похожести" на p2.
  3. Сравниваем 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

[В начало]