Как найти точный размер для произвольного глифа в 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;
Другие вопросы по тегам