Обратите внимание, вам нужно нужно точно учитывать, что вы подразумеваете под вертикальным центрированием.
Шрифты отображаются на базовой линии, проходящей вдоль нижней части текста. Вертикальное пространство выделяется следующим образом:
---
^
| leading
|
--
^ Y Y
| Y Y
| Y Y
| ascent Y y y
| Y y y
| Y y y
-- baseline ______Y________y_________
| y
v descent yy
--
Начальная буква - это просто рекомендуемое расстояние между строками шрифта. Ради центрирования по вертикали между двумя точками следует игнорировать ведение (это ведение, кстати, не прохождение; в обычной типографии это / было расстояние между отведениями, вставленное между линиями в печатной форме).
Так что для центрирования текста по возрастанию и спуску, вы хотите
baseline=(top+((bottom+1-top)/2) - ((ascent + descent)/2) + ascent;
Без окончательного «+ подъема» у вас есть позиция для верхней части шрифта; поэтому добавление восхождения идет от вершины к базовой линии.
Кроме того, обратите внимание, что высота шрифта должна включать начальные, но некоторые шрифты не включают его, и из-за различий в округлении высота шрифта может не совпадать (начальные + подъем + спуск).