Используя DirectWrite и Direct2D1, я пытаюсь имитировать рендеринг, который Illustrator CS6 делает с текстовым полем области. CS6 имеет опцию, где базовая линия может быть размещена на расстоянии от верхней части текстового поля области, которое равно «размеру em» шрифта. Например, при использовании шрифта Trajan Pro размером 100 пт базовая линия составляет 87,5 пт от верхней части текстового поля области.
Из объекта IDWriteFontFace я могу получить значения ascent, descent, designUnitsPerEm и т. Д.
Кажется, что отсутствует базовое расположение относительно верхней части окна em.
Есть ли способ получить базовую позицию в единицах проектирования относительно верхней части блока em?
У DWRITE_FONT_METRICS его нет.
Я посмотрел на DWRITE_LINE_METRICS, но его базовое значение равно ascent + lineGap и не совпадает.
Это только частичный ответ, но здесь идет
То, как я справляюсь с этим в похожем сценарии:
Высота EM — подъем = базовая линия
В чем я не уверен, так это в том, как или даже следует применять linegap. Многие шрифты имеют нулевой разрыв строки, поэтому он не является подходящим, на самом деле в мире CSS, с которым, я думаю, я знаком, нередко сортировать «Добавить» в разрыве строки, указывая, что высота строки равна 1,2 * высоты EM. Когда мне действительно нужно знать распределение этого разрыва, я всегда относился к нему как к достижению достойного уровня, но я не совсем уверен, что это на 100% правильно, это просто достаточно для того, что я делаю.
В общем, высота EM = Ascent + Descent + linegap в этом порядке. Кроме того, я считаю, что вполне допустимо иметь отрицательный разрыв строки, поэтому, как бы он ни распределялся, все внизу, наполовину сверху, наполовину снизу (что, я думаю, на самом деле не имеет смысла, но я могу ошибаться), или что-то еще, вы должны быть последовательны в этом. Надеюсь это поможет.
Других решений пока нет …