Как найти точный размер для произвольного глифа в WPF?
Мне нужно найти точный размер для каждого символа в произвольном шрифте.
Шрифт загружается с использованием класса GlyphTypeface.
Проблема в том, что я могу напрямую получить доступ только к ширине глифа, используя свойство AdvanceWidths, но высота для всех символов одинакова, и для него установлено значение Высота.
Кажется, что высота отдельных символов может быть вычислена с использованием комбинации свойств Baseline, Height, XHeight, BottomSideBearings и TopSideBearings, но нет документации о реальном значении всех этих значений. Значения Baseline, Height и XHeight являются постоянными для всего шрифта, относительно двух других - BottomSideBearings и TopSideBearings - я не могу найти их значение.
Вообще говоря, есть ли какая-нибудь информация, как можно вычислить размер отдельного глифа из произвольного шрифта? (имея только файл 'TTF' или что-либо еще, из которого можно загрузить GlyphTypeface).
2 ответа
После некоторых исследований, нашел правильный способ вычисления размера символов:
var typeface = new GlyphTypeface(new Uri(fontpath));
var character = 'W';
var charIndex = typeface.CharacterToGlyphMap[character];
var width = typeface.AdvanceWidths[charIndex];
var height = typeface.Height - typeface.TopSideBearings[charIndex]
- typeface.BottomSideBearings[charIndex];
Это даст размер символа в em - чтобы найти реальный размер, его нужно умножить на размер шрифта.
Возможно, вы могли бы получить границы геометрии, возвращаемые методом GlyphTypeface.GetGlyphOutline:
GlyphTypeface typeface = new GlyphTypeface(new Uri(@"C:\Windows\Fonts\SegoeUI.ttf"));
ushort glyphIndex = typeface.CharacterToGlyphMap['W'];
double emSize = 14d;
Geometry outline = typeface.GetGlyphOutline(glyphIndex, emSize, 0d);
Size size = outline.Bounds.Size;