From 96919bf34222c0c3f37e1085342b81c63da386c8 Mon Sep 17 00:00:00 2001 From: Kevin Chabowski Date: Thu, 1 Aug 2013 23:01:53 +0200 Subject: Moved BMP code to own file. --- Makefile | 5 +++-- bmp.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ bmp.h | 12 ++++++++++++ 3 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 bmp.c create mode 100644 bmp.h diff --git a/Makefile b/Makefile index 76a46b1..e55ac71 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/bmp.c b/bmp.c new file mode 100644 index 0000000..9537704 --- /dev/null +++ b/bmp.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include +#include + +#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); +} diff --git a/bmp.h b/bmp.h new file mode 100644 index 0000000..e9b2821 --- /dev/null +++ b/bmp.h @@ -0,0 +1,12 @@ +#ifndef _nebula2_bmp_h_ +#define _nebula2_bmp_h_ + +#include +#include + +#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 -- cgit v1.2.3-54-g00ecf