2020-05-25 15:11:32 +00:00
|
|
|
#pragma once
|
2019-10-23 23:20:58 +00:00
|
|
|
/*
|
|
|
|
** v_font.h
|
|
|
|
**
|
|
|
|
**---------------------------------------------------------------------------
|
|
|
|
** Copyright 1998-2008 Randy Heit
|
|
|
|
** All rights reserved.
|
|
|
|
**
|
|
|
|
** Redistribution and use in source and binary forms, with or without
|
|
|
|
** modification, are permitted provided that the following conditions
|
|
|
|
** are met:
|
|
|
|
**
|
|
|
|
** 1. Redistributions of source code must retain the above copyright
|
|
|
|
** notice, this list of conditions and the following disclaimer.
|
|
|
|
** 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
** notice, this list of conditions and the following disclaimer in the
|
|
|
|
** documentation and/or other materials provided with the distribution.
|
|
|
|
** 3. The name of the author may not be used to endorse or promote products
|
|
|
|
** derived from this software without specific prior written permission.
|
|
|
|
**
|
|
|
|
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
|
|
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
|
|
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
|
|
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
|
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
|
|
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
|
|
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
**---------------------------------------------------------------------------
|
|
|
|
**
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
2020-04-05 20:51:53 +00:00
|
|
|
#include "filesystem.h"
|
2019-10-23 23:20:58 +00:00
|
|
|
#include "vectors.h"
|
|
|
|
#include "palentry.h"
|
2020-04-05 20:51:53 +00:00
|
|
|
#include "name.h"
|
2019-10-23 23:20:58 +00:00
|
|
|
|
2020-05-25 21:59:07 +00:00
|
|
|
class FGameTexture;
|
2020-04-05 20:51:53 +00:00
|
|
|
struct FRemapTable;
|
2021-05-30 21:00:06 +00:00
|
|
|
class FFont;
|
|
|
|
|
|
|
|
FFont* V_GetFont(const char* fontname, const char* fontlumpname = nullptr);
|
2019-10-23 23:20:58 +00:00
|
|
|
|
|
|
|
enum EColorRange : int
|
|
|
|
{
|
|
|
|
CR_UNDEFINED = -1,
|
2021-05-29 09:47:05 +00:00
|
|
|
CR_NATIVEPAL = -1,
|
2019-10-23 23:20:58 +00:00
|
|
|
CR_BRICK,
|
|
|
|
CR_TAN,
|
|
|
|
CR_GRAY,
|
|
|
|
CR_GREY = CR_GRAY,
|
|
|
|
CR_GREEN,
|
|
|
|
CR_BROWN,
|
|
|
|
CR_GOLD,
|
|
|
|
CR_RED,
|
|
|
|
CR_BLUE,
|
|
|
|
CR_ORANGE,
|
|
|
|
CR_WHITE,
|
|
|
|
CR_YELLOW,
|
|
|
|
CR_UNTRANSLATED,
|
|
|
|
CR_BLACK,
|
|
|
|
CR_LIGHTBLUE,
|
|
|
|
CR_CREAM,
|
|
|
|
CR_OLIVE,
|
|
|
|
CR_DARKGREEN,
|
|
|
|
CR_DARKRED,
|
|
|
|
CR_DARKBROWN,
|
|
|
|
CR_PURPLE,
|
|
|
|
CR_DARKGRAY,
|
|
|
|
CR_CYAN,
|
|
|
|
CR_ICE,
|
|
|
|
CR_FIRE,
|
|
|
|
CR_SAPPHIRE,
|
|
|
|
CR_TEAL,
|
|
|
|
NUM_TEXT_COLORS,
|
|
|
|
};
|
|
|
|
|
|
|
|
extern int NumTextColors;
|
|
|
|
|
2020-05-25 21:59:07 +00:00
|
|
|
using GlyphSet = TMap<int, FGameTexture*>;
|
2019-10-23 23:20:58 +00:00
|
|
|
|
|
|
|
class FFont
|
|
|
|
{
|
2020-05-01 11:13:46 +00:00
|
|
|
friend void V_LoadTranslations();
|
2019-10-23 23:20:58 +00:00
|
|
|
public:
|
|
|
|
|
|
|
|
enum EFontType
|
|
|
|
{
|
|
|
|
Unknown,
|
|
|
|
Folder,
|
|
|
|
Multilump,
|
|
|
|
Fon1,
|
|
|
|
Fon2,
|
|
|
|
BMF,
|
|
|
|
Custom
|
|
|
|
};
|
|
|
|
|
2020-05-25 15:01:56 +00:00
|
|
|
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);
|
2021-05-30 22:52:40 +00:00
|
|
|
FFont(int lump, FName nm = NAME_None);
|
2019-10-23 23:20:58 +00:00
|
|
|
virtual ~FFont ();
|
|
|
|
|
2021-05-24 17:27:07 +00:00
|
|
|
virtual FGameTexture *GetChar (int code, int translation, int *const width) const;
|
2020-04-05 20:51:53 +00:00
|
|
|
virtual int GetCharWidth (int code) const;
|
2019-11-05 22:35:38 +00:00
|
|
|
int GetColorTranslation (EColorRange range, PalEntry *color = nullptr) const;
|
2020-04-05 20:51:53 +00:00
|
|
|
int GetLump() const { return Lump; }
|
2019-10-23 23:20:58 +00:00
|
|
|
int GetSpaceWidth () const { return SpaceWidth; }
|
|
|
|
int GetHeight () const { return FontHeight; }
|
|
|
|
int GetDefaultKerning () const { return GlobalKerning; }
|
|
|
|
int GetMaxAscender(const uint8_t* text) const;
|
|
|
|
int GetMaxAscender(const char* text) const { return GetMaxAscender((uint8_t*)text); }
|
|
|
|
int GetMaxAscender(const FString &text) const { return GetMaxAscender((uint8_t*)text.GetChars()); }
|
|
|
|
virtual void LoadTranslations();
|
|
|
|
FName GetName() const { return FontName; }
|
|
|
|
|
|
|
|
static FFont *FindFont(FName fontname);
|
|
|
|
|
|
|
|
// Return width of string in pixels (unscaled)
|
2020-05-25 21:59:07 +00:00
|
|
|
int StringWidth (const uint8_t *str, int spacing = 0) const;
|
|
|
|
inline int StringWidth (const char *str, int spacing = 0) const { return StringWidth ((const uint8_t *)str, spacing); }
|
|
|
|
inline int StringWidth (const FString &str, int spacing = 0) const { return StringWidth ((const uint8_t *)str.GetChars(), spacing); }
|
2019-10-23 23:20:58 +00:00
|
|
|
|
|
|
|
// Checks if the font contains all characters to print this text.
|
|
|
|
bool CanPrint(const uint8_t *str) const;
|
|
|
|
inline bool CanPrint(const char *str) const { return CanPrint((const uint8_t *)str); }
|
|
|
|
inline bool CanPrint(const FString &str) const { return CanPrint((const uint8_t *)str.GetChars()); }
|
|
|
|
|
2021-05-30 21:00:06 +00:00
|
|
|
inline FFont* AltFont()
|
|
|
|
{
|
|
|
|
if (AltFontName != NAME_None) return V_GetFont(AltFontName.GetChars());
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
2019-10-23 23:20:58 +00:00
|
|
|
int GetCharCode(int code, bool needpic) const;
|
|
|
|
char GetCursor() const { return Cursor; }
|
|
|
|
void SetCursor(char c) { Cursor = c; }
|
|
|
|
void SetKerning(int c) { GlobalKerning = c; }
|
2021-05-30 08:56:31 +00:00
|
|
|
void SetHeight(int c) { FontHeight = c; }
|
2021-05-30 21:00:06 +00:00
|
|
|
void ClearOffsets();
|
2019-10-23 23:20:58 +00:00
|
|
|
bool NoTranslate() const { return noTranslate; }
|
2020-10-24 15:30:47 +00:00
|
|
|
virtual void RecordAllTextureColors(uint32_t *usedcolors);
|
2019-10-23 23:20:58 +00:00
|
|
|
void CheckCase();
|
2021-05-30 22:52:40 +00:00
|
|
|
void SetName(FName nm) { FontName = nm; }
|
2019-10-23 23:20:58 +00:00
|
|
|
|
|
|
|
int GetDisplacement() const { return Displacement; }
|
|
|
|
|
2021-05-24 18:29:22 +00:00
|
|
|
static int GetLuminosity(uint32_t* colorsused, TArray<double>& Luminosity, int* minlum = nullptr, int* maxlum = nullptr);
|
2021-05-29 13:27:58 +00:00
|
|
|
EFontType GetType() const { return Type; }
|
|
|
|
|
2021-05-30 21:00:06 +00:00
|
|
|
friend void V_InitCustomFonts();
|
2019-10-23 23:20:58 +00:00
|
|
|
|
2021-05-30 22:52:40 +00:00
|
|
|
void CopyFrom(const FFont& other)
|
|
|
|
{
|
|
|
|
Type = other.Type;
|
|
|
|
FirstChar = other.FirstChar;
|
|
|
|
LastChar = other.LastChar;
|
|
|
|
SpaceWidth = other.SpaceWidth;
|
|
|
|
FontHeight = other.FontHeight;
|
|
|
|
GlobalKerning = other.GlobalKerning;
|
|
|
|
TranslationType = other.TranslationType;
|
|
|
|
Displacement = other.Displacement;
|
|
|
|
Cursor = other.Cursor;
|
|
|
|
noTranslate = other.noTranslate;
|
|
|
|
MixedCase = other.MixedCase;
|
|
|
|
forceremap = other.forceremap;
|
|
|
|
Chars = other.Chars;
|
|
|
|
Translations = other.Translations;
|
2023-02-11 09:43:59 +00:00
|
|
|
lowercaselatinonly = other.lowercaselatinonly;
|
2021-05-30 22:52:40 +00:00
|
|
|
Lump = other.Lump;
|
|
|
|
}
|
|
|
|
|
2019-10-23 23:20:58 +00:00
|
|
|
protected:
|
|
|
|
|
|
|
|
void FixXMoves();
|
|
|
|
|
2023-08-23 18:36:19 +00:00
|
|
|
void ReadSheetFont(std::vector<FileSys::FolderEntry> &folderdata, int width, int height, const DVector2 &Scale);
|
2020-04-05 20:51:53 +00:00
|
|
|
|
2019-10-23 23:20:58 +00:00
|
|
|
EFontType Type = EFontType::Unknown;
|
2021-05-30 08:56:31 +00:00
|
|
|
FName AltFontName = NAME_None;
|
2019-10-23 23:20:58 +00:00
|
|
|
int FirstChar, LastChar;
|
|
|
|
int SpaceWidth;
|
|
|
|
int FontHeight;
|
|
|
|
int GlobalKerning;
|
|
|
|
int TranslationType = 0;
|
|
|
|
int Displacement = 0;
|
2021-05-30 08:56:31 +00:00
|
|
|
int16_t MinLum = -1, MaxLum = -1;
|
2019-10-23 23:20:58 +00:00
|
|
|
char Cursor;
|
2020-05-26 21:12:04 +00:00
|
|
|
bool noTranslate = false;
|
2019-10-23 23:20:58 +00:00
|
|
|
bool MixedCase = false;
|
|
|
|
bool forceremap = false;
|
2023-02-11 09:43:59 +00:00
|
|
|
bool lowercaselatinonly = false;
|
2019-10-23 23:20:58 +00:00
|
|
|
struct CharData
|
|
|
|
{
|
2021-05-24 17:27:07 +00:00
|
|
|
FGameTexture *OriginalPic = nullptr;
|
2019-10-23 23:20:58 +00:00
|
|
|
int XMove = INT_MIN;
|
|
|
|
};
|
|
|
|
TArray<CharData> Chars;
|
2020-04-05 20:51:53 +00:00
|
|
|
TArray<int> Translations;
|
2019-10-23 23:20:58 +00:00
|
|
|
|
2020-04-05 20:51:53 +00:00
|
|
|
int Lump;
|
2019-10-23 23:20:58 +00:00
|
|
|
FName FontName = NAME_None;
|
|
|
|
FFont *Next;
|
|
|
|
|
|
|
|
static FFont *FirstFont;
|
|
|
|
friend struct FontsDeleter;
|
|
|
|
|
|
|
|
friend void V_ClearFonts();
|
|
|
|
friend void V_InitFonts();
|
|
|
|
};
|
|
|
|
|
2020-10-24 15:30:47 +00:00
|
|
|
extern FFont *SmallFont, *SmallFont2, *BigFont, *BigUpper, *ConFont, *IntermissionFont, *NewConsoleFont, *NewSmallFont, *CurrentConsoleFont, *OriginalSmallFont, *AlternativeSmallFont, *OriginalBigFont, *AlternativeBigFont;
|
2019-10-23 23:20:58 +00:00
|
|
|
|
|
|
|
void V_InitFonts();
|
|
|
|
void V_ClearFonts();
|
|
|
|
EColorRange V_FindFontColor (FName name);
|
|
|
|
PalEntry V_LogColorFromColorRange (EColorRange range);
|
|
|
|
EColorRange V_ParseFontColor (const uint8_t *&color_value, int normalcolor, int boldcolor);
|
|
|
|
void V_InitFontColors();
|
|
|
|
char* CleanseString(char* str);
|
2021-05-24 17:01:35 +00:00
|
|
|
void V_ApplyLuminosityTranslation(int translation, uint8_t* pixel, int size);
|
2020-05-01 11:13:46 +00:00
|
|
|
void V_LoadTranslations();
|
2021-05-24 11:16:50 +00:00
|
|
|
class FBitmap;
|
2019-10-23 23:20:58 +00:00
|
|
|
|
2020-04-05 20:51:53 +00:00
|
|
|
|