4.¿Ü°û¼± ÃßÃâ

°¡.FT_Outline

¿Ü°û¼± ÆùÆ®ÀÇ ±Û¸®ÇÁ¸¦ ·ÎµåÇÏ¸é ±ÛÀÚÀÇ ¸ð¾çÀ» Á¤ÀÇÇÏ´Â ¿Ü°û¼±ÀÌ ·ÎµåµÈ´Ù. ±×·¯³ª ¿Ü°û¼± Á¤º¸´Â ÁÂÇ¥¸¸À¸·Î ±¸¼ºµÇ¾î Àֱ⠶§¹®¿¡ ¿Ü°û¼±À» ±×¸®´Â ÇÔ¼ö¸¦ È£ÃâÇؾ߸¸ Ãâ·ÂÇÒ ¼ö ÀÖ´Ù. ¿Ü°û¼± ¼ö½ÄÀÌ ¿ö³« º¹ÀâÇϱ⠶§¹®¿¡ ÀÌ ¼Óµµ´Â »ó´çÈ÷ ´À¸° ÆíÀÌ´Ù. ±×·¡¼­ ¿Ü°û¼±À» ¹Ù·Î È­¸éÀ¸·Î Ãâ·ÂÇÏÁö ¾Ê°í ºñÆ®¸ÊÀ¸·Î º¯È¯ÇÏ´Â °úÁ¤À» °ÅÄ¡´Âµ¥ ÀÌ °úÁ¤À» ·¡½ºÅͶóÀÌ¡(Rasterizing)À̶ó°í ÇÑ´Ù. ¿Ü°û¼±Àº º¤ÅÍÀÌÁö¸¸ ±Û²ÃÀ» Ãâ·ÂÇÒ ¸ð´ÏÅͳª ÇÁ¸°ÅÍ´Â ·¡½ºÅÍ ÀåºñÀ̹ǷΠºñÆ®¸ÊÀ¸·Î º¯È¯Çؾ߸¸ ºü¸£°Ô Ãâ·ÂÇÒ ¼ö ÀÖ´Ù.

FreeType ¶óÀ̺귯¸®´Â ¿Ü°û¼±À» ºñÆ®¸ÊÀ¸·Î ·¡½ºÅͶóÀÌ¡ÇÏ´Â ·£´õ¸µ ÇÔ¼ö¸¦ Á¦°øÇϹǷΠÇÔ¼ö¸¸ È£ÃâÇÏ¸é ºñÆ®¸ÊÀ» ½±°Ô ¾òÀ» ¼ö ÀÖ´Ù. ´Ü¼øÇÑ Ãâ·Â¸¸À» ¸ñÀûÀ¸·Î ÇÑ´Ù¸é ·£´õ¸µÀ¸·Î »ý¼ºµÈ ºñÆ®¸ÊÀ» »ç¿ëÇÏ¸é µÇÁö¸¸ ÆùÆ®¸¦ Á» ´õ ÀÚÀ¯·Ó°Ô ´Ù·ç¾î º¸°í ½Í´Ù¸é ¿Ü°û¼± Á¤º¸¸¦ Á÷Á¢ Á¶ÀÛÇØ¾ß ÇÑ´Ù. ¿Ü°û¼± Á¤º¸´Â ±Û¸®ÇÁ ½½·ÔÀÇ outline ¸â¹ö¿¡ ÀúÀåµÇ´Âµ¥ ÀÌ ¸â¹ö´Â FT_Outline ±¸Á¶Ã¼ ŸÀÔÀÌ´Ù.

 

¸â¹ö

¼³¸í

n_contours

Æó°î¼±ÀÇ °³¼öÀÌ´Ù. ±Û¸®ÇÁ Çϳª´Â ¿©·¯ °³ÀÇ Æó°î¼±À¸·Î ±¸¼ºµÈ´Ù.

n_points

Àüü Á¡ÀÇ °³¼öÀÌ´Ù.

points

¿Ü°û¼±À» ±¸¼ºÇÏ´Â Á¡ÀÇ ¹è¿­ÀÌ´Ù. FT_Vector ŸÀÔÀ̸ç x, y ¸â¹ö¸¦ °¡Áø´Ù.

tags

°¢ Á¡ÀÇ Æ¯¼ºÀ» Á¤ÀÇÇÏ´Â ¹è¿­ÀÌ´Ù.

contours

Æó°î¼±ÀÇ ½ÃÀÛ°ú ³¡¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Áø´Ù.

flags

¿Ü°û¼± ÀÚüÀÇ Æ¯¼º°ªÀÌ´Ù.

 

¿Ü°û¼±Àº ¿©·¯ °³ÀÇ Æó°î¼±(Contour)À¸·Î ±¸¼ºµÇ¸ç Æó°î¼±Àº Á÷¼±°ú °î¼±À¸·Î ±¸¼ºµÈ´Ù. ±Û¸®ÇÁ¸¦ ±¸¼ºÇÏ´Â Æó°î¼±ÀÇ °³¼ö´Â ±Û¸®ÇÁ¸¶´Ù ´Ù¸£´Ù. "S" °°Àº ¾ËÆĺªÀº Çѹø¿¡ ±×¸± ¼ö ÀÖÀ¸¹Ç·Î Æó°î¼± Çϳª·Î Ç¥ÇöÇÒ ¼ö Àִµ¥ ºñÇØ ":" °°Àº ±âÈ£´Â ¶³¾îÁø µÎ °³ÀÇ Á¡À¸·Î µÇ¾î ÀÖÀ¸¹Ç·Î Æó°î¼±µµ µÎ °³°¡ ÇÊ¿äÇÏ´Ù. "ÇÑ" °°Àº º¹ÀâÇÑ ±ÛÀÚ´Â Æó°î¼±Àº ´Ù¼¸°³ÀÌÁö¸¸ "¤·"ÀÇ ¾ÈÂÊ, ¹Ù±ùÂÊ ¿øÀÌ º°°³ÀÇ µµÇüÀ̶ó ÃÑ 6°³ÀÇ Æó°î¼±À¸·Î ±¸¼ºµÈ´Ù. ±Û¸®ÇÁÀÇ Æó°î¼± °³¼ö´Â Á¾ÀÌ¿¡ ±ÛÀÚ¸¦ ¾µ ¶§ ÆæÀ» ¶¼¾î¾ß Çϴ ȸ¼ö + 1¿Í °ÅÀÇ ÀÏÄ¡ÇÑ´Ù.

¿Ü°û¼±À» ±¸¼ºÇÏ´Â Á¡µéÀº ¸ðµÎ points ¹è¿­¿¡ ÀúÀåµÇ¾î Àִµ¥ ÀÌ ¹è¿­ ÀÚü¿¡´Â Æó°î¼±ÀÇ °æ°è ±¸ºÐÀÌ ¾ø´Ù. ´Ü¼øÈ÷ ÁÂÇ¥ÀÇ ÁýÇÕÀÏ »ÓÀÌ¸ç ¾îµð¼­ºÎÅÍ ¾îµð±îÁö°¡ ù¹ø° Æó°î¼±ÀÇ ÁÂÇ¥ÀÎÁö´Â ±â·ÏµÇ¾î ÀÖÁö ¾Ê´Ù. ´ë½Å contours ¹è¿­¿¡ °¢ Æó°î¼±ÀÇ ³¡ ÷ÀÚ°¡ ±â·ÏµÇ¾î ÀÖ´Ù. ¿¹¸¦ µé¾î ¼¼ °³ÀÇ Æó°î¼±ÀÌ ÀúÀåµÇ¾î ÀÖ´Ù¸é contours ¹è¿­¿¡´Â °¢ Æó°î¼±ÀÇ ³¡ ÷ÀÚ À§Ä¡°¡ ±â·ÏµÈ´Ù.

