From 903188a5430a2f425fc11de46f9043674b86fb96 Mon Sep 17 00:00:00 2001 From: xamidev <121681048+xamidev@users.noreply.github.com> Date: Fri, 27 Sep 2024 20:21:24 +0200 Subject: [PATCH] Change: font --- include/fonts/UniCyrExt_8x16.psf | Bin 9491 -> 0 bytes include/fonts/viscii10-8x16.psfu | Bin 0 -> 4902 bytes makefile | 4 +-- src/drivers/framebuffer.c | 48 +++++++++++++++++++++++++++++-- src/drivers/framebuffer.h | 7 +++-- src/kernel/kmain.c | 2 +- 6 files changed, 53 insertions(+), 8 deletions(-) delete mode 100644 include/fonts/UniCyrExt_8x16.psf create mode 100644 include/fonts/viscii10-8x16.psfu diff --git a/include/fonts/UniCyrExt_8x16.psf b/include/fonts/UniCyrExt_8x16.psf deleted file mode 100644 index fef3e29a3db2f4edd7af6a2de60cbaa11bdf67ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9491 zcmeHLeQ;D)6@R3-qONJG6<3Q;6)S$Pt)^>Tp{=O3)^F+ueyvzntlNrJ(^a3_B|w@$ z+Cm_K0OgwkfkH~5w6tnw>AdM5DZTsN%-R`Zrt|)Y|8y!db<)h3*`Md!uYGUnjQ{#a zZgThS`MBqvbM86kp11d$zO~DtaW&0Z{H4Wl+UUV^4#SR+_RMK%3=rBMi1Gipv zRqA!di!ZLy{7x$6l=wr9i@98(BTr)@Nr+TiJ-;F+$3;bVJujC@COl8?mo>t(iatNd zV{~-1sQC+p!rgb#IIm!$jMks0p38tsoCh~TPWqrzKHW z+T?OtA6nEg#{YV_oo9#k?HfAVsq|a*VmkNSlp)g7?L0X&ME{!ZWb?Uc`pf0D{yFOa zwx2a}>MPgk|p5H6cgdh@6*Y54yi_7UE4yW-p5+l^YA3y2aZs zjTJ2k)^DV&NEDCfYZK%mb>2=YQQ1W;uxt-qcf7OEt+KR*5#5c!34ZENBO1)lVp<13dF(g#{z-Rt6Tt(f@Bs&q-GHQgzXytFDauQfrHokv!sPckX# ze3}aXI-ejM1;-_nV$!ww>b#W8v9~D*ET8L902uq`(M|Fw91i>$Ma zXQzYNN8O|>@g!g07fL<_dPX`_+m~pnhs3V}K%a+VrWM8?j`MPz99(PIJ;v(i^AY_c z=R;UUcWnq5{Y*-ab>tiIA?=IQ@3wS$n$2sUXXQ)tBL0veP{>%i=Wzh&^Cv6?M<#ks zDr8EDq)Dk!uBSSmTFKN^>>wGPTo}wy@|ngwsZ|ngTx@oGnc+s9Grv6_%lA6nRW7@0 zS}lFguee$Q#-6H}^AYzX?m1ArQ%TaxtH>rK=EdEv!R;;VYKL z|85_O|NZ0M_@4@eOFpM!n5mS7+trxV&vvatJq9=PPbMtC;WJOUzTQNiOz7Bg9L;B8 zsTaxD`eNC)*Jn`UWo12-fs0Z_Gv!#h}f&~OPbbO zc}kyDvwxe<%lZ#Z!{}$w7n{cAO+)j=)V<{Xi{0x(rAi?6of9Hr8DGx7P~Lh6=zZW zdSnf;Un1SU#HB2yRke377qasd?uF<7^)klz1xxd&w+Z?*Yf5S;kl#J2*DTl<(8m4R zqB}@O*INbieLqFlqq!eR4Ap^70+#(qg!kpzY1>L-?L|{6(*h)d~<%GIzk)Y8lzze zQEZ#wb{vh-^hxd?c-&{>RiQLYigK@;OtwbtBaDVAnQFDt+_{l_U{qM!z&m_8+uJ-=8gV2Nta^LI_`FHt>n#4 zCR!-}?Ea2BIwzH!{VcuTxg0E!{+_iXlyZ>2@K(`_R`C!n_cx*~?CHi8 zl_PjtG)hxcP4K7ecR!LU4t zMfeatjE~@>_*hup7?%6O^5(F+4_zu2{@8SDcjvwHM_z`}L zpCA{Ox8bK)fuG?H{2Y1w0xR)L+=*YIfV*%vevMW54er5j@jLt;9k>@o`~iQ&pWx!p zDB-@aw-aI`#3qP7h|LgNAo?K&AhtqmgBXO^4zUAbC&a@LyC8N$?19(|u@7QD!~uwd z5RX6{f;bFu1Y!u{D8w;{MxMg_tM-)bAV<)&HXfquYW7ehiUGlxr2B&(%eGx6wPBa z3BRRG^BJP=qPd&qcACV~e}v{EH22V?b^XNOe~9K`n!M*hnu9dA(IkEPNuU0sG>1qY z;kNXWj@>lZ(&XczW55V6F ze;@q)@DIR02!9CvQTWH;KMMai{1fnp;Xeld6#UchpMZY`{*&;Zf`1nN(+E~0=tQs< z!8!yz2-YLmfS?z_0|*{Ouo1x~_+|L3;jf3k0e&z12jD*l{~`EW;P=Dd27eI#F8I6Q zABKMf!5S%W0KrxS+Yk&Q*p6Taf}IE+Mz9OPZUlP}>_xB-!F~h>5FAAC2!cZh4kI85 uLkNx{IELU+1jiAaKroEpF$5WaFK+77b; zLIS}Hs2HzFFkBM?Bth6QI<>v@(^ek$X=^LYLwK>QJf%`)sz1N~bf50i8&B20)8G96 z`Obem)5)DjZ`f{et)mRd1OGJmAyO0k|5j&q|Lp9s-LoAk-P+A=!wup%iQ`xs2MJf` z3W-_`H`H)^a>BG9pKQ1j=j^vEr`2+@&5-qK6ul~+*>^2}%NDi7GaUA|f$B*A*EGx$;to(C|b%-`HjKd?9q$I|(vH3IYop% z>!q@tS+E-US(=LZD>hhWHu6o`!*G?{Ucak%hVk*0(ohhpAO`a#eR0{>*T|CA?d z%Gc+`|4EW1A=UgRPbVwK3oQASrQ=ockwN>X^h+zDT~7&=o-yk4sP{PB`TkDl_L9FT zd!bKpkl&YrmzI(+(EjnRaOKL#uq4yCPpl-~#p2E9{nt|C(roJdbo(c!-Lc}nYN>qL zcB+?ZX2j=w$bHDbbt4t}wjJj4YMt=Bwv<@si)LZm@8|K4@u-0JaW>z=62?iPcY`}T zsgcev^)oaN?d%38e=tLSonJPlYu3M7wdz$aW<|KgAD<17+bd&k(D|Urzmuh;eVxWIqMm(Yq4G&ZQ@`<*VXM95|@lB8A`y0*XS(fCQv6Nf>GQ3hg5f zy8eRM0cM%Ry-wBE6J;ffyiaw1*BR?HC2LO(vYO_6o|R5)#1pQW<@B@on@+gK#k@O~ zz3TVA*_bqc&$-3?eRr&pHLcR`dv(pVCLSGHv+DQ1^gh7fBmUlH_eCCGaet)z$y9Nl z2)}{r!xy?HR__~zo^Lv)KIJRT|3w?FH}UBC8zu~__zbN03QYg4k)e)Miz~Dwe-{{- z)3vUQ$13NQ^iqT3zH_Yla3yU{#V1;6wsZ+UUpEYU_4>hP(s~**pC!z%3hY?TM$LF1 z5O%e)d1pM;N^Qcmiuw1}HAbhQ}w(dW-w3v2+~ISN0Mg6F8cd zJUx#U%(kSMCi#6Q_M=0xS613j7aLgE%GhPUrPewgMWI?U<+p3)^G$x*+LhsA{)tD1 zD0Vk)RS)G}2}`w$`6N5fD`AxZ^E^(V!LQUN zrn*#5x>LgGyvSF%|2#Fr|CRKunr}K(>OWeW=kXsCyb_9eXGhc;B`p1H>Lo-I%avr} za(%^L^SpGPOnW)MnBVk#6U+G~mh%kE2F~Y)u}K4$Fug6|(V?l`M3m?KpY{F(-hb{Op zCU8AIf{)^3_&9FBjhMtI@JZZ+PvO(}3_gpSaSLw6ZTK8MkK6GDd=X#5m+=*N_$sFG zHQa%(!^bzU72m|S@NES64!(=;VH)4Zo%jKMh#z4FKSmor!B6osg!nl+xQiLuLwSbs zEae5t-zbk!o}e6{{Dbl$<)6$;m$Hp=4`n;$SCoe+zoGn&@_WiY${#3yqWpz&Kjjyc zU6dV^$M7<#dpxH1Jfh!{`4Htf%HJvbDUVa0q#UFiqr61<7tLoWcT?`A+(-E}LQv&v<(qS=k{TNk_JeTW|Ao=34Dfk@y_BYFZ68R_0!577Zc2eH8Ldpofp5k7~Ac{+^f2%@9Jzoa}! X*^lTYM00pqY#&F&O!dg!dj|glR}*oz literal 0 HcmV?d00001 diff --git a/makefile b/makefile index 39dbc63..51c5778 100644 --- a/makefile +++ b/makefile @@ -26,8 +26,8 @@ PROGRAM_OBJECTS = $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(PROGRAM_SOURCES:.c=.o TOOLCHAIN_SRC = https://newos.org/toolchains/i386-elf-7.5.0-Linux-x86_64.tar.xz TOOLCHAIN_FILE = i386-elf-7.5.0-Linux-x86_64.tar.xz -FONT_OBJ = $(OBJ_DIR)/fonts/UniCyrExt_8x16.o -FONT_SRC = $(FONTS_DIR)/UniCyrExt_8x16.psf +FONT_OBJ = $(OBJ_DIR)/fonts/viscii10-8x16.o +FONT_SRC = $(FONTS_DIR)/viscii10-8x16.psfu all: $(OBJ_DIR) kernel.elf programs diff --git a/src/drivers/framebuffer.c b/src/drivers/framebuffer.c index 302a723..e5b3f36 100644 --- a/src/drivers/framebuffer.c +++ b/src/drivers/framebuffer.c @@ -7,9 +7,51 @@ #include "framebuffer.h" #include "serial.h" #include "../kernel/system.h" +#include "../kernel/kheap.h" extern char* framebuffer; +void psf_init() +{ + uint16_t glyph = 0; + PSF_font *font = (PSF_font*)&_binary_include_fonts_viscii10_8x16_psfu_start; + if (font->flags) + { + unicode = NULL; + return; + } + + char* s = (char*)((unsigned char*)&_binary_include_fonts_viscii10_8x16_psfu_start + font->headersize + font->numglyph * font->bytesperglyph); + unicode = calloc(USHRT_MAX, 2); + + while(s>_binary_include_fonts_viscii10_8x16_psfu_end){ + uint16_t uc = (uint16_t)((unsigned char *)s[0]); + if(uc == 0xFF) { + glyph++; + s++; + continue; + } else if(uc & 128) { + /* UTF-8 to unicode */ + if((uc & 32) == 0 ) { + uc = ((s[0] & 0x1F)<<6)+(s[1] & 0x3F); + s++; + } else + if((uc & 16) == 0 ) { + uc = ((((s[0] & 0xF)<<6)+(s[1] & 0x3F))<<6)+(s[2] & 0x3F); + s+=2; + } else + if((uc & 8) == 0 ) { + uc = ((((((s[0] & 0x7)<<6)+(s[1] & 0x3F))<<6)+(s[2] & 0x3F))<<6)+(s[3] & 0x3F); + s+=3; + } else + uc = 0; + } + /* save translation */ + unicode[uc] = glyph; + s++; + } +} + void putpixel(uint32_t* fb, int pitch, int bpp, int x, int y, uint32_t color) { uint32_t* pixel_addr = (uint32_t*)((uint8_t*)fb + y * pitch + x *(bpp / 8)); @@ -18,13 +60,13 @@ void putpixel(uint32_t* fb, int pitch, int bpp, int x, int y, uint32_t color) void draw_char(unsigned short int c, int cx, int cy, uint32_t fg, uint32_t bg) { - PSF_font *font = (PSF_font*)&_binary_include_fonts_UniCyrExt_8x16_psf_start; + PSF_font *font = (PSF_font*)&_binary_include_fonts_viscii10_8x16_psfu_start; int bytesperline=(font->width+7)/8; if (unicode != NULL) { c = unicode[c]; } - unsigned char* glyph = (unsigned char*)&_binary_include_fonts_UniCyrExt_8x16_psf_start + font->headersize + (c>0&&cnumglyph?c:0)*font->bytesperglyph; + unsigned char* glyph = (unsigned char*)&_binary_include_fonts_viscii10_8x16_psfu_start + font->headersize + (c>0&&cnumglyph?c:0)*font->bytesperglyph; int offs = (cy * font->height * scanline) + @@ -54,7 +96,7 @@ void scroll() { serial_printf(3, "Scrolling...\r"); uint32_t bg_color = 0x00000000; - PSF_font *font = (PSF_font*)&_binary_include_fonts_UniCyrExt_8x16_psf_start; + PSF_font *font = (PSF_font*)&_binary_include_fonts_viscii10_8x16_psfu_start; int line_size = font->height * scanline; int framebuffer_size = scanline * font->height * (1080/font->height); diff --git a/src/drivers/framebuffer.h b/src/drivers/framebuffer.h index 7786c10..483360d 100644 --- a/src/drivers/framebuffer.h +++ b/src/drivers/framebuffer.h @@ -9,11 +9,13 @@ #include extern int scanline; -extern char _binary_include_fonts_UniCyrExt_8x16_psf_start; -uint16_t* unicode; +extern char _binary_include_fonts_viscii10_8x16_psfu_start; +extern char _binary_include_fonts_viscii10_8x16_psfu_end; +uint16_t* unicode; #define PIXEL uint32_t +#define USHRT_MAX 10000 #define PSF1_FONT_MAGIC 0x0436 typedef struct { @@ -38,5 +40,6 @@ typedef struct { void putpixel(uint32_t* fb, int pitch, int bpp, int x, int y, uint32_t color); void draw_char(unsigned short int c, int cx, int cy, uint32_t fg, uint32_t bg); void scroll(); +void psf_init(); #endif diff --git a/src/kernel/kmain.c b/src/kernel/kmain.c index 5e29e9c..0477cd5 100644 --- a/src/kernel/kmain.c +++ b/src/kernel/kmain.c @@ -63,7 +63,7 @@ void kmain(multiboot2_info *mb_info) serial_printf(3, "Framebuffer Pitch: %u", fb_info->framebuffer_pitch); serial_printf(3, "Framebuffer BPP: %u", fb_info->framebuffer_bpp); } - + psf_init(); printf("[kernel] multiboot2 info at 0x%x, size=%u\n", mb_info, mb_info->total_size); printf("[kernel] framebuffer discovered at 0x%x\n", (unsigned int)fb_info->framebuffer_addr); printf("[kernel] fb0: width=%u, height=%u, pitch=%u, bpp=%u\n", fb_info->framebuffer_width, fb_info->framebuffer_height, fb_info->framebuffer_pitch, fb_info->framebuffer_bpp);