본문 바로가기

내가 작업한 것들/소프트웨어

FLFTRender, freetype2 를 이용한 Fl_RGB_Image 에 글자 렌더링

Freetype2 에 대한 소개

 Freetype2 는 TTF 폰트를 사용할 수 없는 시스템에서 이를 사용하기 위한 좋은 선택일 수 있거나, 플랫폼에 상관 없이 TTF 가 가지는 정확한 렌더링을 얻어 내기 위한 용도 등 많은 활용도가 있는 오픈소스 라이브러리 입니다. 보통은 Linux 에서 이를 가장 많이 사용하고 있을 것이고, 일부 게임들에서도 TTF 를 통해 Texture 를 얻거나 할때 많이들 사용하는 것으로 알고 있습니다.

libfreetype2 + FLTK 활용

 libfreetype2 의 경우 대부분 Linux 에서는 기본적으로 설치 되거나, 어렵지 않게 패키지 매니저로 설치가 가능한 라이브러리 입니다만, Windows 에서는 M$ 가 만들어 놓은 비친화적인 OS와 개발환경의 차이 덕에 이런 걸 쓰기가 쉽지는 않다고 느껴 집니다. 사실 Windows 에서는 GDI 내에서 Bitmap 의 DC 를 통해 Truetype 글자체를 그리는 것이 어렵지 않을수도 있겠지만, FLTK 를 쓰는 입장에서는 하나의 소스코드로 만들어 놓은 것들이 모든 플랫폼에서 모두 동일하게 돌아야 하는 조건을 생각 해 본다면 Windows 에서 GDI 로만 돌도록 뭘 만드는 건 그리 좋은 선택이 아니라고 판단 되는 부분도 큽니다.
 게다가 GDI 로 그리는 서체의 경우 Windows 에서는 LCD 등에서 사용하는 Cleartype 등이 강제 적용되거나, 개발자가 의도한 형태와 다른 결과를 얻을수도 있는 등의 문제는 물론, FLTK 와 같이 가볍게 만들어 지는 GUI engine 에서는 할애 해야하는 문제점들이 꽤 많습니다 ( offscreen rendering 이 모든 platform 마다 쉽지 않은 이유 )

 FLTK 자체에서는 Fl_Widget 이 rendering 을 상속받은 함수내에서 Text 를 그릴 수 는 있습니디만, Fl_RGB_Image 등에 렌더링을 내가 원하는대로 만들어 내고자 한다면 ? 깊은 생각을 해 봐야 할 시간을 가져야 할 것으로 보입니다.

 그래서 이를 해결 하기 위해 만들기 시작 한 것이 바로 FLFTRender 입니다.


FLFTRender 는 무엇인가?

 기본적으로 FL_RGB_Image 에 직접 Truetype 서체를 그리기 위해 만들어진 간단한 C++ class 하나로 된 오픈 소스 입니다. 물론 응용하면 다른 곳에 쓰는것이 어려운 수준도 아니지만, 적어도 FLTK 에 심미적 그래픽 처리 성능이 전무한 것을 보강 하기 위해 이전에 만든 fl_imgtk 와 함께 사용할 경우 꽤 좋은 그래픽 자원을 얻거나 만들어 낼 수 있습니다.


 소스는 아래의 이미지 처럼 github 에 공개 되어 있으며, 누구나 가져다 쓸 수 있도록 MIT License 를 적용하고 있습니다. 항상 그렇듯, 가져다 쓰는 것 또한 개발자의 실력에 달린 것 ... 하지만 FLFTRender 를 쓰려면 단지 이 소스코드만 가져다가는 뭘 할 수 없기 떄문에 Windows 에서 MinGW-W64 와 MSYS2 를 쓰는 사용자에 한해 이를 할용할 수 있는 기반을 설명 해 보고자 합니다. ( M$VC 는 알아서들 하셔야... )




MSYS2+MinGW-W64 에서 준비사항

 MSYS2 사용자라면 아마 기본적으로 wget 을 설치 해 두셨을 것이라 믿지만, 혹시 wget 을 실행 했을때 아무 반응이 없다면 curl 를 사용해도 됩니다. 하지만 wget 이 없다면 curl 도 높은 활률로 없을 터이니, pacman -S wget 을 통해 wget 을 설치 해 둡니다. 물론 이후에 나오는 사항은 모두 MinGW-W64 G++ 에 대한 개발 환경을 다 설정 해 두신 분들에게만 속합니다.



 일단 Project 또는 소스를 모아 두는 개인의 공간에서 위와 같이 FLFTRender 를 git 으로 clone 하거나, 최신 소스를 내려 받아 둡니다. 이 소스만 있어서는 뭘 할 수 없기 때문에 freetype2 를 받아서 컴파일 해 둬야 합니다.

 git 으로 소스를 clone 해 두면 아래 처럼 나옵니다.



 소스가 덩치가 큰 것이 전혀 없는 수준이라 받는데 걸리는 시간은 그리 길지 않습니다. 약 1초 내외에 끝나겠군요. 이제 다음으로 필요 한 것은 이걸 쓸 수 있는 FreeType 본체 입니다. 이게 있어야 FLFTRender 에서 폰트를 이미지 버퍼에 그릴 수 있습니다.


 Freetype2 에서는 별도로 빌드된 이미지를 제공하는 것이 아니라, 소스 자체를 제공 하므로 [여기] 에서 위 페이지 이미지 처럼 소스를 받을 곳을 한 곳 들어 갑니다. 저의 경우 해당 링크에서 최신버젼 2.10.1.tar.gz 을 사용하였습니다.




 다운로드 페이지에서 직접 해당 압축을 내려 받아도 되나, 저는 wget 으로 바로 내려 받아 압축을 해제 하고 소스를 빌드 하는 작업을 진행 하였습니다. 대부분 Linux 나 MSYS2 에 익숙한 개발자들은 GUI 에 의존하지 않는 습성을 가지고들 계실테니 ...



 물론 MSYS2 를 쓰면서 이걸 내려 받은 파일을 또 지금 작업 하는 디렉터리 위치에 풀려면 몇번의 클릭을 더 하고, 창을 열고 ... 편리함이 쉬움은 아닌듯, 저의 경우 Project 위치에 바로 내려 받은 다음 tar -xf 로 바로 tar.gz 을 해제 합니다.