ù ¹ø° Æó°î¼±Àº ´ç¿¬È÷ ÷ÀÚ 0ºÎÅÍ ½ÃÀÛÇÏ¸ç ±× ³¡Àº contours[0]ÀÎ 4ÀÌ´Ù. ´ÙÀ½ Æó°î¼±Àº ¾Õ Æó°î¼±ÀÇ ³¡ ´ÙÀ½ÀÎ contours[0]+1 ºÎÅÍ ½ÃÀÛÇؼ­ contours[1]±îÁöÀÌ´Ù. ÀÌ·± ½ÄÀ¸·Î n_contours °³¼öÀÇ Æó°î¼±À» ±×¸®¸é Àüü ±Û¸®ÇÁ°¡ ¿Ï¼ºµÈ´Ù. ±×·³ ÀÌ Á¤º¸¸¦ ÀÐ¾î ±Û¸®ÇÁ¸¦ ±×¸®´Â Äڵ带 ÀÛ¼ºÇØ º¸ÀÚ.

 

¿¹ Á¦ : DrawOutline

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     HDC hdc;

     PAINTSTRUCT ps;

     FT_Face face;

     unsigned index;

     int c,p;

     int cs,ce;

     FT_Vector pt;

     int x,y;

 

     switch (iMessage) {

     case WM_CREATE:

          hWndMain=hWnd;

          return 0;

     case WM_PAINT:

          hdc=BeginPaint(hWnd, &ps);

 

          FT_New_Face(library,"c:\\windows\\fonts\\batang.ttc",2,&face);

          FT_Set_Char_Size(face, 256 * 64, 0,

              GetDeviceCaps(hdc,LOGPIXELSX), GetDeviceCaps(hdc,LOGPIXELSY));

          index = FT_Get_Char_Index(face,L'ÇÑ');

          FT_Load_Glyph(face,index,FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP);

 

          for (c=0;c<face->glyph->outline.n_contours;c++) {

              // Æó°î¼±ÀÇ ½ÃÀÛ, ³¡ À妽º ãÀ½

              cs=(c==0 ? 0:face->glyph->outline.contours[c-1]+1);

              ce=face->glyph->outline.contours[c];

              for (p=cs;p<=ce;p++) {

                   pt=face->glyph->outline.points[p];

                   x=pt.x >> 6;

                   y=pt.y >> 6;

                   if (p==cs) {

                        MoveToEx(hdc,x,300-y,NULL);

                   } else {

                        LineTo(hdc,x,300-y);

                   }

                   Sleep(10);

              }

              // Æó°î¼± ´ÝÀ½

              pt=face->glyph->outline.points[cs];

              x=pt.x >> 6;

              y=pt.y >> 6;

              LineTo(hdc,x,300-y);

          }

 

          FT_Done_Face(face);

          EndPaint(hWnd, &ps);

          return 0;

     case WM_DESTROY:

          PostQuitMessage(0);

          return 0;

     }

     return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

 

±Û¸®ÇÁ¸¦ ·Îµå´Â Ç쵂 ºñÆ®¸ÊÀ¸·Î Ãâ·ÂÇÒ °ÍÀº ¾Æ´Ï¹Ç·Î ·£´õ¸µÀº ÇÏÁö ¾Ê¾Ò´Ù. ÀÌ »óÅ¿¡¼­´Â ±Û¸®ÇÁ ½½·ÔÀÇ bitmap¿¡´Â ¾Æ¹« Á¤º¸°¡ ¾øÀ¸¸é outline¿¡¸¸ ¿Ü°û¼± Á¤º¸°¡ Á¶»çµÈ´Ù. outlineÀÇ Á¡ ¹è¿­À» ¼øȸÇϸ鼭 Çϳª¾¿ ²¨³» Ãâ·ÂÇÏ¸é ±Û¸®ÇÁ ¸ð¾ç ºñ½ÁÇÏ°Ô Ãâ·ÂÇÒ ¼ö ÀÖ´Ù.

Æó°î¼± °³¼ö¸¸Å­ ·çÇÁ¸¦ µ¹¸é¼­ °¢ Æó°î¼±ÀÇ ½ÃÀÛ, ³¡ ÷ÀÚ¸¦ Á¶»çÇÑ´Ù. ±×¸®°í Á¶»çµÈ ÷ÀÚ¸¸Å­ points ¹è¿­¿¡¼­ ÁÂÇ¥¸¦ ²¨³» ¼±À¸·Î ¿¬°áÇÑ´Ù. Æó°î¼±ÀÇ Ã¹ Á¡¿¡ ´ëÇؼ­´Â À̵¿¸¸ ÇÏ°í µÎ¹ø° Á¡ºÎÅÍ´Â ¼±À» ±×À¸¸é Æó°î¼±À» ±¸¼ºÇÏ´Â °¢ Á¡ÀÌ ¼ø¼­´ë·Î ¿¬°áµÉ °ÍÀÌ´Ù. ±×¸®´Â ¼ø¼­¸¦ õõÈ÷ º¸±â À§ÇØ SleepÀ» Àû´çÈ÷ ³Ö¾î µÎ¾ú´Ù.

Æó°î¼±À̶õ ´ÝÈù µµÇüÀ̹ǷΠ¸ðµç Á¡À» ¼øȸÇÑ ÈÄ ½ÃÀÛÁ¡°ú ³¡Á¡À» ¿¬°áÇØ¾ß ¿ÏÀüÇÑ Æó°î¼±ÀÌ µÈ´Ù. ÀÌ °úÁ¤À» Æó°î¼± °³¼ö¸¸Å­ ¹Ýº¹ÇÏ¸é ±Û¸®ÇÁÀÇ ¿Ü°û¼±ÀÌ ¿Ï¼ºµÈ´Ù. ´ÙÀ½Àº "ÇÑ"ÀÚÀÇ ¿Ü°û¼±À» ±×¸° °ÍÀε¥ ¾î¶² ¼ø¼­´ë·Î ȹÀÌ ±×·ÁÁö´ÂÁö º¸·Á¸é Á÷Á¢ ½ÇÇàÇØ ºÁ¾ß ÇÑ´Ù. ¿ì¸®°¡ ÀÏ»ó »ýÈ°¿¡¼­ ±ÛÀÚ¸¦ ¾²´Â ȹ¼ø°ú´Â Á» ´Ù¸£°Ô Á¤ÀǵǾî Àֱ⵵ ÇÏ´Ù.

ÆùÆ® µðÀÚÀ̳ʵéÀÌ ¸¸µé¾î ³õÀº ±Û¸®ÇÁ ¸ð¾ç´ë·Î ¿Ü°û¼±ÀÌ Ãâ·ÂµÇ¾ú´Ù. ±×·¯³ª ÀÌ ¿¹Á¦´Â ¾îµð±îÁö³ª ÀÌÇظ¦ ¸ñÀûÀ¸·Î ´ëÃæ ÀÛ¼ºÇÑ °ÍÀ̶ó ¾ÆÁ÷ ¿Ïº®ÇÏÁö´Â ¾Ê´Ù. Á» ´õ Á¤È®ÇÑ ¸ð¾çÀ» ±×¸®·Á¸é ¿©ºÐÀÇ Äڵ尡 ´õ ÇÊ¿äÇÏ´Ù.

³ª.°î¼± ±×¸®±â

