지난 게시물에서 예고한 대로, 윈도환경에서 가상프레임버퍼(wxvfb)로 gxLib를 돌리는데 성공했습니다.

gxLib_in_win32.png 

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배는 더 편해요. :)