Browse Source

Fonts: Use pre-cropped CLX sprites

Built-in font size decreased by 121,587 bytes
(2,287,332 -> 2,165,745).

Fixes #6361
pull/6375/head
Gleb Mazovetskiy 3 years ago committed by Anders Jenbo
parent
commit
d6b7949dab
  1. 39
      CMake/Assets.cmake
  2. BIN
      Packaging/resources/assets/fonts/12-00.bin
  3. BIN
      Packaging/resources/assets/fonts/12-00.clx
  4. 38
      Packaging/resources/assets/fonts/12-01.bin
  5. BIN
      Packaging/resources/assets/fonts/12-01.clx
  6. BIN
      Packaging/resources/assets/fonts/12-02.bin
  7. BIN
      Packaging/resources/assets/fonts/12-02.clx
  8. BIN
      Packaging/resources/assets/fonts/12-03.bin
  9. BIN
      Packaging/resources/assets/fonts/12-03.clx
  10. 38
      Packaging/resources/assets/fonts/12-04.bin
  11. BIN
      Packaging/resources/assets/fonts/12-04.clx
  12. BIN
      Packaging/resources/assets/fonts/12-20.bin
  13. BIN
      Packaging/resources/assets/fonts/12-20.clx
  14. BIN
      Packaging/resources/assets/fonts/12-e0.bin
  15. BIN
      Packaging/resources/assets/fonts/12-e0.clx
  16. BIN
      Packaging/resources/assets/fonts/22-00.bin
  17. BIN
      Packaging/resources/assets/fonts/22-00.clx
  18. 38
      Packaging/resources/assets/fonts/22-01.bin
  19. BIN
      Packaging/resources/assets/fonts/22-01.clx
  20. 38
      Packaging/resources/assets/fonts/22-02.bin
  21. BIN
      Packaging/resources/assets/fonts/22-02.clx
  22. 20
      Packaging/resources/assets/fonts/22-03.bin
  23. BIN
      Packaging/resources/assets/fonts/22-03.clx
  24. 34
      Packaging/resources/assets/fonts/22-04.bin
  25. BIN
      Packaging/resources/assets/fonts/22-04.clx
  26. BIN
      Packaging/resources/assets/fonts/22-05.bin
  27. BIN
      Packaging/resources/assets/fonts/22-05.clx
  28. BIN
      Packaging/resources/assets/fonts/22-20.bin
  29. BIN
      Packaging/resources/assets/fonts/22-20.clx
  30. BIN
      Packaging/resources/assets/fonts/24-00.bin
  31. BIN
      Packaging/resources/assets/fonts/24-00.clx
  32. 12
      Packaging/resources/assets/fonts/24-01.bin
  33. BIN
      Packaging/resources/assets/fonts/24-01.clx
  34. BIN
      Packaging/resources/assets/fonts/24-02.bin
  35. BIN
      Packaging/resources/assets/fonts/24-02.clx
  36. BIN
      Packaging/resources/assets/fonts/24-03.bin
  37. BIN
      Packaging/resources/assets/fonts/24-03.clx
  38. 17
      Packaging/resources/assets/fonts/24-04.bin
  39. BIN
      Packaging/resources/assets/fonts/24-04.clx
  40. BIN
      Packaging/resources/assets/fonts/24-20.bin
  41. BIN
      Packaging/resources/assets/fonts/24-20.clx
  42. BIN
      Packaging/resources/assets/fonts/24-e0.bin
  43. BIN
      Packaging/resources/assets/fonts/24-e0.clx
  44. BIN
      Packaging/resources/assets/fonts/30-00.bin
  45. BIN
      Packaging/resources/assets/fonts/30-00.clx
  46. 4
      Packaging/resources/assets/fonts/30-01.bin
  47. BIN
      Packaging/resources/assets/fonts/30-01.clx
  48. BIN
      Packaging/resources/assets/fonts/30-02.bin
  49. BIN
      Packaging/resources/assets/fonts/30-02.clx
  50. BIN
      Packaging/resources/assets/fonts/30-03.bin
  51. BIN
      Packaging/resources/assets/fonts/30-03.clx
  52. 1
      Packaging/resources/assets/fonts/30-04.bin
  53. BIN
      Packaging/resources/assets/fonts/30-04.clx
  54. BIN
      Packaging/resources/assets/fonts/30-20.bin
  55. BIN
      Packaging/resources/assets/fonts/30-20.clx
  56. BIN
      Packaging/resources/assets/fonts/42-00.bin
  57. BIN
      Packaging/resources/assets/fonts/42-00.clx
  58. 7
      Packaging/resources/assets/fonts/42-01.bin
  59. BIN
      Packaging/resources/assets/fonts/42-01.clx
  60. BIN
      Packaging/resources/assets/fonts/42-02.bin
  61. BIN
      Packaging/resources/assets/fonts/42-02.clx
  62. BIN
      Packaging/resources/assets/fonts/42-03.bin
  63. BIN
      Packaging/resources/assets/fonts/42-03.clx
  64. 3
      Packaging/resources/assets/fonts/42-04.bin
  65. BIN
      Packaging/resources/assets/fonts/42-04.clx
  66. 5
      Packaging/resources/assets/fonts/42-20.bin
  67. BIN
      Packaging/resources/assets/fonts/42-20.clx
  68. BIN
      Packaging/resources/assets/fonts/46-00.bin
  69. BIN
      Packaging/resources/assets/fonts/46-00.clx
  70. 3
      Packaging/resources/assets/fonts/46-01.bin
  71. BIN
      Packaging/resources/assets/fonts/46-01.clx
  72. BIN
      Packaging/resources/assets/fonts/46-02.bin
  73. BIN
      Packaging/resources/assets/fonts/46-02.clx
  74. BIN
      Packaging/resources/assets/fonts/46-03.bin
  75. BIN
      Packaging/resources/assets/fonts/46-03.clx
  76. 3
      Packaging/resources/assets/fonts/46-04.bin
  77. BIN
      Packaging/resources/assets/fonts/46-04.clx
  78. 2
      Packaging/resources/assets/fonts/46-20.bin
  79. BIN
      Packaging/resources/assets/fonts/46-20.clx
  80. BIN
      Packaging/resources/assets/gendata/cut3w.clx
  81. 18
      Source/diablo.cpp
  82. 103
      Source/engine/render/text_render.cpp
  83. 7
      android-project/app/src/main/java/org/diasurgical/devilutionx/DataActivity.java
  84. 9
      android-project/app/src/main/java/org/diasurgical/devilutionx/DevilutionXSDLActivity.java
  85. 16
      tools/update_bundled_assets.sh