¾Õ ¿¹Á¦ÀÇ ½ÇÇà °á°ú¸¦ º¸¸é ¿Ü°û¼±ÀÌ ±×·° Àú·° Àß ±×·ÁÁø °Í °°Áö¸¸ Á÷ÀüÀ¸·Î¸¸ ¿¬°áÀ» ÇÏ´Ù º¸´Ï °¢Áø ºÎºÐÀÌ ÀÖ´Ù. ÆùÆ®ÀÇ ¿Ü°û¼±Àº Á÷¼±°ú °î¼±À¸·Î ±¸¼ºµÇ´Âµ¥ ¿¹Á¦¿¡¼­´Â Á÷¼±¸¸ »ç¿ëÇ߱⠶§¹®ÀÌ´Ù. Á¦´ë·Î ±×¸®·Á¸é ¾îµð°¡ °î¼±ÀÌ°í ¾îµð°¡ Á÷¼±ÀÎÁö¸¦ ¾Ë¾Æ¾ß Çϴµ¥ ÀÌ Á¤º¸´Â tags ¹è¿­¿¡ µé¾î ÀÖ´Ù.

tags´Â points ¹è¿­°ú °°Àº Å©±â¸¦ °¡Áö¸ç °¢ Á¡ÀÇ ¼ºÁúÀ» ÁöÁ¤ÇÑ´Ù. b0(Á¦ÀÏ ¿ÞÂÊ ºñÆ®)°¡ 0À̸é ÀÌ °ªÀº °î¼±ÀÇ ¿ÜºÎ¿¡ ÀÖ´Â Á¡(off)À̸ç b0°¡ 1ÀÌ¸é °î¼±ÀÇ ³»ºÎ¿¡ ÀÖ´Â Á¡(on)ÀÌ´Ù. b1Àº b0°¡ 0À϶§¸¸ Àǹ̰¡ Àִµ¥ b1ÀÌ 1À̸é 3Â÷ º£Áö¾î °î¼±À̸ç 0À̸é 2Â÷ º£Áö¾î °î¼±ÀÌ´Ù. °¢ Á¡ÀÇ on, off »óÅ¿¡ µû¶ó ¾î¶² °î¼±ÀÌ ±×·ÁÁö´ÂÁö º¸ÀÚ.

¸ÕÀú µÎ °³ÀÇ ¿¬¼ÓµÈ Á¡ÀÌ ¸ðµÎ onÀ̸é ÀÌ ¼±Àº Á÷¼±ÀÌ´Ù. µÑ ´Ù ¼± À§¿¡ ÀÖÀ¸¹Ç·Î Á÷¼±ÀÏ ¼ö¹Û¿¡ ¾ø´Ù. on, off, on ¼øÀ¸·Î ¿¬¼ÓµÇ¸é °¡¿îµ¥ ÀÖ´Â offÁ¡Àº ¼± À§¿¡ ÀÖÁö ¾ÊÀº Á¶ÀýÁ¡À̶ó°í º¼ ¼ö ÀÖÀ¸¸ç ÀÌ °æ¿ì 2Â÷ º£Áö¾î °î¼±ÀÌ µÈ´Ù. Á¶ÀýÁ¡Àº °î¼± À§¿¡ ÀÖÁö´Â ¾ÊÁö¸¸ ÀÏÁ¾ÀÇ Áß·ÂÁ¡À¸·Î ÀÛ¿ëÇÏ¿© °î¼±À» Á¶ÀýÁ¡ÂÊÀ¸·Î ÈÖ¾îÁö°Ô ¸¸µå´Â ¿ªÇÒÀ» ÇÑ´Ù.

on, off, off, on ¼øÀ¸·Î ¿¬¼ÓµÇ´Â °æ¿ì´Â °¡¿îµ¥ µÎ °³ÀÇ offÁ¡ÀÌ Á¶ÀýÁ¡ÀÌ´Ù. À̶§ offÁ¡ÀÌ 2Â÷ÀÎÁö 3Â÷ÀÎÁö¿¡ µû¶ó °á°ú°¡ ´Þ¶óÁø´Ù. 3Â÷ Á¶ÀýÁ¡ÀÎ °æ¿ì´Â °î¼±ÀÌ µÎ Á¶ÀýÁ¡ÂÊÀ¸·Î ÈÖ¾îÁø´Ù. 2Â÷ Á¶ÀýÁ¡ÀÎ °æ¿ì´Â µÎ offÁ¡ÀÇ ÁßÁ¡¿¡ onÁ¡ÀÌ Çϳª Ãß°¡·Î ´õ ¹èÄ¡µÈ´Ù. 2Â÷ º£Áö¾î °î¼±ÀÌ´Ï 3Â÷ º£Áö¾î °î¼±ÀÌ´Ï ÇÏ´Â °ÍµéÀº ¼öÇÐÀûÀ¸·Î Á¤ÀǵǴ ¹æÁ¤½ÄÀε¥ ÀÚ¼¼ÇÑ °ÍÀº ±×·¡ÇÈ °ü·Ã ¼­ÀûÀ» ÂüÁ¶Çϱ⠹ٶõ´Ù.

Á» º¹ÀâÇØ º¸À̱â´Â ÇÏÁö¸¸ °î¼±À» Á¤ÀÇÇÏ´Â ±ÔÄ¢ÀÌ ¸íÈ®ÇϹǷΠÀÌ ±ÔÄ¢´ë·Î ÁÂÇ¥¸¦ ¿¬°áÇÏ¿© °î¼±À» ±×¸®±â¸¸ ÇÏ¸é µÈ´Ù. ±×·¯³ª Á¡µéÀÇ ÅÂ±× ¼Ó¼ºÀ» ÀÏÀÏÀÌ ÆľÇÇÏ¿© Á÷¼±, °î¼±À» ¿¬°áÇؼ­ ±×¸®´Â ÀÛ¾÷Àº ¾î·Æ´Ù±âº¸´Ù´Â ¹«Ã´ ±ÍÂúÀº ÀÛ¾÷ÀÌ´Ù. ±×·¡¼­ FreeTypeÀº ¿Ü°û¼± Á¤º¸¸¦ Çؼ®ÇÏ¿© Àû´çÇÑ ¶§ ±×¸®±â ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °î¼± ºÐÇØ ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.

 

FT_EXPORT( FT_Error ) FT_Outline_Decompose( FT_Outline* outline, const FT_Outline_Funcs*  func_interface, void* user );

 

ù¹ø° Àμö´Â ±×¸®°íÀÚ ÇÏ´Â ¿Ü°û¼±ÀÌ´Ù. µÎ ¹ø° Àμö´Â °¢ Á¡ÀÇ ¼Ó¼ºº°·Î È£ÃâÇÒ Äݹé ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ °¡Áö´Â ±¸Á¶Ã¼ÀÌ´Ù. ÇÔ¼ö Æ÷ÀÎÅÍ ¿Ü¿¡ °¢ Á¡¿¡ °öÇØÁö°í ´õÇØÁö´Â °ªµµ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.

 

typedef struct  FT_Outline_Funcs_

  {

    FT_Outline_MoveToFunc   move_to;

    FT_Outline_LineToFunc   line_to;

    FT_Outline_ConicToFunc  conic_to;

    FT_Outline_CubicToFunc  cubic_to;

 

    int                     shift;

    FT_Pos                  delta;

 

  } FT_Outline_Funcs;

 

