5.Æ®·£½ºÆû

°¡.¿Ü°û¼± º¯Çü

¿Ü°û¼± ÆùÆ®ÀÇ ±Û¸®ÇÁ´Â ÃÖÁ¾ ÀåÄ¡·Î ¹Ù·Î Ãâ·ÂµÇ´Â °ÍÀÌ ¾Æ´Ï¶ó ·¡½ºÅͶóÀÌ¡ °úÁ¤À» °ÅÃÄ ºñÆ®¸ÊÀ¸·Î º¯È¯µÈ ÈÄ Ãâ·ÂµÈ´Ù. ·¡½ºÅͶóÀÌ¡Àº ¼öÇÐ ¿¬»êÀ» Àû¿ëÇÏ¿© EMÀÇ ÁÂÇ¥µéÀ» ½ÇÁ¦ ÀåÄ¡ÀÇ ÁÂÇ¥·Î º¯È¯ÇÏ´Â °úÁ¤Àε¥ ÀÌ Áß°£ °úÁ¤¿¡¼­ ¿©·¯ °¡Áö º¯ÇüÀ» ½ÃµµÇÏ¿© ±Û¸®ÇÁÀÇ ¸ð¾çÀ» ¿øÇϴ´ë·Î Á¶ÀÛÇÒ ¼ö ÀÖ´Ù. ¾î¶² 󸮵ç Áß°£ °úÁ¤ÀÌ ÀÖÀ¸¸é Á¶ÀÛÇÒ ¼ö ÀÖ´Â ±âȸ°¡ ºÎ¿©µÇ¸ç ±×·¡¼­ ÀϺη¯ Áß°£ °úÁ¤À» »ðÀÔÇϱ⵵ ÇÑ´Ù.

ÁÂÇ¥ Á¶ÀÛÀº ¿Ü°û¼± ÆùÆ®¿¡¼­¸¸ °¡´ÉÇÏ¸ç ºñÆ®¸Ê ÆùÆ®´Â ·¡½ºÅͶóÀÌ¡ÀÌ ¿Ï·áµÈ ÆùÆ®À̹ǷΠÁß°£ °úÁ¤ÀÌ ¾ø¾î ÀÌ·± Á¶ÀÛÀ» ÇÒ ¼ö ¾ø´Ù. ¾öû³ª°Ô º¹ÀâÇÑ ¼ö½ÄÀ» µ¿¿øÇÏÁö ¾Ê´õ¶óµµ ´Ü¼øÈ÷ °öÇÏ°í ´õÇϱ⸸ Çصµ ²Ï ½ò½òÇÑ È¿°ú¸¦ ³¾ ¼ö ÀÖ´Ù. FreeTypeÀº ´ÙÀ½°ú °°Àº ÁÂÇ¥ Á¶ÀÛ ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.

 

FT_EXPORT( void ) FT_Outline_Translate( const FT_Outline* outline, FT_Pos             xOffset, FT_Pos yOffset );

FT_EXPORT( void ) FT_Outline_Transform( const FT_Outline* outline, const FT_Matrix*   matrix );

 

Translate´Â ¿Ü°û¼± ÆùÆ®ÀÇ ÁÂÇ¥¿¡ xOffset, yOffsetÀ» ´õÇØ ±Û¸®ÇÁ¸¦ ¼öÆò À̵¿½ÃŲ´Ù. Á¶±Ý ´õ ¾Æ·¡ÂÊÀ¸·Î ±Û²ÃÀ» ¿Å±â°í ½Í´Ù°Å³ª À§Ã·ÀÚ, ¾Æ·¡Ã·ÀÚ Ã³·³ º£À̽º¸¦ Á¶ÀÛÇÏ°í ½ÍÀ» ¶§ ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. ÇѱÛ, ¿µ¹®, ÀÏ¾î µîÀÇ ¿©·¯ ¾ð¾î°¡ ¼¯¿© ÀÖÀ» ¶§ º£À̽º°¡ ¸ÂÁö ¾Ê´Â °æ¿ì°¡ °¡²û Àִµ¥ ÀÌ·² ¶§ º£À̽º¸¦ ¸ÂÃß±â À§ÇØ ÇÊ¿äÇÏ´Ù. ÇÔ¼ö°¡ Á÷°üÀûÀÌ°í È¿°úµµ »ó½ÄÀûÀ̹ǷΠÀÌ ÇÔ¼ö¿¡ ´ëÇؼ­´Â µû·Î ¿¹Á¦¸¦ ¸¸µé¾î º¼ ÇÊ¿ä°¡ ¾øÀ» °ÍÀÌ´Ù.

