본문 바로가기

장난감들

PuTTY 한글/영문 글꼴 분리하기

오늘도 삽질 하나. 날씨도 너무 덥고 텍스트큐브 코딩도 안 되고(?) 해서 PuTTY를 뜯었다.;; 그동안 오랜 숙원사업(?)이었던 한글/영문 글꼴의 완전한 분리에 성공했다.

PuTTY 소스코드가 생각보다 난잡(...)해서 찾는 데 좀 시간이 걸렸지만 더위는 이열치열(?)이라는 생각으로 삽질을 해주니 마침내 어디를 고쳐야 하는지 찾을 수 있었다.

방법은 간단히 다음과 같이 window.c를 패치해주고 컴파일하면 끝.;; 보다시피 급조한 거라 글꼴 설정은 소스코드에 하드코딩되어 있다; 기준 소스는 0.60 최신 버전. 아참, 생성만 하고 소멸시키지 않는 것처럼 보이나 다른 부분에 보면 FONT_MAXNO까지 배열을 순회하며 DeleteObject를 호출해주는 부분이 있으므로 걱정 안 해도 된다.

//...
#define FONT_OEMBOLDUND 0x23
#define FONT_NONLATIN 0x30
#define FONT_MAXNO 	0x30 //0x2F

//...

static void init_fonts(int pick_width, int pick_height)
{
//...
    f(FONT_NORMAL, cfg.font.charset, fw_dontcare, FALSE);
    fonts[FONT_NONLATIN] = CreateFont (font_height, font_width, 0, 0, fw_dontcare, FALSE, FALSE, FALSE, \
        cfg.font.charset, OUT_DEFAULT_PRECIS, \
        CLIP_DEFAULT_PRECIS, FONT_QUALITY(cfg.font_quality), \
        FIXED_PITCH | FF_DONTCARE, "Dotum");

    SelectObject(hdc, fonts[FONT_NORMAL]);
    GetTextMetrics(hdc, &tm);
//...
}

void do_text_internal(Context ctx, int x, int y, wchar_t *text, int len,
              unsigned long attr, int lattr)
{
//...
    } else {
    /* And 'normal' unicode characters */
    static WCHAR *wbuf = NULL;
    static int wlen = 0;
    int i;

    if (wlen < len) {
        sfree(wbuf);
        wlen = len;
        wbuf = snewn(wlen, WCHAR);
    }

    for (i = 0; i < len; i++)
        wbuf[i] = text[i];

    /* EXTRA PATCH for non-latin font replacing... */
    SelectObject(hdc, fonts[FONT_NONLATIN]);
    text_adjust = 1;

    /* print Glyphs as they are, without Windows' Shaping*/
    general_textout(hdc, x, y - font_height * (lattr == LATTR_BOT) + text_adjust,
                &line_box, wbuf, len, IpDx, !(attr & TATTR_COMBINING));
//...
}

유니코드 렌더링 부분을 바꾼 것이기 때문에 CP949나 윈도98과 같은 환경에서는 어떻게 나오는지 모르겠지만 일단 나는 유니코드 터미널만 쓰고 있으므로 패스; =3

내가 VS2005로 컴파일한 바이너리는 KLDP를 참조하기 바란다.

추가: 앞으로 원활한 개발을 위해 공개 subversion 저장소를 생성하였다. ViewVC를 통해 살펴보려면 이 링크를 참조하기 바란다. SVN 프로토콜로 접근하려면 경로에서 view를 빼면 된다.