Вопрос

Вопрос:

Есть ли способ проверить, является ли данный шрифт одним из шрифтов 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.Вот рисунок, показывающий разницу:Bold-consolas-example

ДОБАВЛЕНО 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.

Чтобы достичь этого, вам нужно будет "округлить" высоту вашего шрифта методом проб и ошибок.

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