À̵¿, Á÷¼±, 2Â÷ º£Áö¾î, 3Â÷ º£Áö¾î °î¼±À» ¸¸³¯ ¶§¸¶´Ù È£ÃâÇÒ ÇÔ¼ö¸¦ ÀÛ¼ºÇÑ ÈÄ ÀÌ ±¸Á¶Ã¼¿¡ ´ëÀÔÇØ ³õÀ¸¸é Àû´çÇÑ ¶§¿¡ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. ¹°·Ð Äݹé ÇÔ¼ö´Â ÀÌ ±¸Á¶Ã¼¿¡ Á¤ÀÇµÈ ¿øÇü´ë·Î ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î ¼±À» ±×¸®´Â ÇÔ¼ö´Â ¾îµð±îÁö ¼±À» ±×À» °ÍÀÎÁö ¸ñÀûÁö ÁÂÇ¥¸¦ Àü´Þ¹Þ¾Æ¾ß ÇÏ¸ç °î¼±À» ±×¸®´Â ÇÔ¼ö´Â ¸ñÀûÁö ÁÂÇ¥»Ó¸¸ ¾Æ´Ï¶ó Á¶ÀýÁ¡ÀÇ ÁÂÇ¥µµ Àü´Þ¹Þ¾Æ¾ß ÇÑ´Ù. Decompose ÇÔ¼ö°¡ ¿ä±¸ÇÏ´Â ¿øÇü´ë·Î Äݹé ÇÔ¼ö¸¦ ÀÛ¼ºÇØ ³õÀ¸¸é ÀÌ ÇÔ¼ö´Â ¿Ü°û¼±¿¡¼­ ÃßÃâÇÑ ÁÂÇ¥¸¦ Äݹé ÇÔ¼ö·Î Àü´ÞÇϸç Äݹé ÇÔ¼ö´Â Àü´ÞµÈ Àμö´ë·Î ±×¸®±â¸¸ ÇÏ¸é µÈ´Ù.

¸¶Áö¸· Àμö user´Â Äݹé ÇÔ¼ö·Î Àü´ÞµÉ »ç¿ëÀÚ Á¤ÀÇ µ¥ÀÌÅÍÀε¥ void *À̹ǷΠÀÓÀÇÀÇ °´Ã¼³ª ÇÚµéÀ» Àü´ÞÇÒ ¼ö ÀÖ´Ù. °¢ Äݹé ÇÔ¼ö¿¡¼­ Á÷¼±, °î¼±À» Ãâ·ÂÇØ¾ß ÇϹǷΠ±×¸®±â¿¡ ÇÊ¿äÇÑ ¾î¶² °ªÀÌ Àü´ÞµÉ °ÍÀÌ´Ù. ¿¹¸¦ µé¾î DCÀÇ ÇÚµéÀ̳ª Graphics °´Ã¼ÀÇ Æ÷ÀÎÅÍ µîÀÌ Àü´ÞµÇ´Âµ¥ Äݹé ÇÔ¼ö´Â user°ªÀ» ¿ø·¡ ŸÀÔÀ¸·Î ij½ºÆÃÇؼ­ »ç¿ëÇØ¾ß ÇÑ´Ù. ´ÙÀ½ ¿¹Á¦´Â °î¼± ºÐÇØ ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¿ÏÀüÇÑ ¿Ü°û¼±À» ±×·Á³½´Ù.

 

¿¹ Á¦ : DecompOutline

#include FT_OUTLINE_H

....

class DrawOutline

{

#define TOINT(a) ((int)(a >> 6))

public:

     static POINT Base;

     static int nSleep;

     static int PathMoveTo(const FT_Vector *to, void *user)

     {

          HDC hdc=*(HDC *)user;

          MoveToEx(hdc,Base.x + TOINT(to->x),Base.y - TOINT(to->y),NULL);

          if (nSleep) Sleep(nSleep);

          return 0;

     }

 

     static int PathLineTo(const FT_Vector *to, void *user)

     {

          HDC hdc=*(HDC *)user;

          LineTo(hdc,Base.x + TOINT(to->x),Base.y - TOINT(to->y));

          if (nSleep) Sleep(nSleep);

          return 0;

     }

 

     static int PathConicTo(const FT_Vector *control, const FT_Vector *to, void *user)

     {

          HDC hdc=*(HDC *)user;

          POINT pts[3];

          pts[0].x=Base.x + TOINT(control->x);

          pts[0].y=Base.y - TOINT(control->y);

          pts[1].x=Base.x + TOINT(to->x);

          pts[1].y=Base.y - TOINT(to->y);

          pts[2].x=Base.x + TOINT(to->x);

          pts[2].y=Base.y - TOINT(to->y);

          PolyBezierTo(hdc,pts,3);

          if (nSleep) Sleep(nSleep);

          return 0;

     }

 

     static int PathCubicTo(const FT_Vector *control1, const FT_Vector *control2,const FT_Vector *to, void *user)

     {

          HDC hdc=*(HDC *)user;

          POINT pts[3];

          pts[0].x=Base.x + TOINT(control1->x);

          pts[0].y=Base.y - TOINT(control1->y);

          pts[1].x=Base.x + TOINT(control2->x);

          pts[1].y=Base.y - TOINT(control2->y);

          pts[2].x=Base.x + TOINT(to->x);

          pts[2].y=Base.y - TOINT(to->y);

          PolyBezierTo(hdc,pts,3);

          if (nSleep) Sleep(nSleep);

          return 0;

     }

};

POINT DrawOutline::Base;

int DrawOutline::nSleep=0;

 

void OnPaint(HDC hdc)

{

     FT_Face face;

     unsigned index;

 

     FT_New_Face(library,"c:\\windows\\fonts\\batang.ttc",2,&face);

     FT_Set_Char_Size(face, 256 * 64, 0,

          GetDeviceCaps(hdc,LOGPIXELSX), GetDeviceCaps(hdc,LOGPIXELSY));

     index = FT_Get_Char_Index(face,L'ÇÑ');

     FT_Load_Glyph(face,index,FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP);

 

     // ¿Ü°û¼±À» ±×¸°´Ù.

     FT_Outline_Funcs outline_funcs = {

          DrawOutline::PathMoveTo, DrawOutline::PathLineTo,

          DrawOutline::PathConicTo, DrawOutline::PathCubicTo, 0, 0

     };

     DrawOutline::Base.x=0;

     DrawOutline::Base.y=300;

     DrawOutline::nSleep=20;

     FT_Outline_Decompose(&face->glyph->outline, &outline_funcs, &hdc);

 

     FT_Done_Face(face);

}

 

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     HDC hdc;

     PAINTSTRUCT ps;

 

     switch (iMessage) {

     case WM_CREATE:

          hWndMain=hWnd;

          return 0;

     case WM_PAINT:

          hdc=BeginPaint(hWnd, &ps);

          OnPaint(hdc);

          EndPaint(hWnd, &ps);

          return 0;

     case WM_DESTROY:

          PostQuitMessage(0);

          return 0;

     }

     return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

 

