aboutsummaryrefslogtreecommitdiffstats
path: root/src/ft_save_to_bmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ft_save_to_bmp.c')
-rw-r--r--src/ft_save_to_bmp.c125
1 files changed, 125 insertions, 0 deletions
diff --git a/src/ft_save_to_bmp.c b/src/ft_save_to_bmp.c
new file mode 100644
index 0000000..90bbb1f
--- /dev/null
+++ b/src/ft_save_to_bmp.c
@@ -0,0 +1,125 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_save_to_bmp.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/02/29 20:50:35 by rbousset #+# #+# */
+/* Updated: 2020/02/29 20:50:37 by rbousset ### ########lyon.fr */
+/* */
+/* ************************************************************************** */
+
+#include <libft.h>
+#include <cub3d.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdint.h>
+
+static char
+ *ft_set_file_name(t_map *ml)
+{
+ char *str;
+
+ 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))))
+ return (NULL);
+ 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))))
+ return (NULL);
+ ft_sprintf(str, "%s%s", FT_BMP_SAVE_DIR, ml->filename);
+ }
+ ft_memcpy(ft_strrchr(str, '.') + 1, "bmp", 3);
+ return (str);
+}
+
+static uint8_t
+ *ft_convert_image_to_bmp(t_img img, t_cub *cl)
+{
+ uint8_t *bmp;
+ t_bmp_rgb px;
+ uint32_t y;
+ uint32_t x;
+ uint32_t i;
+
+ (void)img;
+ 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*)(cl->img.ptr
+ + (x * 4 + (y * cl->img.sizeline))));
+ *(bmp + i++) = (uint8_t)px.b;
+ *(bmp + i++) = (uint8_t)px.g;
+ *(bmp + i++) = (uint8_t)px.r;
+ }
+ }
+ return (bmp);
+}
+
+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;
+ uint32_t size;
+ int fd;
+
+ size = w * h * 3;
+ bmp_file = ft_init_bmp();
+ bmp_info = ft_init_bmp_info();
+ 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);
+ 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);
+}