TransformÀº ¿Ü°û¼± ÁÂÇ¥¿¡ Çà·Ä½ÄÀ» °öÇØ ¿ÏÀüÈ÷ »õ·Î¿î ÁÂÇ¥·Î À̵¿½ÃŲ´Ù. Translate°¡ µ¡¼À, »¬¼ÀÀ» Çϴµ¥ ºñÇØ TransformÀº °ö¼À, ³ª´°¼ÀÀ» ÇÑ´Ù´Â Á¡¿¡¼­ È°¿ëµµ°¡ ´õ ³ô´Ù. °°Àº ¹æÇâÀÌ ¾Æ´Ñ ¹Ý´ëÃàÀÇ °ªÀ» °öÇÑ ÈÄ ´õÇÒ ¼ö À־ ´Ù¾çÇÑ È¿°ú¸¦ ³¾ ¼ö ÀÖ´Ù. Àμö·Î Àü´Þ¹Þ´Â FT_Matrix´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù.

 

typedef struct  FT_Matrix_

  {

    FT_Fixed  xx, xy;

    FT_Fixed  yx, yy;

 

  } FT_Matrix;

 

4°³ÀÇ ¸â¹ö¸¦ °¡Áö´Âµ¥ °¢ ¸â¹ö´Â Çà·Ä½ÄÀÇ °è¼ö·Î »ç¿ëµÈ´Ù. 16.16 Æ÷¸ËÀ̹ǷΠ¼Ò¼öÁ¡ ÀÌÇÏÀÇ Á¤¹ÐÇÑ °ªµµ Ç¥ÇöÇÒ ¼ö ÀÖ´Ù. ÀÌ Çà·Ä¿¡ ÀÇÇØ ¿ø·¡ ÁÂÇ¥ (x, y)¿¡ ´ëÇØ »õ·Î¿î ÁÂÇ¥ (x', y')°¡ °è»êµÈ´Ù. Çà·Ä½ÄÀ» ¹æÁ¤½ÄÀ¸·Î Ç®¾î º¸¸é ´ÙÀ½°ú °°´Ù.

 

x' = x*xx + y*xy                                            

y' = x*yx + y*yy

 

¿ø·¡ÀÇ x, y¿¡ Çà·Ä½ÄÀÇ °è¼ö¸¦ °öÇÏ¿© »õ ÁÂÇ¥¸¦ °áÁ¤Çϴµ¥ °è¼ö°¡ ¾î¶² °ªÀ» °¡Áö´Â°¡¿¡ µû¶ó »õ ÁÂÇ¥°¡ ÀüÇô ´Ù¸¥ °÷À¸·Î °áÁ¤µÊÀ¸·Î½á º¯È¯ È¿°ú°¡ ¹ß»ýÇÑ´Ù. ÀÌ·± ·ùÀÇ Çà·Ä½ÄÀº GDI¿¡µµ ÀÖ°í GDI+¿¡µµ À־ ÀÌ¹Ì Àͼ÷ÇÒ °ÍÀ̹ǷΠ»ó¼¼ÇÑ ¼öÇÐÀû ¼³¸íÀº »ý·«ÇÏ°í ¿¹Á¦¸¦ ¹Ù·Î ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ.

 

¿¹ Á¦ : Transform

#include <math.h>

void DrawGlyph(HDC hdc,int bx, int by, FT_Face face)

{

     int x, y;

     int Color;

     int width, height;

     width=face->glyph->bitmap.width;

     height=face->glyph->bitmap.rows;

 

     for (y=0;y<height;y++) {

          for (x=0;x<width;x++) {

              Color=255-face->glyph->bitmap.buffer[y*width+x];

              if (Color != 255) {

                   SetPixelV(hdc,bx+face->glyph->bitmap_left+x,

                        by-face->glyph->bitmap_top+y,RGB(Color,Color,Color));

              }

          }

     }

}

 

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, 64 * 64, 0,

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

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

 

     // ´ÜÀ§ Çà·Ä·Î Á¤ÀÇ

     FT_Matrix matrix = { 0x10000,0x00000,0x00000,0x10000 };

 

     FT_Load_Glyph(face,index,FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP);

     FT_Outline_Transform( &face->glyph->outline, &matrix );

     FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);

     DrawGlyph(hdc,200,200,face);

 

     FT_Done_Face(face);

}

 

ÆäÀ̽º¿¡¼­ ±ÛÀÚ Çϳª¸¦ Àоî Ãâ·ÂÇÏ´Â ÄÚµåÀε¥ ¿©·¯ ¹ø ½Ç½ÀÇØ ºÃÀ¸¹Ç·Î ÀÌÁ¦´Â ¾ÆÁÖ Ä£¼÷ÇÏ°Ô ´À²¸Áú °ÍÀÌ´Ù. ÆäÀ̽º ·ÎµåÇÏ°í ±Û¸®ÇÁÀÇ ¼ø¼­°ª ã¾Æ ·ÎµåÇÑ ÈÄ ºñÆ®¸ÊÀ¸·Î ·£´õ¸µÇÏ¿© È­¸éÀ¸·Î Ãâ·ÂÇß´Ù. ´Ù¸¸ ·£´õ¸µÀ» Çϱâ Àü¿¡ Transform ÇÔ¼ö È£Ãâ¹®ÀÌ µé¾î°¬´Ù´Â Á¡¸¸ ´Ù¸¥µ¥ ÀÌ ÇÔ¼ö·Î Àü´ÞµÈ Çà·Ä¿¡ µû¶ó º¯È¯ È¿°ú°¡ ³ªÅ¸³­´Ù.

