Files
42_vox/ScopEngine/Runtime/Sources/Graphics/Loaders/BMP.cpp
2025-06-03 11:57:58 +02:00

46 lines
1.3 KiB
C++

#include <Graphics/Loaders/BMP.h>
#include <Maths/Vec3.h>
#include <fstream>
namespace Scop
{
CPUBuffer LoadBMPFile(const std::filesystem::path& path, Vec2ui32& dimensions)
{
if(path.extension() != ".bmp")
{
Error("BMP loader: not a BMP file, %", path);
return {};
}
std::ifstream file(path, std::ios::binary);
if(!file.is_open())
{
Error("BMP loader: could not open %", path);
return {};
}
std::int16_t bpp;
file.seekg(18, std::ios_base::beg);
file.read(reinterpret_cast<char*>(&dimensions.x), sizeof(dimensions.x));
file.read(reinterpret_cast<char*>(&dimensions.y), sizeof(dimensions.y));
file.seekg(28, std::ios_base::beg);
file.read(reinterpret_cast<char*>(&bpp), sizeof(bpp));
file.seekg(54, std::ios_base::beg);
if(bpp != 24)
Warning("BMP loader: warning while loading %, cannot handle yet different color palette sizes", path);
CPUBuffer buffer{ dimensions.x * dimensions.y * 4 };
for(std::size_t i = 0; i < buffer.GetSize(); i += 4)
{
Vec3b data{ 0, 0, 0 };
data.x = (file.eof() ? 0x00 : file.get());
data.y = (file.eof() ? 0x00 : file.get());
data.z = (file.eof() ? 0x00 : file.get());
buffer.GetData()[i + 0] = data.z;
buffer.GetData()[i + 1] = data.y;
buffer.GetData()[i + 2] = data.x;
buffer.GetData()[i + 3] = 0xFF;
}
Message("BMP Loader: loaded %", path);
return buffer;
}
}