Ассемблер
Пример нестандартной задачи, где проблему пришлось решать не на уровне HTML, CSS или JavaScript, а через ручное изменение нескольких байт в файле шрифта.
Задача
Исправить некорректное отображение нового шрифта в браузерах на Linux.
Проблема
После внедрения нового дизайна выяснилось, что на Linux в браузерах кириллица отображается некорректно: символы имели неправильные отступы и визуально "разъезжались".
При этом:
- на
Windowsшрифт отображался нормально; - проблема воспроизводилась именно на кириллице;
- вёрстка,
JavaScriptиCSSработали корректно.
Диагностика
После проверки стало понятно, что источник проблемы находится не в коде интерфейса, а в самом файле шрифта.
Дальше исследовал шрифт через специализированный инструмент для просмотра метрик. В одной из метрик обнаружилось подозрительно большое отрицательное значение. Для сравнения у других корректных шрифтов эта же метрика обычно была равна 0.
После этого стал искать, как именно можно изменить данное значение. На сайте издателя шрифта нашёл техническое описание формата и указание, по какому смещению в байтах хранится нужная метрика.
Решение
Исправление было сделано вручную:
- определил нужное смещение в файле шрифта;
- открыл файл на уровне байтов;
- изменил несколько байт по указанному адресу;
- выставил для проблемной метрики нулевое значение.
Фактически задача свелась к точечному ручному исправлению бинарных данных шрифта.
Результат
После правки шрифт стал корректно отображаться:
- в браузерах на
Linux; - на кириллице;
- без регрессии на других ОС.
Это позволило сохранить новый шрифт в дизайне и не откатываться на замену, которая могла бы повлиять на внешний вид интерфейса.
Причина проблемы
Причина оказалась в самом шрифте: при его адаптации под кириллицу издатель некорректно выставил одну из метрик.