그래픽 & 멀티미디어
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 값에 따라 함수 포인터를 설정하므로 모든 칼라에 대한 함수를 만든다면 그래픽 환경에 독립된 프로그램을 작성할 수 있습니다.
태그: *그래픽 *라이브러리 *그래픽라이브러리