aboutsummaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/bmp.cc39
-rw-r--r--src/drivers/bmp.hpp18
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