From af05b331cb284916ad97f7165af1ba18cb6dad1c Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Wed, 22 Nov 2023 21:18:06 +0800 Subject: [PATCH] Fix Linux build --- src/libslic3r/SLAPrint.hpp | 1 + src/slic3r/CMakeLists.txt | 4 +- src/slic3r/GUI/Jobs/PrintJob.cpp | 1 + src/slic3r/GUI/Jobs/SendJob.cpp | 1 + src/slic3r/Utils/FontConfigHelp.cpp | 144 ++++++++++++++++++++++++++++ src/slic3r/Utils/FontConfigHelp.hpp | 29 ++++++ 6 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 src/slic3r/Utils/FontConfigHelp.cpp create mode 100644 src/slic3r/Utils/FontConfigHelp.hpp diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index 3fa6757d59e..887942c9cf1 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -6,6 +6,7 @@ #include "PrintBase.hpp" #include "SLA/RasterBase.hpp" #include "SLA/SupportTree.hpp" +#include "Execution/ExecutionTBB.hpp" #include "Point.hpp" #include "MTUtils.hpp" #include "Zipper.hpp" diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index c365fdf62f8..bf9346685e4 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -465,6 +465,8 @@ set(SLIC3R_GUI_SOURCES Utils/FixModelByWin10.hpp Utils/EmbossStyleManager.cpp Utils/EmbossStyleManager.hpp + Utils/FontConfigHelp.cpp + Utils/FontConfigHelp.hpp Utils/Bonjour.cpp Utils/Bonjour.hpp Utils/PresetUpdater.cpp @@ -607,7 +609,7 @@ endif () if (UNIX AND NOT APPLE) find_package(GTK${SLIC3R_GTK} REQUIRED) target_include_directories(libslic3r_gui PRIVATE ${GTK${SLIC3R_GTK}_INCLUDE_DIRS}) - target_link_libraries(libslic3r_gui ${GTK${SLIC3R_GTK}_LIBRARIES}) + target_link_libraries(libslic3r_gui ${GTK${SLIC3R_GTK}_LIBRARIES} fontconfig) # We add GStreamer for bambu:/// support. pkg_check_modules(GSTREAMER REQUIRED gstreamer-1.0) diff --git a/src/slic3r/GUI/Jobs/PrintJob.cpp b/src/slic3r/GUI/Jobs/PrintJob.cpp index 5a3f259d2cb..eaa77383264 100644 --- a/src/slic3r/GUI/Jobs/PrintJob.cpp +++ b/src/slic3r/GUI/Jobs/PrintJob.cpp @@ -6,6 +6,7 @@ #include "slic3r/GUI/GUI.hpp" #include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/MainFrame.hpp" +#include "slic3r/GUI/format.hpp" #include "bambu_networking.hpp" namespace Slic3r { diff --git a/src/slic3r/GUI/Jobs/SendJob.cpp b/src/slic3r/GUI/Jobs/SendJob.cpp index a637539349b..960a083900f 100644 --- a/src/slic3r/GUI/Jobs/SendJob.cpp +++ b/src/slic3r/GUI/Jobs/SendJob.cpp @@ -5,6 +5,7 @@ #include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/GUI.hpp" #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/format.hpp" namespace Slic3r { namespace GUI { diff --git a/src/slic3r/Utils/FontConfigHelp.cpp b/src/slic3r/Utils/FontConfigHelp.cpp new file mode 100644 index 00000000000..2746b0c0008 --- /dev/null +++ b/src/slic3r/Utils/FontConfigHelp.cpp @@ -0,0 +1,144 @@ +///|/ Copyright (c) Prusa Research 2021 - 2022 Filip Sykala @Jony01 +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#include "FontConfigHelp.hpp" + +#ifdef EXIST_FONT_CONFIG_INCLUDE + +#include +#include +#include "libslic3r/Utils.hpp" + +using namespace Slic3r::GUI; + + +// @Vojta suggest to make static variable global +// Guard for finalize Font Config +// Will be finalized on application exit +// It seams that it NOT work +static std::optional finalize_guard; +// cache for Loading of the default configuration file and building information about the available fonts. +static FcConfig *fc = nullptr; + +std::string Slic3r::GUI::get_font_path(const wxFont &font, bool reload_fonts) +{ + if (!finalize_guard.has_value()) { + FcInit(); + fc = FcInitLoadConfigAndFonts(); + finalize_guard.emplace([]() { + // Some internal problem of Font config or other library use FC too(like wxWidget) + // fccache.c:795: FcCacheFini: Assertion `fcCacheChains[i] == NULL' failed. + //FcFini(); + FcConfigDestroy(fc); + }); + } else if (reload_fonts) { + FcConfigDestroy(fc); + fc = FcInitLoadConfigAndFonts(); + } + + if (fc == nullptr) return ""; + + wxString fontDesc = font.GetNativeFontInfoUserDesc(); + wxString faceName = font.GetFaceName(); + const wxScopedCharBuffer faceNameBuffer = faceName.ToUTF8(); + const char * fontFamily = faceNameBuffer; + + // Check font slant + int slant = FC_SLANT_ROMAN; + if (fontDesc.Find(wxS("Oblique")) != wxNOT_FOUND) + slant = FC_SLANT_OBLIQUE; + else if (fontDesc.Find(wxS("Italic")) != wxNOT_FOUND) + slant = FC_SLANT_ITALIC; + + // Check font weight + int weight = FC_WEIGHT_NORMAL; + if (fontDesc.Find(wxS("Book")) != wxNOT_FOUND) + weight = FC_WEIGHT_BOOK; + else if (fontDesc.Find(wxS("Medium")) != wxNOT_FOUND) + weight = FC_WEIGHT_MEDIUM; +#ifdef FC_WEIGHT_ULTRALIGHT + else if (fontDesc.Find(wxS("Ultra-Light")) != wxNOT_FOUND) + weight = FC_WEIGHT_ULTRALIGHT; +#endif + else if (fontDesc.Find(wxS("Light")) != wxNOT_FOUND) + weight = FC_WEIGHT_LIGHT; + else if (fontDesc.Find(wxS("Semi-Bold")) != wxNOT_FOUND) + weight = FC_WEIGHT_DEMIBOLD; +#ifdef FC_WEIGHT_ULTRABOLD + else if (fontDesc.Find(wxS("Ultra-Bold")) != wxNOT_FOUND) + weight = FC_WEIGHT_ULTRABOLD; +#endif + else if (fontDesc.Find(wxS("Bold")) != wxNOT_FOUND) + weight = FC_WEIGHT_BOLD; + else if (fontDesc.Find(wxS("Heavy")) != wxNOT_FOUND) + weight = FC_WEIGHT_BLACK; + + // Check font width + int width = FC_WIDTH_NORMAL; + if (fontDesc.Find(wxS("Ultra-Condensed")) != wxNOT_FOUND) + width = FC_WIDTH_ULTRACONDENSED; + else if (fontDesc.Find(wxS("Extra-Condensed")) != wxNOT_FOUND) + width = FC_WIDTH_EXTRACONDENSED; + else if (fontDesc.Find(wxS("Semi-Condensed")) != wxNOT_FOUND) + width = FC_WIDTH_SEMICONDENSED; + else if (fontDesc.Find(wxS("Condensed")) != wxNOT_FOUND) + width = FC_WIDTH_CONDENSED; + else if (fontDesc.Find(wxS("Ultra-Expanded")) != wxNOT_FOUND) + width = FC_WIDTH_ULTRAEXPANDED; + else if (fontDesc.Find(wxS("Extra-Expanded")) != wxNOT_FOUND) + width = FC_WIDTH_EXTRAEXPANDED; + else if (fontDesc.Find(wxS("Semi-Expanded")) != wxNOT_FOUND) + width = FC_WIDTH_SEMIEXPANDED; + else if (fontDesc.Find(wxS("Expanded")) != wxNOT_FOUND) + width = FC_WIDTH_EXPANDED; + + FcResult res; + FcPattern *matchPattern = FcPatternBuild(NULL, FC_FAMILY, FcTypeString, + (FcChar8 *) fontFamily, NULL); + ScopeGuard sg_mp([matchPattern]() { FcPatternDestroy(matchPattern); }); + + FcPatternAddInteger(matchPattern, FC_SLANT, slant); + FcPatternAddInteger(matchPattern, FC_WEIGHT, weight); + FcPatternAddInteger(matchPattern, FC_WIDTH, width); + + FcConfigSubstitute(NULL, matchPattern, FcMatchPattern); + FcDefaultSubstitute(matchPattern); + + FcPattern *resultPattern = FcFontMatch(NULL, matchPattern, &res); + if (resultPattern == nullptr) return ""; + ScopeGuard sg_rp([resultPattern]() { FcPatternDestroy(resultPattern); }); + + FcChar8 *fileName; + if (FcPatternGetString(resultPattern, FC_FILE, 0, &fileName) != + FcResultMatch) + return ""; + wxString fontFileName = wxString::FromUTF8((char *) fileName); + + if (fontFileName.IsEmpty()) return ""; + + // find full file path + wxFileName myFileName(fontFileName); + if (!myFileName.IsOk()) return ""; + + if (myFileName.IsRelative()) { + // Check whether the file is relative to the current working directory + if (!(myFileName.MakeAbsolute() && myFileName.FileExists())) { + return ""; + // File not found, search in given search paths + // wxString foundFileName = + // m_searchPaths.FindAbsoluteValidPath(fileName); if + // (!foundFileName.IsEmpty()) { + // myFileName.Assign(foundFileName); + //} + } + } + + if (!myFileName.FileExists() || !myFileName.IsFileReadable()) return ""; + + // File exists and is accessible + wxString fullFileName = myFileName.GetFullPath(); + return std::string(fullFileName.c_str()); +} + +#endif // EXIST_FONT_CONFIG_INCLUDE \ No newline at end of file diff --git a/src/slic3r/Utils/FontConfigHelp.hpp b/src/slic3r/Utils/FontConfigHelp.hpp new file mode 100644 index 00000000000..d60c7e7f072 --- /dev/null +++ b/src/slic3r/Utils/FontConfigHelp.hpp @@ -0,0 +1,29 @@ +///|/ Copyright (c) Prusa Research 2021 - 2022 Filip Sykala @Jony01 +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#ifndef slic3r_FontConfigHelp_hpp_ +#define slic3r_FontConfigHelp_hpp_ + +#ifdef __linux__ +#define EXIST_FONT_CONFIG_INCLUDE +#endif + +#ifdef EXIST_FONT_CONFIG_INCLUDE +#include +namespace Slic3r::GUI { + +/// +/// initialize font config +/// Convert wx widget font to file path +/// inspired by wxpdfdoc - +/// https://github.com/utelle/wxpdfdoc/blob/5bdcdb9953327d06dc50ec312685ccd9bc8400e0/src/pdffontmanager.cpp +/// +/// Wx descriptor of font +/// flag to reinitialize font list +/// Font FilePath by FontConfig +std::string get_font_path(const wxFont &font, bool reload_fonts = false); + +} // namespace Slic3r +#endif // EXIST_FONT_CONFIG_INCLUDE +#endif // slic3r_FontConfigHelp_hpp_