Pergunta

Pergunta:

Existe uma maneira de verificar se uma determinada fonte é uma das das Microsoft Fontes otimizadas para o ClearType?

Acho que poderia simplesmente codificar a lista de nomes de fontes, pois é uma lista relativamente curta, mas isso parece um pouco feio. Os nomes das fontes seriam os mesmos, independentemente das configurações de localidade e idioma do Windows?

Fundo:

Putty Parece realmente feio com texto em negrito, habilitado para ClearType. Decidi brincar com a fonte e ver se conseguia descobrir o problema, e acho que o rastreei com o seguinte (abreviado) código:

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);

A intenção é escolher uma fonte em negrito que se encaixe nas mesmas dimensões que a fonte normal. Suponho que o texto do Consolas de Putty pareça feio porque, uma vez que o Consolas é muito otimizado para ser estabelecido em limites específicos de pixels, tentando calçar -o a dimensões arbitrárias produzem maus resultados.

Portanto, parece que uma correção apropriada seria detectar fontes otimizadas para o ClearType e tentar criar as versões em negrito dessas fontes usando a mesma largura e altura que a chamada inicial do createfont.

Foi útil?

Solução

Não tenho certeza de que sigo o que se entende por "rastrear -o até o seguinte (abreviado) código", mas com certeza o consolas o suficiente parece ruim em massa. Aqui está a origem do Putty de Windows/Window.c (revisão 8914 obtida com subversão "svn co svn: //svn.tartarus.org/sgt/putty", em 5 de abril de 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      }

Para 10 pt consolas, os valores de font_height e font_width foram -13 e 0 quando o createfont foi chamado para font_normal (via macro f), mas 15 e 7 quando foi chamado para font_bold (os valores são alterados nas linhas 1399.1400) . Definir o valor da largura explicitamente não concorda bem com a fonte Bold Consolas. Se o window.c for modificado para que as linhas 1477-1479 sejam movidas para vir depois da linha 1391 uma fonte consolas muito mais agradável (eu também tentei todas as outras fontes disponíveis (Courier, BitStream, Lucida etc.) e eles não eram adversamente afetado. Enviei essa sugestão à equipe de vidrões. Aqui está uma figura mostrando a diferença:Bold-consolas-example

Adicionado em 16 de janeiro de 2011: o "bug" ainda está presente e a correção ainda funciona. Agora, os números de linha da janela.C são que as linhas 1510-1512 devem ser movidas para vir após a linha 1417. Kristjan.

Adicionado em janeiro. 13, 2012: O bug ainda está na versão 0.62 do Putty (lançado em 10 de dezembro de 2011). Os utensílios de linha de linho para se mover são agora 1532-1534 para vir depois de 1439. Para completar, aqui estão as etapas que realizei em 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

Outras dicas

Não tenho certeza se isso é uma resposta para você, mas garantir que a largura da fonte seja uma largura exata de pixels inteiros, fará com que as fontes de trueType fixo pareçam boas no ClearType.

Para conseguir isso, você precisará 'arredondar' a altura da fonte com alguma tentativa e erro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top