Detectando fontes otimizadas para ClearType
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.
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:
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.