Tuesday, August 10, 2010

Qt supported font types

embedded Qt 한글 출력 (qte 3.0.4버젼)

1. qt는 PFA/FPB BDF,TTF,qtf 폰트등을 지원합니다.

2. qpf 폰트는 qt가 이들 bdf, ttf 폰트를 로드해서 rendering 이라는 절차를 거치는 과정에서 qpf라는 폰트를 나름대로 만들어서 사용을 하는 폰트입니다. qt쪽에서 보다 더 빠르게 만들어 놓은 format입니다.

3. qpf font를 만들기 위해선 x86용 embedded qt가 있어야 합니다. X86용 일반 qt는 안됩니다.


4. 프로그램 실행 옵션 중에 -savefonts 가 있습니다. 이 옵션을 주게 되면 내부적으로 사용하는 qpf를 디스크에 save를 해줍니다.

4. fontdir 파일의 사용방법
우선 $QTDIR/src/kernel/qfontmanager_qws.cpp 파일을 보면 자세히 나와있습니다.
(version마다 이 부분의 순서와 옵션이 다르며, 저 파일이 아닌 다른파일내에 존재할수있습니다. 반드시 저 부분을 확인후에 fontdir 설정을 하시던가 아니면 qt내의 fontdir내의 다른 폰트 설정을 참고하셔야합니다)



name - 프로그램에서 사용하는 setFont() 함수의 첫번째 인자에 해당합니다.
file - file이름
renderer - BDF or TTF
italic - 이텔릭체를 표현하겠냐? y or n
weight - 글씨의 굵기
size - 글씨의 크기
flags - 3가지 값을 가질 수 있습니다.
s - smooth anti-alias를 지원하는 폰트에 해당
u - font 체계가 unicode형식을 지원할 때
a - ascii 코드


주의할 것은 flags 중 u, a 값은 -savefonts 를 할 때 중요한 영향을 끼칩니다. 즉 사용하는 폰트가 unicode 형식을 지원한다고 해도 fontdir 에 u flag 를 써주지 않으면 savefonts 할 때 기본적으로 ascii 영역의 코드 밖에 저장되지 않습니다.

반 s 옵션의 font는 4-8kbyte 정도이나 u나 au 옵션일 경우 1-2Mbyte정도 나옵니다. 파일 크기만 비교해봐도 Unicode font인지 아닌지 추측 할수있습니다.

5. ttf의 한글폰트를 qpf로 바꾸는 방법

5.1 사용자가 임의로 추가한 폰트가 userfont.ttf 라고 할 때, 이 파일을 $QTDIR/lib/fonts 디렉토리에 넣습니다. 이때 QT는 x86용 embedded QT입니다.
( version에 따라 $QTDIRlib/fonts가 없을경우 $QTDIR/etc/fonts 일수 있습니다.)

5.2 fontdir 파일을 수정합니다. 다음 줄을 추가합니다.
….
userfont userfont.ttf FT y 50(bold일경우 75) 0 u(또는 au)

5.3 $QTDIR/examples/hello 프로젝트에서 main.cpp를 내에서 setFont를 해주는 부분에서 userfont 를 사용할 수 있게 수정을 합니다. 필요한 fontsize 와 bold형태에 따라 모두 추가합니다. 몇 개라도 상관없습니다. 다넣어도 됩니다.

setFont("userfont",14,50)
QFont qf;
qf = QFont("userfont ",10,50);  
h.setFont(qf);
qf = QFont("userfont ",10,75);  
h.setFont(qf);
qf = QFont("userfont ",12,50);  
h.setFont(qf);
qf = QFont("userfont ",12,75);  
h.setFont(qf);
….


5.4 hello 프로젝트를 컴파일 합니다.
5.5 ./hello –qws –savefonts 라고 실행합니다. 이때 정상적을 폰트가 생성되면 창이 뜨는데 시간이 걸립니다. 만약 바로 실행되었을경우에는 font가 생성되지 않은겁니다.
( tip : fonts 내에 전에 만들어둔 qpf 파일이 있을경우 u, au 옵션을 바꾼다고 해서 새로 생성되지 않습니다. 반드시 새로 만들경우 기존의 폰트를 지우시기 바랍니다)

5.6 그럼 $QTDIR/lib/fonts 에 userfont_100_50.qpf 등이 폰트들이 생깁니다.

6. qtf 폰트를 사용하기

6.1 어떤 문서에는 fontdir내에 qpf 폰트를 등록하라고 되어있지만, qt3.x 부터는 qpf 폰트는 등록이 필요없이 자동으로 fonts를 검색하여 로드하게 됩니다.

6.2 qpf 폰트명이 qt 폰트 사용명이 됩니다.
userfont_100_50.qpf
QFont qf = QFont(“userfont”, 10, 50)

