Обнаружение шрифтов, оптимизированных для ClearType
Вопрос
Вопрос:
Есть ли способ проверить, является ли данный шрифт одним из шрифтов Microsoft Шрифты, оптимизированные для ClearType?
Я думаю, я мог бы просто жестко запрограммировать список названий шрифтов, поскольку это относительно короткий список, но это кажется немного уродливым.Будут ли названия шрифтов одинаковыми независимо от локали и языковых настроек Windows?
Предыстория:
Шпаклевка выглядит действительно некрасиво с выделенным жирным шрифтом текстом Consolas с поддержкой ClearType.Я решил поиграть с исходным кодом и посмотреть, смогу ли я разобраться в проблеме, и я думаю, что я отследил ее до следующего (сокращенного) кода:
font_height = cfg.font.height;
if (font_height > 0) {
font_height =
-MulDiv(font_height, GetDeviceCaps(hdc, LOGPIXELSY), 72);
}
}
font_width = 0;
#define f(i,c,w,u) \
fonts[i] = CreateFont (font_height, font_width, 0, 0, w, FALSE, u, FALSE, \
c, OUT_DEFAULT_PRECIS, \
CLIP_DEFAULT_PRECIS, FONT_QUALITY(cfg.font_quality), \
FIXED_PITCH | FF_DONTCARE, cfg.font.name)
f(FONT_NORMAL, cfg.font.charset, fw_dontcare, FALSE);
SelectObject(hdc, fonts[FONT_NORMAL]);
GetTextMetrics(hdc, &tm);
font_height = tm.tmHeight;
font_width = tm.tmAveCharWidth;
f(FONT_BOLD, cfg.font.charset, fw_bold, FALSE);
Цель состоит в том, чтобы выбрать жирный шрифт, который соответствует тем же размерам, что и обычный шрифт.Я предполагаю, что текст Consolas в PuTTY выглядит уродливо, потому что, поскольку Consolas настолько сильно оптимизирован для размещения в определенных границах пикселей, попытка втиснуть его в произвольные размеры приводит к плохим результатам.
Таким образом, кажется, что подходящим исправлением было бы обнаружить шрифты, оптимизированные для ClearType, и попытаться создать жирные версии этих шрифтов, используя ту же ширину и высоту, что и первоначальный вызов CreateFont.
Решение
Я не уверен, что я точно понимаю, что подразумевается под "отследил это до следующего (сокращенного) кода", но, конечно же, Consolas bold плохо смотрится в Putty.Вот исходный код putty для windows /window.c (редакция 8914 получена с помощью subversion "svn co svn://svn.tartarus.org/sgt/putty", 5 апреля 2010).
1386 fonts[i] = CreateFont (font_height, font_width, 0, 0, w, FALSE, u, FALSE, \ 1387 c, OUT_DEFAULT_PRECIS, \ 1388 CLIP_DEFAULT_PRECIS, FONT_QUALITY(cfg.font_quality), \ 1389 FIXED_PITCH | FF_DONTCARE, cfg.font.name) 1390 1391 f(FONT_NORMAL, cfg.font.charset, fw_dontcare, FALSE); 1392 1393 SelectObject(hdc, fonts[FONT_NORMAL]); 1394 GetTextMetrics(hdc, &tm); 1395 1396 GetObject(fonts[FONT_NORMAL], sizeof(LOGFONT), &lfont); 1397 1398 if (pick_width == 0 || pick_height == 0) { 1399 font_height = tm.tmHeight; 1400 font_width = tm.tmAveCharWidth; 1401 } ... 1477 if (bold_mode == BOLD_FONT) { 1478 f(FONT_BOLD, cfg.font.charset, fw_bold, FALSE); 1479 }
Для консолей 10 pt значения font_height и font_width были -13 и 0, когда CreateFont был вызван для FONT_NORMAL (через макрос f), но 15 и 7, когда он был вызван для FONT_BOLD (значения изменены в строках 1399,1400).Явная установка значения width не очень хорошо согласуется со шрифтом Consolas bold.Если window.c изменить так, чтобы строки 1477-1479 были перенесены после строки 1391, получится гораздо более приятный жирный шрифт Consolas (я также попробовал все другие доступные шрифты (Courier, Bitstream, Lucida и т.д.), И на них это отрицательно не повлияло.Я отправил это предложение команде Putty.Вот рисунок, показывающий разницу:
ДОБАВЛЕНО 16 ЯНВАРЯ 2011 ГОДА:"Ошибка" все еще присутствует, и исправление все еще работает.Теперь номера строк в window.c означают, что строки 1510-1512 следует переместить так, чтобы они шли после строки 1417.Kristjan.
ДОБАВЛЕНО В январе.13, 2012:Ошибка все еще присутствует в версии 0.62 putty (выпущена 7 декабря).10, 2011).Номера линий, которые нужно переместить, теперь 1532-1534, которые придут после 1439.Для полноты картины вот шаги, которые я выполнил в cygwin:
$ svn co svn://svn.tartarus.org/sgt/putty2
$ cd putty
$ perl mkfiles.pl
$ cd windows
$ --- edit window.c and move the 3 lines---
$ make CC=gcc-3 -f Makefile.cyg
$ --- move resulting executable files (including putty.exe) to a suitable folder
$ --- add shortcuts to the executables to Windows start menu
Kristjan
Другие советы
Не уверен, что это ответ для вас, но если убедиться, что ширина шрифта равна точной целочисленной ширине пикселя, шрифты TrueType фиксированной ширины будут хорошо смотреться в ClearType.
Чтобы достичь этого, вам нужно будет "округлить" высоту вашего шрифта методом проб и ошибок.