- load the hex font as early as possible.

This commit is contained in:
Christoph Oelckers 2022-05-01 14:03:49 +02:00
parent 7832ada2fc
commit 010f41a3aa
2 changed files with 27 additions and 14 deletions

View file

@ -58,11 +58,12 @@ struct HexDataSource
// //
//========================================================================== //==========================================================================
void ParseDefinition(int lumpnum) void ParseDefinition(FResourceLump* font)
{ {
FScanner sc; FScanner sc;
sc.OpenLumpNum(lumpnum); auto data = font->Lock();
sc.OpenMem("newconsolefont.hex", (const char*)data, font->Size());
sc.SetCMode(true); sc.SetCMode(true);
glyphdata.Push(0); // ensure that index 0 can be used as 'not present'. glyphdata.Push(0); // ensure that index 0 can be used as 'not present'.
while (sc.GetString()) while (sc.GetString())
@ -96,6 +97,7 @@ struct HexDataSource
lumb = i * 255 / 17; lumb = i * 255 / 17;
SmallPal[i] = PalEntry(255, lumb, lumb, lumb); SmallPal[i] = PalEntry(255, lumb, lumb, lumb);
} }
font->Unlock();
} }
}; };
@ -400,7 +402,7 @@ public:
FFont *CreateHexLumpFont (const char *fontname, int lump) FFont *CreateHexLumpFont (const char *fontname, int lump)
{ {
if (hexdata.FirstChar == INT_MAX) hexdata.ParseDefinition(lump); assert(hexdata.FirstChar != INT_MAX);
return new FHexFont(fontname, lump); return new FHexFont(fontname, lump);
} }
@ -412,7 +414,7 @@ FFont *CreateHexLumpFont (const char *fontname, int lump)
FFont *CreateHexLumpFont2(const char *fontname, int lump) FFont *CreateHexLumpFont2(const char *fontname, int lump)
{ {
if (hexdata.FirstChar == INT_MAX) hexdata.ParseDefinition(lump); assert(hexdata.FirstChar != INT_MAX);
return new FHexFont2(fontname, lump); return new FHexFont2(fontname, lump);
} }
@ -424,8 +426,7 @@ FFont *CreateHexLumpFont2(const char *fontname, int lump)
uint8_t* GetHexChar(int codepoint) uint8_t* GetHexChar(int codepoint)
{ {
auto lump = fileSystem.CheckNumForFullName("newconsolefont.hex", 0); // This is always loaded from gzdoom.pk3 to prevent overriding it with incomplete replacements. assert(hexdata.FirstChar != INT_MAX);
if (hexdata.FirstChar == INT_MAX) hexdata.ParseDefinition(lump);
if (hexdata.glyphmap[codepoint] > 0) if (hexdata.glyphmap[codepoint] > 0)
{ {
@ -433,4 +434,13 @@ uint8_t* GetHexChar(int codepoint)
return &hexdata.glyphdata[offset]; return &hexdata.glyphdata[offset];
} }
return nullptr; return nullptr;
} }
void LoadHexFont(const char* filename)
{
auto resf = FResourceFile::OpenResourceFile(filename);
if (resf == nullptr) I_FatalError("Unable to open %s", filename);
auto hexfont = resf->FindLump("newconsolefont.hex");
if (hexfont == nullptr) I_FatalError("Unable to find newconsolefont.hex in %s", filename);
hexdata.ParseDefinition(hexfont);
}

View file

@ -173,6 +173,7 @@ void FreeSBarInfoScript();
void I_UpdateWindowTitle(); void I_UpdateWindowTitle();
void S_ParseMusInfo(); void S_ParseMusInfo();
void D_GrabCVarDefaults(); void D_GrabCVarDefaults();
void LoadHexFont(const char* filename);
// PRIVATE FUNCTION PROTOTYPES --------------------------------------------- // PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
@ -3474,6 +3475,15 @@ static int D_DoomMain_Internal (void)
std::set_new_handler(NewFailure); std::set_new_handler(NewFailure);
const char *batchout = Args->CheckValue("-errorlog"); const char *batchout = Args->CheckValue("-errorlog");
// [RH] Make sure zdoom.pk3 is always loaded,
// as it contains magic stuff we need.
wad = BaseFileSearch(BASEWAD, NULL, true, GameConfig);
if (wad == NULL)
{
I_FatalError("Cannot find " BASEWAD);
}
LoadHexFont(wad); // load hex font early so we have it during startup.
C_InitConsole(80*8, 25*8, false); C_InitConsole(80*8, 25*8, false);
I_DetectOS(); I_DetectOS();
@ -3503,13 +3513,6 @@ static int D_DoomMain_Internal (void)
extern void D_ConfirmSendStats(); extern void D_ConfirmSendStats();
D_ConfirmSendStats(); D_ConfirmSendStats();
// [RH] Make sure zdoom.pk3 is always loaded,
// as it contains magic stuff we need.
wad = BaseFileSearch (BASEWAD, NULL, true, GameConfig);
if (wad == NULL)
{
I_FatalError ("Cannot find " BASEWAD);
}
FString basewad = wad; FString basewad = wad;
FString optionalwad = BaseFileSearch(OPTIONALWAD, NULL, true, GameConfig); FString optionalwad = BaseFileSearch(OPTIONALWAD, NULL, true, GameConfig);