diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/BMPImage.cpp | 52 | ||||
| -rw-r--r-- | src/BMPImage.h | 1 |
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; |