À§ ¿¹Á¦¿¡¼­ Àü´ÞµÈ Çà·ÄÀº ´ë°¢¼± ¹æÇ⸸ 1ÀÎ ´ÜÀ§ Çà·ÄÀÌ´Ù. Çà·ÄÀÇ ¸â¹öµéÀº 16.16 Æ÷¸ËÀ̹ǷΠ65536, 16Áø¼ö·Î 0x10000ÀÌ °ð 1À» ÀǹÌÇÑ´Ù. ¹æÁ¤½ÄÀ¸·Î Ç®¾îº¸¸é x'=x, y'=y°¡ µÇ¾î °á±¹ ¿ø·¡ ÁÂÇ¥¸¦ ±×´ë·Î À¯ÁöÇÏ´Â ¼ÀÀÌ´Ù. ´ÜÀ§ Çà·ÄÀ̶õ µ¡¼ÀÀÇ 0, °ö¼ÀÀÇ 1ó·³ ¿¬»êÇØ ºÁ¾ß ¿ø·¡°ªÀÌ µÇ´Â ±âº»°ªÀÌ´Ù. Áï, ÀÌ ¿¹Á¦ÀÇ °æ¿ì TransformÀ» ÇÏÁö ¾ÊÀº °Í°ú È¿°ú°¡ °°¾Æ¼­ ±Û¸®ÇÁ°¡ ÁöÁ¤ÇÑ À§Ä¡¿¡ ÁöÁ¤ÇÑ Å©±â´ë·Î ³ªÅ¸³­´Ù.

±×·¯³ª Transform È£Ãâ ÀÌÀü¿¡ Çà·ÄÀ» Á¶ÀÛÇÏ¸é ¿Ü°û¼±ÀÇ ÁÂÇ¥°¡ Çà·Ä½Ä´ë·Î Á¶À۵Ǿî Ãâ·Â °á°ú°¡ ¹Ù²ï´Ù. Çà·Ä ¼±¾ð Á÷ÈÄ¿¡ ´ÙÀ½ ´ëÀÔ¹®À» ÀÛ¼ºÇØ º¸ÀÚ.

 

matrix.xx = 0x20000;

matrix.yy = 0x20000;

 

xx¿Í yy¸¦ 2.0À¸·Î ¼öÁ¤ÇßÀ¸¹Ç·Î »õ ÁÂÇ¥´Â ´ÙÀ½ ¹æÁ¤½Ä¿¡ ÀÇÇØ °áÁ¤µÈ´Ù.

 

x' = 2 * x;

y' = 2 * y;

 

¿ø·¡ÀÇ ¿Ü°û¼± ÁÂÇ¥¿¡ ¸ðµÎ 2°¡ °öÇØÁö¹Ç·Î ±Û¸®ÇÁ°¡ 2¹è·Î Ä¿Áø´Ù. (10,10)Àº (20,20)À¸·Î °¡°í (100,200)Àº (200,400)À¸·Î À̵¿ÇÑ´Ù. ·¡½ºÅͶóÀÌ¡Çϱâ ÀüÀÇ ¿Ü°û¼± ÁÂÇ¥¸¦ Á¶ÀÛÇÑ °ÍÀ̹ǷΠ°á°ú·Î ¸¸µé¾îÁø ºñÆ®¸Ê¿¡ °è´Ü Çö»ó µûÀ§´Â ¹ß»ýÇÏÁö ¾ÊÀ¸¸ç ±ò²ûÇÏ°Ô Ãâ·ÂµÈ´Ù.

64Æ÷ÀÎÆ®ÀÇ ±Û¸®ÇÁ¸¦ 2¹è È®´ëÇßÀ¸¹Ç·Î 128Æ÷ÀÎÆ®·Î Ãâ·ÂÇÑ °Í°ú ºñ½ÁÇÏ´Ù. ±×·¯³ª ÈùÆÃÀÌ Æ®·£½ºÆû°ú º°µµ·Î ¼öÇàµÇ±â ¶§¹®¿¡ ¿ÏÀüÈ÷ °°Áö´Â ¾ÊÀ¸¸ç ¾ÆÁÖ ¹Ì¼¼ÇÏ°Ô Æ²¸° Á¡ÀÌ ÀÖ´Ù. ´ÙÀ½Àº ÇÑÂÊ ¹æÇ⸸ È®´ëÇØ º¸ÀÚ.

 

matrix.xx = 0x50000;

matrix.yy = 0x10000;

 

x'¸¸ 5¹è µÇ¹Ç·Î ¼öÆòÀ¸·Î ´Ù¼¸¹è ¶×¶×ÇØÁø ±ÛÀÚ°¡ Ãâ·ÂµÉ °ÍÀÌ´Ù. ±ÛÀÚ¿¡ ÀåÆòÀ» Àû¿ëÇß´Ù°í º¸¸é µÈ´Ù.

Çà·ÄÀÇ ¸â¹ö°¡ ¼Ò¼öÁ¡ ÀÌÇϵµ Ç¥ÇöÇÒ ¼ö ÀÖÀ¸¹Ç·Î 1.0º¸´Ù ÀÛÀº °ªÀ» ÁÖ¸é Ãà¼Òµµ °¡´ÉÇÏ´Ù.

 

matrix.xx = 0x08000;

 

0x8000Àº ½ÊÁø¼ö 32768À̸ç 16.16 Æ÷¸ËÀ¸·Î´Â 0.5¿¡ ÇØ´çÇÑ´Ù. ¼öÆò ÁÂÇ¥¸¦ Àý¹ÝÀ¸·Î 50% ¼¼ÀÏÇؼ­ Àû¿ëÇϹǷΠȦÂßÇÑ ±ÛÀÚ°¡ Ãâ·ÂµÉ °ÍÀÌ´Ù. xx°¡ ÀÛ¾ÆÁú ¼ö·Ï ±Û¸®ÇÁ´Â ´õ¿í ´õ ³¯¾ÀÇÏ°Ô Ãâ·ÂµÈ´Ù.

À½¼öµµ ¹°·Ð Àû¿ëÇÒ ¼ö ÀÖ´Ù. matrix.xx = -0x10000;À¸·Î ´ëÀÔÇÏ¸é ¼öÆò ÁÂÇ¥ÀÇ ºÎÈ£°¡ ¹Ù²î¹Ç·Î ±ÛÀÚ°¡ °Å¿ï¿¡ ¹Ý»çµÈ ¸ð¾çÀ¸·Î Ãâ·ÂµÈ´Ù. yyÀÇ ºÎÈ£¸¦ µÚÁýÀ¸¸é ¼öÁ÷À¸·Î ¹Ý»çµÈ ±ÛÀÚµµ ¹°·Ð ¸¸µé ¼ö ÀÖ´Ù.

´ÙÀ½Àº Á¶±Ý ´õ º¹ÀâÇÑ ¿¹¸¦ º¸ÀÚ. ¿ø·¡ ÁÂÇ¥ÀÇ ¹Ý´ëÃàÀ» ¿¬»ê¿¡ Àû¿ëÇϸé Á» ´õ ±ØÀûÀÎ È¿°ú°¡ ³ªÅ¸³­´Ù.

 

matrix.xy = 0x06000;

 

xy¸¸ 0x6000À¸·Î ´ëÀÔÇߴµ¥ ½Ç¼ö·Î ¹Ù²Ù¸é 0.375°¡ µÈ´Ù. ÀÌ °ªÀ» ¹æÁ¤½Ä¿¡ Àû¿ëÇÏ¸é ´ÙÀ½ µÎ °³ÀÇ ¼ö½ÄÀÌ »ý¼ºµÈ´Ù.

 

x' = x + 0.375 * y

y' = y

 

yÃàÀº ¿ø·¡°ªÀ» ±×´ë·Î °¡ÁöµÇ xÃàÀº y¿¡ ÀÏÁ¤ÇÑ °ªÀ» °öÇØ º£À̽º¶óÀο¡¼­ À§·Î ¿Ã¶ó°¥¼ö·Ï ¿ø·¡°ªº¸´Ù ´õ Ä¿Áø´Ù. ¼öÁ÷ À§Ä¡¿¡ µû¶ó xÀÇ »õ ÁÂÇ¥°¡ ÀÏÁ¤ ºñÀ²·Î À̵¿ÇÔÀ¸·Î½á ±â¿ï¾îÁø ¹®ÀÚ°¡ ¸¸µé¾îÁø´Ù. 0x6000ÀÌ Ä¿Áö¸é ±â¿ï¾îÁö´Â Á¤µµ°¡ ´õ ½ÉÇØÁø´Ù. º¸Åë ¸ð¾çÀÇ ÆäÀ̽º¿¡ ÀÌÅŸ¯ ½ºÅ¸ÀÏÀ» ÁÙ ¶§ ÀÌ ¹æ¹ýÀ» »ç¿ëÇÑ´Ù.

°í¼öÁØ ¹®ÀÚ¿­ Ãâ·Â ÇÔ¼ö¿¡ ºñÇØ ±â¿ï¾îÁö´Â Á¤µµ³ª ¹æÇâÀ» Á¤¹ÐÇÏ°Ô Á¶Á¤ÇÒ ¼ö ÀÖ´Ù´Â Á¡ÀÌ ´Ù¸£´Ù. ´ÙÀ½Àº °¡Àå º¹ÀâÇÑ È¸ÀüÀÇ ¿¹¸¦ º¸ÀÚ. ȸÀüÀº ¼±ÇüÀûÀÎ º¯È¯ÀÌ ¾Æ´Ï¾î¼­ »ï°¢ÇÔ¼ö¸¦ µ¿¿øÇØ¾ß ÇÑ´Ù.

 

