설명

gxLib는 Device Context 개념을 수용하여 화면 출력 장치이든, 메모리로 만들어지 그래픽 출력 영역이든 모두 같은 방식으로 처리되며, 출력 대상이 다르더라도 같은 그래픽 함수로 사용이 가능합니다. gx_screen_dc()는 실제 화면에 출력하는 프레임 버퍼에 그래픽을 출력하기 위한 Device Context 핸들을 구하는 함수로, 함수 호출로 얻어진 struct dc_t 를 이용하여 gxLib는 그래픽을 출력하게 됩니다.

dc_t는 아래와 같은 구조이며, 다양한 그래픽 환경에 대응하기 위해 함수 포인터가 준비되어 있습니다.

typedef struct dc_t_ dc_t;
struct dc_t_
{
   char     dc_type;          // DC의 형태로 Screen, Bitmap을 구분한다.
   int      width;            // 도트 단위의 폭
   int      height;           // 도트 단위의 높이
   int      dots;             // 전체 도트 갯수 width * height
   int      bytes;            // 메모리의 전체 Byte 크기
   int      colors;           // 칼라 깊이
   int      bytes_per_line;   // 라인당 바이트 개수
   int      bits_per_pixel;   // 비트당 픽셀 개수
   int      coor_x;           // 이전에 그리기 했던 마지막 좌표
   int      coor_y;           // 이전에 그리기 했던 마지막 좌표
   color_t  pen_color;        // 현재의 펜 칼라
   color_t  brush_color;      // 현재의 브러쉬 칼라
   void    *mapped;           // 메모리 매핑된 포인터

   void (*release_dc)( dc_t *dc);
   void (*clear    )( dc_t *dc, color_t color);
   void (*get_pixel)( dc_t *dc, int coor_x, int coor_y, color_t   *color );
   void (*set_pixel)( dc_t *dc, int coor_x, int coor_y, color_t    color );
   void (*hline    )( dc_t *dc, int x1st  , int x_2nd , int coor_y, color_t color);
   void (*vline    )( dc_t *dc, int coor_x, int y_1st , int y_2nd , color_t color);
};

함수 포인터는 gx_screen_dc()에 의해 설정되며, 프레임 버퍼의 정보의 칼라 깊이에 따라 함수가 결정되면, 이로서 다양한 화면 칼라 깊이에 대응할 수 있습니다. 이후 gxLib에서 제공되는 대부분의 함수에서 이 함수 포인터를 이용하여 그래픽을 출력하게 됩니다.

헤더 gx.h
형태 dc_t *gx_get_screen_dc( void);
인수
   
반환
dc_t * 실패: NULL
  성공: struct dc_t 메모리 포인터

예제

아래의 예는 Screen DC를 구한 후, Screen DC를 이용하여 화면에 선을 긋습니다.

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

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

   if ( gx_init( "/dev/fb"))     gx_print_error( "");
   else
   {
      if ( !( dc_screen = gx_get_screen_dc()))     // 화면 출력을 위한 스크린 DC 구함
         gx_print_error( "");                      // 실행 중 에러가 있었다면 에러 내용을 출력
      else
      {
         gx_clear( dc_screen, gx_color( 0, 0, 0, 255));
         dc_screen->pen_color  = gx_color( 255, 255, 255, 255);
         gx_line( dc_screen, 0, 0, gx_fb.width, gx_fb.height);
         gx_release_dc( dc_screen);
      }
      gx_close();
   }
   return   0;
}