summaryrefslogtreecommitdiff
path: root/bmp.c
blob: 9537704c2c37e2def764977516332921c8273b8f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <errno.h>

#include "color.h"
#include "bmp.h"

#define BYTES_PER_PIXEL 3
#define OFFSET_bfSize   2
#define OFFSET_biWidth  18
#define OFFSET_biHeight 22
#define HEADERSIZE      54

static const char* header_template = "BM    \0\0\0\0\x36\0\0\0\x28\0\0\0        \x01\0\x18\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";

int
bmp_write_header(FILE* fh, int32_t width, int32_t height) {
	char* header;
	uint32_t filesize;
	
	if(!(header = malloc(HEADERSIZE))) {
		fputs("Could not allocate memory for BMP header.\n", stderr);
		return 0;
	}
	
	filesize = HEADERSIZE + (width * height * BYTES_PER_PIXEL);
	height *= -1;
	
	memcpy(header, header_template, HEADERSIZE);
	memcpy(header + OFFSET_bfSize, &filesize, 4);
	memcpy(header + OFFSET_biWidth, &width, 4);
	memcpy(header + OFFSET_biHeight, &height, 4);
	
	if(fwrite(header, HEADERSIZE, 1, fh) != 1) {
		fprintf(stderr, "Could not write BMP header: %s\n", strerror(errno));
		free(header);
		return 0;
	}
	
	free(header);
	return 1;
}

int
bmp_write_pixel(FILE* fh, color_t col) {
	uint8_t pixel[3];
	pixel[0] = col.b;
	pixel[1] = col.g;
	pixel[2] = col.r;
	
	return (fwrite(pixel, 3, 1, fh) == 1);
}