설명

대부분의 경우 그래픽 출력 함수 하나만 사용해서 화면을 완성하는 경우는 거의 없습니다. 선을 긋고 도형을 그리고 문자열을 출력하는 여러 과정을 거친 다음에야 화면 하나를 완성하게 됩니다. 그런데 문제는 이런 그려가는 과정을 바로 화면에 출력하다 보면, 완셩된 화면을 바로 보는 것이 아니라 그려져 가는 모습이 출력되어, 뭐랄까? 값이 싼 프로그램으로 보일 수 있습니다.

 

이런 문제를 어떻게 처리하면 좋을까요? 이런 문제를 소프트웨어 적으로 처리한다면 대부분의 경우 화면에 바로 출력하지 않고, 다로 화면 크기만큼 메모리를 확보한 후에, 즉 버퍼를 따로 만들어 놓고, 그 버퍼에 그리거나 추력하는 모든 작업을 완료합니다. 모든 그리기 작업이 완료되었다면 그때서야 화면으로 한번에 출력합니다.

이와같이 처리한다면 여러 함수가 사용하는 과정이 출력되지 않아, 실제로는 버퍼에 그리고 화면에 복사하는 과정이 하나 더 있음에도, 전체가 한번에 출력되기 때문에 오히려 버퍼를 사용하는 쪽이 더 빠르고 보기에도 훌륭합니다. 완성도가 높게 보인다는 얘기가 되겠습니다

.

gxLib에서는 이렇게 처리할 수 있도록 원하는 크기 만큼 지정하여 메모리를 버퍼로 하여 Device Context를 만들어 주는 gx_get_buffer_dc()를 제공하고 있습니다. gx_get_buffer_dc()로 DC를 구했다면, 역시 같은 그래픽 함수를 이용하여 버퍼 DC로 그래픽을 출력하십시오. 이후에 완성되면 필요에 따라 화면에 출력하시면 됩니다.

 

헤더 gx.h
형태 dc_t *gx_get_buffer_dc( int width, int height)
인수
int width   버퍼 DC의 폭
int height   버퍼 DC의 높이
반환
NULL   메모리를 이용한 Device Context를 생성하지 못했음. 에러 내용은 gx_error_code로 확인하세요.
NULL !=   메모리를 이용한 버퍼 Device Context

예제

#include    <stdio.h>
#include    <gx.h>
#include    <gxbmp.h>

int   main( void)
{
    dc_t    *dc_screen;                             // 화면 Device Context  
    bmp_t   *bmp;

    if  ( gx_init( "/dev/fb"))                      // gxLib 초기화
        gx_print_error( "");                        // 실행 중 에러 내용을 출력
    else
    {
        if  ( !( dc_screen = gx_get_screen_dc()))   // 화면 출력을 위한 스크린 DC 구함
            gx_print_error( "");                    // 실행 중 에러 내용을 출력
        else
        {
            if  ( !( bmp = gx_bmp_open( "16.bmp")))  
                gx_print_error( "16.bmp");
            {
                // 화면을 깨끗하게
                gx_clear( dc_screen, gx_color( 0, 0, 0, 255));
                
                // bmp를 화면에 출력
                gx_bitblt( dc_screen, 100, 100, (dc_t *)bmp, 0, 0, bmp->width-1, bmp->height-1);
                
                gx_bmp_close( bmp);
            }
            gx_release_dc( dc_screen);
        }
        gx_close();
    }
    return   0;
}
]$ ./a.out