그래픽 & 멀티미디어
gxLib에 BufferDC를 추가했습니다. BufferDC는 그래픽 출력 대상인 화면의 해상도와 같은 DC로, BufferDC를 이용하면 그래픽을 매우 빠르게 출력할 수 있습니다.
gxLib는 아래와 같은 구조로 되어 있습니다.
화면 출력은 하드웨어 직접 연결되어 있는 /dev/fb 장치를 이용하여 그래픽을 출력합니다. gxLib는 /dev/fb 장치든, Bitmap 파일이든 모든 출력 대상을 Device Context 개념으로 접근하고 있습니다. 즉, 아래와 같이 처리하고 있습니다.
/dev/fb | Screen DC |
Bitmap 파일 | Bitmap DC |
이렇게 모두 Device Context로 처리하는 이유는 같은 함수를 모두 적용할 수 있게 하기 위함입니다. 예를 들어 Bitmap 파일을 화면에 출력하기 위해서는 아래와 같이 BitBlt 함수를 사용합니다.
gxBitBlt( Screen DC, 비트맵 DC)
이해를 돕기 위해 인수를 DC 이름만 적었습니다. 반대로 같은 BitBlt 함수를 이용하여 화면을 Bitmap으로 출력할 수 있습니다.
gxBitBlt( 비트맵 DC, Screen DC)
뿐만 아니라 Bitmap에서 Bitmap으로도 출력이 자유롭습니다.
gxBitBlt( A 비트맵 DC, B 비트맵 DC)
BitBlt 함수 뿐만 아니라 선을 긋거나 사각형이나 원을 그리는 모든 그리기 함수도, 같은 함수로 모든 출력 객체에 사용할 수 있습니다.
gxLine( Screen DC, 100, 100, 200, 200)
gxLine( Bitmap DC, 100, 100, 200, 200)
빠른 화면 출력을 위한 Buffer DC
소스 내용을 보시면 아시겠습니다만 화면도 16 bit 외에 8 bit, 4 bit 등 다양한 해상도로 만들어 질 수 있고, 비트맵도 다양한 해상도로 작성될 수 있습니다. gxLib는 서로 다른 해상도의 Device Context를 사용하기 위해 메모리를 직접 이용하지 않고 픽셀에 대한 칼라 값을 구하고, 역시 픽셀 단위로 칼라 값을 변환하는 방법을 사용하고 있습니다.
이렇게 픽셀단위로 작업하다 보니 출력이 느려집니다. 즉, 그려지는 모습이 보이거나 도형을 그린다면 도형이 그려지는 모습이 보여 보기 좋지 않을 수 있습니다. 이때, Screen DC와 같은 해상도와 같은 메모리 구조의 다른 DC를 거친다면 화면 출력 전에 모든 그래픽 작업 완료 후에, 한번에 Screen DC로 출력하면 보다 빠르게 그래픽 출력을 할 수 있습니다.
Buffer DC를 위한 함수
Buffer DC를 위해 다른 스트럭쳐는 만들지 않았습니다. gxGetBufferDC() 함수를 이용하여 Tdc 를 만들면 되며, 이후로 DC를 이용하는 그래픽 함수를 모두 사용할 수 있습니다.
dcBuffer = gxGetBufferDC( -1, -1);
Tdc *gxGetBufferDC ( int width,int height);
- width : 만들어질 Buffer DC의 폭. -1로 지정하면 화면 폭으로 자동 지정
- height : 만들어질 Buffer DC의 높이. -1로 지정하면 화면 높이로 자동 지정
아울러 Screen DC와 같은 폭, 같은 높이라면 BitBlt() 함수보다 더 빨리 복사할 수 있는 gxToScreenDC()도 준비했습니다.
void gxToScreenDC ( Tdc *dcScreen, Tdc *dcBuffer);
함수 내용을 보시면 아시겠습니다만, for 루프없이 memcpy() 함수를 한번 호출하여 작업을 완료하기 때문에 BitBlt() 함수보다 조금 더 빠르게 Buffer DC를 Screen DC로 출력할 수 있습니다.
예제 설명
예제는 Bitmap DC를 이용하여 화면에 출력하는 방법과 Buffer DC를 만든 후에 화면에 출력하는 방법을 소개하고 있습니다. 함수 사용에 대한 이해는 sample.c 의 내용을 먼저 보시기 바랍니다. sample.c는 모두 3가지의 테스트 함수가 준비되어 있으며, 실행하면 각 테스트별 속도 차이를 확인할 수 있도록 비트맵을 화면에 출력합니다.
- void TestBitmapToDC()
비트맵을 직접 화면에 출력하는 예입니다. - void TestBufferDC()
Buffer DC를 BitBlt()를 이용하면 화면에 출력하는 예입니다. - void TestToScreenDC()
Buffer DC를 ToScreenDC()를 이용하면 화면에 출력하는 예입니다.
그 방법을 이용하시면 알파블렌딩을 구현하실 수 있습니다. 아래 글을 참고하세요.
http://forum.falinux.com/zbxe/?document_srl=498642