Обнаружение ClearType-оптимизированных шрифтов - PullRequest
1 голос
/ 26 марта 2010

Вопрос:

Есть ли способ проверить, является ли данный шрифт одним из оптимизированных для ClearType шрифтов Microsoft ?

Полагаю, я мог бы просто жестко закодировать список имен шрифтов, так как это относительно короткий список, но это выглядит немного уродливо. Будут ли имена шрифтов одинаковыми независимо от локали и языковых настроек Windows?

Справка:

PuTTY выглядит действительно безобразно с жирным шрифтом, текстом ClearSype с поддержкой Consolas. Я решил поэкспериментировать с исходным кодом и посмотреть, смогу ли я выяснить проблему, и я думаю, что отследил ее до следующего (сокращенного) кода:

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.

Ответы [ 2 ]

4 голосов
/ 06 апреля 2010

Я не уверен, что я точно понимаю, что подразумевается под «отследить его до следующего (сокращенного) кода»), но достаточно уверенно, смелый Consolas выглядит плохо в 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). Установка значения ширины явно не очень хорошо согласуется с жирным шрифтом Consolas. Если window.c изменен так, чтобы строки 1477-1479 перемещались так, чтобы они шли после строки 1391, получается гораздо более приятный жирный шрифт Consolas (я также пробовал все другие доступные шрифты (Courier, Bitstream, Lucida и т. Д.), И они не были неблагоприятными Я отправил это предложение в команду Putty. Вот рисунок, показывающий разницу: Bold-consolas-example

ДОБАВЛЕНО 16 ЯНВАРЯ 2011 ГОДА: «Ошибка» все еще присутствует, и исправление все еще работает. Теперь номера строк в window.c означают, что строки 1510-1512 следует переместить, чтобы они шли после строки 1417. Кристьян.

ДОБАВЛЕНО В ЯНВАРЬ. 13, 2012: ошибка все еще в версии 0.62 замазки (выпущена 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

Кристьян

0 голосов
/ 06 апреля 2010

Не уверен, что это ответ для вас, но если убедиться, что ширина шрифта равна точной ширине целого пикселя, шрифты TrueType с фиксированной шириной будут хорошо выглядеть при ClearType.

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

...