fdf - KimTaebin-ai/study_posts GitHub Wiki

ν•„μš” κ°œλ… 및 ν•™μŠ΅ λ‚΄μš©

κΉƒν—™ μœ„ν‚€λŠ” MathJax LaTeX μˆ˜μ‹μ„ 직접 μ§€μ›ν•˜μ§€ μ•Šμ•„μ„œ 정리λ₯Ό 포기함..

step 1

μœˆλ„μš° μ°½ λ„μš°κΈ°

#include "fdf.h"

int	main(void)
{
	void	*mlx;
	void	*mlx_win;

	mlx = mlx_init();
	mlx_win = mlx_new_window(mlx, 1920, 1080, "Hello world!");
	mlx_loop(mlx);
}
#include "mlx/mlx.h"
NAME = fdf.a
# μ΅œμ’…μ μœΌλ‘œ 생성될 μ‹€ν–‰ 파일의 이름을 'fdf.a'둜 지정

SRCS = main.c
# main.c μ†ŒμŠ€ 파일 지정

OBJS = $(SRCS:%.c=%.o)
# μ†ŒμŠ€ 파일(.c)을 객체 파일(.o)둜 λ³€ν™˜

# CFLAGS = -Wall -Wextra -Werror
INCLUDE_HEADER  =-Imlx
# MLX 라이브러리의 헀더 파일 μœ„μΉ˜λ₯Ό 지정

%.o: %.c
	cc $(CFLAGS) -Imlx -c $< -o $@

$(NAME): $(OBJS)
	$(MAKE) -C mlx
	$(CC) -g $(OBJS) -Lmlx -lmlx_Linux -L/usr/lib -lXext -lX11 -lm -lz -o $(NAME)
	
# -Lmlx: MLX 라이브러리 경둜 지정
# -lmlx_Linux: MLX 라이브러리 링크
# -lXext -lX11: X11 κ΄€λ ¨ 라이브러리 링크
# -lm: μˆ˜ν•™ 라이브러리 링크
# -lz: zlib μ••μΆ• 라이브러리 링크

step 2

μœˆλ„μš° 창에 μ΄λ―Έμ§€λ‘œ 점 찍기

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)
{
	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);
	img.addr = mlx_get_data_addr(img.img, &img.bits_per_pixel, &img.line_length,
			&img.endian);
	my_mlx_pixel_put(&img, 5, 5, 0x00FF0000);
	mlx_put_image_to_window(mlx, mlx_win, img.img, 0, 0);
	mlx_loop(mlx);
}

step 3

μ˜€μΌ€μ΄ μ—°μŠ΅μ€ 끝났고 이제 맡 파일 λΆˆλŸ¬μ˜€λŠ” 것뢀터 ν•΄λ³΄μž

int	main(int argc, char **argv)
{
	file_load(argc, argv);
	return (0);
}
static void	file_load(int argc, char **argv)
{
	int		fd;
	char	*ext;

	if (argc != 2)
	{
		// μ—λŸ¬ 처리
	}
	fd = open(argv[1], O_RDONLY);
	if (fd < 0)
	{
		// μ—λŸ¬ 처리
	}
	close(fd);
	ext = ft_strrchr(argv[1], '.');
	if (!ext || ft_strncmp(ext, ".fdf", 4))
	{
		// μ—λŸ¬ 처리
	}
}

step 4

μ—λŸ¬ 처리 ν•¨μˆ˜ λ§Œλ“€κΈ°

void	error_msg(char *msg, t_data *data)
{
	ft_putstr_fd(msg, 2);
	free(data->img.data);
	free(data->img.img_ptr);
	free(data->mlx_ptr);
	exit(EXIT_FAILURE);
}
static void	file_load(int ac, char **av)
{
	int		fd;
	char	*ext;

	if (ac != 2)
		error_msg("usage: ./fdf <filename>\n", NULL);
	fd = open(av[1], O_RDONLY);
	if (fd < 0)
		error_msg("error: open() failed\n", NULL);
	close(fd);
	ext = ft_strrchr(av[1], '.');
	if (!ext || ft_strncmp(ext, ".fdf", 4))
		error_msg("error: invalid file extension\n", NULL);
}

μœ„μ—μ„œ ν–ˆλ˜ mlx_init() ν•¨μˆ˜λ„ λ§Œλ“€μ–΄λ‘κ³ 

void	init_mlx(t_data *data)
{
	data->mlx_ptr = mlx_init();
	if (!data->mlx_ptr)
		error_msg("error: mlx_init() failed\n", data);
	data->win_ptr = mlx_new_window(data->mlx_ptr, WIN_WIDTH, WIN_HEIGHT, "fdf");
	if (!data->win_ptr)
		error_msg("error: mlx_new_window() failed\n", data);
	data->img.img_ptr = mlx_new_image(data->mlx_ptr, WIN_WIDTH, WIN_HEIGHT);
	if (!data->img.img_ptr)
		error_msg("error: mlx_new_image() failed\n", data);
	data->img.data = mlx_get_data_addr(data->img.img_ptr, &data->img.bpp,
			&data->img.size_line, &data->img.endian);
	if (!data->img.data)
		error_msg("error: mlx_get_data_addr() failed\n", data);
}
int	main(int argc, char **argv)
{
	t_data	data;

	init_data(&data);
	file_load(argc, argv);
	init_mlx(&data);
	mlx_loop(data.mlx_ptr);
	return (0);
}

step 5

ν›…μŠ€ μΆ”κ°€ν•˜κΈ°

#include "fdf.h"

static void	close_window(t_data *data)
{
	if (data->win_ptr)
	{
		mlx_destroy_window(data->mlx_ptr, data->win_ptr);
		data->win_ptr = NULL;
	}
	if (data->img.img_ptr)
	{
		mlx_destroy_image(data->mlx_ptr, data->img.img_ptr);
		data->img.img_ptr = NULL;
	}
	if (data->mlx_ptr)
	{
		free(data->mlx_ptr);
		data->mlx_ptr = NULL;
	}
	// TODO
	// mlx, 색깔, μ’Œν‘œ free() ν•¨μˆ˜ ν•„μš”
	exit(EXIT_SUCCESS);
}

int	key_hook(int keycode, t_data *data)
{
	int	i;

	i = 0;
	if (!data->init_coords || !data->coords)
		error_msg("Error: init_coords or coords is NULL", data);
	while (i < data->map_height * data->map_width)
	{
		data->coords[i] = data->init_coords[i];
		i++;
	}
	if (keycode == 53 || keycode == 65307)
		close_window(data);
	// TODO
	// νšŒμ „, ν™•λŒ€ λ“±λ“± λ³΄λ„ˆμŠ€μš© ν•¨μˆ˜ ν•„μš”
	return (0);
}

int	handle_x(t_data *data)
{
	close_window(data);
	return (0);
}
int	main(int argc, char **argv)
{
	t_data	data;

	init_data(&data);
	file_load(argc, argv);
	init_mlx(&data);
	mlx_key_hook(data.win_ptr, key_hook, &data);
	mlx_hook(data.win_ptr, 17, 0, handle_x, &data);
	mlx_loop(data.mlx_ptr);
	return (0);
}
⚠️ **GitHub.com Fallback** ⚠️