userfont_120_50.qpf
QFont qf = QFont(“userfont”, 12, 50)

userfont_100_75.qpf
QFont qf = QFont(“userfont”, 10, 75)

6.3 target에는 저 qpf 폰트들을 $QTDIR/lib/fonts내에 copy만 해주면 사용이 가능합니다.

7. TTF 폰트도 각 폰트 문자셋을 unicode base로 만들었는지 KSC5601 base로 만들었는지에 따라서 출력이 안될 수도 있습니다.

8. linux내에 등록되어 있는 batang.ttf gulim.ttf 는 unicode base로 만들어져 있습니다.
예를 들면, 한글 '가'는 unicode 일 경우 0xac00, KSC5601일 경우는 0xb0a1 입니다.

분명 응용프로그램을 작성할 때 vi를 이용했을 것입니다. 만약 이렇게 vi에서 한글은 KSC5601입니다. 따라서 이를 unicode 값으로 바꿔줘야 합니다. 이때 이용하는 것은 codec이 있습니다.

#include
QEucKrCodec* codec = new QEucKrCodec();
char* string="한글입니다";
QString hangul = codec->toUnicode(string, strlen(string));

이렇게 유니코드로 바꿔줍니다. hangul을 리스트 박스에 넣어보면 한글이 보일 것입니다

폰트에 관해 보다 자세한 사항은 아래 사이트를 참조하십시요
http://doc.trolltech.com/3.0/fonts-qws.html 사실 저도 아직 큐티에서 폰트를 만들어 보지를 않아서 딱히뭐라
말씀드리기 힘들어서 여기 저기 알아보니 아래와 같은 글들을 찾았습니다. 도움이 되시길 바라며, 저도 한번 해보도록 하겠습니다.^^;

http://www.korone.net/bbs/board.php?bo_table=qt_lecture&wr_id=89&page=7

http://achiven.tistory.com/1175582971
======================================================
embedded Qt 한글 출력 (qte 3.0.4버젼)

1. qt는 PFA/FPB BDF,TTF,qtf 폰트등을 지원합니다.

2. qpf 폰트는 qt가 이들 bdf, ttf 폰트를 로드해서 rendering 이라는 절차를 거치는 과정에서 qpf라는 폰트를 나름대로 만들어서 사용을 하는 폰트입니다. qt쪽에서 보다 더 빠르게 만들어 놓은 format입니다.

3. qpf font를 만들기 위해선 x86용 embedded qt가 있어야 합니다. X86용 일반 qt는 안됩니다.


4. 프로그램 실행 옵션 중에 -savefonts 가 있습니다. 이 옵션을 주게 되면 내부적으로 사용하는 qpf를 디스크에 save를 해줍니다.

4. fontdir 파일의 사용방법
우선 $QTDIR/src/kernel/qfontmanager_qws.cpp 파일을 보면 자세히 나와있습니다.
(version마다 이 부분의 순서와 옵션이 다르며, 저 파일이 아닌 다른파일내에 존재할수있습니다. 반드시 저 부분을 확인후에 fontdir 설정을 하시던가 아니면 qt내의 fontdir내의 다른 폰트 설정을 참고하셔야합니다)



name - 프로그램에서 사용하는 setFont() 함수의 첫번째 인자에 해당합니다.
file - file이름
renderer - BDF or TTF
italic - 이텔릭체를 표현하겠냐? y or n
weight - 글씨의 굵기
size - 글씨의 크기
flags - 3가지 값을 가질 수 있습니다.
s - smooth anti-alias를 지원하는 폰트에 해당
u - font 체계가 unicode형식을 지원할 때
a - ascii 코드


주의할 것은 flags 중 u, a 값은 -savefonts 를 할 때 중요한 영향을 끼칩니다. 즉 사용하는 폰트가 unicode 형식을 지원한다고 해도 fontdir 에 u flag 를 써주지 않으면 savefonts 할 때 기본적으로 ascii 영역의 코드 밖에 저장되지 않습니다.

반 s 옵션의 font는 4-8kbyte 정도이나 u나 au 옵션일 경우 1-2Mbyte정도 나옵니다. 파일 크기만 비교해봐도 Unicode font인지 아닌지 추측 할수있습니다.

5. ttf의 한글폰트를 qpf로 바꾸는 방법

5.1 사용자가 임의로 추가한 폰트가 userfont.ttf 라고 할 때, 이 파일을 $QTDIR/lib/fonts 디렉토리에 넣습니다. 이때 QT는 x86용 embedded QT입니다.
( version에 따라 $QTDIRlib/fonts가 없을경우 $QTDIR/etc/fonts 일수 있습니다.)

5.2 fontdir 파일을 수정합니다. 다음 줄을 추가합니다.
….
userfont userfont.ttf FT y 50(bold일경우 75) 0 u(또는 au)

