Как указать высоту шрифта в разных ориентациях?

StackOverflow https://stackoverflow.com/questions/929801

Вопрос

Обычный способ создания шрифта с помощью 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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top