임베디드 리눅스 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)를 통해 윈도우 화면 미러링 방법

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

안드로이드(android) 전체 화면 시계 앱(clock app) 예제 코드

mkfs.fat Device or resource busy 에러 해결법