¿Ü°û¼± ºÐÇØ ÇÔ¼ö´Â FT_OUTLINE_H Çì´õ ÆÄÀÏ¿¡ ¼±¾ðµÇ¾î ÀÖÀ¸¹Ç·Î ¸ÕÀú ÀÌ Çì´õ ÆÄÀÏÀ» ÀÎŬ·çµåÇÑ´Ù. °¢ ¼±ºÐÀ» ±×¸± 4°³ÀÇ Äݹé ÇÔ¼ö ¿Ü¿¡µµ º£À̽º¶óÀΰú ½Ã°£ Áö¿¬°ªµµ ÇÊ¿äÇÏ´Ù. ÇÔ¼ö¿Í º¯¼ö ¿©·¯ °³°¡ ÇÊ¿äÇϹǷΠŬ·¡½º·Î ĸ½¶È­Çߴµ¥ Äݹé ÇÔ¼ö¿Í ¿øÇüÀ» ¸ÂÃß±â À§ÇØ ¸â¹ö ÇÔ¼ö´Â ¸ðµÎ Á¤ÀûÀ̾î¾ß ÇÏ¸ç µû¶ó¼­ Á¤Àû ÇÔ¼ö¿¡¼­ »ç¿ëÇÒ ¸â¹ö º¯¼öµµ Á¤ÀûÀ̾î¾ß ÇÑ´Ù. »ç½Ç Àü¿ª º¯¼ö¿Í Àü¿ª ÇÔ¼ö·Îµµ ÃæºÐÇϱâ´Â ÇÏÁö¸¸ ÀçÈ°¿ë¼ºÀ» ³ôÀ̱â À§ÇØ Å¬·¡½º·Î ¸¸µé¾ú´Ù.

FT_Outline_Decompose ÇÔ¼ö´Â ¿Ü°û¼±À» ±¸¼ºÇÏ´Â Á¡µéÀ» ºÐ¼®ÇÏ¿© ÀÌ Á¡ÀÌ °î¼±ÀÎÁö Á÷¼±ÀÎÁö¸¦ ÆÇ´ÜÇÏ°í Àû´çÇÑ Äݹé ÇÔ¼ö¸¦ È£ÃâÇϸç ÀÌ ÇÔ¼ö·Î points ¹è¿­¿¡¼­ ÃßÃâÇÑ ÁÂÇ¥°ªÀ» Àü´ÞÇÑ´Ù. ±×¸®°í user Àμö·Î´Â ±×¸®±âÀÇ Ç¥¸éÀÌ µÉ DC ÇÚµéÀ» Àü´ÞÇß´Ù. °¢ Äݹé ÇÔ¼ö´Â Àü´Þ¹ÞÀº Àμö´ë·Î À§Ä¡¸¦ ¿Å±â°í Á÷¼±À» ±×¸®°í º£Áö¾î °î¼±À» ±×¸°´Ù.

°¢ Äݹé ÇÔ¼öÀÇ ±×¸®±â ÄÚµå´Â Áö±ØÈ÷ Æò¹üÇÑ Win32 ±×·¡ÇÈ ÇÔ¼öÀÏ »ÓÀÌ´Ù. user·Î Àü´ÞµÈ DC ÇÚµéÀ» ¸ÕÀú ÃßÃâÇÏ°í MoveToEx³ª LineTo¸¦ È£ÃâÇÏ¿© ÇöÀç À§Ä¡¸¦ ¿Å±â°í Á÷¼±À» ±ß´Â´Ù. ½ÇÇà °á°ú¸¦ õõÈ÷ »ìÆ캼 ¼ö ÀÖµµ·Ï ÀǵµÀûÀ¸·Î Sleep¹®µµ ³Ö¾î µÎ¾ú´Âµ¥ ½ÇÁ¦ ÇÁ·ÎÁ§Æ®¿¡¼­´Â ¹°·Ð ÇÊ¿ä¾ø´Â ÄÚµåÀÌ´Ù. º£Áö¾î °î¼±À» ±×¸®´Â Äڵ尡 Á» ±æ¾î º¸À̴µ¥ Àü´ÞµÈ Àμö¸¦ PolyBezier ÇÔ¼ö°¡ ¿ä±¸ÇÏ´Â ¹è¿­¿¡ ´ëÀÔÇÏ´Â ¹®ÀåÀÏ »ÓÀÌ´Ù. Ãâ·Â °á°ú¸¦ º¸ÀÚ.

¾Õ ¿¹Á¦¿¡ ºñÇØ °î¼± ºÎºÐÀÌ ºÎµå·´°Ô ±×·ÁÁö¹Ç·Î Á¦´ë·Î Ç°ÁúÀÌ ³ª¿Â´Ù. ¹Ì½º ¹ÚÀÌ ¸¸µç ±Û¸®ÇÁ¿¡ Àú·± ¸ð¾çÀÇ ±ÛÀÚ°¡ ¼öÇнÄÀ¸·Î ºÎȣȭµÇ¾î ÀÖÀ¸¸ç FreeType ¶óÀ̺귯¸®´Â ÀÌ ºÎÈ£¸¦ Çؼ®ÇÏ¿© ÁÂÇ¥·Î º¯È¯ÇØ ÁØ´Ù. ¿ì¸®´Â ºÐ¼®µÈ ÁÂÇ¥´ë·Î ±×¸®±â¸¸ ÇÏ¸é µÈ´Ù. ¸¸¾à ÀÌ Äڵ尡 ¾î·Æ°Ô ´À²¸Áø´Ù¸é Win32ÀÇ ±×¸®±â ÇÔ¼ö³ª CÀÇ ÇÔ¼ö Æ÷ÀÎÅÍ¿¡ ÀÚ½ÅÀÌ ¾ø¾î¼­ÀÏ °ÍÀÌ´Ù. Á» ±æ¾î º¸¿©¼­ ±×·¸Áö °áÄÚ ¾î·Æ°Å³ª º¹ÀâÇÑ Äڵ尡 ¾Æ´Ï´Ù.

Âü°í·Î À§ ¿¹Á¦¿¡¼­ PathCubicTo ÇÔ¼ö´Â ½ÇÁ¦·Î´Â È£ÃâµÇÁö ¾Ê´Â ÇÔ¼öÀÌ´Ù. ¿Ö³ÄÇϸé À©µµ¿ìÁîÀÇ ±âº» ÆùÆ®ÀÎ TrueTypeÀº 3Â÷ º£Áö¾î °î¼±À» »ç¿ëÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ¸ðµç °î¼±Àº 2Â÷ º£Áö¾î °î¼±À¸·Î Á¤ÀǵǾî ÀÖ´Ù. ¹°·Ð ÀÌ·ÐÀûÀ¸·Î 2Â÷ º£Áö¾î °î¼±°ú 3Â÷ º£Áö¾î °î¼±À» ¼¯¾î¼­ »ç¿ëÇÏ´Â °Íµµ °¡´ÉÀº ÇÏÁö¸¸ ±×·¸°Ô ¸¸µé¾îÁø ÆùÆ®´Â ÇöÁ¸ÇÏÁö ¾Ê´Â´Ù.

´Ù.Æнº·Î º¯È¯Çϱâ

±Û¸®ÇÁÀÇ ¿Ü°û¼± Á¤º¸¸¦ °î¼±À¸·Î ¹Ù²Ù¾î ±×¸®±â¿¡ ¼º°øÇߴµ¥ ÀÌ·± ½ÄÀ¸·Î ¿Ü°û¼±¸¸ ±×¸®¸é ³»ºÎ¸¦ ä¿ì±â°¡ ¾î·Æ´Ù. ¹®ÀÚ¸¦ Á¦´ë·Î Ãâ·ÂÇÏ·Á¸é ȹÀÇ ¾ÈÂʱîÁö ¿ÏÀüÈ÷ ä¿ö¾ß ÇÑ´Ù. ¿Ü°û¼±ÀÇ ¾ÈÂÊÀ» ä¿ì´Âµ¥´Â ¿©·¯ °¡Áö ¹æ¹ýÀÌ ÀÖÁö¸¸ Æнº¸¦ »ç¿ëÇÏ´Â °ÍÀÌ °¡Àå ºü¸£°í ÇÕ¸®ÀûÀÌ´Ù. ÀÏ´Ü Æнº·Î º¯È¯ÇØ ³õ±â¸¸ ÇÏ¸é ´Ù¾çÇÑ ÇüÅ·Πº¯ÇüÇÒ ¼ö ÀÖ¾î ÀÀ¿ëÀÇ ¹¦¹Ìµµ ÀÖ´Ù.