39
CMake/Assets.cmake

@ -63,91 +63,52 @@ set(devilutionx_assets
data/stashnavbtns.clx
data/talkbutton.clx
data/xpbar.clx
fonts/12-00.bin
fonts/12-00.clx
fonts/12-01.bin
fonts/12-01.clx
fonts/12-02.bin
fonts/12-02.clx
fonts/12-03.bin
fonts/12-03.clx
fonts/12-04.bin
fonts/12-04.clx
fonts/12-1f4.clx
fonts/12-1f6.clx
fonts/12-1f9.clx
fonts/12-20.bin
fonts/12-20.clx
fonts/12-26.clx
fonts/12-e0.clx
fonts/12-e0.bin
fonts/22-00.bin
fonts/22-00.clx
fonts/22-01.bin
fonts/22-01.clx
fonts/22-02.bin
fonts/22-02.clx
fonts/22-03.bin
fonts/22-03.clx
fonts/22-04.bin
fonts/22-04.clx
fonts/22-05.bin
fonts/22-05.clx
fonts/22-20.bin
fonts/22-20.clx
fonts/24-00.bin
fonts/24-00.clx
fonts/24-01.bin
fonts/24-01.clx
fonts/24-02.bin
fonts/24-02.clx
fonts/24-03.bin
fonts/24-03.clx
fonts/24-04.bin
fonts/24-04.clx
fonts/24-1f4.clx
fonts/24-1f6.clx
fonts/24-1f9.clx
fonts/24-20.bin
fonts/24-20.clx
fonts/24-26.clx
fonts/24-e0.bin
fonts/24-e0.clx
fonts/30-00.bin
fonts/30-00.clx
fonts/30-01.bin
fonts/30-01.clx
fonts/30-02.bin
fonts/30-02.clx
fonts/30-03.bin
fonts/30-03.clx
fonts/30-04.bin
fonts/30-04.clx
fonts/30-20.bin
fonts/30-20.clx
fonts/42-00.bin
fonts/42-00.clx
fonts/42-01.bin
fonts/42-01.clx
fonts/42-02.bin
fonts/42-02.clx
fonts/42-03.bin
fonts/42-03.clx
fonts/42-04.bin
fonts/42-04.clx
fonts/42-20.bin
fonts/42-20.clx
fonts/46-00.bin
fonts/46-00.clx
fonts/46-01.bin
fonts/46-01.clx
fonts/46-02.bin
fonts/46-02.clx
fonts/46-03.bin
fonts/46-03.clx
fonts/46-04.bin
fonts/46-04.clx
fonts/46-20.bin
fonts/46-20.clx
fonts/black.trn
fonts/blue.trn

BIN
Packaging/resources/assets/fonts/12-00.bin

Binary file not shown.

BIN
Packaging/resources/assets/fonts/12-00.clx

Binary file not shown.

38
Packaging/resources/assets/fonts/12-01.bin

@ -1,38 +0,0 @@
         
   
   

   


 

 


 

  

BIN
Packaging/resources/assets/fonts/12-01.clx

Binary file not shown.

BIN
Packaging/resources/assets/fonts/12-02.bin

Binary file not shown.

BIN
Packaging/resources/assets/fonts/12-02.clx

Binary file not shown.

BIN
Packaging/resources/assets/fonts/12-03.bin

Binary file not shown.

BIN
Packaging/resources/assets/fonts/12-03.clx

Binary file not shown.

38
Packaging/resources/assets/fonts/12-04.bin

@ -1,38 +0,0 @@
   
 
 
 


   
    
 
 
  
 

 

 



 
 
    








BIN
Packaging/resources/assets/fonts/12-04.clx

Binary file not shown.

BIN
Packaging/resources/assets/fonts/12-20.bin

Binary file not shown.

BIN
Packaging/resources/assets/fonts/12-20.clx

Binary file not shown.

BIN
Packaging/resources/assets/fonts/12-e0.bin

Binary file not shown.

BIN
Packaging/resources/assets/fonts/12-e0.clx

Binary file not shown.

BIN
Packaging/resources/assets/fonts/22-00.bin

Binary file not shown.

BIN
Packaging/resources/assets/fonts/22-00.clx

Binary file not shown.

38
Packaging/resources/assets/fonts/22-01.bin

@ -1,38 +0,0 @@






  
     
     

 
   
    
 





 


BIN
Packaging/resources/assets/fonts/22-01.clx

Binary file not shown.

38
Packaging/resources/assets/fonts/22-02.bin

@ -1,38 +0,0 @@
 

   

 

 
 

 
 
 



     
 
 



BIN
Packaging/resources/assets/fonts/22-02.clx

Binary file not shown.

20
Packaging/resources/assets/fonts/22-03.bin

@ -1,20 +0,0 @@
   
  



  

    
 
   

   
 
   
  

BIN
Packaging/resources/assets/fonts/22-03.clx

Binary file not shown.

34
Packaging/resources/assets/fonts/22-04.bin

@ -1,34 +0,0 @@

   
 

    
 
    
   



     
 
  



 
  


BIN
Packaging/resources/assets/fonts/22-04.clx

Binary file not shown.

BIN
Packaging/resources/assets/fonts/22-05.bin

Binary file not shown.

BIN
Packaging/resources/assets/fonts/22-05.clx

Binary file not shown.

BIN
Packaging/resources/assets/fonts/22-20.bin

Binary file not shown.

BIN
Packaging/resources/assets/fonts/22-20.clx

Binary file not shown.

BIN
Packaging/resources/assets/fonts/24-00.bin

Binary file not shown.

BIN
Packaging/resources/assets/fonts/24-00.clx

Binary file not shown.

12
Packaging/resources/assets/fonts/24-01.bin

@ -1,12 +0,0 @@
    
     

            
      

       

BIN
Packaging/resources/assets/fonts/24-01.clx

Binary file not shown.

BIN
Packaging/resources/assets/fonts/24-02.bin

Binary file not shown.

BIN
Packaging/resources/assets/fonts/24-02.clx

Binary file not shown.

BIN
Packaging/resources/assets/fonts/24-03.bin

Binary file not shown.

BIN
Packaging/resources/assets/fonts/24-03.clx

Binary file not shown.

17
Packaging/resources/assets/fonts/24-04.bin

@ -1,17 +0,0 @@
             
 
   
 
  



      
    
    



BIN
Packaging/resources/assets/fonts/24-04.clx

Binary file not shown.

BIN
Packaging/resources/assets/fonts/24-20.bin

Binary file not shown.

BIN
Packaging/resources/assets/fonts/24-20.clx

Binary file not shown.

BIN
Packaging/resources/assets/fonts/24-e0.bin

Binary file not shown.

BIN
Packaging/resources/assets/fonts/24-e0.clx

Binary file not shown.

BIN
Packaging/resources/assets/fonts/30-00.bin

Binary file not shown.

BIN
Packaging/resources/assets/fonts/30-00.clx

Binary file not shown.

4
Packaging/resources/assets/fonts/30-01.bin

@ -1,4 +0,0 @@
                   

  


BIN
Packaging/resources/assets/fonts/30-01.clx

Binary file not shown.

BIN
Packaging/resources/assets/fonts/30-02.bin

Binary file not shown.

BIN
Packaging/resources/assets/fonts/30-02.clx

Binary file not shown.

BIN
Packaging/resources/assets/fonts/30-03.bin

Binary file not shown.

BIN
Packaging/resources/assets/fonts/30-03.clx

Binary file not shown.

1
Packaging/resources/assets/fonts/30-04.bin

@ -1 +0,0 @@
                     !                  

BIN
Packaging/resources/assets/fonts/30-04.clx

Binary file not shown.

BIN
Packaging/resources/assets/fonts/30-20.bin

Binary file not shown.

BIN
Packaging/resources/assets/fonts/30-20.clx

Binary file not shown.

BIN
Packaging/resources/assets/fonts/42-00.bin

Binary file not shown.

BIN
Packaging/resources/assets/fonts/42-00.clx

Binary file not shown.

7
Packaging/resources/assets/fonts/42-01.bin

@ -1,7 +0,0 @@



% )" !  !#)'"!!

)'"!

