2010-03-26 22 views
1

問:檢測的ClearType優化的字體

有沒有一種方法來檢查,如果給定的字體是微軟ClearType-optimized fonts之一?

我想我可以簡單地硬編碼字體名稱列表,因爲它是一個相對較短的列表,但這似乎有點難看。無論Windows的語言環境和語言設置如何,字體名稱是否都是相同的?

背景:

PuTTY看起來大膽,啓用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); 

這樣做的目的是選擇一個粗體適合與普通字體相同的尺寸。我假設PuTTY的索拉文字看起來醜陋,因爲自從索拉如此高度優化的特定的像素邊界進行奠定了,試圖把它變成鞋拔子任意尺寸產生不好的結果。

因此,似乎適當的修復方法是檢測ClearType優化的字體,並嘗試使用與初始CreateFont調用相同的寬度和高度創建這些字體的粗體版本。

回答

4

我不確定我遵循的是什麼意思是「追蹤到下面的(縮寫)代碼」,但確實夠不夠Consolas在膩子中看起來不好。下面是窗戶/ window.c的油灰源(與顛覆「SVN共同的svn://svn.tartarus.org/sgt/putty」獲得的修訂8914 2010年4月,5)。

 

     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個索拉,font_height和font_width的值分別爲-13和0時的CreateFont被稱爲用於FONT_NORMAL(經由宏F),但15和圖7,當它被要求FONT_BOLD(該值是改爲1399,1400行)。顯式設置寬度的值不符合Consolas粗體字體。如果window.c被修改,使得線1477-1479移動來線1391後得到一個好得多的大膽索拉字體(我也嘗試過其他所有可用的字體(快遞,檔案,龍力等),他們也沒有不利。影響我已將這個建議,膩子團隊下面是該差異圖: Bold-consolas-example

添加於2011年1月16日:「蟲」依然存在,而修復仍然有效現在行了。在window.c中的數字是行1510-1512應該移動到行1417之後。Kristjan。

2012年1月13日添加:錯誤仍然在版本0.62的膩子(發佈12月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

「(縮寫)」代碼是windows \ window.c的簡化版本。你的分析與我的分析基本相同。我爲本地副本PuTTY所做的解決方法是,如果字體名稱爲Consolas,則爲字體寬度傳遞0。 (加下劃線的字體也可能會搞砸;我認爲你的修補程序將無法處理這些問題。) – 2010-04-07 02:05:39

+0

謝謝你的提示。我也把這個問題跟蹤到了這個代碼區域,最後指責了CreateFont。現在我已經更改了代碼,以便字體寬度作爲0傳遞(第1421行),並且看起來和預期的一樣好。要主動處理額外的和窄/寬的字體(雖然從未見過),如果它在行1596之前等於font_width,則將x重置爲0.無法找到類似大小的其他固定寬度字體的任何錯誤。 – ygoe 2011-05-18 14:01:05

0

不知道這是給你一個答案,但要確保字體的寬度是一個準確的整數像素寬度,將固定寬度在ClearType下,TrueType字體看起來不錯。

要做到這一點,您需要通過一些試驗和錯誤來「圓化」字體高度。

+0

從我的測試中,最好不要指定字體寬度,而是讓Windows選擇適合高度的字體寬度。 – 2010-04-25 17:06:04

+0

我確實嘗試過,但您會注意到一些像素間距問題。 – leppie 2010-04-26 06:04:51