원 내부를 특정 색으로 칠하는 코드를 생각해 보겠습니다. 이전 코드에서 점 좌료를 그래도 이용하는 것으로 그림에서처럼 좌표와 좌표를 연결해서 원의 내부를 칠하는 것입니다.

이전 코드와 달라진 부분만 색상을 바꾸었습니다. 참고하세요. ^^

 

 

 

 

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>        // abs

#include <unistd.h>        // open/close
#include <fcntl.h>         // O_RDWR
#include <sys/ioctl.h>     // ioctl
#include <sys/mman.h>      // mmap PROT_
#include <linux/fb.h>

int   screen_width;
int   screen_height;
unsigned short *fb_mapped;


void  dot( int x, int y)
{
   unsigned short *ptr;

   if ( 0 <= x && 0 <= y && x < screen_width && y < screen_height)
   {
      ptr   = fb_mapped + screen_width * y + x;
     *ptr  = 0xffff;
   }
}

static void inner_circle( int x_center, int y_center, int x_coor, int y_coor)
{
   int      x_dot;
   int      y_dot;

   y_dot   = y_center +y_coor;
   for ( x_dot = x_center -x_coor; x_dot < x_center +x_coor; x_dot++)
      dot( x_dot, y_dot);

   y_dot   = y_center -y_coor;
   for ( x_dot = x_center -x_coor; x_dot < x_center +x_coor; x_dot++)
      dot( x_dot, y_dot);


   y_dot   = y_center +x_coor;
   for ( x_dot = x_center -y_coor; x_dot < x_center +y_coor; x_dot++)
      dot( x_dot, y_dot);

   y_dot   = y_center -x_coor;
   for ( x_dot = x_center -y_coor; x_dot < x_center +y_coor; x_dot++)
      dot( x_dot, y_dot);
}

void  circle( int x_center, int y_center, int radius)
{
   int      x_coor;
   int      y_coor;
   int      p_value;

   x_coor   = 0;
   y_coor   = radius;
   p_value   = 3 - 2 * radius;
   while   ( x_coor < y_coor)
   {
      inner_circle( x_center, y_center, x_coor, y_coor);
      if ( p_value < 0)
      {
         p_value   += 4 * x_coor +6;
      }
      else
      {
         p_value   += 4 * ( x_coor -y_coor) +10;
         y_coor--;
      }
      x_coor++;
   }
   if ( x_coor == y_coor)
      inner_circle( x_center, y_center, x_coor, y_coor);
}


int   main( int argc, char **argv)
{
   int      fb_fd;
   struct   fb_var_screeninfo  fbvar;
   struct   fb_fix_screeninfo  fbfix;
   int      bytes_per_line;
   int      mem_size;

   if ( access( "/dev/fb", F_OK))
   {
      printf( "프레임 버퍼 장치가 없습니다.n");
      return 0;
   }

   if ( 0 > ( fb_fd = open( "/dev/fb", O_RDWR)))
   {
      printf( "프레임 버퍼에 접근할 수 없습니다.n");
      return 0;

   }

   if ( ioctl( fb_fd, FBIOGET_VSCREENINFO, &fbvar))
   {
      printf( "FBIOGET_VSCREENINFO를 실행하지 못했습니다.n");
      return 0;
   }
   if ( ioctl( fb_fd, FBIOGET_FSCREENINFO, &fbfix))
   {
      printf( "FBIOGET_FSCREENINFO 실행하지 못했습니다.n");
      return 0;
   }

   screen_width   = fbvar.xres;                    // 스크린의 픽셀 폭
   screen_height  = fbvar.yres;                    // 스크린의 픽셀 높이
   bytes_per_line = fbfix.line_length;             // 한개 라인 당 바이트 개수

   mem_size       = bytes_per_line * screen_height;

   fb_mapped      = ( unsigned short *)mmap( 0,
                                          mem_size,
                                          PROT_READ|PROT_WRITE,
                                          MAP_SHARED,
                                          fb_fd,
                                          0);


   if ( 4 != argc)
   {
      printf( "사용방법: $]./sample x y rn");
   }
   else
   {
      circle( atoi( argv[1]), atoi( argv[2]), atoi( argv[3]) );
   }

   munmap( fb_mapped, mem_size);
   close( fb_fd);

   return 0;
}

[jwjw@jwCentOS 026 circle]$ ./sample 500, 100, 60
[jwjw@jwCentOS 026 circle]$ ./sample 100, 100, 100
[jwjw@jwCentOS 026 circle]$ ./sample 400, 300, 80
[jwjw@jwCentOS 026 circle]$ ./sample 50, 400, 180

아래는 실행한 모습입니다.

태그: *그래픽