[FdF] MiniLibX about window and image

bolee·2022년 7월 3일
0

42seoul

목록 보기
14/27

MiniLibX ?

MiniLibX(이하 mlx)는 X-Window와 Cocoa에 대한 지식 없이 화면에 무언가를 렌더링하기 위한 가장 기본적인 작업을 할 수 있는 작은 그래픽 라이브러리로, 즉 창(window) 제어와 그래픽 작업을 위한 라이브러리이다.

MiniLibX document

X-Window
유직스(Unix) 용 네트워크 지향 그래픽 시스템이다.

Cocoa
Apple에서 iOS, macOS 등의 Apple 운영 체제용 어플리케이션 제작 시 사용하는 프레임워크

이를 위해 다양한 함수들이 준비되어 있다.

MiniLibX Prototyes

macOS에서 컴파일 명령은 아래와 같다.(2021/6/22 swift 작성 버전 기준)

$> export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:~/(mlx_mms 절대경로)	// 환경변수 설정
$> gcc <소스파일명.c> -Lmlx_mms -lmlx -framework Cocoa -framework Metal -framework MetalKit -framework QuartzCore -o <실행파일명>

아래에서는 mlx 내 함수와 함수 사용법 중 몇 가지를 살펴볼 것이다.

mlx 초기화

mlx_init()

void	*mlx_init();

mlx를 사용하기 위해 초기화하여 내 소프트웨어와 디스플레이를 연결시켜 주는 함수이다.

return value:

  • 성공: mlx instance pointer
  • 실패: NULL

사용 예

#include <mlx.h>

int main()
{
	void	*mlx;
    
    mlx = mlx_init();
    return 0;
}

창(window) 생성

mlx_new_window()

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

새 창을 스크린에 생성하여 띄워주는 함수이다.

  • mlx_ptr: mlx instance 포인터
  • size_x: 창의 길이
  • size_y: 창의 높이
  • title: 창의 제목 (창의 타이틀 바에 표시됨)

return value:

  • 성공: window instance pointer
  • 실패: NULL

참고
mlx는 n개의 각기 다른 창들을 제어할 수 있다. 각각의 인스턴스 창들 각각을 식별하는 고유 값이다.

mlx_loop()

int	mlx_loop(void *mlx_ptr);

이벤트를 받기 위한 함수이다.
키보드나 마우스로부터 받은 이벤트를 기다리는 무한 루프이고, 이벤트에 연결되는 사용자 정의 함수를 호출한다.

  • mlx_ptr: mlx instance pointer

return_value:

  • 없음 (리턴 안함)

그래픽 시스템은 양방향이다.
한쪽에서는 스크린에 디스플레이할 픽셀, 이미지 등을 명령하고, 한쪽에서는 키보드나 마우스로부터 “이벤트”를 받는다.
따라서 키보드나 마우스로부터의 명령을 받기 위해서는 해당 함수가 필수적이다.

사용 예

#include <mlx.h>

int main()
{
	void *mlx;
    void *mlx_win;
    
    mlx = mlx_init();
    // 1920x1080 크기의 "Hello World!" 라는 타이틀을 가지는 창을 생성하고 instance pointer 반환
    mlx_win = mlx_new_window(mlx, 1920, 1080, "Hello World!");
    // 새로 생성한 window가 있는 mlx를 랜더링(rendering)
    mlx_loop(mlx);
}

창(window)에 이미지 넣기

mlx_new_image()

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

새로운 mlx 호환 이미지를 만드는 함수이다.
렌더링 중인 이미지를 버퍼링하는 데 권장되는 방법이다.

  • mlx_ptr: mlx instance pointer
  • width: 이미지 가로 길이
  • height: 이미지 세로 길이

return_value:

  • 성공: 이미지에 대한 참조 포인터 (image instance pointer)
  • 실패: NULL

mlx_get_data_addr()

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

