Наименьший прямоугольник Sharp dx, заключающий глиф

Я пытаюсь вычислить наименьший прямоугольник, который может содержать глиф, используя SharpDX. Метод GetGdiCompatibleGlyphMetrics, похоже, не возвращает правильные значения, поскольку каждый из моих символов имеет ширину и высоту 1000+, тогда как я указал размер шрифта 16.

fontFace = new FontFace(factory, FontFaceType.Truetype, fontFileArray, 0, FontSimulations.None);    
var glyphMetrics = fontFace.GetGdiCompatibleGlyphMetrics(16, 1, null, false, glyphIndices, false);

Если у кого-то есть идея, я был бы очень благодарен.


person Slel    schedule 31.03.2015    source источник


Ответы (3)


Я нашел решение. Я опубликую его здесь для будущих вопросов.

У класса FontFace есть дочерний класс с именем FontFace1, который сам имеет метод GetKerningPairAdjustments. Этот параметр кернинга решает все.

person Slel    schedule 13.04.2015

Вероятно, это связано с тем, что размер шрифта (16) установлен с использованием другой единицы измерения, чем разрешение экрана.

Чарльз Петцольд в значительной степени является экспертом по этим расчетам и освещает их в своем blog и в его книгах (которые всегда рекомендуется читать для написания кода Windows). Единственный способ узнать наверняка, каким должен быть ответ, — это рассчитать его самостоятельно для вашего текущего разрешения экрана и настроек DPI.

person Dr Herbie    schedule 31.03.2015
comment
Я понимаю, что размер шрифта, вероятно, неправильный. Я должен дать ему размер по падению. Я просто не могу понять, как это сделать. Кстати, не могли бы вы привести мне пример? Все, что я знаю, это то, что мне нужен размер шрифта 16 (не знаю, какая единица обычно выражает это). Мой экран - монитор с разрешением 120 dpi. - person Slel; 02.04.2015
comment
Для размера шрифта в WPF каждый пункт равен 1/96 дюйма. Таким образом, размер шрифта 16 пунктов будет иметь высоту 0,1667 дюйма. - person Dr Herbie; 06.04.2015
comment
И снова здравствуйте. Мне удалось вычислить результат с правильным размером шрифта и прочим. Однако у меня возникла проблема с вычислением ограничивающих прямоугольников глифа в следующей строке: b A. Кажется, что заглавная буква «A» перекрывает пространство между двумя буквами, в результате чего вычисляемый блок немного смещается от фактического положения « А'. Любая мысль? Спасибо - person Slel; 09.04.2015
comment
Извините, но вы вышли за пределы моего «круга компетенции»! Надеюсь, кто-то еще здесь сможет помочь. - person Dr Herbie; 12.04.2015

GetGdiCompatibleGlyphMetrics возвращает метрики в проектных единицах, вы должны масштабировать их самостоятельно, используя размер шрифта, соотношение пикселей к углу (1 в вашем случае) и размер окна дизайна Em, который имеет ваш шрифт. Это даст вам масштабированные показатели дизайна. GetKerningPairAdjustments не имеет к этому никакого отношения, вы можете использовать его, только если в шрифте есть данные о парах кернинга, и если вы действительно включили кернинг в макете. Обратите внимание, что это отличается от кернинга по умолчанию, который ваш макет может получить в результате формирования, вы не можете предположить, что это то же самое, потому что данные GPOS не должны совпадать с данными парного кернинга. В любом случае, если вы хотите получить настоящую чернильную коробку, вам нужно отрисовать глиф, другого способа получить точные результаты нет.

person bunglehead    schedule 03.02.2016