double angle=(45.0/360)*3.14159*2;

matrix.xx = (FT_Fixed)(cos(angle)*0x10000);

matrix.xy = (FT_Fixed)(-sin(angle)*0x10000);

matrix.yx = (FT_Fixed)(sin(angle)*0x10000);

matrix.yy = (FT_Fixed)(cos(angle)*0x10000);

 

¿øÇÏ´Â °¢µµ¸¸Å­ sin, cosÀ» Àû¿ëÇϸé ÀÌ °¢µµ¸¸Å­ ±â¿ï¾îÁø ÇüÅ·Π±Û¸®ÇÁ°¡ Ãâ·ÂµÈ´Ù. sin, cos »ï°¢ÇÔ¼ö´Â °¢µµ°¡ ¾Æ´Ñ ¶óµð¾ÈÀ» ¿ä±¸ÇϹǷΠ°¢µµ¸¦ ¶óµð¾ÈÀ¸·Î ¹Ù²ã¼­ Àü´ÞÇß´Ù.

°©Àڱ⠻ﰢÇÔ¼ö°¡ µîÀåÇؼ­ Á» ´çȲ½º·¯¿ïÁö ¸ð¸£°Ú´Âµ¥ À§ ¼ö½ÄÀº ÁßÇб³ ¼öÇÐ ¼öÁØ¿¡¼­µµ ¼³¸í °¡´ÉÇÑ ½¬¿î ¼ö½ÄÀÌ´Ù.

³ª.½ºÅ¸ÀÏ Àû¿ë

Transform ÇÔ¼ö¸¦ »ç¿ëÇϸé À̵¿À̳ª È®´ë, ±â¿ïÀ̱⠵îÀÇ º¯ÇüÀ» ÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ÀÌ ÇÔ¼ö´Â ÁÂÇ¥¸¸ Á¶ÀÛÇÒ ¼ö ÀÖÀ¸¹Ç·Î ÁÂÇ¥¿Í Á÷Á¢ÀûÀÎ ¿¬°üÀÌ ¾ø´Â ½ºÅ¸ÀÏÀ» Àû¿ëÇϴµ¥´Â ÇÑ°è°¡ ÀÖ´Ù. ´ëÇ¥ÀûÀÎ ¿¹°¡ ȹÀÇ ±½±â¸¦ º¯ÇüÇÏ´Â °ÍÀÌ´Ù. Æ®·çŸÀÔÀÇ È¹Àº Æó°î¼±À¸·Î Á¤ÀǵǾî ÀÖ¾î ¹Ù±ùÂÊÀ¸·Î¸¸ ÁÂÇ¥¸¦ À̵¿½ÃÄÑ¾ß Çϴµ¥ ¾î´ÀÂÊÀÌ ¹Ù±ùÂÊÀÌ°í ¾î´ÀÂÊÀÌ ¾ÈÂÊÀÎÁö¸¦ ÁÂÇ¥¸¸À¸·Î´Â ÆǺ°ÇÒ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. ±×·¡¼­ FreeTypeÀº ±½±â¸¦ Á¶Á¤ÇÏ´Â º°µµÀÇ º¯È¯ ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.

 

FT_EXPORT( FT_Error ) FT_Outline_Embolden( FT_Outline* outline, FT_Pos strength );

 

±½±â¿¡ Àû¿ëÇÒ °­µµ°ªÀ» Àü´ÞÇϸé ÀÌ °­µµ¸¸Å­ ȹÀ» ´õ ±½°Ô ¸¸µé¾îÁØ´Ù. °­µµ°ªÀº 26.6Æ÷¸ËÀ̹ǷΠ¼Ò¼öÁ¡ ´ÜÀ§·Î ¼¶¼¼ÇÏ°Ô ÁöÁ¤ÇÒ ¼ö ÀÖÀ¸¸ç À½¼ö¸¦ ÁÖ¾î ´õ °¡´Ã°Ô ±×¸®´Â °Íµµ °¡´ÉÇÏ´Ù. °£´ÜÇÏ°Ô ¿¹Á¦¸¦ ¸¸µé¾î º¸ÀÚ.

 

¿¹ Á¦ : ApplyStyle

void DrawGlyph(HDC hdc,int bx, int by, FT_Face face)

