Files
Aeon/legacy/src/framebuffer.cpp

84 lines
2.0 KiB
C++

#include "framebuffer.hpp"
#include <memory>
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "thirdparty/stb_image_write.h"
FrameBuffer::FrameBuffer( int width, int height )
: mWidth(width)
, mHeight(height)
{
size_t size = sizeof( uint32_t ) * mWidth * mHeight;
Data = (uint32_t*)malloc( size );
// Initialise the framebuffer
if ( Data != nullptr )
memset( Data, 0xFFFFFFFF, size );
}
void FrameBuffer::SetPixel( int x, int y, glm::vec3 p )
{
int i = y * mWidth + x;
const static float gamma = 1.0f / 2.2f;
uint8_t r = (uint8_t)( pow( p.r, gamma ) * 255.0f );
uint8_t g = (uint8_t)( pow( p.g, gamma ) * 255.0f );
uint8_t b = (uint8_t)( pow( p.b, gamma ) * 255.0f );
uint32_t col = r << 24 | g << 16 | b << 8 | 0xFF;
Data[i] = col;
}
void FrameBuffer::Resize( int width, int height )
{
mWidth = width; mHeight = height;
size_t size = sizeof( uint32_t ) * mWidth * mHeight;
realloc( Data, size );
memset( Data, 0xFFFFFFFF, size );
}
void FrameBuffer::DumpToFile( std::string file )
{
// int stbi_write_png(char const* filename, int w, int h, int comp, const void* data, int stride_in_bytes);
struct P {
unsigned char r, g, b, a;
};
P* imageData = (P*)malloc( ( (int)mWidth * (int)mHeight ) * sizeof( P ) );
for ( int x = 0; x < mWidth; x++ )
for ( int y = 0; y < mHeight; y++ ) {
// Red and Blue channels need to be swapped, no clue why
// saving the framebuffer just doesnt work
//nvm it just doesnt work
uint32_t pixel = Data[y * mWidth + x];
uint8_t er = ( pixel & 0x0000FF00 );
uint8_t eg = ( pixel & 0x00FF0000 ) >> 8;
uint8_t eb = ( pixel & 0xFF0000FF ) >> 16;
imageData[y * mWidth + x] = P{ (unsigned char)er, (unsigned char)eg, (unsigned char)eb, 0xFF };
}
stbi_write_png( file.c_str(), mWidth, mHeight, sizeof( P ), imageData, sizeof( P ) * mWidth );
free( imageData );
}
int FrameBuffer::GetWidth()
{
return mWidth;
}
int FrameBuffer::GetHeight()
{
return mHeight;
}
FrameBuffer::~FrameBuffer()
{
free( Data );
}