mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-11-12 23:54:37 +00:00
- the basics for creating font objects for the in-game bitmap fonts.
Definitions were added to RedNukem frontend for testing, not used yet.
This commit is contained in:
parent
7c3cac5721
commit
2f672da7ba
8 changed files with 89 additions and 11 deletions
|
@ -68,7 +68,7 @@
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
FFont::FFont (const char *name, const char *nametemplate, const char *filetemplate, int lfirst, int lcount, int start, int fdlump, int spacewidth, bool notranslate, bool iwadonly, bool doomtemplate)
|
FFont::FFont (const char *name, const char *nametemplate, const char *filetemplate, int lfirst, int lcount, int start, int fdlump, int spacewidth, bool notranslate, bool iwadonly, bool doomtemplate, GlyphSet *baseGlyphs)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
FTextureID lump;
|
FTextureID lump;
|
||||||
|
@ -185,6 +185,22 @@ FFont::FFont (const char *name, const char *nametemplate, const char *filetempla
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (baseGlyphs)
|
||||||
|
{
|
||||||
|
// First insert everything from the given glyph set.
|
||||||
|
GlyphSet::Iterator it(*baseGlyphs);
|
||||||
|
GlyphSet::Pair* pair;
|
||||||
|
while (it.NextPair(pair))
|
||||||
|
{
|
||||||
|
if (pair->Value && pair->Value->GetTexelWidth() > 0 && pair->Value->GetTexelHeight() > 0)
|
||||||
|
{
|
||||||
|
auto position = pair->Key;
|
||||||
|
if (position < minchar) minchar = position;
|
||||||
|
if (position > maxchar) maxchar = position;
|
||||||
|
charMap.Insert(position, pair->Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (nametemplate != nullptr)
|
if (nametemplate != nullptr)
|
||||||
{
|
{
|
||||||
if (!iwadonly)
|
if (!iwadonly)
|
||||||
|
|
|
@ -78,6 +78,7 @@ enum EColorRange : int
|
||||||
|
|
||||||
extern int NumTextColors;
|
extern int NumTextColors;
|
||||||
|
|
||||||
|
using GlyphSet = TMap<int, FTexture*>;
|
||||||
|
|
||||||
class FFont
|
class FFont
|
||||||
{
|
{
|
||||||
|
@ -94,7 +95,7 @@ public:
|
||||||
Custom
|
Custom
|
||||||
};
|
};
|
||||||
|
|
||||||
FFont (const char *fontname, const char *nametemplate, const char *filetemplate, int first, int count, int base, int fdlump, int spacewidth=-1, bool notranslate = false, bool iwadonly = false, bool doomtemplate = false);
|
FFont (const char *fontname, const char *nametemplate, const char *filetemplate, int first, int count, int base, int fdlump, int spacewidth=-1, bool notranslate = false, bool iwadonly = false, bool doomtemplate = false, GlyphSet *baseGlpyphs = nullptr);
|
||||||
virtual ~FFont ();
|
virtual ~FFont ();
|
||||||
|
|
||||||
virtual FTexture *GetChar (int code, int translation, int *const width, bool *redirected = nullptr) const;
|
virtual FTexture *GetChar (int code, int translation, int *const width, bool *redirected = nullptr) const;
|
||||||
|
|
|
@ -149,7 +149,7 @@ struct DrawParms
|
||||||
double top;
|
double top;
|
||||||
double left;
|
double left;
|
||||||
float Alpha;
|
float Alpha;
|
||||||
int remap;
|
int TranslationId;
|
||||||
PalEntry fillcolor;
|
PalEntry fillcolor;
|
||||||
PalEntry colorOverlay;
|
PalEntry colorOverlay;
|
||||||
PalEntry color;
|
PalEntry color;
|
||||||
|
|
|
@ -261,7 +261,7 @@ void F2DDrawer::AddTexture(FTexture *img, DrawParms &parms)
|
||||||
dg.mVertCount = 4;
|
dg.mVertCount = 4;
|
||||||
dg.mTexture = img;
|
dg.mTexture = img;
|
||||||
|
|
||||||
dg.mRemapIndex = parms.remap;
|
dg.mRemapIndex = parms.TranslationId;
|
||||||
SetStyle(img, parms, vertexcolor, dg);
|
SetStyle(img, parms, vertexcolor, dg);
|
||||||
|
|
||||||
u1 = parms.srcx;
|
u1 = parms.srcx;
|
||||||
|
|
|
@ -262,7 +262,7 @@ bool ParseDrawTextureTags(FTexture *img, double x, double y, uint32_t tag, Va_Li
|
||||||
parms->burn = false;
|
parms->burn = false;
|
||||||
parms->monospace = EMonospacing::Off;
|
parms->monospace = EMonospacing::Off;
|
||||||
parms->spacing = 0;
|
parms->spacing = 0;
|
||||||
parms->remap = -1;
|
parms->TranslationId = -1;
|
||||||
|
|
||||||
// Parse the tag list for attributes. (For floating point attributes,
|
// Parse the tag list for attributes. (For floating point attributes,
|
||||||
// consider that the C ABI dictates that all floats be promoted to
|
// consider that the C ABI dictates that all floats be promoted to
|
||||||
|
@ -412,7 +412,7 @@ bool ParseDrawTextureTags(FTexture *img, double x, double y, uint32_t tag, Va_Li
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DTA_TranslationIndex:
|
case DTA_TranslationIndex:
|
||||||
parms->remap = ListGetInt(tags);
|
parms->TranslationId = ListGetInt(tags);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DTA_ColorOverlay:
|
case DTA_ColorOverlay:
|
||||||
|
|
|
@ -102,7 +102,7 @@ void DrawChar (F2DDrawer* drawer, FFont *font, int normalcolor, double x, double
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
PalEntry color = 0xffffffff;
|
PalEntry color = 0xffffffff;
|
||||||
parms.remap = font->GetColorTranslation((EColorRange)normalcolor, &color);
|
parms.TranslationId = redirected? -1 : font->GetColorTranslation((EColorRange)normalcolor, &color);
|
||||||
parms.color = PalEntry((color.a * parms.color.a) / 255, (color.r * parms.color.r) / 255, (color.g * parms.color.g) / 255, (color.b * parms.color.b) / 255);
|
parms.color = PalEntry((color.a * parms.color.a) / 255, (color.r * parms.color.r) / 255, (color.g * parms.color.g) / 255, (color.b * parms.color.b) / 255);
|
||||||
drawer->AddTexture(pic, parms);
|
drawer->AddTexture(pic, parms);
|
||||||
}
|
}
|
||||||
|
@ -140,7 +140,7 @@ void DrawTextCommon(F2DDrawer* drawer, FFont *font, int normalcolor, double x, d
|
||||||
|
|
||||||
PalEntry colorparm = parms.color;
|
PalEntry colorparm = parms.color;
|
||||||
PalEntry color = 0xffffffff;
|
PalEntry color = 0xffffffff;
|
||||||
parms.remap = font->GetColorTranslation((EColorRange)normalcolor, &color);
|
parms.TranslationId = font->GetColorTranslation((EColorRange)normalcolor, &color);
|
||||||
parms.color = PalEntry(colorparm.a, (color.r * colorparm.r) / 255, (color.g * colorparm.g) / 255, (color.b * colorparm.b) / 255);
|
parms.color = PalEntry(colorparm.a, (color.r * colorparm.r) / 255, (color.g * colorparm.g) / 255, (color.b * colorparm.b) / 255);
|
||||||
|
|
||||||
kerning = font->GetDefaultKerning();
|
kerning = font->GetDefaultKerning();
|
||||||
|
@ -167,7 +167,7 @@ void DrawTextCommon(F2DDrawer* drawer, FFont *font, int normalcolor, double x, d
|
||||||
EColorRange newcolor = V_ParseFontColor(ch, normalcolor, boldcolor);
|
EColorRange newcolor = V_ParseFontColor(ch, normalcolor, boldcolor);
|
||||||
if (newcolor != CR_UNDEFINED)
|
if (newcolor != CR_UNDEFINED)
|
||||||
{
|
{
|
||||||
parms.remap = font->GetColorTranslation(newcolor, &color);
|
parms.TranslationId = font->GetColorTranslation(newcolor, &color);
|
||||||
parms.color = PalEntry(colorparm.a, (color.r * colorparm.r) / 255, (color.g * colorparm.g) / 255, (color.b * colorparm.b) / 255);
|
parms.color = PalEntry(colorparm.a, (color.r * colorparm.r) / 255, (color.g * colorparm.g) / 255, (color.b * colorparm.b) / 255);
|
||||||
currentcolor = newcolor;
|
currentcolor = newcolor;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6752,6 +6752,8 @@ void G_PostCreateGameState(void)
|
||||||
A_InitEnemyFlags();
|
A_InitEnemyFlags();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InitFonts();
|
||||||
|
|
||||||
static void G_Startup(void)
|
static void G_Startup(void)
|
||||||
{
|
{
|
||||||
int32_t i;
|
int32_t i;
|
||||||
|
@ -6813,6 +6815,8 @@ static void G_Startup(void)
|
||||||
if (TileFiles.artLoadFiles("tiles%03i.art") < 0)
|
if (TileFiles.artLoadFiles("tiles%03i.art") < 0)
|
||||||
G_GameExit("Failed loading art.");
|
G_GameExit("Failed loading art.");
|
||||||
|
|
||||||
|
InitFonts();
|
||||||
|
|
||||||
// Make the fullscreen nuke logo background non-fullbright. Has to be
|
// Make the fullscreen nuke logo background non-fullbright. Has to be
|
||||||
// after dynamic tile remapping (from C_Compile) and loading tiles.
|
// after dynamic tile remapping (from C_Compile) and loading tiles.
|
||||||
picanm[LOADSCREEN].sf |= PICANM_NOFULLBRIGHT_BIT;
|
picanm[LOADSCREEN].sf |= PICANM_NOFULLBRIGHT_BIT;
|
||||||
|
@ -7020,6 +7024,7 @@ static const char* actions[] = {
|
||||||
"Toggle_Crouch", // This is the last one used by EDuke32.
|
"Toggle_Crouch", // This is the last one used by EDuke32.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int GameInterface::app_main()
|
int GameInterface::app_main()
|
||||||
{
|
{
|
||||||
buttonMap.SetButtons(actions, NUM_ACTIONS);
|
buttonMap.SetButtons(actions, NUM_ACTIONS);
|
||||||
|
|
|
@ -21,12 +21,68 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
#include "ns.h" // Must come before everything else!
|
#include "ns.h" // Must come before everything else!
|
||||||
|
|
||||||
|
#include "v_font.h"
|
||||||
#include "duke3d.h"
|
#include "duke3d.h"
|
||||||
#include "compat.h"
|
#include "compat.h"
|
||||||
#include "sbar.h"
|
#include "sbar.h"
|
||||||
|
|
||||||
BEGIN_RR_NS
|
BEGIN_RR_NS
|
||||||
|
|
||||||
|
|
||||||
|
void InitFonts()
|
||||||
|
{
|
||||||
|
GlyphSet fontdata;
|
||||||
|
|
||||||
|
// Small font
|
||||||
|
for (int i = 0; i < 95; i++)
|
||||||
|
{
|
||||||
|
auto tile = TileFiles.GetTile(STARTALPHANUM + i);
|
||||||
|
if (tile && tile->GetTexelWidth() > 0 && tile->GetTexelHeight() > 0)
|
||||||
|
fontdata.Insert('!' + i, tile);
|
||||||
|
}
|
||||||
|
SmallFont = new ::FFont("SmallFont", nullptr, "defsmallfont", 0, 0, 0, -1, -1, false, false, false, &fontdata);
|
||||||
|
fontdata.Clear();
|
||||||
|
|
||||||
|
// Big font
|
||||||
|
|
||||||
|
// This font is VERY messy...
|
||||||
|
fontdata.Insert('_', TileFiles.GetTile(BIGALPHANUM - 11));
|
||||||
|
fontdata.Insert('-', TileFiles.GetTile(BIGALPHANUM - 11));
|
||||||
|
for (int i = 0; i < 10; i++) fontdata.Insert('0' + i, TileFiles.GetTile(BIGALPHANUM - 10 + i));
|
||||||
|
for (int i = 0; i < 26; i++) fontdata.Insert('A' + i, TileFiles.GetTile(BIGALPHANUM + i));
|
||||||
|
fontdata.Insert('.', TileFiles.GetTile(BIGPERIOD));
|
||||||
|
fontdata.Insert(',', TileFiles.GetTile(BIGCOMMA));
|
||||||
|
fontdata.Insert('!', TileFiles.GetTile(BIGX_));
|
||||||
|
fontdata.Insert('?', TileFiles.GetTile(BIGQ));
|
||||||
|
fontdata.Insert(';', TileFiles.GetTile(BIGSEMI));
|
||||||
|
fontdata.Insert(':', TileFiles.GetTile(BIGCOLIN));
|
||||||
|
fontdata.Insert('\\', TileFiles.GetTile(BIGALPHANUM + 68));
|
||||||
|
fontdata.Insert('/', TileFiles.GetTile(BIGALPHANUM + 68));
|
||||||
|
fontdata.Insert('%', TileFiles.GetTile(BIGALPHANUM + 69));
|
||||||
|
fontdata.Insert('`', TileFiles.GetTile(BIGAPPOS));
|
||||||
|
fontdata.Insert('"', TileFiles.GetTile(BIGAPPOS));
|
||||||
|
fontdata.Insert('\'', TileFiles.GetTile(BIGAPPOS));
|
||||||
|
BigFont = new ::FFont("BigFont", nullptr, "defbigfont", 0, 0, 0, -1, -1, false, false, false, &fontdata);
|
||||||
|
fontdata.Clear();
|
||||||
|
|
||||||
|
// Tiny font
|
||||||
|
for (int i = 0; i < 95; i++)
|
||||||
|
{
|
||||||
|
auto tile = TileFiles.GetTile(MINIFONT + i);
|
||||||
|
if (tile && tile->GetTexelWidth() > 0 && tile->GetTexelHeight() > 0)
|
||||||
|
fontdata.Insert('!' + i, tile);
|
||||||
|
}
|
||||||
|
SmallFont2 = new ::FFont("SmallFont2", nullptr, "defsmallfont2", 0, 0, 0, -1, -1, false, false, false, &fontdata);
|
||||||
|
fontdata.Clear();
|
||||||
|
|
||||||
|
// SBAR index font
|
||||||
|
for (int i = 0; i < 10; i++) fontdata.Insert('0' + i, TileFiles.GetTile(THREEBYFIVE + i));
|
||||||
|
fontdata.Insert(':', TileFiles.GetTile(THREEBYFIVE + 10));
|
||||||
|
fontdata.Insert('/', TileFiles.GetTile(THREEBYFIVE + 11));
|
||||||
|
new ::FFont("IndexFont", nullptr, nullptr, 0, 0, 0, -1, -1, false, false, false, &fontdata);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t sbarx(int32_t x)
|
static int32_t sbarx(int32_t x)
|
||||||
{
|
{
|
||||||
if (ud.screen_size == 4) return sbarsc(x<<16);
|
if (ud.screen_size == 4) return sbarsc(x<<16);
|
||||||
|
@ -42,7 +98,7 @@ static int32_t sbarxr(int32_t x)
|
||||||
static int32_t sbary(int32_t y)
|
static int32_t sbary(int32_t y)
|
||||||
{
|
{
|
||||||
if (hud_position == 1 && ud.screen_size == 4 && ud.althud == 1) return sbarsc(y << 16);
|
if (hud_position == 1 && ud.screen_size == 4 && ud.althud == 1) return sbarsc(y << 16);
|
||||||
else return (200<<16) - sbarsc(200<<16) + sbarsc(y<<16);
|
else return (100<<16) - sbarsc(200<<16) + sbarsc(y<<16);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t sbarx16(int32_t x)
|
int32_t sbarx16(int32_t x)
|
||||||
|
@ -67,7 +123,7 @@ static int32_t sbarxr16(int32_t x)
|
||||||
|
|
||||||
int32_t sbary16(int32_t y)
|
int32_t sbary16(int32_t y)
|
||||||
{
|
{
|
||||||
return (200<<16) - sbarsc(200<<16) + sbarsc(y);
|
return (100<<16) - sbarsc(200<<16) + sbarsc(y);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void G_PatchStatusBar(int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t aspectCorrect = 1)
|
static void G_PatchStatusBar(int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t aspectCorrect = 1)
|
||||||
|
|
Loading…
Reference in a new issue