푸른수염님의 도움으로 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 를 먼저 실행하여 주십시오. 즉,

  1. vi Makefile

                    // Makefile 내용 중에 컴파일러를 변경하신 후 저장하십시오.

    #CC = mipsel-linux-gcc
    CC = gcc

  2. ]$ make dep
  3. ]$ make clean
  4. ]$ make
  5. ]$ ./sample   // 샘플을 실행합니다.

만일 실행 중에 "프레임 버퍼 장치 접근 권한이 없습니다." 메시지가 출력되면 프레임버퍼의 사용권한을 777로 변경합니다.

  1. ]$ ./sample
  2. ]$ su -
    암호:
  3. ]# chmod 777 /dev/fb
  4. ]# exit
  5. ]$ .sample

앞으로 gxLib에 비트맵 폰트 외에 jpeg와 png를 출력하는 루틴을 출력하고 싶은데, 저 혼자로는 힘이 드네요. 혹, 구현하신 분은 공유를 부탁드립니다. ^^