Как указать высоту шрифта в разных ориентациях? - PullRequest
3 голосов
/ 30 мая 2009

Обычный способ создания шрифта с помощью GDI - это использование желаемого размера точки и вертикального разрешения (DPI) целевого устройства, например:

LOGFONT lf = {0};
lf.lfHeight = -MulDiv(point_size, GetDeviceCaps(hdc, LOGPIXELSY), 72);
...
HFONT hfont = CreateFontIndirect(&lf);

Предполагая режим отображения MM_TEXT по умолчанию, он преобразует point_size в высоту пикселя для нужного устройства. (Это общее приближение. На самом деле в дюйме 72,27 точки, а не 72). (Знак минус означает, что я хочу указать действительную высоту символа, а не высоту ячейки.)

Если я хочу создать боковой шрифт - то есть с ориентацией и отклонением 90 градусов - я использую LOGPIXELSX вместо LOGPIXELSY? Для некоторых принтеров, на которые я нацеливаюсь, разрешение по горизонтали и вертикали различается.

Как правило, если я хочу получить угол theta, могу ли я объединить LOGPIXELSX и LOGPIXELSY? Я думаю о чем-то вроде этого:

// Given theta in degrees (e.g., theta = 45.0) ...
double theta_radians = theta * 2.0 * pi / 360.0;
int dpi = static_cast<int>(GetDeviceCaps(hdc, LOGPIXELSX) * sin(theta_radians) +
                           GetDeviceCaps(hdc, LOGPIXELSY) * cos(theta_radians) +
                           0.5);
LOGFONT lf = {0};
lf.lfHeight = -MulDiv(point_size, dpi, 72);
// Set escapement and orientation to theta in tenths of a degree.
lf.lfEscapement = lf.lfOrientation = static_cast<LONG>(theta * 10.0 + 0.5);
...

Это имеет для меня интуитивно понятный смысл, но мне интересно, действительно ли так работают средства отображения шрифтов GDI и драйверы принтеров.

1 Ответ

0 голосов
/ 07 июля 2009

1) Есть 72 точки / дюйм. (Раньше было 72.27, но было изменено.) 2) Сочетание LOGPIXELSX и LOGPIXELSY так, как вы делаете, это хорошо, но 3) Средство сопоставления шрифтов не учитывает отступ и ориентацию при сопоставлении шрифтов. Значения LOGPIXELS будут использоваться только как часть преобразования координат.

http://msdn.microsoft.com/en-us/library/ms969909(loband).aspx

Не уверен в том, как работают «драйверы принтера», поскольку в это заявление может входить множество возможных драйверов и принтеров.

Они могут растеризоваться с квадратными пикселями, а затем растянуть до неквадратных. Они могли бы преобразовать глиф кривых. Они могли бы сделать что-то еще.

...