BIN
Packaging/resources/assets/fonts/42-01.clx

Binary file not shown.

BIN
Packaging/resources/assets/fonts/42-02.bin

Binary file not shown.

BIN
Packaging/resources/assets/fonts/42-02.clx

Binary file not shown.

BIN
Packaging/resources/assets/fonts/42-03.bin

Binary file not shown.

BIN
Packaging/resources/assets/fonts/42-03.clx

Binary file not shown.

3
Packaging/resources/assets/fonts/42-04.bin

@ -1,3 +0,0 @@

! # '"$"!.('!'%"%!!!
!

BIN
Packaging/resources/assets/fonts/42-04.clx

Binary file not shown.

5
Packaging/resources/assets/fonts/42-20.bin

@ -1,5 +0,0 @@
""  "# 
% '   "" 
 

BIN
Packaging/resources/assets/fonts/42-20.clx

Binary file not shown.

BIN
Packaging/resources/assets/fonts/46-00.bin

Binary file not shown.

BIN
Packaging/resources/assets/fonts/46-00.clx

Binary file not shown.

3
Packaging/resources/assets/fonts/46-01.bin

@ -1,3 +0,0 @@
"## 
 #!!!,& %%% $%% 1)##"!"!''!!% ! +$!& 
 1/)('!# %% %% %###!!! 1/)'#!!

BIN
Packaging/resources/assets/fonts/46-01.clx

Binary file not shown.

BIN
Packaging/resources/assets/fonts/46-02.bin

Binary file not shown.

BIN
Packaging/resources/assets/fonts/46-02.clx

Binary file not shown.

BIN
Packaging/resources/assets/fonts/46-03.bin

Binary file not shown.

BIN
Packaging/resources/assets/fonts/46-03.clx

Binary file not shown.

3
Packaging/resources/assets/fonts/46-04.bin

@ -1,3 +0,0 @@
#  $"%!# %")!! "$& *" #
/!%")"!+%"!)#("70!.'.!#$!!.)-%("# ""#%)"(" % ")" "#!!!&!!! ! "#

BIN
Packaging/resources/assets/fonts/46-04.clx

Binary file not shown.

2
Packaging/resources/assets/fonts/46-20.bin

@ -1,2 +0,0 @@
((
! (* !+ . $((    

BIN
Packaging/resources/assets/fonts/46-20.clx

Binary file not shown.

BIN
Packaging/resources/assets/gendata/cut3w.clx

Binary file not shown.

18
Source/diablo.cpp

@ -1094,11 +1094,23 @@ void CheckArchivesUpToDate()
{
#ifdef UNPACKED_MPQS
const bool devilutionxMpqOutOfDate = false;
const bool fontsMpqOutOfDate = font_data_path && !FileExists(*font_data_path + "fonts" + DirectorySeparator + "12-4e.clx");
const bool haveFonts { font_data_path };
#else
const bool devilutionxMpqOutOfDate = devilutionx_mpq && !devilutionx_mpq->HasFile("data\\charbg.clx");
const bool fontsMpqOutOfDate = font_mpq && !font_mpq->HasFile("fonts\\12-4e.clx");
const bool devilutionxMpqOutOfDate = devilutionx_mpq && (!devilutionx_mpq->HasFile("data\\charbg.clx") || devilutionx_mpq->HasFile("fonts\\12-00.bin"));
const bool haveFonts { font_mpq };
#endif
bool fontsMpqOutOfDate = true;
if (haveFonts) {
size_t size;
AssetHandle handle = OpenAsset("fonts\\VERSION", size);
if (handle.ok()) {
std::unique_ptr<char[]> version_contents { new char[size] };
handle.read(version_contents.get(), size);
fontsMpqOutOfDate = string_view { version_contents.get(), size } != "1\n";
}
} else {
fontsMpqOutOfDate = false;
}
if (devilutionxMpqOutOfDate && fontsMpqOutOfDate) {
app_fatal(_("Please update devilutionx.mpq and fonts.mpq to the latest version"));

103
Source/engine/render/text_render.cpp

@ -39,10 +39,7 @@ constexpr char32_t ZWSP = U'\u200B'; // Zero-width space
std::unordered_map<uint32_t, OptionalOwnedClxSpriteList> Fonts;
std::unordered_map<uint32_t, std::array<uint8_t, 256>> FontKerns;
std::array<int, 6> FontSizes = { 12, 24, 30, 42, 46, 22 };
std::array<uint8_t, 6> CJKWidth = { 17, 24, 28, 41, 47, 16 };
std::array<uint8_t, 6> HangulWidth = { 15, 20, 24, 35, 39, 15 };
constexpr std::array<int, 6> LineHeights = { 12, 26, 38, 42, 50, 22 };
constexpr int SmallFontTallLineHeight = 16;
std::array<int, 6> BaseLineOffset = { -3, -2, -3, -6, -7, 3 };
@ -151,35 +148,6 @@ uint32_t GetFontId(GameFontTables size, uint16_t row)
return (size << 16) | row;
}
std::array<uint8_t, 256> *LoadFontKerning(GameFontTables size, uint16_t row)
{
uint32_t fontId = GetFontId(size, row);
auto hotKerning = FontKerns.find(fontId);
if (hotKerning != FontKerns.end()) {
return &hotKerning->second;
}
char path[32];
GetFontPath(size, row, ".bin", &path[0]);
auto *kerning = &FontKerns[fontId];
if (IsCJK(row)) {
kerning->fill(CJKWidth[size]);
} else if (IsHangul(row)) {
kerning->fill(HangulWidth[size]);
} else {
AssetHandle handle = OpenAsset(path);
if (!handle.ok() || !handle.read(kerning, 256)) {
LogError("Missing font kerning: {}", path);
kerning->fill(CJKWidth[size]);
}
}
return kerning;
}
OptionalClxSpriteList LoadFont(GameFontTables size, text_color color, uint16_t row)
{
if (ColorTranslations[color] != nullptr && !ColorTranslationsData[color]) {
@ -218,7 +186,6 @@ OptionalClxSpriteList LoadFont(GameFontTables size, text_color color, uint16_t r
class CurrentFont {
public:
OptionalClxSpriteList sprite;
std::array<uint8_t, 256> *kerning = nullptr;
bool load(GameFontTables size, text_color color, char32_t next)
{
@ -228,7 +195,6 @@ public:
}
sprite = LoadFont(size, color, unicodeRow);
kerning = LoadFontKerning(size, unicodeRow);
hasAttemptedLoad_ = true;
currentUnicodeRow_ = unicodeRow;
@ -445,14 +411,15 @@ uint32_t DoDrawString(const Surface &out, string_view text, Rectangle rect, Poin
}
const uint8_t frame = next & 0xFF;
if (next == U'\n' || characterPosition.x + (*currentFont.kerning)[frame] > rightMargin) {
const uint16_t width = (*currentFont.sprite)[frame].width();
if (next == U'\n' || characterPosition.x + width > rightMargin) {
const int nextLineY = characterPosition.y + lineHeight;
if (nextLineY >= bottomMargin)
break;
characterPosition.y = nextLineY;
if (HasAnyOf(flags, (UiFlags::AlignCenter | UiFlags::AlignRight))) {
lineWidth = (*currentFont.kerning)[frame];
lineWidth = width;
if (remaining.size() > cpLen)
lineWidth += spacing + GetLineWidth(remaining.substr(cpLen), size, spacing);
}
@ -463,7 +430,7 @@ uint32_t DoDrawString(const Surface &out, string_view text, Rectangle rect, Poin
}
DrawFont(out, characterPosition, *currentFont.sprite, color, frame, outline);
characterPosition.x += (*currentFont.kerning)[frame] + spacing;
characterPosition.x += width + spacing;
}
return remaining.data() - text.data();
}
@ -478,16 +445,13 @@ void LoadSmallSelectionSpinner()
void UnloadFonts()
{
Fonts.clear();
FontKerns.clear();
}
int GetLineWidth(string_view text, GameFontTables size, int spacing, int *charactersInLine)
{
int lineWidth = 0;
CurrentFont currentFont;
uint32_t codepoints = 0;
uint32_t currentUnicodeRow = 0;
std::array<uint8_t, 256> *kerning = nullptr;
char32_t next;
while (!text.empty()) {
next = ConsumeFirstUtf8CodePoint(&text);
@ -499,14 +463,16 @@ int GetLineWidth(string_view text, GameFontTables size, int spacing, int *charac
if (next == U'\n')
break;
uint8_t frame = next & 0xFF;
const uint32_t unicodeRow = GetUnicodeRow(next);
if (unicodeRow != currentUnicodeRow || kerning == nullptr) {
kerning = LoadFontKerning(size, unicodeRow);
currentUnicodeRow = unicodeRow;
if (!currentFont.load(size, text_color::ColorDialogWhite, next)) {
next = U'?';
if (!currentFont.load(size, text_color::ColorDialogWhite, next)) {
app_fatal("Missing fonts");
}
}
lineWidth += (*kerning)[frame] + spacing;
codepoints++;
const uint8_t frame = next & 0xFF;
lineWidth += (*currentFont.sprite)[frame].width() + spacing;
++codepoints;
}
if (charactersInLine != nullptr)
*charactersInLine = codepoints;
@ -517,10 +483,9 @@ int GetLineWidth(string_view text, GameFontTables size, int spacing, int *charac
int GetLineWidth(string_view fmt, DrawStringFormatArg *args, std::size_t argsLen, size_t argsOffset, GameFontTables size, int spacing, int *charactersInLine)
{
int lineWidth = 0;
CurrentFont currentFont;
uint32_t codepoints = 0;
uint32_t currentUnicodeRow = 0;
std::array<uint8_t, 256> *kerning = nullptr;
char32_t prev = U'\0';
char32_t next;
@ -550,13 +515,15 @@ int GetLineWidth(string_view fmt, DrawStringFormatArg *args, std::size_t argsLen
if (next == U'\n')
break;
uint8_t frame = next & 0xFF;
const uint32_t unicodeRow = GetUnicodeRow(next);
if (unicodeRow != currentUnicodeRow || kerning == nullptr) {
kerning = LoadFontKerning(size, unicodeRow);
currentUnicodeRow = unicodeRow;
if (!currentFont.load(size, text_color::ColorDialogWhite, next)) {
next = U'?';
if (!currentFont.load(size, text_color::ColorDialogWhite, next)) {
app_fatal("Missing fonts");
}
}
lineWidth += (*kerning)[frame] + spacing;
const uint8_t frame = next & 0xFF;
lineWidth += (*currentFont.sprite)[frame].width() + spacing;
codepoints++;
prev = next;
}
@ -597,9 +564,8 @@ std::string WordWrapString(string_view text, unsigned width, GameFontTables size
string_view::size_type lastBreakablePos = string_view::npos;
std::size_t lastBreakableLen;
bool lastBreakableKeep = false;
uint32_t currentUnicodeRow = 0;
unsigned lineWidth = 0;
std::array<uint8_t, 256> *kerning = nullptr;
CurrentFont currentFont;
char32_t codepoint = U'\0'; // the current codepoint
char32_t nextCodepoint; // the next codepoint
@ -623,13 +589,15 @@ std::string WordWrapString(string_view text, unsigned width, GameFontTables size
}
if (codepoint != ZWSP) {
uint8_t frame = codepoint & 0xFF;
const uint32_t unicodeRow = GetUnicodeRow(codepoint);
if (unicodeRow != currentUnicodeRow || kerning == nullptr) {
kerning = LoadFontKerning(size, unicodeRow);
currentUnicodeRow = unicodeRow;
const uint8_t frame = codepoint & 0xFF;
if (!currentFont.load(size, text_color::ColorDialogWhite, codepoint)) {
codepoint = U'?';
if (!currentFont.load(size, text_color::ColorDialogWhite, codepoint)) {
app_fatal("Missing fonts");
}
}
lineWidth += (*kerning)[frame] + spacing;
lineWidth += (*currentFont.sprite)[frame].width() + spacing;
}
const bool isWhitespace = IsWhitespace(codepoint);
@ -788,14 +756,15 @@ void DrawStringWithColors(const Surface &out, string_view fmt, DrawStringFormatA
}
const uint8_t frame = next & 0xFF;
if (next == U'\n' || characterPosition.x + (*currentFont.kerning)[frame] > rightMargin) {
const uint16_t width = (*currentFont.sprite)[frame].width();
if (next == U'\n' || characterPosition.x + width > rightMargin) {
const int nextLineY = characterPosition.y + lineHeight;
if (nextLineY >= bottomMargin)
break;
characterPosition.y = nextLineY;
if (HasAnyOf(flags, (UiFlags::AlignCenter | UiFlags::AlignRight))) {
lineWidth = (*currentFont.kerning)[frame];
lineWidth = width;
if (remaining.size() > cpLen)
lineWidth += spacing + GetLineWidth(remaining.substr(cpLen), args, argsLen, fmtArgParser.offset(), size, spacing);
}
@ -806,7 +775,7 @@ void DrawStringWithColors(const Surface &out, string_view fmt, DrawStringFormatA
}
DrawFont(clippedOut, characterPosition, *currentFont.sprite, color, frame, outlined);
characterPosition.x += (*currentFont.kerning)[frame] + spacing;
characterPosition.x += width + spacing;
}
if (HasAnyOf(flags, UiFlags::PentaCursor)) {

7
android-project/app/src/main/java/org/diasurgical/devilutionx/DataActivity.java

@ -103,12 +103,15 @@ public class DataActivity extends Activity {
File fonts_mpq = fileManager.getFile("/fonts.mpq");
if (lang.startsWith("ko") || lang.startsWith("zh") || lang.startsWith("ja") || fonts_mpq.exists()) {
if (!fonts_mpq.exists() || fonts_mpq.length() == 70471463 /* v1 */ || fonts_mpq.length() == 53991069 /* v2 */) {
if (!fonts_mpq.exists() ||
fonts_mpq.length() == 70471463 /* v1 */ ||
fonts_mpq.length() == 53991069 /* v2 */ ||
fonts_mpq.length() == 58488019 /* v3 */) {
if (!isDownloadingFonts) {
fonts_mpq.delete();
isDownloadingFonts = true;
sendDownloadRequest(
"https://github.com/diasurgical/devilutionx-assets/releases/download/v3/fonts.mpq",
"https://github.com/diasurgical/devilutionx-assets/releases/download/v4/fonts.mpq",
"fonts.mpq",
"Extra Game Fonts"
);

9
android-project/app/src/main/java/org/diasurgical/devilutionx/DevilutionXSDLActivity.java

@ -79,11 +79,12 @@ public class DevilutionXSDLActivity extends SDLActivity {
if (lang.startsWith("ru") && !fileManager.hasFile("ru.mpq"))
return true;
if (lang.startsWith("ko") || lang.startsWith("zh") || lang.startsWith("ja")) {
if (!fileManager.hasFile("fonts.mpq"))
if (!fileManager.hasFile("fonts.mpq") ||
fileManager.fileSize("fonts.mpq") == 70471463 /* v1 */ ||
fileManager.fileSize("fonts.mpq") == 53991069 /* v2 */ ||
fileManager.fileSize("fonts.mpq") == 58488019 /* v3 */) {
return true;
}
if (fileManager.fileSize("fonts.mpq") == 70471463 /* v1 */ || fileManager.fileSize("fonts.mpq") == 53991069 /* v2 */) {
return true;
}
}
return !fileManager.hasFile("diabdat.mpq") &&

16
tools/update_bundled_assets.sh

@ -2,7 +2,7 @@
set -euo pipefail
if [[ $# -eq 0 ]]; then
>&2 echo "Usage: tools/update_bundled_assets.sh [path-to-devilutionx-assets-repo-dir]"
>&2 echo "Usage: tools/update_bundled_assets.sh [path-to-devilutionx-assets-repo-dir]"
exit 64
fi
@ -11,10 +11,20 @@ OUTPUT_DIR="${PWD}/Packaging/resources/assets"
set -x
cd "${ASSETS_REPO_DIR}/bundled-assets"
pcx2clx --output-dir "${OUTPUT_DIR}/data" data/boxleftend.pcx data/boxmiddle.pcx data/talkbutton.pcx data/boxrightend.pcx data/charbg.pcx data/health.pcx
pcx2clx --output-dir "${OUTPUT_DIR}/data" data/boxleftend.pcx data/boxmiddle.pcx data/boxrightend.pcx data/charbg.pcx data/health.pcx
pcx2clx --output-dir "${OUTPUT_DIR}/data" --num-sprites 2 data/talkbutton.pcx
pcx2clx --output-dir "${OUTPUT_DIR}/gendata" gendata/*.pcx
pcx2clx --output-dir "${OUTPUT_DIR}/ui_art" ui_art/creditsw.pcx ui_art/dvl_lrpopup.pcx ui_art/hf_titlew.pcx ui_art/mainmenuw.pcx ui_art/supportw.pcx
pcx2clx --transparent-color 1 --num-sprites 256 --output-dir "${OUTPUT_DIR}/fonts" fonts/*.pcx
FONT_CONVERT_ARGS=(--transparent-color 1 --num-sprites 256 --output-dir "${OUTPUT_DIR}/fonts")
for path in fonts/*.pcx; do
if [[ -f "${path%.pcx}.txt" ]]; then
pcx2clx "${FONT_CONVERT_ARGS[@]}" --crop-widths "$(cat "${path%.pcx}.txt" | paste -sd , -)" "${path}"
else
pcx2clx "${FONT_CONVERT_ARGS[@]}" "${path}"
fi
done
pcx2clx --num-sprites 2 --output-dir "${OUTPUT_DIR}/ui_art" ui_art/dvl_but_sml.pcx
pcx2clx --transparent-color 1 --output-dir "${OUTPUT_DIR}/data" data/hintbox.pcx data/hintboxbackground.pcx
pcx2clx --transparent-color 1 --num-sprites 6 --output-dir "${OUTPUT_DIR}/data" data/hinticons.pcx

Loading…
Cancel
Save