[so_long] mlx 라이브러리

sham·2021년 7월 9일
0

MLX 라이브러리란?

  • 윈도우의 제어와 그래픽 작업을 위한 라이브러리다.
  • mlx 라이브러리 내부의 mlx.h 파일을 인클루드 함으로써 MiniLibX API를 사용할 수 있다.

    cc -L[mlx 폴더 경로] -lmlx -framework OpenGL -framework AppKit *.c

주요 함수

식별자

  • mlx 라이브러리에서 윈도우를 띄우거나 이미지를 만들거나 할 때는 항상 void *인 식별자를 사용하게 된다. 그 식별자를 리턴받는 함수들의 내부를 한 번 살펴보았다.

mlx_ptr_t

mlx_init으로 리턴받는 식별자이다.
과제를 진행하며 항상 사용하게 될 식별자로 소프트웨어와 디스플레이를 연결한다.
밑에 나올 mlx_win_list_t 구조체와 mlx_img_list_t 구조체에 대한 포인터를 멤버로 가진다. 각각 구조체는 연결 리스트 형태를 띄고 있어 한 개의 포인터로 모든 식별자를 관리하는 것으로 보인다.

typedef struct		mlx_ptr_s
{
  void			*appid;
  mlx_win_list_t	*win_list;
  mlx_img_list_t	*img_list;
  void			(*loop_hook)(void *);
  void			*loop_hook_data;
  void			*loop_timer;
  mlx_img_list_t	*font;
  int			main_loop_active;
} mlx_ptr_t;

mlx_win_list_t

mlx_new_window로 리턴받는 식별자이다.
말 그대로 윈도우 창과 연관된 식별자이다.
자기 자신에 대한 포인터를 멤버로 가진다.
연결 리스트 형태로 모든 윈도우를 관리한다.
윈도우를 새로 생성할 때마다 새로 생성한 포인터가 next를 mlx_ptr_t의 mlx_win_list_t 포인터를 가리키며 헤드를 차지하게 된다.

typedef struct	mlx_win_list_s
{
  void			*winid;
  mlx_img_ctx_t		*img_list;
  int			nb_flush;
  int			pixmgt;
  struct mlx_win_list_s	*next;
} mlx_win_list_t;

mlx_img_list_t

mlx_new_image로 리턴받는 식별자이다.
mlx_win_list_t처럼 하나의 연결 리스트로 모든 이미지를 관리하게 된다.

typedef struct	mlx_img_list_s
{
  int			width;
  int			height;
  char			*buffer;
  GLfloat		vertexes[8];
  struct mlx_img_list_s	*next;
} mlx_img_list_t;

mlx_init

프로토타입

void * mlx_init ();

인자

X

반환

디스플레이 장치와의 연결에 대한 식별자를 void * 타입의 포인터로 반환한다. 실패 시 NULL을 리턴한다.

위에서 언급했다시피 연결리스트 형태의 win 식별자 포인터와 img 식별자 포인터를 구조체 멤버로 가지고 있다.

mlx_new_window

프로토타입

void mlx_new_window (void mlx_ptr, int size_x, int size_y, char *title);

인자

  • mlx_ptr : 연결 식별자(mlx_init 리턴)
  • size_x, size_y : 새 창의 가로, 세로.
  • title : 타이틀바에 보일 문자열

반환

연결 식별자인 img_ptr 포인터를 리턴한다. 실패 시 NULL을 리턴한다.

실질적으로 리턴되는 식별자는 mlx_ptr->win_list이다.
동적할당된 새로운 win 식별자는 mlx 식별자의 win 식별자 연결리스트의 헤드를 차지하게 된다.

void *mlx_new_window(mlx_ptr_t *mlx_ptr, int size_x, int size_y, char *title)
{
  mlx_win_list_t	*newwin;
  NSString		*str;
  if ((newwin = malloc(sizeof(*newwin))) == NULL)
    return ((void *)0);
  newwin->img_list = NULL;
  newwin->next = mlx_ptr->win_list;
  newwin->nb_flush = 0;
  newwin->pixmgt = 1;
  mlx_ptr->win_list = newwin;
  //이하 생략

mlx_new_image

프로토타입

void mlx_new_image(void mlx_ptr, int width, int height);

인자

  • bits_per_pixel : 비트로 표현된 픽셀 색깔(이미지의 깊이)
  • size_line : 이미지의 한 줄을 메모리에 저장하는 데 사용되는 바이트 수.
    • 이미지에서 한 줄에서 다른 줄로 이동하는 데 필요하다.

반환

이미지 식별자를 void *형태로 리턴한다. 실패 시 NULL을 리턴한다.

mlx_new_window와 방식이 유사하다.

mlx_get_data_addr

프로토타입

char mlx_get_data_addr(void img_ptr, int bits_per_pixel, int size_line, int *endian);

인자

  • char mlx_get_data_addr(void img_ptr, int bits_per_pixel, int size_line, int *endian);
  • bits_per_pixel : 비트로 표현된 픽셀 색깔(이미지의 깊이)
  • size_line : 이미지의 한 줄을 메모리에 저장하는 데 사용되는 바이트 수.
    • 이미지에서 한 줄에서 다른 줄로 이동하는 데 필요하다.
  • endian : 픽셀 색깔을 저장하는 변수가 리틀엔디안(endian == 0)인지 혹은 빅엔디안(endian == 1) 방식인지 나타낸다. (MacOS에서는 필요없다. 클라이언트와 그래픽 프레임워크가 동일한 엔디언을 갖는다.)

반환

이미지가 저장된 메모리 영역의 시작을 나타내는 주소를 리턴한다.

mlx_get_data_addr

프로토타입

int mlx_put_image_to_window(void mlx_ptr, void win_ptr, void *img_ptr, int x, int y);

인자

  • img_ptr: 사용할 이미지, 경로 형태로 지정한다.
    • 프로그램을 실행하는 디렉토리의 위치를 기준으로 해서 추적한다.
    • 디렉토리가 변할 경우 제대로 추적이 안 될 수도 있음을 유의.
  • x, y: 이미지가 위치할 창 내의 x, y좌표

반환

헤더 상에서는 int 리턴이라고 명시되어 있으나 실제 함수는 void 형. 리턴하지 않는다.

mlx_hook

프로토타입

int mlx_hook(void win_ptr, int x_event, int x_mask, int (funct)(), void *param);

인자

win_ptr : 윈도우 식별자.
x_event : 이벤트마다 정해진 일종의 코드가 존재. https://github.com/VBrazhnik/FdF/wiki/How-to-handle-mouse-buttons-and-key-presses%3F
x_mask : 사용하지 않는 함수? 기본적으로 0을 넣어준다.
int (*funct)() : 호출할 함수 포인터.
param :

반환

없다.

모든 이벤트에 대해 hook이 가능. 자바스크립트의 addEventListener와 비슷한 개념같다.

mlx_loop

프로토타입

  • int mlx_loop(void *mlx_ptr);

인자

mlx_ptr : mlx 식별자.

반환

없다.

이벤트를 기다린 다음 이 이벤트와 연결된 사용자 정의 함수를 호출하는 무한 루프.
창을 렌더링한다.

profile
씨앗 개발자

0개의 댓글