From d8bfb76eef955b2305a1ebbabc31cab3d063064d Mon Sep 17 00:00:00 2001 From: apio Date: Mon, 19 Sep 2022 20:17:37 +0200 Subject: [PATCH] Try to make TextRenderer work... still failing I can now safely call try_initialize() in early_init though --- initrd/boot/font.psf | Bin 4421 -> 5312 bytes kernel/include/psf1.h | 11 ++++++ kernel/include/psf2.h | 17 -------- kernel/src/init/Init.cpp | 3 +- kernel/src/psf1.cpp | 3 ++ kernel/src/render/TextRenderer.cpp | 61 +++++++++++++++-------------- 6 files changed, 48 insertions(+), 47 deletions(-) create mode 100644 kernel/include/psf1.h delete mode 100644 kernel/include/psf2.h create mode 100644 kernel/src/psf1.cpp diff --git a/initrd/boot/font.psf b/initrd/boot/font.psf index 0054a2b4f3ed691ef2bcd72e08ad90c94e0ecdb5..047bd1b0be57f5165922969887fd5c6b3ede3304 100644 GIT binary patch literal 5312 zcmZvfYj|8m8ONumYuWPTX}2NR#ja$!-P22gWqTn_!x}b+CGLjWrV9ZrErg^*Q7#pg zR#-M)dH5vt6W^#dDpo?=ZroX2GPqlk>dUR5~-O%TA{=x~wy4)o?nKPI)+}R{f?) z&a6~suyM9AC~c84#mtiKRJwcR*kaFX>CDQSms*V8lP)g2tIeL4q?CK8LP3I@JEhY_ zrOv~1*m$S+7`IpwMUvC_SREWZSj}YmCMF)R`sEuYw%fO4UaQ5L8DRXa#0)TglbE^g zmO;_qLbYAD-a9RwH8UC72ui9H1m*J9AmEiG`Oqk8bjb695`%DqWmr+{tR247Qoq>c zQQyoDP9<9q>!_Z6+RAC>Ni@Ccm~jf&AhJh{Kke44)!~H;Yi>r@jg4(gr(eHj&8Ur+ z#WTD5s$g`pXrjBBvR0L%z@&6KB}JNHo0Q3D=aR1V<@#!^3CBDO&Kf-^X+>^ErLAXF z!Shn4O|7ks`3c7A(frcG>}o=hTJtB{TbEr-{Jk7=Z`VVqR98=-Qfa1Aru#}Y%jI&z zlf|*|a~e(fNH?PnxZXekizj(MF#JX(l zrhdGi+0i7^oNKRhKld`Tq)NrjM^LGbPfm_kE6!h zY;1JY`P05lZhh?7BtqOjvG15E%{K*NZ&WLcGPb+(WVLKXo2<6M$z6OplF#RRdZP71 z*J=|J)6-G^0?vn-bX#BCaVA+U`$e{&o6np*Et2PqgEl87mGV3z2W?*@mkCSvb;Qr5l~yHw)5cNLR5TS)5lTaua| zfkb^oLeom`>T0!FC2g}!vO8olnSaJX`|qn)VZ#_7a-0d$y7d0PRX8S=tT05BJG{L3d@Z8+tN9Jri znZ!hr9h)d%=;rG}Zb#B!C6(3XR{Q8da}gOUbvy27itUQb?66nH@I9oV^GT+L$)da6 zjz4j}GsSVaQDWc0iv04mv=|tD>#K4TYqM1rXj4>YpjO+)dddC5e(&55+{1iYmD}z= z{6bf^{Wg*JDCA;ii1g_WNBMG>6cwMgGS*T3*xnH@j12DC*`LUMe?Iva`MKugagHKu zJ%=GG3Zq&*9m&P*%`CMBr_ZELCLEV$dacEko=lxd=%rEp*zW4Pc%eF#hAbgoaP&Bd~d(3fjzmC>_0{`JKzojRLxW-c5~Tua z+kL>4q;oR9_U{GPKRMFI?)n#N*S}axeRtyo4nH zgg)-itn~X=^@rh66^6&)%kWY7ID85A&kIAX!*DqiA-_BfSMuBpLy*(GdVuE}^%3ty z?o?-xU`HVjABKIfr`&y-Z*XuA`P1zdgQ(N^?#?;UICF+Ft25fIqpX7ur(cSt2 zeWmWkx>gk^zf@K9g{UIF>tH=>fQ@h&48SHBgv~Id2JpU|w-UTrl^NYIZ&yGWMj(JI zp#oRID7*!#P=hhJTJDgphil+kn1JixdUzYW9d^JCuv5LdCJcA+ zcB6XIJMPV2!Hl9N)f3(^?^!Ram+8xN7~V|T6imZzxCLh59q>-L72XB!hTGtFxC8El zJ@6j53*HOwgZIPTuow2h2jCvK7aD2>GjtzsP4$Au%IS;pCwz7wC0~QD!#ChbcuMs% z3&(l;CVUH?hG*be_%?h8o`VzcU6o4#7cq3?5fcGn!AS=gB{f{tSE;?xW7< z)ltsZ7f@eRtMpU(b?k~J<%cOb0#864eGTk`ub`FRqc7Btvtk~->hfn|q1-oJo+hrg73m%ogB(qBP7 z?e~+<_#4P?^)DyC&A*!bet2+s7=8#o2>anz^z_&88~82!4t@`RfIq^Y;Lq?E_$&Mk m{thp}Kj5G6GQ0x+f|Kwn{2NZeY4{KP7ybul;59f4A^aazON1E! literal 4421 zcmeHJ>2nlC6d$&>sG%waBbBn&s#MslD+Ui-5FzNe%#O>t8xtX5yblBqyb%wA#syLF zLPbPGMdg-LQ9)5qs`mXS{1trr`CcEhJ;7L1KJ$|9nP0#Ab#K2}d#Zo4$CT$WNnUuG z#t#|3V5VlQsHu@V4$6g7^w0CJoYk1DWlQyXX-=b7Td1KntlxRg`o8kz`&n7b2Z72q2=W4%in(U4 z?VFh!cxaZHb2+wQS1vlAxtw8Tm8*O{iqt|F*ZP;Oj6=iqbG_oYY+x8?vVM@a)|y$L z6HJ7&9i7E$GpizIg=Q3uI^0}78s*=LwcN~T&xz$Ybhz?f&SY(no(eaK*+QG3#1!aC zDRUg34Uw_1SU@`pV}5V%U{|5CWN2vlV3ePs__<;n%THPhdmOODJZfM!S1F3}-3E?S znHN__43vDCZ9N+pIl8sDV0BqhT^)v7mMXXFoDpi*Dz4Votf^ORR1yS}byQh3+-OuP z6=N!1xvam&<_(leGTE}LbXa)|H=9uliraQnj-paWCS%i=BPL{Ywc*6Fz+y4kBMzw2 zXbi7Pgqg*~HLy}CbULOssACmv(A;iy^kvf3;*zT$fIe9xDh8Q!;e+0)F`9m;%fmet znjL1!e6;jC*FiE)_Sf^mIErjWyagE&6gWvfF)u`7Se0l29jBVv{SS*Ig4~4IsvY*JRbEi+=MRiSg zbzyfE28V_Q3tbn9>V+xOi}m94DdTW?xj8;7&6((DUfRmU5&tkRL0OXJlrKT@KSX4= z_%h&P<^%5J{0-IAeIe_oAb;Pu+_?iO$a~~+*^CR>?TlRS?B0?35)*;#-I5^tb(=N& zbs_t8AvQ&876XXG|(w#=U+O!}CyWf!t#7hW|p z1q+1~R5^2p?JSt=Cv_JVHyT5QFyaMHU)}7cYp^31a{4ah^j*k~#`JE}LdCF97*_{a zVL&5xfAp{yI=upFd?$y}m#@Ql6!E>jNx)on|e59VmVsD2^P+ zx~XQJ?%k~Ga#`1b(>waIZae0T+-9w!;^LTQt)gl}6;&HbH5gf86=WNFeERuTNj|r{ zOei1jYJb~1Y`-_m4jagh#BgjNTXvy64(0ThjQOHSgqaJR-?0rstrIez-@cQ_Rvue; zZ0B)St!`BFF2?(LoaAwg$0kuhYaftD4+^*%MO=fKxE8&bh3jxVZorM0jhj%y9L&Yd zn1@?19}Ccjg}4>BA;j${V-X@$5aSM1u^2Vni8>nS$6Xk}AnwKzEX5F(VL9%>Fz&^D zxE~MTK|F+q@dzHpV_1R5u@bBB1fIlGcp9tm44%bvcpfj{MZAPHco}Q)3SPx)cpd97 zg7tUJ15tvzV%m0Vl<(K>+EK~DS-T8H^@l*e%?gesvJYMqwpjCwr> z+6a0Zv$ hSI}>ulb} - -#define PSF_FONT_MAGIC 0x864ab572 - -typedef struct -{ - uint32_t magic; - uint32_t version; - uint32_t headersize; - uint32_t flags; - uint32_t numglyph; - uint32_t bytesperglyph; - uint32_t height; - uint32_t width; - uint8_t glyphs; -} __attribute__((packed)) psf2_t; \ No newline at end of file diff --git a/kernel/src/init/Init.cpp b/kernel/src/init/Init.cpp index 9addffed..9bf2c45c 100644 --- a/kernel/src/init/Init.cpp +++ b/kernel/src/init/Init.cpp @@ -38,13 +38,14 @@ void Init::early_init() framebuffer0.init((void*)bootboot.fb_ptr, bootboot.fb_type, bootboot.fb_scanline, bootboot.fb_width, bootboot.fb_height); - // ASSERT(TextRenderer::try_initialize()); kernelPMM.init_from_mmap(); kernelVMM.init(); InitRD::init(); + ASSERT(TextRenderer::try_initialize()); + if (strstr(environment, "quiet=1")) { KernelLog::toggle_log_level(LogLevel::DEBUG); diff --git a/kernel/src/psf1.cpp b/kernel/src/psf1.cpp new file mode 100644 index 00000000..e2c7b202 --- /dev/null +++ b/kernel/src/psf1.cpp @@ -0,0 +1,3 @@ +#include "psf1.h" + +unsigned char psf1_magic[2] = {0x36, 0x04}; \ No newline at end of file diff --git a/kernel/src/render/TextRenderer.cpp b/kernel/src/render/TextRenderer.cpp index d0345acb..7096bb66 100644 --- a/kernel/src/render/TextRenderer.cpp +++ b/kernel/src/render/TextRenderer.cpp @@ -5,19 +5,22 @@ #include "init/InitRD.h" #include "io/Serial.h" #include "log/Log.h" -#include "psf2.h" +#include "psf1.h" #include "render/Framebuffer.h" #include "std/stdio.h" #include "std/string.h" extern BOOTBOOT bootboot; -static psf2_t* font; +static psf1_t* font; static Color bgColor = Color::Black; static Color fgColor = Color::White; static uint32_t xpos = 0; static uint32_t ypos = 0; +#define FONT_HEIGHT font->charsize +#define FONT_WIDTH 8 + bool TextRenderer::try_initialize() { InitRD::File font_file = InitRD::open("boot/font.psf"); @@ -26,12 +29,14 @@ bool TextRenderer::try_initialize() kerrorln("Failed to load boot/font.psf from initrd"); return false; } - font = (psf2_t*)font_file.addr; - if (font->magic != PSF_FONT_MAGIC) + font = (psf1_t*)font_file.addr; + if (font->magic[0] != psf1_magic[0] || font->magic[1] != psf1_magic[1]) { - kerrorln("Font magic does not match PSF font magic: %x", font->magic); + kerrorln("Font magic does not match PSF font magic: 0x%x 0x%x", font->magic[0], font->magic[1]); return false; } + kdbgln("Loaded font %s, height %d, address %lx, mode %d", font_file.name, font->charsize, + (uintptr_t)&font->glyphs[0], font->mode); return true; } @@ -40,19 +45,17 @@ bool TextRenderer::is_initialized() return font; // if font is NULL, not initialized, else yes } -static void putchar_at_offset(char c, int cx, int cy, Color& fg, Color& bg) +static void putchar_at_offset(char c, uint32_t cx, uint32_t cy, Color& fg, Color& bg) { - uint8_t* glyph = - (uint8_t*)font + font->headersize + (c > 0 && (uint32_t)c < font->numglyph ? c : 0) * font->bytesperglyph; - int mask; - for (uint32_t y = 0; y < font->height; y++) + volatile uint8_t* glyph = (uint8_t*)font->glyphs + (c * font->charsize); + for (uint32_t y = 0; y < FONT_HEIGHT; y++) { - mask = 1 << (font->width - 1); - for (uint32_t x = 0; x < font->width; x++) + for (uint32_t x = 0; x < FONT_WIDTH; x++) { - framebuffer0.set_pixel(cx + x, cy + y, *((uint32_t*)glyph) & mask ? fg : bg); - mask >>= 1; + if (((*glyph & (0b10000000 >> x)) > 0)) { framebuffer0.set_pixel(cx + x, cy + y, fg); } + else { framebuffer0.set_pixel(cx + x, cy + y, bg); } } + glyph++; } } @@ -61,13 +64,13 @@ void TextRenderer::putchar(char chr) switch (chr) { case '\n': - ypos += font->height; - if ((ypos + font->height) >= bootboot.fb_height) + ypos += FONT_HEIGHT; + if ((ypos + FONT_HEIGHT) >= bootboot.fb_height) { - memcpy((void*)bootboot.fb_ptr, (uint32_t*)bootboot.fb_ptr + (bootboot.fb_scanline * font->height), - bootboot.fb_size - (sizeof(uint32_t) * bootboot.fb_scanline * font->height)); - ypos -= font->height; - framebuffer0.paint_rect(0, ypos, bootboot.fb_width, font->height, Color::Black); + memcpy((void*)bootboot.fb_ptr, (uint32_t*)bootboot.fb_ptr + (bootboot.fb_scanline * FONT_HEIGHT), + bootboot.fb_size - (sizeof(uint32_t) * bootboot.fb_scanline * FONT_HEIGHT)); + ypos -= FONT_HEIGHT; + framebuffer0.paint_rect(0, ypos, bootboot.fb_width, FONT_HEIGHT, Color::Black); } xpos = 0; break; @@ -75,23 +78,23 @@ void TextRenderer::putchar(char chr) case '\b': if (xpos != 0) { - xpos -= font->width + 1; - framebuffer0.paint_rect(xpos, ypos, font->width + 1, font->height, Color::Black); + xpos -= FONT_WIDTH; + framebuffer0.paint_rect(xpos, ypos, FONT_WIDTH, FONT_HEIGHT, Color::Black); } break; default: putchar_at_offset(chr, xpos, ypos, fgColor, bgColor); - xpos += font->width + 1; - if ((xpos + font->width + 1) > bootboot.fb_width) + xpos += FONT_WIDTH; + if ((xpos + FONT_WIDTH) > bootboot.fb_width) { xpos = 0; - ypos += font->height; + ypos += FONT_HEIGHT; if (ypos > bootboot.fb_height) { - memcpy((void*)bootboot.fb_ptr, (uint32_t*)bootboot.fb_ptr + (bootboot.fb_scanline * font->height), - bootboot.fb_size - (sizeof(uint32_t) * bootboot.fb_scanline * font->height)); - ypos -= font->height; - framebuffer0.paint_rect(0, ypos, bootboot.fb_width, font->height, Color::Black); + memcpy((void*)bootboot.fb_ptr, (uint32_t*)bootboot.fb_ptr + (bootboot.fb_scanline * FONT_HEIGHT), + bootboot.fb_size - (sizeof(uint32_t) * bootboot.fb_scanline * FONT_HEIGHT)); + ypos -= FONT_HEIGHT; + framebuffer0.paint_rect(0, ypos, bootboot.fb_width, FONT_HEIGHT, Color::Black); } } break;