[GPG 1 글 6.1] 부록 6.1 텍스트 라이브러리의 한글 지원 문제

GPG 시리즈 관련 질답, 논의 공간.

Moderator: 류광

eoh
Posts: 135
Joined: 2001-07-20 09:00
Location: REAL:DREAM
Contact:

Post by eoh »

이 글은 예전 GPG 스터디 포럼에 gryu 님이 올리신 주제와 그에 대한 답글들입니다. 원본(Ezboard)은 "<a href="http://pub32.ezboard.com/fgpgstudyfrm6. ... ID=6.topic" target="_blank">부록 6.1 텍스트 라이브러리의 한글 지원 문제</a>"입니다.
<div class="imported">
<div class="sep"><span class="cfs">제목: 부록 6.1 텍스트 라이브러리의 한글 지원 문제
</span></div>
<div class="r">글쓴이: gryu , 글쓴때: 1/10/01 5:29:31 pm</div>

Jini3D님이 부록의 라이브러리들에 대해 질문을 했었습니다.. 그 중 텍스트 라이브러리의 한글 지원 부분을 따로 떼서 의견을 나누었으면 합니다. 꼭 해결했으면 하구요...

도스 시절부터 게임을 만들었던 분이라면 별로 어렵지 않을 것 같은데요..

손봐야 할 곳은 우선 글자 하나의 크기... 현재는 8x8인데, 한글을 표시하려면 그보다는 커야겠죠.. Text.cpp의 다음 부분을 손을 봐야 할 것이구요..

#define FONT_W 8 //글꼴 하나의 너비
#define FONT_H 8 // 글꼴 하나의 높이
#define FONT_DRAW_W 8 // 글자 하나가 차지할 공간의 너비
#define FONT_DRAW_H 9 // ... 높이
#define FONT_TEX_W 64 // 텍스쳐 너비
#define FONT_TEX_H 128 // 텍스쳐 높이

글꼴 데이터는 Text.cpp 끝 부분에
<pre>
unsigned char fontData[64 * 128 * 2] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
....
</pre>
이런 식으로 되어 있는데, 한 점이 한 바이트입니다. 투명한 점은 0x00, 찍히는 점은 0xFF이구요. 8x8 글자 하나는 결국 64바이트....
구현을 간단하게 하기 위해서 조합형+두벌식+빨래줄 방식을 사용한다면 자음 글꼴과 모음 글꼴 두벌이 필요하구요. 계산이 안되네.. 어쨌든 자음 하나, 모음 하나는 굳이 16x16이 될 필요가 없을 거구요... 8x8로 통일한다면 옛날 애플 3327 한글 처럼 되겠네요..(기억하시는 분 있으려나..)

크게 손볼 부분은 TextBox 클래스의 DrawStr 메서드입니다..

<pre>
void TextBox::DrawStr(int x, int y, int maxFlag, int maxY,
char* string) {
int cursorX;
int cursorY;
char* cP = string;
int index;
int s, t;

cursorX = x;
cursorY = y;

glColor4ub(color.r, color.g, color.b, color.a);
glBegin(GL_QUADS);

// Parse the String
while (*cP != '') {
// Visible characters
if ( ' ' == *cP && !(mode & TEXT_DRAW_SPACES)) {
cursorX += FONT_DRAW_W;
}
</pre>
여기서부터 핵심인데... 우선 다음 else if는 ' '(빈칸)과 '~' 사이의 문자만 처리하기 위한 것인데, 이걸 아예 없애거나 한글 코드에 맞게 수정해야 할 것입니다..
<pre>
//********* (1) **************
else if ( ' ' <= *cP && *cP <= '~' )
// **********(1) *************
</pre>
그 다음으로는 실제로 글꼴을 찍는 부분입니다.

현재 글자의 코드에서 빈칸의 코드)를 빼서 현재 글자가 몇 번째 글자인지 알아내고, 그걸 이용해서 그 글자에 해당하는 픽셀들이 있는 좌표를 얻고(s, t 부분), 그 s, t 좌표를 이용해서 작은 사각형에 텍스쳐 픽셀들을 입히는 겁니다. 즉 하나의 글자가 하나의 사각형(GL_SQUAD)가 되는 거죠...

<pre>
{
// ******** (2) ***************
index = *cP - ' ';
s = ( index % 8 ) * FONT_W;
t = ( index / 8 ) * FONT_H;
glTexCoord2f((float)(s )/FONT_TEX_W,
(float)(t )/FONT_TEX_H);
glVertex3s(cursorX , cursorY , 0);
glTexCoord2f((float)(s )/FONT_TEX_W,
(float)(t+FONT_H + 1)/FONT_TEX_H);
glVertex3s(cursorX , cursorY+FONT_DRAW_H, 0);
glTexCoord2f((float)(s+FONT_W)/FONT_TEX_W,
(float)(t+FONT_H + 1)/FONT_TEX_H);
glVertex3s(cursorX+FONT_DRAW_W,
cursorY+FONT_DRAW_H, 0);
glTexCoord2f((float)(s+FONT_W)/FONT_TEX_W,
(float)(t )/FONT_TEX_H);
glVertex3s(cursorX+FONT_DRAW_W, cursorY , 0);
cursorX += FONT_DRAW_W;
}
if ( *cP == 'n' ) {
cursorX = x;
cursorY += FONT_DRAW_H;
if (maxFlag && cursorY + FONT_DRAW_H > maxY)
break;
}
cP++;
}