5.3 $QTDIR/examples/hello 프로젝트에서 main.cpp를 내에서 setFont를 해주는 부분에서 userfont 를 사용할 수 있게 수정을 합니다. 필요한 fontsize 와 bold형태에 따라 모두 추가합니다. 몇 개라도 상관없습니다. 다넣어도 됩니다.

setFont("userfont",14,50)
QFont qf;
qf = QFont("userfont ",10,50);  
h.setFont(qf);
qf = QFont("userfont ",10,75);  
h.setFont(qf);
qf = QFont("userfont ",12,50);  
h.setFont(qf);
qf = QFont("userfont ",12,75);  
h.setFont(qf);
….


5.4 hello 프로젝트를 컴파일 합니다.
5.5 ./hello –qws –savefonts 라고 실행합니다. 이때 정상적을 폰트가 생성되면 창이 뜨는데 시간이 걸립니다. 만약 바로 실행되었을경우에는 font가 생성되지 않은겁니다.
( tip : fonts 내에 전에 만들어둔 qpf 파일이 있을경우 u, au 옵션을 바꾼다고 해서 새로 생성되지 않습니다. 반드시 새로 만들경우 기존의 폰트를 지우시기 바랍니다)

5.6 그럼 $QTDIR/lib/fonts 에 userfont_100_50.qpf 등이 폰트들이 생깁니다.

6. qtf 폰트를 사용하기

6.1 어떤 문서에는 fontdir내에 qpf 폰트를 등록하라고 되어있지만, qt3.x 부터는 qpf 폰트는 등록이 필요없이 자동으로 fonts를 검색하여 로드하게 됩니다.

6.2 qpf 폰트명이 qt 폰트 사용명이 됩니다.
userfont_100_50.qpf
QFont qf = QFont(“userfont”, 10, 50)

userfont_120_50.qpf
QFont qf = QFont(“userfont”, 12, 50)

userfont_100_75.qpf
QFont qf = QFont(“userfont”, 10, 75)

6.3 target에는 저 qpf 폰트들을 $QTDIR/lib/fonts내에 copy만 해주면 사용이 가능합니다.

7. TTF 폰트도 각 폰트 문자셋을 unicode base로 만들었는지 KSC5601 base로 만들었는지에 따라서 출력이 안될 수도 있습니다.

8. linux내에 등록되어 있는 batang.ttf gulim.ttf 는 unicode base로 만들어져 있습니다.
예를 들면, 한글 '가'는 unicode 일 경우 0xac00, KSC5601일 경우는 0xb0a1 입니다.

분명 응용프로그램을 작성할 때 vi를 이용했을 것입니다. 만약 이렇게 vi에서 한글은 KSC5601입니다. 따라서 이를 unicode 값으로 바꿔줘야 합니다. 이때 이용하는 것은 codec이 있습니다.

#include
QEucKrCodec* codec = new QEucKrCodec();
char* string="한글입니다";
QString hangul = codec->toUnicode(string, strlen(string));

이렇게 유니코드로 바꿔줍니다. hangul을 리스트 박스에 넣어보면 한글이 보일 것입니다

폰트에 관해 보다 자세한 사항은 아래 사이트를 참조하십시요
http://doc.trolltech.com/3.0/fonts-qws.html

1 comment:

  1. Embedded Qt qpf 한글 폰트 생성하기

    * Embedded Qt (4.5.2 기준) 의 lib/fonts 폴더 아래로 true type font 화일을 복사한 후

    아래와 같은 2줄을 lib/fonts/fontdir 내에 등록하여 준다.



    yourfontname yourfont.ttf TTF y 50 0 sua
    yourfontname yourfont.ttf TTF y 75 0 sua




    위의 2줄의 구성은 다음과 같다.

    폰트명 / 폰트화일명 / renderer / italic / weight / size / flags
    폰트명 - setFont 에서 사용할 이름
    폰트화일명 - 화일명
    renderer - TTF / BDF
    italic - y / n
    weight - 50(normal) / 75(bold)
    size - 0 for scalable or pointsize times 10 (e.g., 120 for 12pt)
    flags - s / u / a
    ● s: smooth (anti-aliased)
    ● u: unicode range when saving (default is Latin-1)
    ● a: ascii range when saving (default is Latin-1)



    * 이제 Embedded Qt 폴더에서 다음과 같은 명령을 실행하면 폰트화일이 생성된다.

    sudo ./bin/makeqpf -qws yourfontname 12 bold

    (12 크기의 bold체 qpf 폰트가 생성된다. bold 옵션을 빼면 일반 qpf 폰트가 생성된다)

    (생성된 qpf 폰트가 한글을 제대로 지원하느냐 안하느냐는 사용한 true type font 에 따라서 다르다. 이유는?...)

    ReplyDelete