주어진 이미지의 메모리 주소를 가져오는 함수이다.

  • img_ptr: image instance pointer
  • bits_per_pixel: 픽셀 색상(이미지 깊이라고도 한다.)을 나타내는 데 필요한 비트 수.
  • size_line: 이미지의 한 줄을 메모리에 저장하는데 사용되는 바이트 수이다. 해당 정보는 이미지에서의 한 줄에서 다른 한 줄로 이동하는데 필요하다.
  • endian: 이미지의 픽셀 색상을 리틀 엔티안(0) 또는 빅 엔디안(1)으로 해야하는지 알려주는 parameter (macOS의 경우 클라이언트와 그래픽 프레임워크가 동일한 엔디언을 갖기 때문에 상관없다.)

return_value:

  • 성공: 이미지의 메모리 주소
  • 실패: NULL

mlx_put_image_to_window()

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

(x, y) 위치에 지정된 window instance에 이미지를 넣는 함수이다.
한 번에 많은 양의 그래픽 데이터를 작성하는 데 권장되는 방법이다.
위치의 메모리를 변경할 때 창에 직접 표시된다.

  • mlx_ptr: mlx instance pointer
  • win_ptr: window instance pointer
  • img_ptr: image instance pointer
  • x: 이미지를 배치해야 하는 x 위치
  • y: 이미지를 배치해야 하는 y 위치

return_value:

  • 없음 (리턴 안함)

사용 예

#include <mlx.h>

typedef struct s_data
{
	void	*img;
    char	*addr;
    int 	bits_per_pixel;
    int		line_length;
    int		endian;
} t_data;

void my_mlx_pixel_put(t_data *data, int x, int y, int color)
{
	char *dst;
    
    dst = data->addr + (y * data->line_length + x * (data->bits_per_pixel / 8));
    *(unsigned int *) dst = color;
}

int main()
{
	void	*mlx;
    void	*mlx_win;
    t_data	img;
    
    mlx = mlx_init();
    mlx_win = mlx_new_window(mlx, 1920, 1080, "Hello world!");
    img.img = mlx_new_image(mlx, 1920, 1080);	// image instance 생성
    img.addr = mlx_get_data_addr(img.img, &img.bits_per_pixel, &img.line_length, &img.endian); // 이미지의 주소 할당
    
    for (int i = 0; i < 100; i++)
    {
    	my_mlx_pixel_put(&img, i, i, 0x00FF0000); // 붉은색 선을 대각선으로 그린다.
        my_mlx_pixel_put(&img, 100, i, 0x00FF0000); // 붉은색 선을 세로으로 그린다.
        my_mlx_pixel_put(&img, i, 100, 0x00FF0000); // 붉은색 선을 가로으로 그린다.
    }
    mlx_put_image_to_window(mlx, mlx_win, img.img, 0, 0); //이미지를 윈도우에 올린다.
    mlx_loop(mlx);
}

이미지(image) 삭제 및 창(window) 닫기

mlx_destroy_window()

int		mlx_destroy_window(void *mlx_ptr, void *win_ptr);

window instance(즉, 생성된 창)을 닫는 함수이다.

  • mlx_ptr: mlx instance pointer
  • win_ptr: window instance pointer

return_value:

  • 없음 (리턴 안함)

mlx_destroy_image()

int		mlx_destroy_image(void *mlx_ptr, void *img_ptr);

mlx instance에 존재하는 image instance를 삭제하는 함수이다.

  • mlx_ptr: mlx instance pointer
  • img_ptr: image instance pointer

return_value:

  • 없음 (리턴 안함)

참고자료
https://velog.io/@sayi/42cursursftminiRTmlx-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC1#%EC%B0%BDwindoe%EC%97%90-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%84%A3%EA%B8%B0
https://harm-smits.github.io/42docs/libs/minilibx/prototypes.html#mlx_get_data_addr
https://harm-smits.github.io/42docs/libs/minilibx/introduction.html

0개의 댓글