{

     int x, y;

     int Color;

     int width, height;

     width=face->glyph->bitmap.width;

     height=face->glyph->bitmap.rows;

 

     for (y=0;y<height;y++) {

          for (x=0;x<width;x++) {

              Color=255-face->glyph->bitmap.buffer[y*width+x];

              if (Color != 255) {

                   SetPixelV(hdc,bx+face->glyph->bitmap_left+x,

                        by-face->glyph->bitmap_top+y,RGB(Color,Color,Color));

              }

          }

     }

}

 

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, 128 * 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_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);

     DrawGlyph(hdc,0,200,face);

 

     // º¼µå Àû¿ë - 5% ´õ µÎ²®°Ô

     FT_Load_Glyph(face,index,FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP);

     FT_Outline_Embolden( &face->glyph->outline, (face->size->metrics.x_ppem*5/100)*64);

     FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);

     DrawGlyph(hdc,200,200,face);

 

     // ÀÌÅŸ¯ Àû¿ë - 12µµ ±â¿ïÀÓ

     FT_Load_Glyph(face,index,FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP);

     FT_Matrix transform = {0x10000, 0x06000, 0x00000, 0x10000};

     FT_Outline_Transform( &face->glyph->outline, &transform );

     FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);

     DrawGlyph(hdc,400,200,face);

 

     // ¹ØÁÙ Àû¿ë

     FT_Load_Glyph(face,index,FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP);

     FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);

     DrawGlyph(hdc,600,200,face);

 

     int underpos=face->underline_position*face->size->metrics.x_ppem/face->units_per_EM;

     int underthick=face->underline_thickness*face->size->metrics.x_ppem/face->units_per_EM;

     HPEN hPen,hOldPen;

     hPen=CreatePen(PS_SOLID,underthick,RGB(0,0,255));

     hOldPen=(HPEN)SelectObject(hdc,hPen);

     MoveToEx(hdc,600+(face->glyph->bitmap_left),200-underpos,NULL);

     LineTo(hdc,600+(face->glyph->metrics.width >> 6),200-underpos);

 

     FT_Done_Face(face);

}

 

128Æ÷ÀÎÆ® Å©±â·Î "°¡" ±Û¸®ÇÁ¸¦ Ãâ·ÂÇ쵂 º¸Åë ¸ð¾ç, º¼µå, ÀÌÅŸ¯, ¹ØÁÙÀ» Àû¿ëÇØ º¸¾Ò´Ù. ½ÇÇà °á°ú´Â ´ÙÀ½°ú °°´Ù.

¹ØÁÙÀº Á÷Á¢ ¼±À» ±×¾î¾ß ÇÑ´Ù. face¿¡ ¹ØÁÙÀÇ À§Ä¡¿Í ±½±â¿¡ ´ëÇÑ ¸ÞÆ®¸¯½º°¡ ÀÖÀ¸¹Ç·Î ÀÌ °ªÀ» ÀÐ¾î °è»êµÈ À§Ä¡¿¡ ¼±¸¸ ±×À¸¸é µÈ´Ù. ¹ØÁÙÀÇ À§Ä¡¿Í ±½±â´Â ÆùÆ® À¯´ÖÀ¸·Î ±â·ÏµÇ¾î ÀÖÀ¸¹Ç·Î Çȼ¿ ´ÜÀ§·Î ¹Ù²Ù¾î Àû¿ëÇß´Ù. ¹ØÁÙÀº Åë»ó ±ÛÀÚÀÇ »ö»ó°ú °°Àº »öÀ¸·Î ±ß´Â °ÍÀÌ º¸ÅëÀÌÁö¸¸ ¿¹Á¦¿¡¼­´Â ±Û¸®ÇÁ¿Í º°µµ·Î ±×·ÁÁø °ÍÀÓÀ» °­Á¶Çϱâ À§ÇØ ÆĶõ»öÀ¸·Î Ãâ·ÂÇØ º¸¾Ò´Ù.

°í¼öÁØ ÅؽºÆ® Ãâ·Â ÇÔ¼ö¿¡¼­´Â ¹ØÁÙÀÌ ±ÛÀÚ¿Í °°ÀÌ Ãâ·ÂµÇ¹Ç·Î ¸¶Ä¡ ±Û¸®ÇÁ¿¡ ¹ØÁÙÀÌ ¹Ì¸® Æ÷ÇÔµÈ °Íó·³ º¸ÀÌÁö¸¸ Àú¼öÁØ¿¡¼­´Â ¹ØÁÙµµ Á÷Á¢ ±×¾î¾ß ÇÑ´Ù. ¿Ö ÀÌ·¸°Ô µÇ¾î Àִ°¡ ÇÏ¸é ¹ØÁÙÀ̶õ ±Û¸®ÇÁ Çϳª¿¡ ¼Ò¼ÓµÈ´Ù±âº¸´Ù´Â ÁÖº¯ÀÇ ÅؽºÆ®¿¡ ÇѲ¨¹ø¿¡ Àû¿ëµÇ´Â ½ºÅ¸ÀÏÀ̱⠶§¹®ÀÌ´Ù. ³ôÀÌ°¡ ´Ù¸¥ ¹®ÀÚµéÀ̳ª ÀÚ°£ÀÌ ¹ú¾îÁø »óÅ¿¡¼­µµ µ¿ÀÏÇÑ ±½±â·Î ²÷¾îÁü¾øÀÌ ±×¾î¾ß ÇϹǷΠ±Û¸®ÇÁ¿¡ ¼Ò¼ÓµÇ¾î¼­´Â ¾ÈµÈ´Ù.

