From: DeaDDooMER Date: Wed, 28 Dec 2022 13:42:06 +0000 (+0300) Subject: gl: fix stdfont cyrillic chars X-Git-Url: http://deadsoftware.ru/gitweb?p=d2df-sdl.git;a=commitdiff_plain;h=00f10879be0376401ea238ab59b49e9ae20b04a8 gl: fix stdfont cyrillic chars --- diff --git a/src/game/renders/opengl/r_common.pas b/src/game/renders/opengl/r_common.pas index 9c6b8b4..174769b 100644 --- a/src/game/renders/opengl/r_common.pas +++ b/src/game/renders/opengl/r_common.pas @@ -70,7 +70,7 @@ interface function r_Common_LoadTextureMultiFromFileAndInfo (const filename: AnsiString; w, h, count: Integer; log: Boolean = True): TGLMultiTexture; function r_Common_LoadTextureMultiTextFromFile (const filename: AnsiString; var txt: TAnimTextInfo; log: Boolean = True): TGLMultiTexture; function r_Common_LoadTextureStreamFromFile (const filename: AnsiString; w, h, count, cw: Integer; st: TGLTextureArray; rs: TRectArray; log: Boolean = True): Boolean; - function r_Common_LoadTextureFontFromFile (const filename: AnsiString; constref f: TFontInfo; skipch: Integer; log: Boolean = true): TGLFont; + function r_Common_LoadTextureFontFromFile (const filename: AnsiString; constref f: TFontInfo; font2enc: TConvProc; log: Boolean = true): TGLFont; procedure r_Common_Load; procedure r_Common_Free; @@ -349,13 +349,22 @@ implementation r_Common_DrawBackgroundImage(BackgroundTexture.id) end; + function r_Common_Std2Win (i: Integer): Integer; + begin + case i of + 0..223: result := i + 32; + 224..255: result := i - 224; + otherwise result := -1; + end + end; + function r_Common_LoadFont (const name: AnsiString): TGLFont; - var info: TFontInfo; skiphack: Integer; + var info: TFontInfo; p: TConvProc; begin result := nil; - if name = 'STD' then skiphack := 144 else skiphack := 0; + if name = 'STD' then p := @r_Common_Std2Win else p := nil; if r_Font_LoadInfoFromFile(GameWad + ':FONTS/' + name + 'TXT', info) then - result := r_Common_LoadTextureFontFromFile(GameWad + ':FONTS/' + name + 'FONT', info, skiphack, true); + result := r_Common_LoadTextureFontFromFile(GameWad + ':FONTS/' + name + 'FONT', info, p, true); if result = nil then e_logwritefln('failed to load font %s', [name]); end; @@ -439,9 +448,9 @@ implementation r_Common_StepLoading(1); end; - function r_Common_LoadTextureFontFromFile (const filename: AnsiString; constref f: TFontInfo; skipch: Integer; log: Boolean = true): TGLFont; + function r_Common_LoadTextureFontFromFile (const filename: AnsiString; constref f: TFontInfo; font2enc: TConvProc; log: Boolean = true): TGLFont; begin - result := r_Textures_LoadFontFromFile (filename, f, skipch, log); + result := r_Textures_LoadFontFromFile (filename, f, font2enc, log); r_Common_StepLoading(1); end; diff --git a/src/game/renders/opengl/r_textures.pas b/src/game/renders/opengl/r_textures.pas index 0114880..aa3bbff 100644 --- a/src/game/renders/opengl/r_textures.pas +++ b/src/game/renders/opengl/r_textures.pas @@ -120,6 +120,8 @@ interface anim: TAnimInfo; end; + TConvProc = function (x: Integer): Integer; + procedure r_Textures_Initialize; procedure r_Textures_Finalize; @@ -130,7 +132,7 @@ interface function r_Textures_LoadStreamFromFile (const filename: AnsiString; w, h, count, cw: Integer; st: TGLTextureArray; rs: TRectArray; log: Boolean = True): Boolean; - function r_Textures_LoadFontFromFile (const filename: AnsiString; constref f: TFontInfo; skipch: Integer; log: Boolean = true): TGLFont; + function r_Textures_LoadFontFromFile (const filename: AnsiString; constref f: TFontInfo; font2enc: TConvProc; log: Boolean = true): TGLFont; implementation @@ -797,26 +799,28 @@ implementation (* --------- TGLFont --------- *) - function r_Textures_LoadFontFromFile (const filename: AnsiString; constref f: TFontInfo; skipch: Integer; log: Boolean = true): TGLFont; - var i: Integer; st: TGLTextureArray; font: TGLFont; t: TGLTexture; + function r_Textures_LoadFontFromFile (const filename: AnsiString; constref f: TFontInfo; font2enc: TConvProc; log: Boolean = true): TGLFont; + var i, ch: Integer; st, stch: TGLTextureArray; font: TGLFont; begin - ASSERT(skipch >= 0); result := nil; SetLength(st, 256); if r_Textures_LoadStreamFromFile(filename, f.w, f.h, 256, 16, st, nil, log) then begin - if skipch > 0 then + font := TGLFont.Create(); + font.info := f; + font.ch := st; + if Assigned(font2enc) then begin + SetLength(stch, 256); for i := 0 to 255 do begin - t := st[i]; - st[i] := st[(i + skipch) mod 256]; - st[(i + skipch) mod 256] := t; + ch := font2enc(i); + ASSERT((ch >= 0) and (ch <= 255)); + stch[ch] := st[i]; end; + font.ch := stch; + SetLength(st, 0); end; - font := TGLFont.Create(); - font.info := f; - font.ch := st; result := font; end; end;