diff options
Diffstat (limited to '')
-rw-r--r-- | src/ft_save_to_bmp.c | 99 |
1 files changed, 72 insertions, 27 deletions
diff --git a/src/ft_save_to_bmp.c b/src/ft_save_to_bmp.c index 66f8b86..7d242c6 100644 --- a/src/ft_save_to_bmp.c +++ b/src/ft_save_to_bmp.c @@ -14,6 +14,8 @@ #include <cub3d.h> #include <stddef.h> #include <stdlib.h> +#include <fcntl.h> +#include <unistd.h> #include <stdint.h> static char @@ -23,56 +25,99 @@ static char if (ft_strrchr(ml->filename, '/')) { - if (!(str = (char*)malloc((ft_strlen(FT_BMP_SAVE_DIR) + ft_strlen(ft_strrchr(ml->filename, '/') + 1) + 1) * sizeof(char)))) + if (!(str = (char*)malloc((ft_strlen(FT_BMP_SAVE_DIR) + + ft_strlen(ft_strrchr(ml->filename, '/')+ 1) + + 1) * sizeof(char)))) return (NULL); - ft_printf("%lu\n", (ft_strlen(FT_BMP_SAVE_DIR) + ft_strlen((ft_strrchr(ml->filename, '/') + 1)) + 1)); ft_sprintf(str, "%s%s", FT_BMP_SAVE_DIR, ft_strrchr(ml->filename, '/') + 1); } else { if (!(str = (char*)malloc((ft_strlen(FT_BMP_SAVE_DIR) + - ft_strlen(ml->filename) + 1)* sizeof(char)))) + ft_strlen(ml->filename) + 1) * sizeof(char)))) return (NULL); - ft_sprintf(str, "%s%s.bmp", FT_BMP_SAVE_DIR, ml->filename); + ft_sprintf(str, "%s%s", FT_BMP_SAVE_DIR, ml->filename); } ft_memcpy(ft_strrchr(str, '.') + 1, "bmp", 3); return (str); - /* return (NULL); */ } -/* static int8_t */ -/* ft_convert_image_to_bmp(t_bmp_file bmp_file, void *img, t_cub *cl) */ -/* { */ -/* int32_t filelen; */ -/* uint8_t *bmp; */ +static uint8_t + *ft_convert_image_to_bmp(t_img img, t_cub *cl) +{ + uint8_t *bmp; + t_rgb px; + uint32_t y; + uint32_t x; + uint32_t i; -/* (void)img; */ -/* (void)bmp_file; */ -/* filelen = 54 + 3 * cl->wlist.x_size * cl->wlist.y_size; */ -/* if (!(bmp = (uint8_t*)malloc((filelen - 54) * sizeof(uint8_t)))) */ -/* return (-1); */ -/* ft_memdel((void**)&bmp); */ -/* return (0); */ -/* } */ + if (!(bmp = (uint8_t*)malloc((3 * cl->wlist.x_size + * cl->wlist.y_size) * sizeof(uint8_t)))) + return (NULL); + y = cl->wlist.y_size; + i = 0; + while (--y > 0) + { + x = -1; + while (++x < cl->wlist.x_size) + { + px = ft_hex_to_rgb(*(int*)(img.ptr + (x * 4 + (y * img.sizeline)))); + *(bmp + i++) = (uint8_t)px.b; + *(bmp + i++) = (uint8_t)px.g; + *(bmp + i++) = (uint8_t)px.r; + } + } + return (bmp); +} -int8_t - ft_save_to_bmp(void *img, t_cub *cl) +static int8_t + ft_write_bmp(const char *fname, uint32_t h, uint32_t w, uint8_t *bmp) { t_bmp_file bmp_file; t_bmp_info bmp_info; - t_bmp_colors bmp_colors; - char *fname; + uint32_t size; + int fd; - (void)img; + size = w * h * 3; bmp_file = ft_init_bmp(); bmp_info = ft_init_bmp_info(); - bmp_colors = ft_init_bmp_colors(); + bmp_file.file_size = size + sizeof(t_bmp_file) + sizeof(t_bmp_info); + bmp_file.offset_data = bmp_file.file_size - size; + bmp_info.size = 40; + bmp_info.width = w; + bmp_info.height = h; + bmp_info.bit_count = 24; + bmp_info.size_image = size; + if (!(fd = open(fname, O_RDWR | O_CREAT , 0644))) + return (-1); + write(fd, &bmp_file, sizeof(t_bmp_file)); + write(fd, &bmp_info, sizeof(t_bmp_info)); + write(fd, bmp, size); + close(fd); + return (0); +} + +int8_t + ft_save_to_bmp(t_cub *cl) +{ + uint8_t *bmp; + char *fname; + if (!(fname = ft_set_file_name(&cl->mlist))) return (-1); - ft_printf("%s\n", fname); - /* if (ft_convert_image_to_bmp(bmp_file, img, cl) < 0) */ - /* return (-1); */ + if (!(bmp = ft_convert_image_to_bmp(cl->img, cl))) + { + ft_memdel((void**)&fname); + return (-1); + } + if (ft_write_bmp(fname, cl->wlist.y_size, cl->wlist.x_size, bmp) < 0) + { + ft_memdel((void**)&bmp); + ft_memdel((void**)&fname); + return (-1); + } + ft_memdel((void**)&bmp); ft_memdel((void**)&fname); return (0); } |