임베디드 리눅스 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);

}



댓글

이 블로그의 인기 게시물

간단한 cfar 알고리즘에 대해

windows에서 간단하게 크롬캐스트(Chromecast)를 통해 윈도우 화면 미러링 방법

쉽게 설명한 파티클 필터(particle filter) 동작 원리와 예제

base64 인코딩 디코딩 예제 c 소스

간단한 칼만 필터(Kalman Filter) 소스 코드와 사용 예제