From 8ed1c226fe48f62a6c106b9ebfec690abca42b38 Mon Sep 17 00:00:00 2001 From: Leandro Nini Date: Fri, 17 Jul 2026 14:15:15 +0200 Subject: [PATCH 1/4] Load font from png --- src/bme/bme_win.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ src/bme/bme_win.h | 2 ++ src/console.cpp | 5 +---- src/data/chargen.bin | Bin 4096 -> 0 bytes src/data/loadtrk.seq | 2 +- 5 files changed, 45 insertions(+), 5 deletions(-) delete mode 100644 src/data/chargen.bin diff --git a/src/bme/bme_win.cpp b/src/bme/bme_win.cpp index 4ebaad1..c05102f 100644 --- a/src/bme/bme_win.cpp +++ b/src/bme/bme_win.cpp @@ -477,6 +477,47 @@ void gfx_freecursor() } } +bool gfx_loadcharset(const char *name, unsigned char *chardata) +{ + int handle = io_open(name); + if (handle == -1) return false; + + int size = io_lseek(handle, 0, SEEK_END); + char *charbuffer = new (std::nothrow) char[size]; + if (!charbuffer) + { + io_close(handle); + return false; + } + io_lseek(handle, 0, SEEK_SET); + io_read(handle, charbuffer, size); + io_close(handle); + + SDL_IOStream *rw = SDL_IOFromMem(charbuffer, size); + SDL_Surface *gfx_chars = SDL_LoadPNG_IO(rw, true); + if (!gfx_chars) + return false; + + if ((gfx_chars->w != 8) || (gfx_chars->h != 4096)) + return false; + + int i = 0, j = 0; + for (int y=0; y<4096; y++) + { + chardata[j] = 0xff; + for (int x=7; x>=0; x--) + { + if (((char*)gfx_chars->pixels)[i]) + chardata[j] &= ~(1u << x); + i++; + } + j++; + } + SDL_DestroySurface(gfx_chars); + + return true; +} + void gfx_drawcursor(int x, int y) { if (!gfx_initted) return; diff --git a/src/bme/bme_win.h b/src/bme/bme_win.h index b009810..edb243c 100644 --- a/src/bme/bme_win.h +++ b/src/bme/bme_win.h @@ -27,6 +27,8 @@ bool gfx_loadcursor(const char *name); void gfx_drawcursor(int x, int y); void gfx_freecursor(); +bool gfx_loadcharset(const char *name, unsigned char *chardata); + void mou_getpos(unsigned *x, unsigned *y); unsigned mou_getbuttons(); diff --git a/src/console.cpp b/src/console.cpp index 12f4bd9..007257e 100644 --- a/src/console.cpp +++ b/src/console.cpp @@ -115,10 +115,7 @@ bool initscreen() std::memset(region, 0, sizeof region); chardata = new unsigned char[4096]; - int handle = io_open("chargen.bin"); - if (handle == -1) return false; - io_read(handle, &chardata[0], 4096); - io_close(handle); + gfx_loadcharset("font.png", chardata); loadexternalpalette(); gfx_setpalette(); diff --git a/src/data/chargen.bin b/src/data/chargen.bin deleted file mode 100644 index b937329ac7819ccb37bb1f5882af700844c03b8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmeHK&1&385N@)dlbHA@h;c6a06NWzML6%VClMBrL$mla%t45p{22Qz!Ys`mgpb33 zhao4Qf-x*4J{Zk@_1EeVd4x2!_`iZ0v@U6$R3PBq+J$cwTGx1v^gUu_QKIBu9O%d!!MJ|WAi$YrA}a$ZFl#oGE* zw~->Jz4?l}2zgd;Q{0b#%o=Ypif{NVtjdS5+lAmOp^It@TUfo&T@dl0HbG}~mSv$6 zetuc|aYD#fLQlgmye9mr0UfYZeuBQ_Z1%xQ`1E%V{d_BYN*904;Tvt~a(Jj(X7Ub^ zYw)zy5RWnzKJ4enZZ?RG1cO~?D0=2{b}`Eq__LgQ2Z?%3rkvcP=GQT>76RCyNl`~Hu!c*!&`wXc+~ zE;Jr&>~_29$s6svs_Ia5p{bT!1I>R5x755l!(T1qQkKehpNB6u)#WOCBl@+BPo6WM zx+(iVc%GaqO9IzoZSyY9tNYS4RBeDDN_7DMu=-uXlZUv@HwkqCLty;M|JiVlw7%eP zNPO&aZYk{h4cXWF0-9CY|15JWi~|m8K>H6ZoIO?ACxJ|# zgB9+2DO`=HVi4+|E>N#Dhq)_3=v-+258pXc9?<-EDYd8hLl=P?PE^I6W%lE0vr z`7Y^YzDt_T;Tt-4n|8E!(N{t*`?EYxpmT<|<$2D0Ld=Y3b7TFSQv47Y)APlI?Ja1c zO91U?pXPYuI6uA;pZj{6k;C*$p}=+Sd9e%!`#qzFOwcm$3I%DP=T)_(8T zA}Y^`j)%B`VC84t!Fe?(by+qIM!hLzUg>%g<>U{&UP$$B_GR;LOvkxB?mm7VU1&rA zni;Ba3l{@#tlrVY*fJR|t`UGhM8R7=zQ1~3C-E&>i|qYgmGLDGXm5M}_cfP5>E?j1 z#x={(*8^7oD`HtZdmc7c!xul+bqbRymh zE%ygpAMy-ovA_4ld*Ok`X*0FdAiF;>=Vbo${lVnlE|%_pSjb0x_IH}kBeCw{`Gh_M zyD*p!y6)048qETH4|1P%xVsR#up++)+wdJCKBS2+#cw?Dv2!V(0g&pGlX0^~N&aGgc+~isQu{eU@}J%pfYvjb{HJ_}vZXZXR~(Jh zi}X_($)C}#1xROk#fhDihz-luw6UA5T2o zTj+8@M>5xk{L!@7eTw|0bh#bRXsUn8CnM Date: Fri, 17 Jul 2026 14:17:42 +0200 Subject: [PATCH 2/4] Add sanity check --- src/bme/bme_win.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/bme/bme_win.cpp b/src/bme/bme_win.cpp index c05102f..88a00e3 100644 --- a/src/bme/bme_win.cpp +++ b/src/bme/bme_win.cpp @@ -501,6 +501,9 @@ bool gfx_loadcharset(const char *name, unsigned char *chardata) if ((gfx_chars->w != 8) || (gfx_chars->h != 4096)) return false; + if (gfx_chars->format != SDL_PIXELFORMAT_INDEX8) + return false; + int i = 0, j = 0; for (int y=0; y<4096; y++) { From a191edbfab9ed89b47e02052fe6be0704d1a3275 Mon Sep 17 00:00:00 2001 From: Leandro Nini Date: Fri, 17 Jul 2026 18:53:53 +0200 Subject: [PATCH 3/4] Add special characters --- src/bme/bme_win.cpp | 6 +++--- src/console.cpp | 16 ++++++++-------- src/data/font.png | Bin 1437 -> 1468 bytes src/display.cpp | 2 +- src/loadtrk.cpp | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/bme/bme_win.cpp b/src/bme/bme_win.cpp index 88a00e3..6b1d575 100644 --- a/src/bme/bme_win.cpp +++ b/src/bme/bme_win.cpp @@ -507,11 +507,11 @@ bool gfx_loadcharset(const char *name, unsigned char *chardata) int i = 0, j = 0; for (int y=0; y<4096; y++) { - chardata[j] = 0xff; + chardata[j] = 0; for (int x=7; x>=0; x--) { - if (((char*)gfx_chars->pixels)[i]) - chardata[j] &= ~(1u << x); + if (((unsigned char*)gfx_chars->pixels)[i]) + chardata[j] |= (1u << x); i++; } j++; diff --git a/src/console.cpp b/src/console.cpp index 007257e..d49910f 100644 --- a/src/console.cpp +++ b/src/console.cpp @@ -295,8 +295,8 @@ void drawbox(int x, int y, int color, int sx, int sy) while (counter--) { - setcharcolor(dptr, '|', color); - setcharcolor(dptr2, '|', color); + setcharcolor(dptr, '\x95', color); + setcharcolor(dptr2, '\x95', color); dptr += MAX_COLUMNS; dptr2 += MAX_COLUMNS; } @@ -307,23 +307,23 @@ void drawbox(int x, int y, int color, int sx, int sy) while (counter--) { - setcharcolor(dptr, '-', color); - setcharcolor(dptr2, '-', color); + setcharcolor(dptr, '\x94', color); + setcharcolor(dptr2, '\x94', color); dptr++; dptr2++; } dptr = scrbuffer + (x + y * MAX_COLUMNS); - setcharcolor(dptr, '+', color); + setcharcolor(dptr, '\x90', color); dptr = scrbuffer + ((x+sx-1) + y * MAX_COLUMNS); - setcharcolor(dptr, '+', color); + setcharcolor(dptr, '\x91', color); dptr = scrbuffer + (x + (y+sy-1) * MAX_COLUMNS); - setcharcolor(dptr, '+', color); + setcharcolor(dptr, '\x92', color); dptr = scrbuffer + ((x+sx-1) + (y+sy-1) * MAX_COLUMNS); - setcharcolor(dptr, '+', color); + setcharcolor(dptr, '\x93', color); } void printbg(int x, int y, int color, int length) diff --git a/src/data/font.png b/src/data/font.png index b386dbdee33d209fee08184928e8f6fe6e5a1abb..f1a8f67e6dc3ccf173c998ee7b74ca9b43e2d340 100644 GIT binary patch delta 1461 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 diff --git a/src/display.cpp b/src/display.cpp index e812ce2..e26999d 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -590,7 +590,7 @@ void printstatus() color = isplaying() ? colors.CEDIT : colors.CMUTE; printtext(dpos.octaveX+10, dpos.octaveY+1, color, textbuffer); - const char *cmds = isplaying() ? " [] Stop " : " [> Play "; + const char *cmds = isplaying() ? " \x80 " : " \x81 "; printtext(dpos.octaveX+20, dpos.octaveY, colors.CTITLE|(colors.CHDRBG<<4), cmds); const char *chnls = (numsids == 1) ? " CHN1 CHN2 CHN3 " : " CHN1 CHN2 CHN3 CHN4 CHN5 CHN6 "; diff --git a/src/loadtrk.cpp b/src/loadtrk.cpp index 166131a..1c42a55 100644 --- a/src/loadtrk.cpp +++ b/src/loadtrk.cpp @@ -764,7 +764,7 @@ void mousecommands() if ((!prevmouseb) && (mousey == dpos.octaveY)) { if ((mousex >= dpos.octaveX+20) && - (mousex <= dpos.octaveX+28)) + (mousex <= dpos.octaveX+23)) { if (isplaying()) { From 32e41c94f001585194d923fcc8dfe9b024ee224e Mon Sep 17 00:00:00 2001 From: Leandro Nini Date: Fri, 17 Jul 2026 20:33:37 +0200 Subject: [PATCH 4/4] Convert input keys to ISO-8859-1 --- src/bme/bme_win.cpp | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/bme/bme_win.cpp b/src/bme/bme_win.cpp index 6b1d575..aec7739 100644 --- a/src/bme/bme_win.cpp +++ b/src/bme/bme_win.cpp @@ -266,7 +266,33 @@ void win_checkmessages() break; case SDL_EVENT_TEXT_INPUT: - win_asciikey = event.text.text[0]; + { + const char *in = event.text.text; + // convert to ISO-8859-1 + unsigned int codepoint; + while (*in != 0) + { + unsigned char ch = static_cast(*in); + if (ch <= 0x7f) + codepoint = ch; + else if (ch <= 0xbf) + codepoint = (codepoint << 6) | (ch & 0x3f); + else if (ch <= 0xdf) + codepoint = ch & 0x1f; + else if (ch <= 0xef) + codepoint = ch & 0x0f; + else + codepoint = ch & 0x07; + ++in; + if (((*in & 0xc0) != 0x80) && (codepoint <= 0x10ffff)) + { + if (codepoint <= 255) + { + win_asciikey = static_cast(codepoint); + } + } + } + } break; case SDL_EVENT_KEY_DOWN: