이번 시간에는 gx 라이브러리와 샘플 소스 중에 이미 말씀을 드린 선 긋기, 원, 타원을 제외한 초기화 함수와 칼라 설정 함수에 대해서 말씀을 드리겠습니다. 다시 말씀드립니다만, 이전 gx 라이브러리는 어떻게 프레임버퍼에서 칼라 값을 생성하고 기본 도형을 그리는지 이해를 돕기 위해 인수 값도 필요한 값만큼 변수를 생성해서 받아들이고, 변수를 최적화하지 않고 이름을 길게 하여 필요한만큼 선언해서 작성했습니다.

그러나 다음 시간부터 만들어질 정식 그래픽 라이브러리에서는 스트럭쳐를 적절히 운영하면서 다양한 그래픽 환경에서 같은 함수 이름을 사용하기 위해 포인터 함수를 사용하는 등에 많이 복잡해 질 것입니다.

그러므로 이전 그래픽 강좌 내용과 gx 0.0.1 버전의 코드 내용을 가급적 이해를 해 놓으신다면 다음 그래픽 코드가 복잡하다고 하더라도 이해하시는데 큰 도움이 될 것으로 생각됩니다.

라이브러리 초기화 및 에러 코드 설명

앞으로 만들어질 정식 버전에서도 그래픽 환경을 초기화하는 함수가 있으며, 이 초기화 함수에서는 그래픽을 운영하기 위해 체크할 것이 많습니다. 이렇게 체크할 내용이 많다 보니 에러로 검출할 내용도 제일 많이 가지고 있습니다. 또한, 다른 그래픽 함수에도 필요하면 에러 코드를 생성하도록 할 것입니다.

에러 코드는 gx.h에 정의 되어 있습니다

#define  GXERR_NONE              0           // 에러 없음
#define  GXERR_NO_DEVICE         -1          // 장치가 없음
#define  GXERR_ACCESS_DEVICE     -2          // 접근 권한이 없음
#define  GXERR_VSCREENINFO       -3          // FBIOGET_VSCREENINFO 정보 구하기 실패
#define  GXERR_FSCREENINFO       -4          // FBIOGET_FSCREENINFO 정보 구하기 실패
#define  GXERR_MEMORYMAPPING     -5          // 메모리 메핑에 실패

gx 라이브러리를 초기호 하는 방법은 아래와 같습니다.

switch( gx_init( "/dev/fb") )
{
   case  GXERR_NO_DEVICE      :  printf( "프레임 버퍼 장치가 없습니다.n"              ); return -1;
   case  GXERR_ACCESS_DEVICE  :  printf( "프레임 버퍼 장치 접근 권한이 없습니다.n"    ); return -1;
   case  GXERR_VSCREENINFO    :  printf( "FBIOGET_VSCREENINFO를 실행하지 못했습니다.n"); return -1;
   case  GXERR_FSCREENINFO    :  printf( "FBIOGET_FSCREENINFO를 실행하지 못했습니다.n"); return -1;
   case  GXERR_MEMORYMAPPING  :  printf( "메모리 메핑을 못했습니다.n"                 ); return -1;
}

16bit 칼라 값 계산

칼라 값을 계산하는 부분을 보겠습니다. 첫 번째가 gx_bitcolor() 이었습니다.

// 설명: 칼라 값을 구한다.
// 인수: red         0부터 칼라 비트 크기 사이의 red   값
//       green       0부터 칼라 비트 크기 사이의 green 값
//       blue        0부터 칼라 비트 크기 사이의 blue  값
// 참고: 16 bit 환경에 따라 5:6:5 또는 5:5:5 값이 될 수 있으므로,
//       칼라 환경에 따라 색상 값을 구한다.
//--------------------------------------------------------------------
int   gx_bitcolor( int red, int green, int blue)
{
   return    ( red   << gxfb.red.offset  )
           | ( green << gxfb.green.offset)
           | ( blue  << gxfb.blue.offset );

}