libfreetype2 빌드 하기

 libfreetype2 를 빌드 하는 방법은 여러가지가 있겠습니다만, 보통은 configure 를 통해 Makefile 을 현재 개발 환경에 맞게 조정된 형태로 바로 만드는 것을 추천 드립니다. 물론 build 디렉터리 안에 Cmake 를 할 수 있도록 설계되어 있지만, MSYS 나 MinGW-W64 로 이걸 하기엔 뭔가 제대로 동작을 안 합니다. 개인적으론 CMake 를 쓰려면 M$VC 를 쓰려는 분들에 한해서만 추천 드립니다.


 freetype2 에서 의존하는 패키지는 보통 bzip2 (bz2 ) 와 libz, 그리고 harfbuzz 가 있습니다. 여기서 이 harfbuzz 는 TTF 의 hinting 을 처리 할 때 추가적으로 사용할 수 있는 라이브러리 인데, 불행히도 MSYS2 에서 이걸 제대로 쓰기가 쉽지가 않고, 기본적인 hinting 은 libfreetype2 에서도 충분히 처리 할 수 있습니다. 고로 제가 configure 에서 추천드리는 방법은 아래 한줄 입니다. ( FLFTRender 의 readme.md 에서도 보실 수 있습니다 )


$ ./configure --with-harfbuzz=no


 위 설정대로 configure 를 하시면 harfbuzz 를 사용하지 않고 libfreetype2 를 쓸 수 있도록 Makefile 이 만들어 지나, 여기서 하나 더 추천 드리는 것은 libpng 를 설치 하신적이 없다면 pacman 에서 libpng 를 설치 한 다음 configure 를 돌리는 걸 추천 드립니다.



 위와 같이 libpng 를 검색 한 다음 설치 하시면 됩니다. 그리고 configure 를 추천드린 옵션과 함께 빌드 하신 다음, Make 를 수행 해 주시면 됩니다. CPU 성능이 좋으신 분들은 make 시 -j 10 과 같이 동시 작업수를 높여 주시면 더 빠른 빌드를 경험 하실 수 있습니다.

 Make 작업이 종료 된 다음은 make install 을 통해서 시스템 위치에 설치 될 수 있도록 해 줍니다. 이렇게 할 경우 어플리케이션 개발을 할 때 Makefile 내에서 -lfreetype2 로만 LFLAGS 지정을 한다음 빌드 할 수 있게 됩니다. 물론 pkg-config 으로도 해당 옵션을 그대로 얻어 올 수 있습니다.


예제 빌드 하기

FLFTRender 안에 최신버젼의 경우 testing 이 추가 되었습니다. 빌드는 두가지 방법을 지원 하는데, 기본적으로 다음과 같이 빌드 할 수 있습니다.


  • $ make -f Makefile.macllvm
  • $ make -f Makefile.gcc


 위는 MacOSX 에서 llvm-gcc 를 통해 빌드 할 경우이며, Cocoa framework 를 사용하여 빌드 하도록 되어 있기 때문에 Mac 에서만 정상 빌드 되며, 아래는 MinGW-W64 나 Linux 의 gcc 등에서도 빌드가 가능 합니다.

 어떤 플랫폼이던, 컴파일이 되고 나면 아래처럼 test 프로그램이 구동이 가능 한데, 실행 위치에 D2CodingBold-Ver1.3.2-20180524.ttf 파일이 있어야 합니다. 처음 Source 를 내려 받은 다음에서는 tar -xf D2CodingBold-Ver1.3.2-20180524.ttf.tar.gz 으로 압축을 먼저 풀어 주고 나서 실행 해 줘야 합니다.




Alpha depth 처리 관련

 FLFTRender 는 기본적으로 alpha depth 를 처리할 수 있도록 만들어 졌습니다. 예제를 보면 알 수 있는 부분으로 RGBA 로 32bit unsigned long 으로 각 색상 값을 지정 합니다 ( FLTK 에서 사용하는 방법 입니다 )



 현재 16bit RGB555 나 565 에 대해서는 처리를 하지 않고 있지만, 8bit gray 에서는 RGB 컬러 말고 FFT 자체의 depth 에 alpha depth 만 계산을 하고, RGB 나 RGBA 에서는 대상 color depth 에 따라 투명도를 적용하여 출력 할 수 있도록 만들어 졌습니다. 한글 출력은 대상 Font 마다 다른데, D2Coding 은 wide-char 형태로 한글 code 를 입력 받도록 만들어 졌고, UnFont 와 같은 Linux 서체를 사용할 경우는 UTF-8 encoding 을 사용해야 합니다.