aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDylan <boss@tehbox.org>2026-04-30 01:11:11 +1200
committerDylan <boss@tehbox.org>2026-04-30 01:11:11 +1200
commitb1eeaeb1e899dab64ce7bd21611e072cbca4107c (patch)
treeb196802e2499aead4809ed4af6816b1cdcfc896d /src
parente9a32a966d49ab798a4c6f24471669fc03adb395 (diff)
downloadtehimage-b1eeaeb1e899dab64ce7bd21611e072cbca4107c.tar.gz
tehimage-b1eeaeb1e899dab64ce7bd21611e072cbca4107c.zip
feat: Started implementing BMP reading
This is so I can test PNG writing by reading a BMP and writing it to a PNG, effectively the reverse of the PNG reading testing
Diffstat (limited to 'src')
-rw-r--r--src/BMPImage.cpp52
-rw-r--r--src/BMPImage.h1
2 files changed, 52 insertions, 1 deletions
diff --git a/src/BMPImage.cpp b/src/BMPImage.cpp
index b0b7c55..b45ff3f 100644
--- a/src/BMPImage.cpp
+++ b/src/BMPImage.cpp
@@ -1,7 +1,9 @@
#include "BMPImage.h"
+#include "reader.h"
#include <cstdint>
#include <iostream>
+#include <memory>
using std::cout, std::endl;
@@ -10,7 +12,55 @@ namespace TehImage
int BMPImage::readFromFile(std::string filename)
{
- cout << "Not implemented" << endl;
+ Reader reader(filename, FileEndianness::LITTLE);
+
+ char magic[2];
+ uint8_t expected[] = {0x42, 0x4D};
+ reader.readBytes(magic, 2);
+ uint32_t fileSize = reader.readData<uint32_t>();
+ reader.skipBytes(4);
+ uint32_t offset = reader.readData<uint32_t>();
+
+ if(strncmp(magic, (char*)expected, 2) != 0)
+ {
+ cout << "Not a BMP" << endl;
+ return 1;
+ }
+
+ uint32_t headerSize = reader.readData<uint32_t>();
+
+ // BITMAPINFOHEADER
+ if(headerSize == 40)
+ {
+ width = reader.readData<uint32_t>();
+ height = reader.readData<uint32_t>();
+ uint16_t colorPlanes = reader.readData<uint16_t>();
+ bpp = reader.readData<uint16_t>();
+ uint32_t compressionMethod = reader.readData<uint32_t>();
+ uint32_t size = reader.readData<uint32_t>();
+ uint32_t horrRes = reader.readData<uint32_t>();
+ uint32_t vertRes = reader.readData<uint32_t>();
+ uint32_t paletteSize = reader.readData<uint32_t>();
+ uint32_t importantColors = reader.readData<uint32_t>();
+
+ pixels = std::make_unique<Pixel[]>(width * height);
+
+ for(int y = height-1; y >= 0; y--)
+ {
+ for(int x = 0; x < width; x++)
+ {
+ Pixel& pixel = (*this)[x,y];
+ pixel.b = reader.readByte();
+ pixel.g = reader.readByte();
+ pixel.r = reader.readByte();
+ pixel.a = 255;
+ }
+ }
+
+ // cout << compressionMethod << " " << size << endl;
+ }
+
+ // cout << "Not implemented" << endl;
return 2;
};
diff --git a/src/BMPImage.h b/src/BMPImage.h
index 651192b..e9da6f5 100644
--- a/src/BMPImage.h
+++ b/src/BMPImage.h
@@ -12,6 +12,7 @@ namespace TehImage
private:
public:
// template<std::derived_from<Image> T> BMPImage(const T& other) : Image(other) { }
+ BMPImage() = default;
BMPImage(const Image& other) : Image(other) {}
int readFromFile(std::string filename) override;