그래픽 & 멀티미디어
지난 게시물에서 예고한 대로, 윈도환경에서 가상프레임버퍼(wxvfb)로 gxLib를 돌리는데 성공했습니다.
jpg, png 지원이 빠진 상태라(이건 순전히 윈도가 나쁜 OS이기 때문이에요!) 완전한 성공이라 볼 수 없지만,
제가 더 가지고 있기 보다는 윈도에서의 개발에 익숙하신 분이 이어가시는게 좋을 것 같아 작업내용을 올려봅니다.
우선 가상프레임버퍼, wxvfb는 wx-python을 사용해 작성되었으며, 제 블로그에서 조금 자세히 설명해 두었습니다.
요는, 프레임버퍼장치파일을 대신할 dummy.vfb를 생성한 뒤, 계속 읽어서 wx.Panel에 뿌려주는 것으로,
리눅스 환경에선 gxLib가 mmap함수를 사용해 이 파일을 메모리에 사상하여 사용합니다.
일전에 장길석 님이 mmap에 대해 잘 설명해 주신 적이 있으시네요. 여기
예외처리를 제외하여 단순화 해 보면 다음과 같습니다.
file path(dev_name)를 주고, 버퍼의 포인터(gx_fb.mapped)를 받아서 사용합니다.
// 파일을 열어 fb_fd = open( dev_name, O_RDWR) // mmap으로 사상 gx_fb.mapped = ( void *)mmap( 0, gx_fb.bytes, // 메모리 전체 크기 PROT_READ|PROT_WRITE, MAP_SHARED, fb_fd, 0) // 사상뒤에 바로 fd를 닫아도 무방합니다. close( fb_fd);
윈도 OS에서도 같은 목적의 api가 존재하며 똑같이
path를 주고 포인터를 받을 수 있습니다.
// 파일을 열어 h_file = CreateFile(dev_name, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // 파일에 해당하는 맵 핸들을 또 만들고 (윈도는 번거롭군요) h_fmap = CreateFileMapping( h_file, NULL, PAGE_READWRITE, 0, 0, NULL); // 메모리에 사상 gx_fb.mapped = (void *)MapViewOfFile(h_fmap, FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, 0); // 역시 사상뒤에 바로 핸들들을 닫아도 무방합니다. CloseHandle(h_file); CloseHandle(h_fmap);
이후의 동작은 platform independent한 것들로 예전의 소스를 그대로 잘 동작하더군요.
VS2005에 딸려온 컴파일러로 컴파일 했습니다.
소스의 빌드는 똑똑한 scons를 사용했습니다.
scons는 같은 scons설정파일로 리눅스에서는 gcc를 사용하고 윈도에서는 cl 등을 잘 사용하여 잘 컴파일 해 줍니다!!
단, 앞서 언급했듯이 jpg, png를 사용시에 문제가 있었는데, gnuwin에서 제공하는 pre built된 윈도용 libjpeg, libpng 바이너리로 잘 컴파일&링크까지 되지만, 실행 중에 에러를 뿜으며 gxlib가 죽더군요.
그 원인은 이 링크에 설명이 되어 있습니다. 고쳐주세요!
일단 jpg, png지원을 빼고 시험해 보기 위해 gxlib에 예외처리를 추가하였습니다.
scons설정파일, 윈도 포팅, 예외처리를 포함한 패치파일을 첨부하였습니다.
이전 게시물에 첨부했던 기존 패치를 적용하지 않은 날 gxLib-0.7.1 에 적용하시기 바랍니다.
하드웨어 fb에 비해 무겁고, 느리지만 개발용으론 쓸만하실 것 같습니다.
또, 윈도위에 가상 리눅스를 띄울 필요가 없어져서 꽤 편합니다.(편해지시길 기대합니다.)
ps. 하지만, 그냥 우분투 리눅스 위에서 개발하시는게 100배는 더 편해요. :)
와우~ 좋은 글 감사합니다. 빨리 보내 주신 파일 내용으로 업데이트해야 하는데 늦어서 대단히 죄송합니다.
다시 봐도 신기신기 합니다. ^^