aboutsummaryrefslogtreecommitdiff
path: root/src/capture.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/capture.c')
-rw-r--r--src/capture.c100
1 files changed, 84 insertions, 16 deletions
diff --git a/src/capture.c b/src/capture.c
index a052709..72c1f81 100644
--- a/src/capture.c
+++ b/src/capture.c
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/01/11 13:15:11 by cacharle #+# #+# */
-/* Updated: 2020/02/02 08:33:14 by cacharle ### ########.fr */
+/* Updated: 2020/02/03 02:25:43 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -14,14 +14,14 @@
#define BM_FILE_TYPE 19778
#define DATA_OFFSET 1078
-#define BITMAP_INFO_HEADER_SIZE 40
+#define BITMAP_INFO_HEADER_SIZE 0x424d
#define CAPTURE_FILENAME "capture.bmp"
int capture(t_state *state)
{
t_bmp_header header;
- render_update_window(state, CELL_WALL);
+ render_update_window(state);
bmp_fill_header(&state->window, &header);
if (!bmp_write(&state->window, &header))
{
@@ -31,15 +31,81 @@ int capture(t_state *state)
return (0);
}
+unsigned char* createBitmapFileHeader(int height, int width, int paddingSize){
+ int fileSize = 14 + 40 + (3*width+paddingSize) * height;
+
+ static unsigned char fileHeader[] = {
+ 0,0, /// signature
+ 0,0,0,0, /// image file size in bytes
+ 0,0,0,0, /// reserved
+ 0,0,0,0, /// start of pixel array
+ };
+
+ fileHeader[ 0] = (unsigned char)('B');
+ fileHeader[ 1] = (unsigned char)('M');
+ fileHeader[ 2] = (unsigned char)(fileSize );
+ fileHeader[ 3] = (unsigned char)(fileSize>> 8);
+ fileHeader[ 4] = (unsigned char)(fileSize>>16);
+ fileHeader[ 5] = (unsigned char)(fileSize>>24);
+ fileHeader[10] = (unsigned char)(14 + 40);
+
+ return fileHeader;
+}
+
+unsigned char* createBitmapInfoHeader(int height, int width){
+ static unsigned char infoHeader[] = {
+ 0,0,0,0, /// header size
+ 0,0,0,0, /// image width
+ 0,0,0,0, /// image height
+ 0,0, /// number of color planes
+ 0,0, /// bits per pixel
+ 0,0,0,0, /// compression
+ 0,0,0,0, /// image size
+ 0,0,0,0, /// horizontal resolution
+ 0,0,0,0, /// vertical resolution
+ 0,0,0,0, /// colors in color table
+ 0,0,0,0, /// important color count
+ };
+
+ infoHeader[ 0] = (unsigned char)(40);
+ infoHeader[ 4] = (unsigned char)(width );
+ infoHeader[ 5] = (unsigned char)(width>> 8);
+ infoHeader[ 6] = (unsigned char)(width>>16);
+ infoHeader[ 7] = (unsigned char)(width>>24);
+ infoHeader[ 8] = (unsigned char)(height );
+ infoHeader[ 9] = (unsigned char)(height>> 8);
+ infoHeader[10] = (unsigned char)(height>>16);
+ infoHeader[11] = (unsigned char)(height>>24);
+ infoHeader[12] = (unsigned char)(1);
+ infoHeader[14] = (unsigned char)(3*8);
+
+ return infoHeader;
+}
+
t_bool bmp_write(t_image *image, t_bmp_header *header)
{
int fd;
- if ((fd = open(CAPTURE_FILENAME, O_WRONLY | O_CREAT)) < 0)
+ unsigned char padding[3] = {0, 0, 0};
+ int paddingSize = (4 - (image->width*3) % 4) % 4; //redundant?
+ unsigned char* fileHeader = createBitmapFileHeader(image->height, image->width, paddingSize);
+ unsigned char* infoHeader = createBitmapInfoHeader(image->height, image->width);
+
+ if ((fd = open(CAPTURE_FILENAME, O_WRONLY | O_CREAT, S_IRWXU)) < 0)
return (FALSE);
- printf("%d\n", fd);
- write(fd, &header, sizeof(t_bmp_header));
- write(fd, image->data, image->width * image->height * 4);
+
+ write(fd, fileHeader, 14);
+ write(fd, infoHeader, 40);
+ /* write(fd, &header, sizeof(t_bmp_header)); */
+ for (int i = 0; i < image->width; i++)
+ {
+ for (int j = 0; j < image->height; j++)
+ {
+ write(fd, &image->data[4 * (i * image->width + j)], 3);
+ }
+ write(fd, padding, paddingSize);
+ }
+ /* write(fd, image->data, image->width * image->height * 4); */
close(fd);
return (TRUE);
}
@@ -47,23 +113,25 @@ t_bool bmp_write(t_image *image, t_bmp_header *header)
void bmp_fill_header(t_image *image, t_bmp_header *header)
{
header->file_header.file_type = BM_FILE_TYPE;
- header->file_header.file_size = sizeof(t_bmp_header) + image->width * image->height * 4;
+ header->file_header.file_size = sizeof(t_bmp_header) + image->width * image->height * 3;
header->file_header.reserved1 = 0;
header->file_header.reserved1 = 0;
- header->file_header.offset = DATA_OFFSET;
- header->info_header.size = sizeof(t_bmp_header) + image->width * image->height * 4;
+ header->file_header.offset = sizeof(t_bmp_header);
+
+ header->info_header.size = sizeof(header->info_header);
header->info_header.width = image->width;
header->info_header.height = image->height;
header->info_header.planes = 0;
- header->info_header.depth = 8 * 4;
+ header->info_header.depth = 8 * 3;
header->info_header.compression = 0;
- header->info_header.size_image = 0;
+ header->info_header.size_image = image->width * image->height * 3;
header->info_header.w_pix_per_meter = 0;
header->info_header.h_pix_per_meter = 0;
header->info_header.color_used = 0;
header->info_header.color_important = 0;
- header->color_table.blue = 0xff;
- header->color_table.green = 0xff;
- header->color_table.red = 0xff;
- header->color_table.reserved = 0;
+
+ /* header->color_table.blue = 0xff; */
+ /* header->color_table.green = 0xff; */
+ /* header->color_table.red = 0xff; */
+ /* header->color_table.reserved = 0; */
}