2014년 7월 1일 화요일

[일기] SDL 트루 타입 폰트 TTL(True Type Font) 튜토리얼 정리.

라이브러리가 또한 필요하다고 한다. 이것 만드는 사람 대단하다. 나도 그 중 한 명이 되고 싶은데 멀었다.

 http://www.libsdl.org/projects/SDL_ttf/

여기서 다운 받는다.

전에서와 마찬가지로 설정을 마치고......(dll 이동 및 lib 추가; 본인은 VS2012 사용...)

SDL_ttf 는 속도와 질의 Trade-off를 가지고 다양하게 텍스트를 렌더링할수 있는 방법을 몇 가지 제공한다고 한다. 가령, 유니코드, UTF-8, 글리프와 같은....

TTF_RenderText_Blended를 사용할 것이다.

SDL_Color로 텍스트의 색상도 지정할 수 있다.


불행하게도(?), SDL_ttf는 표면 즉, Surface에만 렌더링을 수행할 수 있다. 이에 문자를 출력하는 단계는 대략 다음과 같다.

 1. 렌더러 생성.
 2. 텍스트 생성.
 3. 텍스트로 표면 생성.
 4. 표면으로 텍스처 생성.
 5. 화면에 출력.

TTF_OpenFont로 사용할 폰트를 불러온다.

초기화는 TTF_Init()으로 하되 성공시 0을 리턴한다.

------------------------------------------------------------------------

위 단계를 하나로 밀집한 함수를 만든다.

DL_Texture* MY_RenderText(const std::string &msg, const std::string &fontFile,
  SDL_Color color, int fontSize, SDL_Renderer *ren){
TTF_Font *font = TTF_OpenFont(fontFile.c_str(), fontSize);
if(font == nullptr){
MY_LogSDLError(std::cout, "TTF_OpenFont");
return nullptr;
}

SDL_Surface* surf = TTF_RenderText_Blended(font, msg.c_str(), color);
if(surf == nullptr){
TTF_CloseFont(font);
MY_LogSDLError(std::cout, "TTF_RenderText");
return nullptr;
}

SDL_Texture* tex = SDL_CreateTextureFromSurface(ren, surf);
if(tex == nullptr) {
MY_LogSDLError(std::cout, "CreateTexture");
}

SDL_FreeSurface(surf);
TTF_CloseFont(font);
return tex;
}

이를 이용해서 출력을 시도해 본다.

int recordTutorialFour(int argc, char* argv[]){

if( TTF_Init() != 0 ){
MY_LogSDLError(std::cout, "TTF_Init");
return 1;
}

SDL_Init(SDL_INIT_EVERYTHING);

SDL_Window* win = SDL_CreateWindow("Font", 0, 0, WIDTH_OF_SCREEN, HEIGHT_OF_SCREEN, SDL_WINDOW_SHOWN);
SDL_Renderer *ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);


const std::string resPath = getResourcePath();

SDL_Color color = { 255, 255, 255, 255 };
SDL_Texture *image = MY_RenderText("TTF fonts are cool!", resPath + "sample.ttf",
color, 64, ren);
if (image == nullptr){
return 1;
}

int iW, iH;
SDL_QueryTexture(image, NULL, NULL, &iW, &iH);
int x = WIDTH_OF_SCREEN / 2 - iW / 2;
int y = HEIGHT_OF_SCREEN / 2 - iH / 2;


//Note: This is within the program's main loop
SDL_RenderClear(ren);
//We can draw our message as we do any other texture, since it's been
//rendered to a texture
MY_RenderTexture(image, ren, x, y);
SDL_RenderPresent(ren);

SDL_Delay(4000);

SDL_DestroyTexture(image);
SDL_DestroyRenderer(ren);
SDL_DestroyWindow(win);
SDL_Quit();
        TTF_Quit();

return 0;
}

int main(int argc, char* argv[]){

return recordTutorialFour(argc, argv);
}

sample.ttf는 훈하얀고양이R 폰트.


댓글 없음:

댓글 쓰기