Как указать высоту шрифта в разных ориентациях?
-
06-09-2019 - |
Вопрос
Обычный способ создания шрифта с помощью 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) Есть 72 точки/дюйм.(Раньше это было 72,27, но было изменено.) 2) Объединение LogPixelsx и LogPixelsy так, как вы делаете, это хорошо, но 3) Маппер шрифта не смотрит на выпуск и ориентацию при картировании шрифтов.Значения LOGPIXELS будут использоваться только как часть преобразования координат.
http://msdn.microsoft.com/en-us/library/ms969909(loband).aspx
Не уверен, как работают «драйверы принтеров», поскольку оператор может включать множество возможных драйверов и принтеров.
Они могли растеризовать квадратные пиксели, а затем растянуть их до неквадратных пикселей.Они могли трансформировать кривые глифов.Они могли бы сделать что-то еще.