Подробности

[В начало]

Проблема в реализации № V0019

Краткое описание

FT_OpenType_Validate выдаёт противоречивые результаты для разных режимов проверки шрифта

Подробное описание

Согласно FreeType2 API reference, функция FT_OpenType_Validate проверяет OpenType-таблицы (BASE, GDEF, GPOS, GSUB, JSTF), для данного шрифта и возвращает указатели на эти таблицы. Для тех таблиц, которых в указанном шрифте нет, функция устанавливает соответствующий указатель в NULL. FT_OpenType_Validate возвращает ноль в случае успеха и ненулевой код ошибки в противном случае.

Если вызвать FT_OpenType_Validate для шрифта "FreeMono.ttf" (см. прикреплённый пример) для проверки всех пяти таблиц (т.е. с флагом FT_VALIDATE_OT), функция возвращает 0 (успех). По значениям указателей на таблицы, установленным этой функцией, можно заключить, что в данном шрифте есть таблицы GDEF и GSUB (и они корректны), а остальных трёх таблиц нет.

Однако, если вызвать FT_OpenType_Validate для проверки только таблицы GDEF этого же шрифта (т.е. указать флаг FT_VALIDATE_GDEF), функция возвращает 16 ("invalid glyph index"). Таким образом, поведение функции противоречиво по отношению к этой таблице: в первом случае функция сообщает, что таблица GDEF верна, во втором - что неверна.

Раздел стандарта

Linux Standard Base Desktop Specification 3.2, Chapter 12. Libraries, 12.1 Interfaces for libfreetype, который ссылается на FreeType-2.1.10 API Reference, section "OpenType Validation"

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

  1. Распакуйте прикреплённый архив
  2. Скомпилируйте и скомпонуйте программу-пример, которая в нём хранится
  3. Запустите программу-пример:
    ./opentype_validation

Стоит отметить, что функция FT_OpenType_Validate использует для своей работы модуль OpenType validation ("otvalid"). В FreeType 2.3.7 этот модуль по умолчанию отключен, как, возможно, и в некоторых других версиях freetype.

Вероятно, перед сборкой и запуском программы, демонстрирующей поведение FT_OpenType_Validate, потребуется заново собрать и установить FreeType уже со включенным модулем "otvalid". Для этого нужно в файле "modules.cfg" (находится в корневом каталоге пакета с исходными кодами freetype) раскомментировать строку "AUX_MODULES += otvalid", затем собрать и установить FreeType обычным способом.

Компонент

freetype 2.1.10 or later

Окружение

Архитектуры

x86, x86-64

Принято

freetype-devel mailing list, #00, 2008.12

Статус

Исправлено в freetype 2.3.8

[В начало]