Æнº´Â À©µµ¿ìÁîÀÇ ±âº» ±×¸®±â ¿£ÁøÀÎ GDI¿¡µµ ÀÖ°í GDIÀÇ »óÀ§ ¹öÀüÀÎ GDI+¿¡µµ ÀÖÀ¸¹Ç·Î ¾î·ÆÁö ¾Ê°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù. GDIÀÇ Æнº´Â ¿©·¯ °¡Áö ¸é¿¡¼­ GDI+¿¡ ºñÇØ ±â´ÉÀÌ ¿­¾ÇÇϹǷΠÀ̹ø ¿¹Á¦¿¡¼­´Â GDI+ÀÇ Æнº¸¦ »ç¿ëÇØ º¸±â·Î ÇÏÀÚ. ´ç¿¬ÇÑ ¾ê±â°ÚÁö¸¸ ÀÌ ¿¹Á¦¸¦ Á¦´ë·Î ÀÌÇØÇÏ·Á¸é GDI+¿¡ ´ëÇÑ ¼±Çà ÇнÀÀÌ µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù.

 

¿¹ Á¦ : FillOutline

#include <gdiplus.h>

using namespace Gdiplus;

#pragma comment(lib, "gdiplus")

class CGdiPlusStarter

{

private:

     ULONG_PTR m_gpToken;

 

public:

     bool m_bSuccess;

     CGdiPlusStarter() {

          GdiplusStartupInput gpsi;

          m_bSuccess=(GdiplusStartup(&m_gpToken,&gpsi,NULL) == Ok);

     }

     ~CGdiPlusStarter() {

          GdiplusShutdown(m_gpToken);

     }

};

CGdiPlusStarter g_gps;

 

class PathConverter

{

#define TOREAL(a) ((REAL)(a >> 6))

#define TO266(a) ((FT_F26Dot6)(a << 6))

public:

     static PointF Current;

     static PointF Base;

     static int PathMoveTo(const FT_Vector *to, void *user)

     {

          GraphicsPath *pPath=(GraphicsPath *)user;

          pPath->StartFigure();

         

          Current.X = Base.X + TOREAL(to->x);

          Current.Y = Base.Y - TOREAL(to->y);

          return 0;

     }

 

     static int PathLineTo(const FT_Vector *to, void *user)

     {

          GraphicsPath *pPath=(GraphicsPath *)user;

          pPath->AddLine(Current.X, Current.Y, Base.X + TOREAL(to->x), Base.Y - TOREAL(to->y));

 

          Current.X = Base.X + TOREAL(to->x);

          Current.Y = Base.Y - TOREAL(to->y);

          return 0;

     }

 

     static int PathConicTo(const FT_Vector *control, const FT_Vector *to, void *user)

     {

          GraphicsPath *pPath=(GraphicsPath *)user;

          pPath->AddBezier(Current.X, Current.Y,

              Base.X + TOREAL(control->x), Base.Y - TOREAL(control->y),

              Base.X + TOREAL(to->x), Base.Y - TOREAL(to->y),

              Base.X + TOREAL(to->x), Base.Y - TOREAL(to->y));

             

          Current.X = Base.X + TOREAL(to->x);

          Current.Y = Base.Y - TOREAL(to->y);

          return 0;

     }

 

     static int PathCubicTo(const FT_Vector *control1, const FT_Vector *control2,const FT_Vector *to, void *user)

     {

          GraphicsPath *pPath=(GraphicsPath *)user;

          pPath->AddBezier(Current.X, Current.Y,

              Base.X + TOREAL(control1->x), Base.Y - TOREAL(control1->y),

              Base.X + TOREAL(control2->x), Base.Y - TOREAL(control2->y),

              Base.X + TOREAL(to->x), Base.Y - TOREAL(to->y));

 

          Current.X = Base.X + TOREAL(to->x);

          Current.Y = Base.Y - TOREAL(to->y);

          return 0;

     }

};

PointF PathConverter::Current;

PointF PathConverter::Base;

 

void OnPaint(HDC hdc)

{

     FT_Face face;

     unsigned index;

 

     FT_New_Face(library,"c:\\windows\\fonts\\batang.ttc",2,&face);

     FT_Set_Char_Size(face, 256 * 64, 0,

          GetDeviceCaps(hdc,LOGPIXELSX), GetDeviceCaps(hdc,LOGPIXELSY));

     index = FT_Get_Char_Index(face,L'ÇÑ');

     FT_Load_Glyph(face,index,FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP);

 

     Graphics G(hdc);

     G.SetSmoothingMode(Gdiplus::SmoothingModeHighQuality);

     GraphicsPath Path;

     Path.SetFillMode(Gdiplus::FillModeWinding);        

    

     // ¿Ü°û¼±À» Æнº·Î º¯È¯

     FT_Outline_Funcs outline_funcs = {

          PathConverter::PathMoveTo, PathConverter::PathLineTo,

          PathConverter::PathConicTo, PathConverter::PathCubicTo, 0, 0

     };

 

     PathConverter::Base.X=0;

     PathConverter::Base.Y=300;

     FT_Outline_Decompose(&face->glyph->outline, &outline_funcs, &Path);

     Path.CloseFigure();

 

     // Æнº Ãâ·Â

     G.FillPath(&SolidBrush(Color(0,0,0)),&Path);

     //G.DrawPath(&Pen(Color(0,0,255),5),&Path);

 

     FT_Done_Face(face);

}

 

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     HDC hdc;

     PAINTSTRUCT ps;

 

     switch (iMessage) {

     case WM_CREATE:

          hWndMain=hWnd;

          return 0;

     case WM_PAINT:

          hdc=BeginPaint(hWnd, &ps);

          OnPaint(hdc);

          EndPaint(hWnd, &ps);

          return 0;

     case WM_DESTROY:

          PostQuitMessage(0);

          return 0;

     }

     return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

 

¾Õ ¿¹Á¦¿Í ±âº»ÀûÀÎ ±¸Á¶´Â °ÅÀÇ °°´Ù. ´Ù¸¸ Á÷Á¢ ±×¸®´Â °ÍÀÌ ¾Æ´Ï¹Ç·Î DCÀÇ ÇÚµé ´ë½Å GraphicsPath °´Ã¼ÀÇ Æ÷ÀÎÅ͸¦ ¹Þ¾Æ Æнº¿¡ Á÷¼±°ú °î¼±À» ´©Àû½ÃŲ´Ù´Â Á¡ÀÌ ´Ù¸£´Ù. Àü´ÞµÈ ÁÂÇ¥¸¦ GraphicsPathÀÇ ¸â¹ö ÇÔ¼öÀÇ Àμö·Î »ç¿ëÇÏ¿© Æнº¿¡ µµÇüÀ» Çϳª¾¿ ±×¸°´Ù. Æнº¿¡ ÀÏ´Ü ´©Àû½ÃÄÑ ³õ°í ³ªÁß¿¡ Æнº¸¸ ±×¸®¸é µÈ´Ù. Á¤Àû ¸â¹ö º¯¼ö·Î ÇöÀç À§Ä¡¿¡ ÇØ´çÇÏ´Â Current°ªÀ» ÀÏÀÏÀÌ ÀúÀåÇÏ´Â Äڵ尡 Ãß°¡µÇ¾î Àִµ¥ ÀÌ´Â GDI¿Í GDI+ÀÇ Â÷ÀÌ¿¡ ±âÀÎÇÑ´Ù.

