aboutsummaryrefslogtreecommitdiffstats
path: root/src/ft_save_to_bmp.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/ft_save_to_bmp.c99
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);
}