2010-03-26 6 views
1

질문 :감지 클리어 타입에 최적화 된 글꼴

가 주어진 글꼴 마이크로 소프트의 ClearType-optimized fonts 중 하나인지 확인하는 방법이 있나요?

상대적으로 짧은 목록이기 때문에 글꼴 이름 목록을 간단히 하드 코딩 할 수 있습니다.하지만보기에는 약간 엉망입니다. Windows의 로켈 및 언어 설정에 관계없이 글꼴 이름이 동일합니까?

배경 :

PuTTY 굵게, ClearType을 지원, 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 텍스트가보기 흉하게 보일 것이라고 생각합니다. 임의의 크기로 구h 주려고하면 나쁜 결과가 나옵니다.

그래서 ClearType 최적화 된 글꼴을 감지하고 초기 CreateFont 호출과 동일한 너비와 높이를 사용하여 해당 글꼴의 굵게 버전을 만드는 것이 적절한 해결책 인 것 같습니다.

답변

4

나는 "다음 코드 (간략한 코드)로 추적했다"라는 것이 무엇인지 잘 모르겠지만 Consolas 대담한 것은 Putty에서 나쁘다. 다음은 windows/window.c의 퍼티 소스입니다 (개정 8914는 2010 년 4 월 5 일에 "svn co svn : //svn.tartarus.org/sgt/putty"라는 Subversion으로 획득). 이 값은 (FONT_BOLD 촉구 때

 

     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  } 

태평양 표준시 01시 Consolas 들어 font_height 및 font_width의 값은 -13과의 createFont가 (매크로 (F)를 통해) FONT_NORMAL 촉구은 0이지만 15 7이었다 1399,1400 행에서 변경됨). 너비를 명시 적으로 설정하는 것은 Consolas 굵은 글꼴과 잘 일치하지 않습니다. line.cpl이 수정되어 line1477-1479가 1391 줄 뒤에 오도록 훨씬 더 굵은 Consolas 글꼴을 얻을 수 있습니다. (다른 Courier, Bitstream, Lucida 등의 다른 글꼴도 사용했습니다. . 영향을받는 나는 퍼티 팀이 제안을 전송 한 다음 그 차이를 나타내는 도면이다. Bold-consolas-example

ADDED 2011년 1월 16일에서 : "버그는"여전히 존재하고, 수정은 여전히 ​​이제 라인을 사용할 수 있습니다. window.c의 숫자는 1510-1512 행이 1417 행 뒤에 오도록 이동해야한다는 것입니다. Kristjan.

2012 년 1 월 13 일에 추가됨 : 버그는 여전히 퍼티 버전 0.62에 있습니다 (12 월 10 일에 릴리스 됨). , 2011). 움직일 수있는 수는 1439 년 이후에 1532-1534가되었습니다. 완성을 위해 여기

$ 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을 전달하는 것입니다. (밑줄 친 글꼴도 엉망이 될 수 있습니다, 나는 당신의 픽스가 그것들을 처리하지 못할 것이라고 생각합니다.) –

+0

이 힌트를 가져 주셔서 감사합니다. 또한이 코드 영역까지 문제를 추적하고 끝에 CreateFont를 비난했습니다. 이제 글꼴 너비가 0 (1421 줄)으로 전달되도록 코드를 변경 했으므로 예상 한만큼 좋은 것으로 보입니다. 자동으로 추가 및 좁은/와이드 글꼴 (비록 본적이없는) 처리하기 위해 1596 줄 전에 font_width 같으면 x x 0으로 재설정합니다. 유사한 고정 너비 글꼴을 사용하여 오류를 찾을 수 없습니다. – ygoe

0

이 당신에 대한 대답은 확실하지만, 글꼴의 폭이 정확한 정수 픽셀 폭을 확인하고 아니, 할 것 고정 폭 : 내가 Cygwin에서 수행하는 단계입니다 트루 타입 글꼴은 ClearType에서 잘 보입니다.

이 작업을 수행하려면 시행 착오와 함께 글꼴 높이를 '반올림'해야합니다.

+0

필자가 테스트 한 바에 따르면 폰트 폭을 전혀 지정하지 않고 Windows가 높이에 적합한 폰트 폭을 선택하게하는 것이 가장 좋습니다. –

+0

나는 그것을 시도했지만 1 픽셀 간격으로 문제가 있음을 알 수 있습니다. – leppie