GDI´Â ÇöÀç ¼±ÅÃµÈ ¿ÀºêÁ§Æ®³ª ÇöÀç À§Ä¡, °¢Á¾ ¸ðµå µîÀÌ DC¿¡ ÀúÀåµÇ´Âµ¥ ºñÇØ GDI+´Â »óÅ°¡ ¾ø´Â ¶óÀ̺귯¸®¶ó ÇöÀç À§Ä¡¸¦ º°µµÀÇ º¯¼ö¿¡ ÀúÀåÇØ¾ß ÇÑ´Ù. GDIÀÇ ÇöÀç À§Ä¡¿¡ ÇØ´çÇÏ´Â °ªÀÌ ¹Ù·Î Current Á¤Àû ¸â¹ö º¯¼öÀÌ´Ù. Æнº°¡ ¿Ï¼ºµÈ ÈÄ FillPath·Î ÆнºÀÇ ³»ºÎ¸¦ ä¿ì±â¸¸ Çϸé ȹÀÇ ¾ÈÂʱîÁö ¿ÏÀüÈ÷ ä¿öÁø ±ÛÀÚ°¡ Ãâ·ÂµÈ´Ù.

GraphicsÀÇ ±×¸®±â ¸ðµå¸¦ Àß Àû¿ëÇÏ¸é ¾ÈƼ ¾Ë¸®¾Æ½Ìµµ ÈǸ¢ÇÏ°Ô Áö¿øµÈ´Ù. ÀÏ´Ü Æнº°¡ ±¸ÃàµÇ¸é ÆæÀ̳ª ±×¶óµ¥ÀÌ¼Ç ºê·¯½Ã µîÀ» Àû¿ëÇÏ¿© ´Ù¾çÇÑ º¯ÇüÀ» ÇØ º¼ ¼ö ÀÖ´Ù. ´ÙÀ½Àº ±½±â 5ÀÇ ÆĶõ»ö ÆæÀ¸·Î ¿Ü°û¼±À» ±×¸° °ÍÀÌ´Ù. Á¤¸» ¼½½ÃÇÏÁö ¾ÊÀº°¡?

GDI ¼öÁØ¿¡¼­ ÀÏÁ¤ÇÑ ±½±â·Î ÀÌ·± ¿¹»Û °î¼±À» ±×¸®±â´Â ¹«Ã´ ¾î·Æ´Ù. Æнº ³»ºÎ¿¡ ºñÆ®¸ÊÀ» ä¿ö ³Ö°Å³ª ¹ÝÅõ¸íÇÑ »öÀ¸·Î ä¿ö À̹ÌÁö À§¿¡ ±ÛÀÚ¸¦ »ì¦ ¾ñÀ» ¼öµµ ÀÖ°í Æнº¸¦ º¯ÇüÇÏ¿© ±ÛÀÚ¸¦ Âî±×·¯¶ß¸± ¼öµµ ÀÖ´Ù. ½Ã°£ °ü°è»ó ¿¹Á¦¸¦ ¸¸µé¾î º¸Áö´Â ¾Ê°ÚÁö¸¸ GDI+ÀÇ Æнº ±â´ÉÀÌ ¿ö³« È­·ÁÇÏ¿© Á¶±Ý¸¸ ÀÀ¿ëÇصµ ¹«±Ã ¹«ÁøÇÑ º¯ÇüÀÌ °¡´ÉÇÏ´Ù.

ÀÌ ¿¹Á¦´Â SleepÀ» ÁÖ´Â Äڵ尡 ¾ø¾î ÀÌÀüÀÇ ¿¹Á¦¿¡ ºñÇØ ¼Óµµ°¡ »ó´çÈ÷ ºü¸£´Ù. ³»ºÎ¿¡¼­ º¹ÀâÇÑ °è»êÀ» ÇÔ¿¡µµ ºÒ±¸ÇÏ°í ±ÛÀÚ°¡ ¹Ù·Î Ãâ·ÂµÈ´Ù. ±×·¯³ª ¿î¿µÃ¼Á¦°¡ Á¦°øÇÏ´Â °í¼öÁØ ÇÔ¼ö¿¡ ºñÇؼ­´Â ¿©ÀüÈ÷ ´À¸°µ¥ Áö±Ý±îÁö ÇнÀÇØ ºÁ¼­ ¾Ë°ÚÁö¸¸ ÆäÀ̽ºÀÇ ±ÛÀÚ Çϳª¸¦ Àоî Ãâ·ÂÇÏ´Â °úÁ¤ÀÌ »ó´çÈ÷ º¹ÀâÇϱ⠶§¹®ÀÌ´Ù. Áï, ±ÛÀÚ Çϳª¸¦ Ãâ·ÂÇÏ´Â µ¥´Â ¿ø·¡ ÀÌ·¸°Ô ½Ã°£ÀÌ ¿À·¡ °É¸°´Ù.

±×·¸´Ù¸é ¿î¿µÃ¼Á¦ÀÇ ÇÔ¼öµéÀº °ú¿¬ ¾î¶² Æ®¸¯À» ¾²±æ·¹ °ÅÀÇ ½Ç½Ã°£À¸·Î ÅؽºÆ®°¡ Ãâ·ÂµÇ´Â °ÍÀϱî? »ç½Ç ¿î¿µÃ¼Á¦¶ó°í Çؼ­ Ưº°È÷ ¿ë»©´Â ÀçÁÖ°¡ ÀÖ´Â °ÍÀº ¾Æ´Ï¸ç À§ ¿¹Á¦µéÀÇ Äڵ带 ¼ø¼­´ë·Î ½ÇÇàÇؾ߸¸ ±Û²ÃÀ» Á¦´ë·Î Ãâ·ÂÇÒ ¼ö ÀÖ´Ù. ½ÇÁ¦·Î ¿öµå ÇÁ·Î¼¼¼­·Î ƯÀÌÇÑ ÆùÆ®ÀÇ Å« ±Û²ÃÀ» °©ÀÚ±â Ãâ·ÂÇØ º¸¸é ±×¸®´Â °úÁ¤ÀÌ º¸ÀÏ Á¤µµ·Î ´À¸®´Ù´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖÀ¸¸ç ÇѹøÂëÀº ±×·± °æÇèÀ» ÇØ º» ÀûÀÌ ÀÖÀ» °ÍÀÌ´Ù. ¸Þ¸ð¸®±îÁö ºÎÁ·ÇÑ ½Ã½ºÅÛ¿¡¼­´Â ¾Æ¿¹ ȹÀ» ±ß´Â°Ô ´«¿¡ º¸ÀÏ Á¤µµ´Ù.

