WinAPI и TrueType шрифты
От: Hydrophobia  
Дата: 27.03.18 12:32
Оценка:
Разрабатываю библиотеку по конвертации EMF файлов в PDF документ и появились вопросы как WinAPI интерпретирует данные TrueType шрифтов.
В TrueType шрифтах есть таблица hmtx, которая хранит advance width и left-side bearing (LSB) в design юнитах. Для преобразования design units -> device units пользуюсь формулой

 DeviceUnits = (DesignUnits/unitsPerEm) * (PointSize/72) * DeviceResolution



В WinAPI есть функция GetCharABCWidths(), которая возвращает в структуре ABC параметры глифов в виде набора
abcA — ширина отступа перед отрисовкой глифа, LSB в терминах TrueType;
abcB — ширина глифа, вычисляется как (xmax — xmin) из таблицы glyf;
abcC — ширина отступа после отрисовки глифа, вычисляется как advance width — LSB — (xmax — xmin);

В итоге полная ширина глифа равна сумме трех составляющих abcA + abcB + abcC и она должна равняться advance width из таблицы hmtx. Но она отличается на 1-2 логических юнита, что приводит к наложению соседних слов в PDF документе, когда в EMF все корректно. Например,




здесь черным цветом — расположение символов в EMF документе, зеленым — расположение в PDF документе.

Может кто подскажет, что упустил из расчетов? Книгу "Windows Graphics Programming Win32 GDI and DirectDraw" Feng Yuan смотрел, там про расчеты ничего не сказано.
winapi emf
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.