Как устаревшая реализация может изящно обработать новую версию шрифта OpenType?

Ниже приведен следующий текст в разделе Номера версий документа Спецификация файла шрифта MS OpenType:

Реализации, читающие таблицы, должны включать код для проверки номеров версий, чтобы в случае изменения формата и, следовательно, номера версии старые реализации корректно обрабатывали новые версии.

Предположим, кто-то написал код для чтения файла шрифта OpenType с версией 1 и выше, код используется для обработки того же файла шрифта, но с версией 2. Я просто не могу представить, как это могло бы «изящно» преуспеть, если только приведенное выше утверждение означает, что необходимо обновить код до окончательной версии файла шрифта перед его обработкой.


person Ayrosa    schedule 14.04.2017    source источник
comment
В интересах того, чтобы stackoverflow действительно был полезен для будущих посетителей, можете ли вы либо принять ответ, либо оставить комментарий о том, как он не решает вашу проблему?   -  person Mike 'Pomax' Kamermans    schedule 01.05.2017


Ответы (1)


Вы ошибочно принимаете «изящный» за «все еще анализирует файл шрифта». Идея спецификации состоит в том, что существуют номера версий, поэтому каждый анализатор явно проверяет номер версии, продолжает анализировать версии, которые он знает, как анализировать, и правильно сообщает и детерминистически ведет себя с версиями, с которыми он не знает, что делать.

Изящный:

  • начать читать таблицу
  • прочитать номер версии в структуру таблицы
  • проверить номер версии
  • переход к функции синтаксического анализа для известного номера версии
  • сообщить о невозможности продолжить синтаксический анализ для неизвестного номера версии
  • отменить синтаксический анализ детерминированным, задокументированным способом
  • Приложение, использующее синтаксический анализатор, теперь может изящно справляться с ситуацией «невозможно загрузить шрифт запроса», в которой оно находится.

Не изящно:

  • начать читать таблицу
  • считывать байты в структуру, отражающую самый последний формат таблицы OpenType на момент написания синтаксического анализатора.
  • в конечном итоге с поврежденными данными из-за несоответствия версии, возможно, тут же произойдет жесткий сбой из-за доступа к памяти за пределами выделенного диапазона для таблицы.
  • возможно обслуживание поврежденных данных и/или сбой позже из-за неправильных смещений
  • возможно, произойдет сбой приложения, использующего синтаксический анализатор, поскольку были возвращены поврежденные данные, или сбой синтаксического анализатора был достаточно серьезным, чтобы завершить процесс
  • возможно ... и т.д. и т.п.

Никто не ожидает, что синтаксический анализатор сможет анализировать новые форматы таблиц OpenType, но он должен абсолютно обращаться с ними изящным образом, проверяя, соответствуют ли версии тем, которые он использует. знает, как работать, и сообщает о невозможности анализа данных, для которых у него нет правил анализа, с чистым выходом, который позволяет приложениям-потребителям делать то, что им нужно.

person Mike 'Pomax' Kamermans    schedule 21.04.2017