ÇÏÁö¸¸ ÀÏ»óÀûÀ¸·Î´Â ÀÌ·± Çö»óÀ» ¸ñ°ÝÇϱⰡ ½±Áö ¾Ê´Âµ¥ ±× ºñ¹ÐÀº ¹Ù·Î ij½Ì¿¡ ÀÖ´Ù. Çѹø Ãâ·ÂÇÑ ±Û²ÃÀº ·¡½ºÅͶóÀÌ¡µÈ °á°ú¸¦ öÀúÈ÷ ij½ÃÇÏ¿© ´ÙÀ½ Ãâ·Â¿¡´Â Àç°è»êÇÏÁö ¾Ê°í ij½ÌµÈ °á°ú¸¦ Ãâ·ÂÇÏ´Â ±â¹ýÀ» »ç¿ëÇÑ´Ù. ¶ÇÇÑ ÆùÆ®¿¡ ÀÌ¹Ì ³»ÀåµÈ ºñÆ®¸Ê ±Û²Ãµµ ¼Óµµ Çâ»ó¿¡ Å« ±â¿©¸¦ Çϴµ¥ ºñÆ®¸Ê ±Û²ÃÀº ij½ÌÇÒ ÇÊ¿äµµ ¾øÀÌ ¹Ù·Î Ãâ·ÂÇÒ ¼ö ÀÖ´Ù. ƯÈ÷ ½Ã½ºÅÛ ±Û²ÃÀÇ °æ¿ì´Â ºÎÆà Á÷ÈÄ¿¡ ¸ðµç ±ÛÀÚµéÀÌ ´Ù ij½ÌµÇ¾î ÀÖ´Ù°í º¸¸é Ʋ¸²¾ø´Ù. ¿î¿µÃ¼Á¦´Â ºü¸¥ Ãâ·ÂÀ» À§ÇØ ¾öû³­ ¸Þ¸ð¸®¸¦ »ç¿ëÇϸç ÀÌ°Í Àú°Í ÁغñÇÒ °Ô ¸¹´Ù º¸´Ï ºÎÆà ½Ã°£ÀÌ ¿À·¡ °É¸®´Â °ÍÀÌ´Ù.

¹°·Ð ¿î¿µÃ¼Á¦ÀÇ ÃÖÀûÈ­µÈ Äڵ嵵 ¼Óµµ Çâ»ó¿¡ ¾î´À Á¤µµ ±â¿©¸¦ ÇÏ°ÚÁö¸¸ ÁÖµÈ ¼ÓµµÂ÷´Â ij½Ì¿¡¼­ ¹ß»ýÇÑ´Ù. ±×·¸´Ù¸é ÀÀ¿ë ÇÁ·Î±×·¥µµ ij½ÌÀ» Çϸé ÈξÀ ´õ ºü¸£°Ô ¹®ÀÚ¸¦ Ãâ·ÂÇÒ ¼ö ÀÖÁö ¾ÊÀ»±î? ¸Þ¸ð¸®¸¦ ¸¹ÀÌ ¾²¸é ¼Óµµ°¡ ¿Ã¶ó°¡´Â °ÍÀº µðÁöÅÐ ¼¼°èÀÇ Áø¸®À̹ǷΠÀÌ´Â ´ç¿¬ÇÏ´Ù. ´Ù¸¸, FreeType ¶óÀ̺귯¸®ÀÇ ±Û¸®ÇÁ ½½·ÔÀÌ Á¤Àû ÀúÀå¼ÒÀ̱⠶§¹®¿¡ Çѹø¿¡ ÇϳªÀÇ ±Û¸®ÇÁ¸¸ ÀÐÀ» ¼ö ÀÖ´Ù´Â Á¡ÀÌ ¹®Á¦´Ù. ±×·¡¼­ FreeTypeÀº ±Û¸®ÇÁ ½½·ÔÀ» º°µµÀÇ °´Ã¼·Î ¹é¾÷ÇÏ´Â ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.

 

FT_EXPORT( FT_Error ) FT_Get_Glyph( FT_GlyphSlot slot, FT_Glyph *aglyph );

 

ÀÌ ÇÔ¼ö´Â ÆäÀ̽º °´Ã¼ÀÇ ÇöÀç ½½·ÔÀ» º°µµÀÇ FT_Glyph ŸÀÔÀÇ º¯¼ö¿¡ ±íÀº º¹»ç¸¦ ÇÑ´Ù. ÇÊ¿äÇÑ ½½·ÔÀÇ °³¼ö¸¸Å­ FT_Slot ¹è¿­À» ¼±¾ðÇÏ°í ±Û¸®ÇÁ¸¦ ÀÐÀ» ¶§¸¶´Ù ¹é¾÷À» ÇÑ ÈÄ ´ÙÀ½ Ãâ·ÂÇÒ ¶§´Â ¹é¾÷ÇØ µÐ ½½·ÔÀ» ÀÐÀ¸¸é µÉ °ÍÀÌ´Ù. »çº»À¸·Î ÀÛ¼ºµÈ ±Û¸®ÇÁ´Â ÆäÀ̽º¿Í´Â º°µµÀÇ °´Ã¼À̹ǷΠ´Ù »ç¿ëÇÑ ÈÄ FT_Done_Glyph ÇÔ¼ö·Î ÇØÁ¦ÇØ¾ß ÇÑ´Ù. ºñÆ®¸ÊÀ̳ª Æнº·Î º¯È¯±îÁö ÇØ ³õÀ¸¸é ¼Óµµ´Â ´õ ±ØÀûÀ¸·Î Çâ»óµÇ¾î ¿î¿µÃ¼Á¦¿Í ¸Â¯À» ¶ã ¼öµµ ÀÖ´Ù.

°³º° ±ÛÀÚµéÀÇ ±Û¸®ÇÁ¸¦ ¸ðµÎ ¹é¾÷ÇØ µÎ·Á¸é ¾öû³­ ¸Þ¸ð¸®°¡ ¼Ò¸ðµÉ °ÍÀÌ´Ù. ±×·¡¼­ Á¤¹ÐÇÏ°íµµ ¼¶¼¼ÇÑ ¸Þ¸ð¸® °ü¸® ±â¼úÀÌ ÇÊ¿äÇÑ °ÍÀÌ¸ç ¹é¾÷À̶ó´Â ¿ë¾î ´ë½Å ij½ÌÀ̶ó´Â ¸ÚÁø À̸§À» ºÙ¿© ÁÖ´Â °ÍÀÌ´Ù. Áߺ¹µÇ´Â ¹®ÀÚ´Â ´Ù½Ã ¹é¾÷ÇÒ ÇÊ¿ä°¡ ¾ø°í ÆùÆ®¿¡ ÀÌ¹Ì ºñÆ®¸ÊÀÌ Á¦°øµÇ´Â ¹®ÀÚµµ ¹é¾÷ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. »ç¿ëÇÑÁö ¿À·¡µÈ ¹®ÀÚ´Â ¸Þ¸ð¸®¸¦ ºñ¿ö Àû´çÇÑ ¼öÁØÀÇ °ü¸®µµ ÇØ¾ß ÇÏ¸ç ºñÆ®¸Êµµ ³¯Æ÷¸ËÀ¸·Î ÀúÀåÇÏÁö ¸»°í ¾ÐÃàÇؼ­ ÀúÀåÇϸé ÈξÀ ´õ ¸Þ¸ð¸®¸¦ Àý¾àÇÒ ¼ö ÀÖ´Ù.

ÀÌ °­Á¿¡¼­´Â ij½ÌÀÇ Çʿ伺°ú ´ë·«ÀÇ ¾Ë°í¸®Áò¸¸ ¼³¸íÇÒ »Ó Ä£ÀýÇÑ ¿¹Á¦´Â Á¦°øÇÏÁö ¾Ê´Â´Ù. ¿Ö³ÄÇϸé ij½Ì ±â¹ýÀº ÀÀ¿ëÀÇ ¿µ¿ªÀÌÁö FreeType ¶óÀ̺귯¸® ÀÚü¿¡ ´ëÇÑ ±â¹ýÀÌ ¾Æ´Ï±â ¶§¹®ÀÌ´Ù. ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ »óȲ°ú ¿ëµµ¿¡ µû¶ó Àû´çÇÑ ¼öÁØÀÇ Ä³½Ì ¾Ë°í¸®ÁòÀ» Àû¿ëÇϱ⠹ٶõ´Ù.