1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Fully remove bitmap font support (#11863)

Freetype is now a build requirement.
This commit is contained in:
sfan5 2022-01-08 14:53:25 +01:00 committed by GitHub
parent bf22569019
commit 76dbd0d2d0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
50 changed files with 71 additions and 319 deletions

View file

@ -122,16 +122,8 @@ if(BUILD_CLIENT)
endif()
endif()
option(ENABLE_FREETYPE "Enable FreeType2 (TrueType fonts and basic unicode support)" TRUE)
set(USE_FREETYPE FALSE)
if(BUILD_CLIENT AND ENABLE_FREETYPE)
find_package(Freetype)
if(FREETYPE_FOUND)
message(STATUS "Freetype enabled.")
set(USE_FREETYPE TRUE)
endif()
if(BUILD_CLIENT)
find_package(Freetype REQUIRED)
endif()
option(ENABLE_CURSES "Enable ncurses console" TRUE)
@ -495,13 +487,11 @@ include_directories(
${PROJECT_SOURCE_DIR}
${ZLIB_INCLUDE_DIR}
${ZSTD_INCLUDE_DIR}
${SOUND_INCLUDE_DIRS}
${SQLITE3_INCLUDE_DIR}
${LUA_INCLUDE_DIR}
${GMP_INCLUDE_DIR}
${JSON_INCLUDE_DIR}
${LUA_BIT_INCLUDE_DIR}
${X11_INCLUDE_DIR}
${PROJECT_SOURCE_DIR}/script
)
@ -509,8 +499,12 @@ if(USE_GETTEXT)
include_directories(${GETTEXT_INCLUDE_DIR})
endif()
if(USE_FREETYPE)
include_directories(${FREETYPE_INCLUDE_DIRS})
if(BUILD_CLIENT)
include_directories(
${FREETYPE_INCLUDE_DIRS}
${SOUND_INCLUDE_DIRS}
${X11_INCLUDE_DIR}
)
endif()
if(USE_CURL)
@ -539,6 +533,7 @@ if(BUILD_CLIENT)
${GMP_LIBRARY}
${JSON_LIBRARY}
${LUA_BIT_LIBRARY}
${FREETYPE_LIBRARY}
${PLATFORM_LIBS}
)
if(NOT USE_LUAJIT)
@ -573,17 +568,11 @@ if(BUILD_CLIENT)
${CURL_LIBRARY}
)
endif()
if(USE_FREETYPE)
if(FREETYPE_PKGCONFIG_FOUND)
set_target_properties(${PROJECT_NAME}
PROPERTIES
COMPILE_FLAGS "${FREETYPE_CFLAGS_STR}"
)
endif()
target_link_libraries(
${PROJECT_NAME}
${FREETYPE_LIBRARY}
)
if(FREETYPE_PKGCONFIG_FOUND)
set_target_properties(${PROJECT_NAME}
PROPERTIES
COMPILE_FLAGS "${FREETYPE_CFLAGS_STR}"
)
endif()
if (USE_CURSES)
target_link_libraries(${PROJECT_NAME} ${CURSES_LIBRARIES})
@ -896,14 +885,8 @@ if(BUILD_CLIENT)
endforeach()
endif()
# Install necessary fonts depending on configuration
if(USE_FREETYPE)
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../fonts" DESTINATION "${SHAREDIR}"
FILES_MATCHING PATTERN "*.ttf" PATTERN "*.txt")
else()
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../fonts" DESTINATION "${SHAREDIR}"
FILES_MATCHING PATTERN "*.png" PATTERN "*.xml")
endif()
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../fonts" DESTINATION "${SHAREDIR}"
FILES_MATCHING PATTERN "*.ttf" PATTERN "*.txt")
endif(BUILD_CLIENT)
if(BUILD_SERVER)

View file