glEnd( );
}
</pre>

이 부분을 크게 뜯어 고쳐야 하겠죠.. 일단 현재 글자(char 하나)가 초성인지, 종성인지, 중성인지를 알아내야 하고, 그 자모에 해당하는 픽셀들이 있는 s, t를 얻고, 초/종/중에 따라서 사각형의 위치를 다르게 하는 등등... 그렇다면 한글 하나를 찍기 위해서는 사각형을 세 개 만들어야 한다는 결론이 나오겠네요...

저의 한계는 여기까지...

도스 시절부터 게임을 만들었던 분이라면 별로 어렵지 않을 것 같은데요... 관심 있으신 분들 적극적으로 도전해 주시길...

**추가: 현재 글자가 초, 중, 종성인지 알아낸다고 하기 보다는 2 바이트를 초중종으로 분리시킨다고 하는 것이 정확하겠네요..

<p><center>
/*************************
as simple as possible,
but not simpler
*************************/
</center>

<br></p>
<div class="sep"><span class="cfs">제목: Re: 부록 6.1 텍스트 라이브러리의 한글 지원 문제
</span></div>
<div class="r">글쓴이: ahastudio , 글쓴때: 1/11/01 4:01:56 am</div>

오옷.. 애플 3327 한글... T_T
어렸을 때 많이 봤던.. 전설적인.. 쿨럭..
그런데.. 그것도 좋을 듯 하네요.
굳이 퀄리티 문제를 보지 않는다면 정형화된 틀에서도 굳이 16x16을 쓸 필요는 없을 듯 하네요.
예전에 320x200에서 어떻게 하면 글자가 640x480처럼 보이게 할까..를 많이 연구했었고..
가장 표준안에 가까웠던 게 12x12...
그보다 작은 걸로는 320x400용이었던 8x16를 비롯해서 ( 당시 도트 노가다 및 폰트 제작 등을 했던 제 동생의 말에 따르면 한글은 가로로 줄이는 건 별 문제가 안돼는데 세로로 줄이는게 힘들다는군요. 그 원칙에 따른 폰트가 바로 이것.. -_-; ) 궁극의 8x10짜리도 나왔었죠. -_-; ( 보고서 경악을.. )
물론 성익님이 진짜로 8x8짜리 한글 폰트도 만들었었는데..
( 그 폰트가 그 당시 하이텔 게제동의 시애틀 프로젝트에 쓰였죠. 개인적인 생각으로 괜찮은 프로젝트였는데.. )
음... 역시 폴리건을 여러번에 걸쳐서 그린다면 속도를 제외하고 아무 문제가 안되겠져.. -_-;
( 대체 이 글의 목적은 무엇이냐.. T_T )


개인적 발언 - 발췌/근거/인용/기사화 될 수 없음.
<p></p>
<div class="sep"><span class="cfs">제목: Re: 부록 6.1 텍스트 라이브러리의 한글 지원 문제
</span></div>
<div class="r">글쓴이: gryu , 글쓴때: 2/26/01 10:32:22 pm</div>

-- 이 주제에 대해 다시 한 번 관심을 부탁드립니다. --
(죽은 주제 되살리기 프로젝트)

<p><center>
/*************************
as simple as possible,
but not simpler
*************************/
</center>

<br></p></div>