diff options
| author | Loic Guegan <manzerbredes@mailbox.org> | 2021-04-29 08:49:41 +0200 |
|---|---|---|
| committer | Loic Guegan <manzerbredes@mailbox.org> | 2021-04-29 08:49:41 +0200 |
| commit | fde8a1ab65d5e33d90123a3aaa9b5c15e249689f (patch) | |
| tree | 14134c0c2f322cbcba0989b78bd7057f76c157c3 /src/drivers/psftext.cc | |
| parent | 067d6e340be698b0e26b7732215a1969e0e683f3 (diff) | |
Debug, add memory print driver
Diffstat (limited to 'src/drivers/psftext.cc')
| -rw-r--r-- | src/drivers/psftext.cc | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/drivers/psftext.cc b/src/drivers/psftext.cc new file mode 100644 index 0000000..da7e8c9 --- /dev/null +++ b/src/drivers/psftext.cc @@ -0,0 +1,66 @@ +#include "psftext.hpp" +#include "core/paging.hpp" +#include "libs/string.hpp" +#include "drivers/framebuffer.hpp" + +PSF_STATUS psf_status; + +void psftext_init(void* psf_addr){ + printk("Loading PSF font... "); + memcpy(psf_addr, &psf_status.header, sizeof(PSF_HEADER)); + if(psf_status.header.magic!=PSF_MAGIC){ + printk("Invalid PSF magic number. Abort.\n"); + return; + } + + printk("Flags %d Version %d Glyphs number %d Size %dx%d", + psf_status.header.flags, psf_status.header.version, + psf_status.header.glyph_count, psf_status.header.glyph_width, psf_status.header.glyph_height); + psf_status.x=0; + psf_status.y=0; + psf_status.psf_addr=(u8*)psf_addr; + psf_status.nline=fb_cfg.height/psf_status.header.glyph_height; + psf_status.nchar=fb_cfg.width/psf_status.header.glyph_width; + psf_status.bg=0; + psf_status.fg=200; + print("\n"); +} + +void psftext_putchar(char c){ + if(c=='\n'){ + psf_status.y++; + psf_status.x=0; + if(psf_status.y>psf_status.nline) + framebuffer_scrollup(psf_status.header.glyph_height); + return; + } + + u8* glyph=(psf_status.psf_addr+psf_status.header.header_length+c*psf_status.header.glyph_size); + FB_PIXEL pixel; + for(int i=0;i<psf_status.header.glyph_height;i++){ + for(int k=0;k<(psf_status.header.glyph_width/8);k++){ + u8 mask=1<<7; + u8 row=*(glyph+k); + for(int j=0;j<8;j++){ + u16 status=row&mask; + u8 color=status ? psf_status.fg:psf_status.bg; + pixel.x=j+k*8+psf_status.x*psf_status.header.glyph_width; + pixel.y=i+psf_status.y*psf_status.header.glyph_height; + pixel.r=color; + pixel.g=color; + pixel.b=color; + pixel.a=color; + framebuffer_draw(pixel); + mask>>=1; + } + } + glyph+=psf_status.header.glyph_width/8; + } + psf_status.x++; + if(psf_status.x>psf_status.nchar){ + psf_status.y++; + psf_status.x=0; + if(psf_status.y>psf_status.nline) + framebuffer_scrollup(psf_status.header.glyph_height); + } +}
\ No newline at end of file |
