diff options
Diffstat (limited to 'src/drivers')
| -rw-r--r-- | src/drivers/bmp.cc | 39 | ||||
| -rw-r--r-- | src/drivers/bmp.hpp | 18 |
2 files changed, 57 insertions, 0 deletions
diff --git a/src/drivers/bmp.cc b/src/drivers/bmp.cc new file mode 100644 index 0000000..6f9dad6 --- /dev/null +++ b/src/drivers/bmp.cc @@ -0,0 +1,39 @@ +#include "bmp.hpp" +#include "libs/string.hpp" + +#include "drivers/framebuffer.hpp" + +void bmp_draw(u8* bmp_data, int posx, int posy){ + BMP_HEADER header; + memcpy(bmp_data, &header, sizeof(BMP_HEADER)); + if(header.signature!=0x4d42){ + printk("Invalid BMP data\n"); + return; + } + + // Do not forget, each row is 32bits aligned + u32 Bpp=header.bpp/8; + u32 lineW=header.width*Bpp; + while((lineW&0x3)!=0){ + lineW++; + } + + for(u32 y=0;y<header.height;y++){ + for(u32 x=0;x<header.width;x++){ + u32 pos=x*Bpp+y*lineW; + u8 *pixel=((u8*)bmp_data)+header.data_offset+pos; + FB_PIXEL p; + p.x=posx+x; + p.y=posy+(header.height-y); + p.r=pixel[0]; + p.g=pixel[1]; + p.b=pixel[2]; + //printk("R%d G%d B%d\n",p.r,p.g,p.b); + p.a=0; + framebuffer_draw(p); + + } + + } + +}
\ No newline at end of file diff --git a/src/drivers/bmp.hpp b/src/drivers/bmp.hpp new file mode 100644 index 0000000..e31d4b3 --- /dev/null +++ b/src/drivers/bmp.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include "boucane.hpp" + +typedef struct { + u16 signature; + u32 filesize; + u32 reserved; + u32 data_offset; + u32 info_header_size; + u32 width; + u32 height; + u16 planes; + u16 bpp; + u32 compression; +} __attribute__((packed)) BMP_HEADER; + +void bmp_draw(u8* bmp_data, int x, int y);
\ No newline at end of file |