gx_bitcolor() 함수는 프레임 버퍼의 칼라 해상도에 맞추어 인수를 전달해 주어야 합니다. 예로 흰색을 만들려면,

  • (5:6:5)  : gx_bitcolor( 0x1f, 0x3f, 0x1f);
  • (5:5:5)  : gx_bitcolor( 0x1f, 0x1f, 0x1f);  -> 구하는 인수값이 틀립니다.

이와 같이 프레임 버퍼에 설정된 칼라 비트 개수에 따라 인수 값을 맞추어 입력해 주어야 합니다. 이 함수를 사용하는 것은 조금 불편할 수 있어도 바로 칼라 값을 구할 수 있다는 장정이 있습니다.

칼라 값을 비례 값으로 구하기

그러나 (5:6:5) 나 (5:5:5) 시스템에 따라 프로그램을 따로 만든다는 것은 어렵기 때문에 gx_color() 함수를 따로 만들었습니다. 이는 프로그래머가 프레임 버퍼의 상태를 체크할 필요없이 R, G, B 값 모두 1 byte 값으로 비교하여 칼라 값을 구하게 하는 것입니다.

즉, 아래와 같이 같은 값으로 흰색을 구할 수 있습니다.

  • (5:6:5)  : gx_bitcolor( 0xff, 0xff, 0xff);
  • (5:5:5)  : gx_bitcolor( 0xff, 0xff, 0xff);   -> 구하는 인수 값이 같습니다.
//--------------------------------------------------------------------
// 설명: 칼라 값을 구한다.
// 인수: red         0부터 255 사이의 red   값
//       green       0부터 255 사이의 green 값
//       blue        0부터 255 사이의 blue  값
// 참고: 16 bit 환경에 따라 5:6:5 또는 5:5:5 값이 될 수 있으므로,
//       칼라 환경에 따라 색상 값을 구한다.
//--------------------------------------------------------------------
int   gx_color( unsigned char red, unsigned char green, unsigned char blue)
{
   int      color;

   red   /= gxfb.red.bit_value;
   green /= gxfb.green.bit_value;
   blue  /= gxfb.blue.bit_value;

   color =   ( red   << gxfb.red.offset  )
           | ( green << gxfb.green.offset)
           | ( blue  << gxfb.blue.offset );

   return   color;
}

색상 값을 구하기 위해, 각 R,G,B 별로 bit_value 값으로 나누었습니다. 이 값으로 최종 칼라 값을 구했습니다. 이렇게 구한 이유는 아래와 같습니다.

Red의 값을 받는 변수 red 가 인수로 0x00에서 0xff 까지의 값을 받는다고 하겠습니다. 즉, 8개의 비트 값을 받습니다. 그러나 16bit 칼라 환경에서 실제 Red 값은 5 비트이므로 0x00에서 0xff 까지의 값으로 만들어야 하는데, 이렇게 하기 위해서는 8 로 나누어야 합니다.

Green 값을 받는 green 변수는 0x00 에서 0xff 까지 값을 받는다고 해도, (5:6:5) 그래픽 환경에서는 실제 6 비트 크기이므로 0x00에서 0x3f까지 값으로 변환해서 대입해 주어야 합니다. 이렇게 하려면 4로 나누어 주어야 합니다.

여기서, 나누려는 8과 4의 값을 if 문을 사용하지 않고 아래와 같은 방법으로 미리 bit_value에 구한것입니다.

gx_init()함수를 보시면,

gxfb.red.bit_value   = 0x100 >> fbvar.red.length;
gxfb.green.bit_value = 0x100 >> fbvar.green.length;
gxfb.blue.bit_value  = 0x100 >> fbvar.blue.length;

이와 같이 0x100을 각 칼라 별 비트 개수로 shift 하여 구할 수 있습니다.

 

 태그: *그래픽 *라이브러리 *그래픽라이브러리