diff options
-rw-r--r-- | Makefile | 5 | ||||
-rw-r--r-- | bmp.c | 54 | ||||
-rw-r--r-- | bmp.h | 12 |
3 files changed, 69 insertions, 2 deletions
@@ -6,8 +6,9 @@ SFMTFLAGS=-DHAVE_SSE2 -DSFMT_MEXP=19937 OPTIMIZE=-O3 -fno-strict-aliasing #OPTIMIZE=-ggdb -nebula2: nebula2.o config.o render.o statefile.o color.o mutex_helpers.o iniparser/libiniparser.a SFMT/SFMT.c - $(CC) $(CFLAGS) $(OPTIMIZE) $(SFMTFLAGS) $(LIBS) -o nebula2 nebula2.o config.o render.o statefile.o color.o mutex_helpers.o iniparser/libiniparser.a SFMT/SFMT.c +OBJECTS=nebula2.o config.o render.o statefile.o color.o mutex_helpers.o bmp.o +nebula2: $(OBJECTS) iniparser/libiniparser.a SFMT/SFMT.c + $(CC) $(CFLAGS) $(OPTIMIZE) $(SFMTFLAGS) $(LIBS) -o nebula2 $(OBJECTS) iniparser/libiniparser.a SFMT/SFMT.c iniparser/libiniparser.a: make -C iniparser libiniparser.a @@ -0,0 +1,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); +} @@ -0,0 +1,12 @@ +#ifndef _nebula2_bmp_h_ +#define _nebula2_bmp_h_ + +#include <stdio.h> +#include <stdint.h> + +#include "color.h" + +extern int bmp_write_header(FILE* fh, int32_t width, int32_t height); +extern int bmp_write_pixel(FILE* fh, color_t col); + +#endif
\ No newline at end of file |