임베디드 리눅스 freetype 라이브러리 사용 예제 c 코드
본 문서는 임베디드 리눅스에서 freetype 라이브러리 사용 방법 대해 기술한다.
임베디드 리눅스에서 트루타입 폰트를 사용하여 글을 화면에 써줄 때 효율적으로
사용할 수 있는 방법이 freetype 라이브러리를 사용하는 것이다.
빌드 방법은 압축파일내 docs 폴더의 INSTALL 문서를 참조하면 된다.
1. freetype 라이브러리 초기화
라이브러리 초기화 과정은 아래와 같다.
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H
FT_Library hftlib;
FT_Face hface;
FT_Error error = 0;
/* 라이브러리 초기화
*/
error = FT_Init_FreeType(&hftlib);
if(error != 0)
{
print("FT_Init_FreeType error %d
\r\n",error);
return error;
}
/*트루타입 폰트 파일을 사용하여 face를 생성한다.
*/
error = FT_New_Face(hftlib,"./ARIAL.TTF",0,&hface);
if(error != 0)
{
print("FT_New_Face error %d
\r\n",error);
FT_Done_FreeType(hftlib);
return error;
}
/* char map을 unicode로
*/
error = FT_Select_Charmap(hface , ft_encoding_unicode);
if(error)
{
print("[FT_Select_Charmap %d
\r\n",error);
FT_Done_Face(hface);
FT_Done_FreeType(hftlib);
return error;
}
/*freetype라이브러리 사용 후 아래 코드를 사용하여 리소스를
반환한다.
*/
FT_Done_Face(hface);
FT_Done_FreeType(hftlib);
2. 글자 코드로 글자 bitmap 가져오기
화면에 보여주고자 하는 text가 있을 경우 아래와 같은 방법으로 한 글자 마다
bitmap을 가져와 화면이 쓸 수 있다.
/*폰트 크기 설정
*/
error = FT_Set_Pixel_Sizes(hface, 0, font_h);
for(i = 0; i<text_size;i++)
{
FT_Glyph glyph = NULL;
FT_ULong code = text[i];
FT_GlyphSlot slot =
hface->glyph;
/* 글자 코드로 글리프 인덱스를 받아온다.
*/
FT_UInt glyph_index =
FT_Get_Char_Index(hface,code);
if(glyph_index == 0)
{
continue;
}
/* 글리프 인덱스로 글자 bitmap을 받아온다.
*/
error =
FT_Load_Glyph(hface,glyph_index,FT_LOAD_DEFAULT);
if ( error )
{
print("FT_Load_Glyph error %d
\r\n",error);
continue;
}
error =
FT_Get_Glyph(hface->glyph,&glyph);
if ( error )
{
print("Glyph error %d
\r\n",error);
continue;
}
error =
FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL,0, 1);
if(!error)
{
/* 글자 bitmap을 화면 x,y위치에 그린다.
*/
FT_BitmapGlyph bit =
(FT_BitmapGlyph)glyph;
draw_text_image(x + bit->left, y
+( font_h - bit->top),
bit->bitmap.buffer,
bit->bitmap.width,
bit->bitmap.rows,
color);
/* 다음 글자를 그리기 위해 그려진 글자 넓이 만큼 x좌표를
이동한다.
*/
x +=
(int)((double)slot->advance.x/64.0 + 0.5);
}
/* 사용한 글리프의 리소스를 반환한다.
*/
FT_Done_Glyph(glyph);
}
댓글
댓글 쓰기