gx 그래픽 라이브러리가 타원까지 그릴 수 있게 되었습니다. 여기서 잠깐 다른 그래픽 환경. 즉, 32bit 칼라에서는 어떻게 처리할 지에 대해 알아 보고 넘어 가도록 하겠습니다.

gx32.h

우선 16bit 칼라를 처리하는 gx16.h를 보아 주십시오.

#ifndef _GX_16_H_
#define _GX_16_H_

#include 
                              // 16 bit 칼라 함수를 선언

extern int  gx16_color     ( int  red, int green , int blue                   ); // 색상을 구함
extern void gx16_clear     ( dc_t *dc, int color                               ); // 인수로 받은 색상으로 전체 칠하기
extern void gx16_set_pixel ( dc_t *dc, int coor_x, int coor_y, int color      ); // 점 찍기
extern void gx16_get_pixel ( dc_t *dc, int coor_x, int coor_y, color_t  *color); // 칼라 값을 읽어 오기
extern void gx16_hline     ( dc_t *dc, int fst_x , int snd_x , int coor_y, int color); // 수평선 그리기
extern void gx16_vline     ( dc_t *dc, int coor_x, int fst_y , int snd_y , int color); // 수직선 그리기

#endif

32bit 칼라에서도 gx16.h 에서 언급된 함수를 만들어 놓으면 되겠습니다. 역시 gx16.h와 거의 동일합니다. 아래 처럼요. ^^

#ifndef _GX_32_H_
#define _GX_32_H_

#include 
                              // 32 bit 칼라 함수를 선언

extern int  gx32_color     ( int  red, int green , int blue                  ); // 색상을 구함
extern void gx32_clear     ( dc_t *dc, int color                              ); // 인수로 받은 색상으로 전체 칠하기
extern void gx32_set_pixel ( dc_t *dc, int coor_x, int coor_y, int color     ); // 점 찍기
extern void gx32_get_pixel ( dc_t *dc, int coor_x, int coor_y, color_t *color); // 칼라 값을 읽어 오기
extern void gx32_hline     ( dc_t *dc, int fst_x , int snd_x , int coor_y, int color); // 수평선 그리기
extern void gx32_vline     ( dc_t *dc, int coor_x, int fst_y , int snd_y , int color); // 수직선 그리기

#endif

32bit에서 점 찍기

void  gx32_set_pixel( dc_t *dc, int coor_x, int coor_y, int color)
{
   unsigned long *ptr;

   if ( 0 > coor_x || dc->width  <= coor_x)     return;
   if ( 0 > coor_y || dc->height <= coor_y)     return;

   ptr   = (unsigned long *)dc->mapped +dc->width * coor_y + coor_x;
   *ptr  = color;
}

32bit 칼라에서는 점 하나 당 4바이트입니다. 그러므로 프레임 버퍼에 매핑된 메모리에 unsigned long 으로 포인터를 선언해서 포인터 ptr 의 계산이 +1 에 대해서 4바이트씩 계산이 되도록 했습니다.

칼라값 계산

32bit칼라에서는 한 개의 점당 Alpah(8bit):Red(8bit):Green(8bit):Blue(8bit) 로 4바이트씩 구성되어 있습니다. gx 라이브러리에는 알파값을 처리하지 않기 때문에 8bit 씩 Red, Green, Blue 값으로 색상값을 구합니다.

int   gx32_color( int red, int green, int blue)
{
   return   ( red << 16) | ( green << 8) | blue;
}

gx_screen_dc()

dc_t *gx_screen_dc( void)
{
   dc_t  *dc;

   dc = malloc( sizeof( dc_t));
   if ( NULL != dc)
   {
      dc->width      = gx_fb.width;
      dc->height     = gx_fb.height;
      dc->dots       = gx_fb.dots;
      dc->mapped     = gx_fb.mapped;
      dc->coor_x     = 0;
      dc->coor_y     = 0;
      dc->pen_color  = clr_black;
      dc->brush_color= clr_black;

      switch( gx_fb.colors)           // 칼라 깊이별 처리가 다른 함수를 지정
      {
      case 16  :
                     dc->color      = gx16_color;
                     dc->clear      = gx16_clear;
                     dc->get_pixel  = gx16_get_pixel;
                     dc->set_pixel  = gx16_set_pixel;
                     dc->hline      = gx16_hline;
                     dc->vline      = gx16_vline;
                     break;
      case 32  :
                     dc->color      = gx32_color;
                     dc->clear      = gx32_clear;
                     dc->get_pixel  = gx32_get_pixel;
                     dc->set_pixel  = gx32_set_pixel;
                     dc->hline      = gx32_hline;
                     dc->vline      = gx32_vline;
                     break;
      default  :
                     free( dc);
                     dc = NULL;
      }
   }
   return dc;
}

gx_screen_dc()에서는 칼라의 깊이에 따라 switch문에서 함수 포인터에 칼라에 해당되는 함수를 지정하는 것을 보실 수 있습니다. 그러므로 시스템의 칼라 깊이가 다른 그래픽 환경에서도 프로그램 수정없이 프로그램을 실행할 수 있습니다.

첨부된 파일을 컴파일 하신 후, 리눅스 그래픽 - 프레임버퍼의 내용에 따라 16 bit 칼라와 32 bit 칼라로 변경하신 후 프로그램을 테스트해 보십시오. 한가지 참고할 것은 제 시스템에서는 24bit에 해당되는 값으로 설정하면 32bit 칼라로 설정되더군요. 아직 왜 이런지 이유를 모르겠습니다만, gx 라이브러리는 상수가 아닌 gx_fb.colors 값에 따라 함수 포인터를 설정하므로 모든 칼라에 대한 함수를 만든다면 그래픽 환경에 독립된 프로그램을 작성할 수 있습니다.

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