ÀÌ ¿¹Á¦ÀÇ Äڵ带 Àß ÀÀ¿ëÇÏ¸é °í¼öÁØ ÇÔ¼ö¿¡¼­´Â ±¸ÇöÇÒ ¼ö ¾ø´Â Ä¿½ºÅÒ ½ºÅ¸ÀÏÀ» Àû¿ëÇÒ ¼öµµ ÀÖ´Ù. ±½±âÀÇ Á¤µµ³ª ±â¿ïÀÓ °¢µµ¸¦ ¿øÇϴ´ë·Î Á¶Á¤ÇÒ ¼ö ÀÖÀ¸¸ç ¹ØÁÙÀÇ »ö»óÀ̳ª °³¼ö, ½ÉÁö¾î ¹ØÁÙÀÇ ¸ð¾ç±îÁöµµ ¸¶À½´ë·Î ±×¸± ¼ö ÀÖ´Ù. ÀÌÁß ¹ØÁÙÀº ¹°·ÐÀÌ°í ¹°°áÄ¡´Â ¸ð¾çÀÇ ¹ØÁÙµµ °¡´ÉÇÏ´Ù. ¿ª½Ã Àú¼öÁØÀ̶ó ÀÀ¿ëÀÇ ¹¦¹Ì°¡ ÀÖ´Ù. ±×·¯³ª ¾ÈŸ±õ°Ôµµ FreeTypeÀÇ Bold 󸮿¡ ¾à°£ÀÇ ¹®Á¦°¡ ÀÖÀ½ÀÌ ¹ß°ßµÇ¾ú´Ù. "°¡"ó·³ °£´ÜÇÑ ±ÛÀÚ´Â Àß µ¿ÀÛÇÏÁö¸¸ "ÇÑ"À̳ª "¿µ"ó·³ Á¶±Ý º¹ÀâÇÑ ±ÛÀÚ´Â °á°ú°¡ Á¶±Ý ÀÌ»óÇÏ´Ù.

¤¾ÀÇ µ¿±×¶ó¹Ì°¡ ±½¾îÁø°Ô ¾Æ´Ï¶ó ¿ÀÈ÷·Á ¾ã¾ÆÁ® ¹ö·È´Ù. ÀÌ ¹®Á¦´Â Æó°î¼±ÀÇ ¾ÈÂÊ°ú ¹Ù±ùÂÊÀ» ¿ÀÆÇÇÏ¿© »ý±ä °Í °°´Ù. ÆäÀ̽º¿¡ ¹®Á¦°¡ Àְųª ¾Æ´Ï¸é FreeType¿¡ ¹®Á¦°¡ Àְųª µÑÁß ÇϳªÀε¥ ¾Æ¹«·¡µµ FreeTypeÂÊÀÇ ¹ö±×°¡ ¾Æ´Ñ°¡ »ý°¢µÈ´Ù. ¿µ¹® ÆùÆ®´Â ¸ðµÎ Á¤»ó µ¿ÀÛÇϸç ÇÑ±Û ÆùÆ®µµ ¹ÙÅÁ°ú ±¼¸²Àº Á¦´ë·Î µÇÁö¸¸ ±Ã¼­¿Í µ¸¿òÀº ¹®Á¦°¡ ÀÖ¾ú´Ù.

¿ª½Ã ±¹»ê ¶óÀ̺귯¸®°¡ ¾Æ´Ï´Ù º¸´Ï ÇÑ±Û ÆùÆ®¿¡ ´ëÇؼ­´Â Á¦´ë·Î Å×½ºÆ®°¡ µÇÁö ¸øÇÑ °Í °°´Ù. ¿¹Á¦ ÀÛ¼ºÀÚ°¡ Àá½Ã ±ô¹Ú Á¹¾Æ¼­ ¹º°¡ ²À ÇÊ¿äÇÑ Ã³¸®¸¦ »© ¸Ô¾úÀ» °¡´É¼ºµµ ÀÖ±â´Â ÇÏÁö¸¸ Äڵ尡 ¿ö³« °£´ÜÇØ È®·üÀº ³ôÁö ¾Ê´Ù. ¾î¶² ¶óÀ̺귯¸®³ª »ç¼ÒÇÑ ¹ö±×´Â Àֱ⠸¶·ÃÀ̹ǷΠ¹ö±×¸¦ ÇÇÇØ »ç¿ëÇÏ´Â ¼ö¹Û¿¡ ¾ø´Ù. FreeTypeÀÇ ¹öÀüÀÌ ¿Ã¶ó°¡¸é ÇØ°áµÉ °ÍÀÌ´Ù.

´Ù.±â¿ï¾îÁø ¹®ÀÚ¿­

