그래픽 라이브러리 - gxLib
글 수 28
설명
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); | |||||
인수 |
| |||||
반환 |
|
예제
아래의 예는 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; }