그래픽 & 멀티미디어
푸른수염님의 도움으로 gx 라이브러리에 문자열을 출력하는 기능을 추가하면서 0.3.1에서 0.4.1로 버전업했습니다. 이제 gxLib를 이용하시면, 직선, 사각형, 원, 타원, 비트맵 출력과 함께 문자열도 출력할 수 있습니다.
또한 0.4.1은 푸른수염님께서 만들어 주신 내용에서 출력 부분만 따로 gxbdf.c로 분리했습니다. 문자열을 출력하기 위해서는 폰트 파일이 필요한데, 폰트 파일을 DC에 지정하여 계속 사용할 수 있도록 FILE 포인터를 DC에 추가했습니다.
typedef struct dc_t_ dc_t; struct dc_t_ { int width; int height; int dots; // 전체 도트 갯수 width * height int coor_x; int coor_y; int pen_color; int brush_color; void *mapped; // 메모리 매핑된 포인터 FILE* font_file; <--- 추가한 내용 int (*color )( int red, int green, int blue); // 칼라값 구하기 void (*clear )( dc_t *dc, int 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, int color ); // 점 찍기 void (*hline )( dc_t *dc, int fst_x , int snd_x , int coor_y, int color); // 수평선 긋기 void (*vline )( dc_t *dc, int coor_x, int fst_y , int snd_y , int color); // 수직선 긋기 };
물론 같은 구조를 가져야 하는 Bitmap 구조체에도 추가했습니다.
struct bmp_t_ { int width; int height; int dots; // 전체 도트 개수 int coor_x; int coor_y; int pen_color; int brush_color; void *mapped; // 메모리 매핑된 포인터 FILE* font_file; <--- 추가한 내용 int (*color )( int red, int green, int blue); // 칼라값 구하기 void (*clear )( bmp_t *bmp, int color); // 색으로 전체 칠하기 void (*get_pixel)( bmp_t *bmp, int coor_x, int coor_y, color_t *color); // 칼라 값을 읽어 오기 void (*set_pixel)( bmp_t *bmp, int coor_x, int coor_y, int color ); // 점 찍기 void (*hline )( bmp_t *bmp, int fst_x , int snd_x , int coor_y, int color); // 수평선 긋기 void (*vline )( bmp_t *bmp, int coor_x, int fst_y , int snd_y , int color); // 수직선 긋기 int error_code; // 에러 코드 int filesize; // ^ 이미지 파일 사이즈 int reserved; // ¦ 예약 영역 int data_offset; // ¦ int header_size; // ¦ int img_width; // ¦ 이미지 폭 int img_height; // ¦ 이미지 높이 short cnt_planes; // ¦ bmp 헤더 영역 52 bytes short bpp; // ¦ int compression; // ¦ 압축 형식 int bitmap_size; // ¦ int hres; // ¦ int vres; // ¦ int cnt_colors; // ¦ int important_colors; // v int cnt_palette; // 팔레트 개수 palette_t *palette; // 팔레트 칼라 정보 int bytes_per_line; unsigned char *data; unsigned char *encoded_data; unsigned bsize_blue , bsize_green , bsize_red; unsigned boffset_blue, boffset_green, boffset_red; };
문자열 출력 관련 파일은 gxbdf.h, gxbdf.c, ksc5601.h, ksc5601.c, fontinfo.h, fontinfo.c 이며, 사용되는 폰트는 비트맵 폰트인 bdf 입니다. 첨부된 파일은 역시 푸른수염님께서 올려주신 gulim.bdf 를 그대로 사용했습니다.
문자열 출력 방법
문자열 출력 순서는 아래와 같습니다.
순서 | 내용 | 코드 |
1 | 출력 대상 DC를 구한다. | dc = gx_screen_dc() |
2 | 폰트를 지정 | file_bdf = fopen( "gulim.bdf", "r") dc->font_file = file_bdf |
3 | 문자열 출력 | gx_text_out( dc, 0 , 20, "안녕하세요." , gx_color( dc, 0, 255, 0)); |
작업 완료 후에는 | ||
4 | 폰트 파일 사용 종료 | fclose( dc->font_file); |
5 | DC 사용 종료 | gx_release_dc( dc); |
한글을 출력할 때 주의할 점은 출력 위치 중 y 좌표입니다. 출력되는 문자열의 좌측 상단을 기준으로 하는 것이 아니라 문자열의 하단을 지정해 주셔야 합니다.
즉, gx_text_out( dc, 0, 0) 으로 출력하면 화면 맨 위에 점 하나만 출력됩니다. 제대로 출력하려면 폰트의 높이만큼 더하기 하여 지정해 주어야 합니다. 만일 폰트 높이가 20정도라면 gx_text_out( dc, 0, 20) 이렇게 지정해 주어야 화면 상단에 출력됩니다.
푸른수염님의 소스를 분석하여 좌상단을 지정하도록 수정하려 했습니다만, 글자 폰트를 출력하는 방법이 밑에서 위로 출력하기 때문에 결국 수정하지를 못했습니다. 각 문자의 폰트 별로 높이 값이 다르기 때문에, 예를 들어 마침표 같은 경우 글자 밑에 출력되는 것이 아니라 위에 출력됩니다. ^^;
샘플 실행 방법
첨부된 파일은 저의 개발환경에 맞추어져 있습니다. 그러므로 압축파일을 푸신 후에 make dep 를 먼저 실행하여 주십시오. 즉,
- vi Makefile
// Makefile 내용 중에 컴파일러를 변경하신 후 저장하십시오.
#CC = mipsel-linux-gcc
CC = gcc
- ]$ make dep
- ]$ make clean
- ]$ make
- ]$ ./sample // 샘플을 실행합니다.
만일 실행 중에 "프레임 버퍼 장치 접근 권한이 없습니다." 메시지가 출력되면 프레임버퍼의 사용권한을 777로 변경합니다.
- ]$ ./sample
- ]$ su -
암호: - ]# chmod 777 /dev/fb
- ]# exit
- ]$ .sample
앞으로 gxLib에 비트맵 폰트 외에 jpeg와 png를 출력하는 루틴을 출력하고 싶은데, 저 혼자로는 힘이 드네요. 혹, 구현하신 분은 공유를 부탁드립니다. ^^