´ÙÀ½ ¿¹Á¦´Â º¯ÇüÀÇ ¶Ç ´Ù¸¥ ¿¹·Î °³º° ±Û¸®ÇÁ°¡ ¾Æ´Ñ ¹®ÀÚ¿­À» Åë°·Î ±â¿ï¿©¼­ Ãâ·ÂÇÑ´Ù. FreeType Æ©Å丮¾ó¿¡ ÀÖ´Â ¿¹Á¦¸¦ À籸¼ºÇÑ °ÍÀε¥ ³­À̵µ¿¡ ºñÇØ ½Ç¿ë¼ºÀº ¶³¾îÁö¹Ç·Î ±¸°æ¸¸ ÇØ º¸ÀÚ.

 

¿¹ Á¦ : SkewString

#include <math.h>

void OnPaint(HDC hdc)

{

     FT_Face face;

     TCHAR str[]=TEXT("Skew String");

     int idx;

     int x, y;

     int Color;

     int width, height;

     FT_Matrix matrix;

     FT_Vector pen;

 

     pen.x=100*64;

     pen.y=(600-300)*64;

 

     FT_New_Face(library,"c:\\windows\\fonts\\times.ttf",0,&face);

     FT_Set_Char_Size(face, 64 * 64, 0,

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

 

     double angle=(25.0/360)*3.14159*2;

     matrix.xx = (FT_Fixed)(cos(angle)*0x10000);

     matrix.xy = (FT_Fixed)(-sin(angle)*0x10000);

     matrix.yx = (FT_Fixed)(sin(angle)*0x10000);

     matrix.yy = (FT_Fixed)(cos(angle)*0x10000);

 

     for (idx=0;idx<lstrlen(str);idx++) {

          FT_Set_Transform(face,&matrix,&pen);

          FT_Load_Char(face,str[idx],FT_LOAD_RENDER);

 

          width=face->glyph->bitmap.width;

          height=face->glyph->bitmap.rows;

 

          for (y=0;y<height;y++) {

              for (x=0;x<width;x++) {

                   Color=255-face->glyph->bitmap.buffer[y*width+x];

                   if (Color != 255) {

                        SetPixel(hdc,face->glyph->bitmap_left+x,

                             600-face->glyph->bitmap_top+y,RGB(Color,Color,Color));

                   }

              }

          }

 

          pen.x += face->glyph->advance.x;

          pen.y += face->glyph->advance.y;

     }

 

     FT_Done_Face(face);

}

 

FT_Set_Transofrm ÇÔ¼ö´Â ±Û¸®ÇÁ¸¦ ·ÎµåÇϱâ Àü¿¡ È£ÃâÇÏ¸ç ±Û¸®ÇÁ°¡ ·ÎµåµÉ ¶§ º¯ÇüÀ» °¡ÇÑ´Ù. ±Û¸®ÇÁ°¡ Çà·Ä½Ä´ë·Î º¯ÇüµÇ¸ç ±× °á°ú advance ¸ÞÆ®¸¯½ºµµ °°ÀÌ º¯°æµÈ´Ù. ºñ½ºµëÇÏ°Ô ±â¿ï¾îÁö¸é ÁøÇàÆøµµ ¹Ù²î´Âµ¥ ÀÌ·± °è»êÀ» °°ÀÌ ¼öÇàÇÔÀ¸·Î½á ¿¬¼ÓÀûÀÎ ¹®ÀÚµéÀ» °°Àº °¢µµ·Î ±â¿ïÀÏ ¼ö ÀÖ´Â °ÍÀÌ´Ù. ½ÇÇà °á°ú´Â ´ÙÀ½°ú °°´Ù.

¹º°¡ Á» »ö´Þ¶ó º¸À̱â´Â ÇÏÁö¸¸ ½Ç¿ë¼ºÀº °ÅÀÇ ¾ø´Ù. ¿Ö³ÄÇϸé ÀÌ·± È¿°ú¸¦ ³»°í ½ÍÀ» ¶§ ¾µ ¼ö ÀÖ´Â °í¼öÁØÀÇ ´Ù¸¥ ±â¹ýµéÀÌ ¸¹ÀÌ Àֱ⠶§¹®ÀÌ´Ù. GDI+ÀÇ ¿ùµå ÁÂÇ¥ º¯È¯ ±â´ÉÀ» »ç¿ëÇϸé ÀϹÝÀûÀÎ ¹®ÀÚ¿­À» Ãâ·ÂÇصµ ±â¿ïÀÌÁö°í Âî±×·¯Áø ¹®ÀÚ¿­À» ¾ó¸¶µçÁö Ç¥ÇöÇÒ ¼ö ÀÖÀ¸¸ç ÈξÀ ´õ ±â´Éµµ ¸¹À» »Ó¸¸ ¾Æ´Ï¶ó »ç¿ëÇϱ⵵ ½±´Ù. °í¼öÁØ¿¡¼­ ÈǸ¢ÇÏ°Ô Á¦°øµÇ´Â ±â´ÉÀº ±»ÀÌ Àú¼öÁØÀ» µ¿¿øÇÒ ÇÊ¿ä°¡ ¾ø´Ù.