Разрабатываю библиотеку по конвертации 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 смотрел, там про расчеты ничего не сказано.