@ -24,10 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "porting.h"
#include "filesys.h"
#include "gettext.h"
#if USE_FREETYPE
#include "irrlicht_changes/CGUITTFont.h"
#endif
/** maximum size distance for getting a "similar" font size */
#define MAX_FONT_SIZE_OFFSET 10
@ -45,9 +42,8 @@ static void font_setting_changed(const std::string &name, void *userdata)
FontEngine::FontEngine(gui::IGUIEnvironment* env) :
m_env(env)
{
for (u32 &i : m_default_size) {
i = (FontMode) FONT_SIZE_UNSPECIFIED;
i = FONT_SIZE_UNSPECIFIED;
}
assert(g_settings != NULL); // pre-condition
@ -56,25 +52,19 @@ FontEngine::FontEngine(gui::IGUIEnvironment* env) :
readSettings();
if (m_currentMode != FM_Simple) {
g_settings->registerChangedCallback("font_size", font_setting_changed, NULL);
g_settings->registerChangedCallback("font_bold", font_setting_changed, NULL);
g_settings->registerChangedCallback("font_italic", font_setting_changed, NULL);
g_settings->registerChangedCallback("font_path", font_setting_changed, NULL);
g_settings->registerChangedCallback("font_path_bold", font_setting_changed, NULL);
g_settings->registerChangedCallback("font_path_italic", font_setting_changed, NULL);
g_settings->registerChangedCallback("font_path_bolditalic", font_setting_changed, NULL);
g_settings->registerChangedCallback("font_shadow", font_setting_changed, NULL);
g_settings->registerChangedCallback("font_shadow_alpha", font_setting_changed, NULL);
g_settings->registerChangedCallback("font_size_divisible_by", font_setting_changed, NULL);
g_settings->registerChangedCallback("fallback_font_path", font_setting_changed, NULL);
}
const char *settings[] = {
"font_size", "font_bold", "font_italic", "font_size_divisible_by",
"mono_font_size", "mono_font_size_divisible_by",
"font_shadow", "font_shadow_alpha",
"font_path", "font_path_bold", "font_path_italic", "font_path_bold_italic",
"mono_font_path", "mono_font_path_bold", "mono_font_path_italic",
"mono_font_path_bold_italic",
"fallback_font_path",
"screen_dpi", "gui_scaling",
};
g_settings->registerChangedCallback("mono_font_path", font_setting_changed, NULL);
g_settings->registerChangedCallback("mono_font_size", font_setting_changed, NULL);
g_settings->registerChangedCallback("mono_font_size_divisible_by", font_setting_changed, NULL);
g_settings->registerChangedCallback("screen_dpi", font_setting_changed, NULL);
g_settings->registerChangedCallback("gui_scaling", font_setting_changed, NULL);
for (auto name : settings)
g_settings->registerChangedCallback(name, font_setting_changed, NULL);
}
/******************************************************************************/
@ -108,16 +98,8 @@ irr::gui::IGUIFont *FontEngine::getFont(FontSpec spec, bool may_fail)
{
if (spec.mode == FM_Unspecified) {
spec.mode = m_currentMode;
} else if (m_currentMode == FM_Simple) {
// Freetype disabled -> Force simple mode
spec.mode = (spec.mode == FM_Mono ||
spec.mode == FM_SimpleMono) ?
FM_SimpleMono : FM_Simple;
// Support for those could be added, but who cares?
spec.bold = false;
spec.italic = false;
} else if (spec.mode == _FM_Fallback) {
// Fallback font doesn't support these either
// Fallback font doesn't support these
spec.bold = false;
spec.italic = false;
}
@ -134,11 +116,7 @@ irr::gui::IGUIFont *FontEngine::getFont(FontSpec spec, bool may_fail)
return it->second;
// Font does not yet exist
gui::IGUIFont *font = nullptr;
if (spec.mode == FM_Simple || spec.mode == FM_SimpleMono)
font = initSimpleFont(spec);
else
font = initFont(spec);
gui::IGUIFont *font = initFont(spec);
if (!font && !may_fail) {
errorstream << "Minetest cannot continue without a valid font. "
@ -185,13 +163,6 @@ unsigned int FontEngine::getDefaultFontSize()
unsigned int FontEngine::getFontSize(FontMode mode)
{
if (m_currentMode == FM_Simple) {
if (mode == FM_Mono || mode == FM_SimpleMono)
return m_default_size[FM_SimpleMono];
else
return m_default_size[FM_Simple];
}
if (mode == FM_Unspecified)
return m_default_size[FM_Standard];
@ -201,20 +172,12 @@ unsigned int FontEngine::getFontSize(FontMode mode)
/******************************************************************************/
void FontEngine::readSettings()
{
if (USE_FREETYPE && g_settings->getBool("freetype")) {
m_default_size[FM_Standard] = g_settings->getU16("font_size");
m_default_size[_FM_Fallback] = g_settings->getU16("font_size");
m_default_size[FM_Mono] = g_settings->getU16("mono_font_size");
m_default_size[FM_Standard] = g_settings->getU16("font_size");
m_default_size[_FM_Fallback] = g_settings->getU16("font_size");
m_default_size[FM_Mono] = g_settings->getU16("mono_font_size");
m_default_bold = g_settings->getBool("font_bold");
m_default_italic = g_settings->getBool("font_italic");
} else {
m_currentMode = FM_Simple;
}
m_default_size[FM_Simple] = g_settings->getU16("font_size");
m_default_size[FM_SimpleMono] = g_settings->getU16("mono_font_size");
m_default_bold = g_settings->getBool("font_bold");
m_default_italic = g_settings->getBool("font_italic");
cleanCache();
updateFontCache();
@ -283,7 +246,6 @@ gui::IGUIFont *FontEngine::initFont(const FontSpec &spec)
Settings::getLayer(SL_DEFAULTS)->get(path_setting)
};
#if USE_FREETYPE
for (const std::string &font_path : fallback_settings) {
gui::CGUITTFont *font = gui::CGUITTFont::createTTFont(m_env,
font_path.c_str(), size, true, true, font_shadow,
@ -302,80 +264,5 @@ gui::IGUIFont *FontEngine::initFont(const FontSpec &spec)
}
return font;
}
#else
errorstream << "FontEngine: Tried to load TTF font but Minetest was"
" compiled without Freetype." << std::endl;
#endif
return nullptr;
}
/** initialize a font without freetype */
gui::IGUIFont *FontEngine::initSimpleFont(const FontSpec &spec)
{
assert(spec.mode == FM_Simple || spec.mode == FM_SimpleMono);
assert(spec.size != FONT_SIZE_UNSPECIFIED);
const std::string &font_path = g_settings->get(
(spec.mode == FM_SimpleMono) ? "mono_font_path" : "font_path");
size_t pos_dot = font_path.find_last_of('.');
std::string basename = font_path, ending;
if (pos_dot != std::string::npos)
ending = lowercase(font_path.substr(pos_dot));
if (ending == ".ttf") {
errorstream << "FontEngine: Found font \"" << font_path
<< "\" but freetype is not available." << std::endl;
return nullptr;
}
if (ending == ".xml" || ending == ".png")
basename = font_path.substr(0, pos_dot);
u32 size = std::floor(
RenderingEngine::getDisplayDensity() *
g_settings->getFloat("gui_scaling") *
spec.size);
irr::gui::IGUIFont *font = nullptr;
std::string font_extensions[] = { ".png", ".xml" };
// Find nearest matching font scale
// Does a "zig-zag motion" (positibe/negative), from 0 to MAX_FONT_SIZE_OFFSET
for (s32 zoffset = 0; zoffset < MAX_FONT_SIZE_OFFSET * 2; zoffset++) {
std::stringstream path;
// LSB to sign
s32 sign = (zoffset & 1) ? -1 : 1;
s32 offset = zoffset >> 1;
for (const std::string &ext : font_extensions) {
path.str(""); // Clear
path << basename << "_" << (size + offset * sign) << ext;
if (!fs::PathExists(path.str()))
continue;
font = m_env->getFont(path.str().c_str());
if (font) {
verbosestream << "FontEngine: found font: " << path.str() << std::endl;
break;
}
}
if (font)
break;
}
// try name direct
if (font == NULL) {
if (fs::PathExists(font_path)) {
font = m_env->getFont(font_path.c_str());
if (font)
verbosestream << "FontEngine: found font: " << font_path << std::endl;
}
}
return font;
}

View file

@ -34,8 +34,6 @@ enum FontMode : u8 {
FM_Standard = 0,
FM_Mono,
_FM_Fallback, // do not use directly
FM_Simple,
FM_SimpleMono,
FM_MaxMode,
FM_Unspecified
};
@ -140,9 +138,6 @@ private:
/** initialize a new TTF font */
gui::IGUIFont *initFont(const FontSpec &spec);
/** initialize a font without freetype */
gui::IGUIFont *initSimpleFont(const FontSpec &spec);
/** update current minetest skin with font changes */
void updateSkin();
@ -165,8 +160,8 @@ private:
bool m_default_bold = false;
bool m_default_italic = false;
/** current font engine mode */
FontMode m_currentMode = FM_Standard;
/** default font engine mode (fixed) */
static const FontMode m_currentMode = FM_Standard;
DISABLE_CLASS_COPY(FontEngine);
};

View file

@ -18,7 +18,6 @@
#cmakedefine01 USE_GETTEXT
#cmakedefine01 USE_CURL
#cmakedefine01 USE_SOUND
#cmakedefine01 USE_FREETYPE
#cmakedefine01 USE_CURSES
#cmakedefine01 USE_LEVELDB
#cmakedefine01 USE_LUAJIT

View file

@ -111,4 +111,3 @@ with this program; if not, write to the Free Software Foundation, Inc.,
*/
#define TTF_DEFAULT_FONT_SIZE (16)
#define DEFAULT_FONT_SIZE (10)

View file

@ -303,8 +303,7 @@ void set_default_settings()
settings->setDefault("main_menu_path", "");
settings->setDefault("serverlist_file", "favoriteservers.json");
#if USE_FREETYPE
settings->setDefault("freetype", "true");
// General font settings
settings->setDefault("font_path", porting::getDataPath("fonts" DIR_DELIM "Arimo-Regular.ttf"));
settings->setDefault("font_path_italic", porting::getDataPath("fonts" DIR_DELIM "Arimo-Italic.ttf"));
settings->setDefault("font_path_bold", porting::getDataPath("fonts" DIR_DELIM "Arimo-Bold.ttf"));
@ -322,14 +321,6 @@ void set_default_settings()
settings->setDefault("fallback_font_path", porting::getDataPath("fonts" DIR_DELIM "DroidSansFallbackFull.ttf"));
std::string font_size_str = std::to_string(TTF_DEFAULT_FONT_SIZE);
#else
settings->setDefault("freetype", "false");
settings->setDefault("font_path", porting::getDataPath("fonts" DIR_DELIM "mono_dejavu_sans"));
settings->setDefault("mono_font_path", porting::getDataPath("fonts" DIR_DELIM "mono_dejavu_sans"));
std::string font_size_str = std::to_string(DEFAULT_FONT_SIZE);
#endif
// General font settings
settings->setDefault("font_size", font_size_str);
settings->setDefault("mono_font_size", font_size_str);
settings->setDefault("chat_font_size", "0"); // Default "font_size"

View file

@ -30,12 +30,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "client/fontengine.h"
#include "log.h"
#include "gettext.h"
#include "irrlicht_changes/CGUITTFont.h"
#include <string>
#if USE_FREETYPE
#include "irrlicht_changes/CGUITTFont.h"
#endif
inline u32 clamp_u8(s32 value)
{
return (u32) MYMIN(MYMAX(value, 0), 255);
@ -328,19 +325,16 @@ void GUIChatConsole::drawText()
core::rect<s32> destrect(
x, y, x + m_fontsize.X * fragment.text.size(), y + m_fontsize.Y);
#if USE_FREETYPE
if (m_font->getType() == irr::gui::EGFT_CUSTOM) {
// Draw colored text if FreeType is enabled
irr::gui::CGUITTFont *tmp = dynamic_cast<irr::gui::CGUITTFont *>(m_font);
// Draw colored text if possible
gui::CGUITTFont *tmp = static_cast<gui::CGUITTFont*>(m_font);
tmp->draw(
fragment.text,
destrect,
false,
false,
&AbsoluteClippingRect);
} else
#endif
{
} else {
// Otherwise use standard text
m_font->draw(
fragment.text.c_str(),

View file

@ -17,31 +17,26 @@ with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "IGUIEnvironment.h"
#include "IGUIElement.h"
#include "guiHyperText.h"
#include "guiScrollBar.h"
#include "IGUIFont.h"
#include <vector>
#include <list>
#include <unordered_map>
using namespace irr::gui;
#include "client/fontengine.h"
#include <SColor.h>
#include "client/tile.h"
#include "IVideoDriver.h"
#include "client/client.h"
#include "client/renderingengine.h"
#include "hud.h"
#include "guiHyperText.h"
#include "util/string.h"
#include "irrlicht_changes/CGUITTFont.h"
bool check_color(const std::string &str)
using namespace irr::gui;
static bool check_color(const std::string &str)
{
irr::video::SColor color;
return parseColorString(str, color, false);
}
bool check_integer(const std::string &str)
static bool check_integer(const std::string &str)
{
if (str.empty())
return false;
@ -616,12 +611,10 @@ TextDrawer::TextDrawer(const wchar_t *text, Client *client,
if (e.font) {
e.dim.Width = e.font->getDimension(e.text.c_str()).Width;
e.dim.Height = e.font->getDimension(L"Yy").Height;
#if USE_FREETYPE
if (e.font->getType() == irr::gui::EGFT_CUSTOM) {
e.baseline = e.dim.Height - 1 -
((irr::gui::CGUITTFont *)e.font)->getAscender() / 64;
CGUITTFont *tmp = static_cast<CGUITTFont*>(e.font);
e.baseline = e.dim.Height - 1 - tmp->getAscender() / 64;
}
#endif
} else {
e.dim = {0, 0};
}

View file

@ -19,16 +19,17 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#pragma once
#include "config.h" // for USE_FREETYPE
#include <vector>
#include <list>
#include <unordered_map>
#include <string>
#include "irrlichttypes_extrabloated.h"
using namespace irr;
class ISimpleTextureSource;
class Client;
#if USE_FREETYPE
#include "irrlicht_changes/CGUITTFont.h"
#endif
class GUIScrollBar;
class ParsedText
{

View file

@ -1,14 +1,9 @@
if (BUILD_CLIENT)
set(client_irrlicht_changes_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/static_text.cpp
${CMAKE_CURRENT_SOURCE_DIR}/CGUITTFont.cpp
)
if (USE_FREETYPE)
set(client_irrlicht_changes_SRCS ${client_irrlicht_changes_SRCS}
${CMAKE_CURRENT_SOURCE_DIR}/CGUITTFont.cpp
)
endif()
# CMake require us to set a local scope and then parent scope
# Else the last set win in parent scope
set(client_irrlicht_changes_SRCS ${client_irrlicht_changes_SRCS} PARENT_SCOPE)

View file

@ -12,17 +12,12 @@
#include <rect.h>
#include <SColor.h>
#if USE_FREETYPE
#include "CGUITTFont.h"
#endif
#include "CGUITTFont.h"
#include "util/string.h"
namespace irr
{
#if USE_FREETYPE
namespace gui
{
//! constructor
@ -108,14 +103,12 @@ void StaticText::draw()
font->getDimension(str.c_str()).Width;
}
#if USE_FREETYPE
if (font->getType() == irr::gui::EGFT_CUSTOM) {
irr::gui::CGUITTFont *tmp = static_cast<irr::gui::CGUITTFont*>(font);
CGUITTFont *tmp = static_cast<CGUITTFont*>(font);
tmp->draw(str,
r, HAlign == EGUIA_CENTER, VAlign == EGUIA_CENTER,
(RestrainTextInside ? &AbsoluteClippingRect : NULL));
} else
#endif
{
// Draw non-colored text
font->draw(str.c_str(),
@ -590,8 +583,6 @@ s32 StaticText::getTextWidth() const
} // end namespace gui
#endif // USE_FREETYPE
} // end namespace irr

View file

@ -20,7 +20,6 @@
#include "config.h"
#include <IGUIEnvironment.h>
#if USE_FREETYPE
namespace irr
{
@ -230,41 +229,6 @@ inline void setStaticText(irr::gui::IGUIStaticText *static_text, const EnrichedS
}
}
#else // USE_FREETYPE
namespace irr
{
namespace gui
{
class StaticText
{
public:
static irr::gui::IGUIStaticText *add(
irr::gui::IGUIEnvironment *guienv,
const EnrichedString &text,
const core::rect< s32 > &rectangle,
bool border = false,
bool wordWrap = true,
irr::gui::IGUIElement *parent = NULL,
s32 id = -1,
bool fillBackground = false)
{
return guienv->addStaticText(text.c_str(), rectangle, border, wordWrap, parent, id, fillBackground);
}
};
} // end namespace gui
} // end namespace irr
inline void setStaticText(irr::gui::IGUIStaticText *static_text, const EnrichedString &text)
{
static_text->setText(text.c_str());
}
#endif
inline void setStaticText(irr::gui::IGUIStaticText *static_text, const wchar_t *text)
{
setStaticText(static_text, EnrichedString(text, static_text->getOverrideColor()));

View file

@ -37,7 +37,6 @@ const char *g_build_info =
#ifndef SERVER
"USE_GETTEXT=" STR(USE_GETTEXT) "\n"
"USE_SOUND=" STR(USE_SOUND) "\n"
"USE_FREETYPE=" STR(USE_FREETYPE) "\n"
#endif
"STATIC_SHAREDIR=" STR(STATIC_SHAREDIR)
#if USE_GETTEXT && defined(STATIC_LOCALEDIR)