#ifndef __BITMAP__LIB__
#define __BITMAP__LIB__

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#define BITS_PER_BYTE 8
#pragma pack(push, 1)

struct Pixel {
	uint8_t B, G, R;
};

struct BitmapHeader {
	uint16_t bmType;
	uint32_t bmSize;
	uint16_t bmReserve1;
	uint16_t bmReserve2;
	uint32_t bmPixArrayOffset;
};

struct BitmapDIB {
	uint32_t headerSize;
	int32_t bmWidth;
	int32_t bmHeight;
	uint16_t nPlanes;
	uint16_t bitDepth;
	uint32_t compressionMode;
	uint32_t dataSize;
	int32_t xPixPerM;
	int32_t yPixPerM;
	uint32_t nColorPalette;
	uint32_t nColorImportant;
};

struct Bitmap{
	BitmapHeader header;
	BitmapDIB dib;
	uint8_t* data;
	uint32_t rowSize;

	Pixel& operator()(uint32_t x, uint32_t y) {
		// data != null
		uint8_t* pointer = data + x*rowSize + y*dib.bitDepth / BITS_PER_BYTE;

		return *((Pixel*)pointer);
	}

	Pixel operator()(uint32_t x, uint32_t y) const {
		// data != null
		uint8_t* pointer = data + x*rowSize + y*dib.bitDepth / BITS_PER_BYTE;

		return *((Pixel*)pointer);
	}
};

#pragma pack(pop)


void freeBitmap(Bitmap*);

Bitmap* newBitmapFromFile(const char*);

bool writeBitmapToFile(const char*, Bitmap*);

void setRowSize(Bitmap*);

#endif // __BITMAP__LIB__