mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-14 02:55:55 +08:00
separate wxFontUtils
This commit is contained in:
parent
20645264f8
commit
1301234d33
@ -412,25 +412,6 @@ std::optional<Emboss::Font> Emboss::load_font(std::vector<unsigned char> data)
|
|||||||
// load information about line gap
|
// load information about line gap
|
||||||
stbtt_GetFontVMetrics(info, &res.ascent, &res.descent, &res.linegap);
|
stbtt_GetFontVMetrics(info, &res.ascent, &res.descent, &res.linegap);
|
||||||
|
|
||||||
// TrueType Reference Manual - The 'name' table https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6name.html
|
|
||||||
// OpenType™ Specification - The Naming Table http://www.microsoft.com/typography/otspec/name.htm
|
|
||||||
int length = 0;
|
|
||||||
//PLATFORM_ID_UNICODE PLATFORM_ID_MAC PLATFORM_ID_ISO PLATFORM_ID_MICROSOFT
|
|
||||||
int platformId = STBTT_PLATFORM_ID_MICROSOFT;
|
|
||||||
// UNICODE_EID_UNICODE_1_0 UNICODE_EID_UNICODE_1_1 UNICODE_EID_ISO_10646 UNICODE_EID_UNICODE_2_0_BMP
|
|
||||||
// UNICODE_EID_UNICODE_2_0_FULL MS_EID_SYMBOL MS_EID_UNICODE_BMP MS_EID_SHIFTJIS MS_EID_UNICODE_FULL
|
|
||||||
// MAC_EID_ROMAN MAC_EID_JAPANESE MAC_EID_CHINESE_TRAD MAC_EID_KOREAN MAC_EID_ARABIC MAC_EID_HEBREW MAC_EID_GREEK
|
|
||||||
// MAC_EID_RUSSIAN
|
|
||||||
int encodingID = STBTT_MS_EID_SYMBOL;
|
|
||||||
// MS_LANG_ENGLISH MS_LANG_CHINESE MS_LANG_DUTCH MS_LANG_FRENCH MS_LANG_GERMAN MS_LANG_HEBREW MS_LANG_ITALIAN
|
|
||||||
// MS_LANG_JAPANESE MS_LANG_KOREAN MS_LANG_RUSSIAN MS_LANG_SPANISH MS_LANG_SWEDISH MAC_LANG_ENGLISH
|
|
||||||
// MAC_LANG_ARABIC MAC_LANG_DUTCH MAC_LANG_FRENCH MAC_LANG_GERMAN MAC_LANG_HEBREW MAC_LANG_ITALIAN
|
|
||||||
// MAC_LANG_JAPANESE MAC_LANG_KOREAN MAC_LANG_RUSSIAN MAC_LANG_SPANISH MAC_LANG_SWEDISH
|
|
||||||
// MAC_LANG_CHINESE_SIMPLIFIED MAC_LANG_CHINESE_TRAD
|
|
||||||
int languageID = STBTT_MS_LANG_ENGLISH;
|
|
||||||
int nameID = 4; // human readable - http://www.microsoft.com/typography/otspec/name.htm
|
|
||||||
const char *name_char = stbtt_GetFontNameString(info, &length, platformId, encodingID, languageID, nameID);
|
|
||||||
res.name = std::string(name_char, length);
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,9 +92,7 @@ public:
|
|||||||
// vertical position is "scale*(ascent - descent + lineGap)"
|
// vertical position is "scale*(ascent - descent + lineGap)"
|
||||||
int ascent = 0, descent = 0, linegap = 0;
|
int ascent = 0, descent = 0, linegap = 0;
|
||||||
|
|
||||||
std::string name;
|
Emboss::Glyphs cache; // cache of glyphs
|
||||||
|
|
||||||
Emboss::Glyphs cache;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -11,6 +11,27 @@
|
|||||||
#include <wx/font.h>
|
#include <wx/font.h>
|
||||||
#include <wx/fontdlg.h>
|
#include <wx/fontdlg.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace Slic3r {
|
||||||
|
class WxFontUtils
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
WxFontUtils() = delete;
|
||||||
|
|
||||||
|
// os specific load of wxFont
|
||||||
|
static std::optional<Slic3r::Emboss::Font> load_font(const wxFont &font);
|
||||||
|
|
||||||
|
// load font used by Operating system as default GUI
|
||||||
|
static Slic3r::Emboss::FontItem get_os_font();
|
||||||
|
static std::string get_human_readable_name(const wxFont &font);
|
||||||
|
|
||||||
|
// serialize / deserialize font
|
||||||
|
static std::string store_wxFont(const wxFont &font);
|
||||||
|
static wxFont load_wxFont(const std::string &font_descriptor);
|
||||||
|
};
|
||||||
|
} // namespace Slic3r
|
||||||
|
|
||||||
|
using namespace Slic3r;
|
||||||
using namespace Slic3r::GUI;
|
using namespace Slic3r::GUI;
|
||||||
|
|
||||||
GLGizmoEmboss::GLGizmoEmboss(GLCanvas3D & parent,
|
GLGizmoEmboss::GLGizmoEmboss(GLCanvas3D & parent,
|
||||||
@ -31,7 +52,8 @@ GLGizmoEmboss::GLGizmoEmboss(GLCanvas3D & parent,
|
|||||||
// (copy & paste) unicode symbols from web
|
// (copy & paste) unicode symbols from web
|
||||||
|
|
||||||
bool is_font_loaded = load_font();
|
bool is_font_loaded = load_font();
|
||||||
add_fonts(Emboss::get_font_list());
|
//add_fonts(Emboss::get_font_list());
|
||||||
|
//add_fonts({WxFontUtils::get_os_font()});
|
||||||
|
|
||||||
if (!is_font_loaded) {
|
if (!is_font_loaded) {
|
||||||
// can't load so erase it from list
|
// can't load so erase it from list
|
||||||
@ -72,24 +94,7 @@ void GLGizmoEmboss::on_render_input_window(float x, float y, float bottom_limit)
|
|||||||
int flag = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize |
|
int flag = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize |
|
||||||
ImGuiWindowFlags_NoCollapse;
|
ImGuiWindowFlags_NoCollapse;
|
||||||
m_imgui->begin(on_get_name(), flag);
|
m_imgui->begin(on_get_name(), flag);
|
||||||
if (m_font.has_value()) {
|
|
||||||
ImGui::Text("Selected font is %s END.", m_font->name.c_str());
|
|
||||||
} else {
|
|
||||||
ImGui::Text("No selected font yet.");
|
|
||||||
}
|
|
||||||
draw_font_list();
|
draw_font_list();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// TODO: fix load string each render
|
|
||||||
wxSystemSettings ss;
|
|
||||||
wxFont ssFont = ss.GetFont(wxSYS_ANSI_VAR_FONT);
|
|
||||||
std::string fontDesc = std::string(ssFont.GetNativeFontInfoDesc().c_str());
|
|
||||||
ImGui::Text("%s", fontDesc.c_str());
|
|
||||||
if (ImGui::Button(_L("Load font").c_str())) {
|
|
||||||
wxFont font = load_wxFont(fontDesc);
|
|
||||||
set_font(font);
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::string fontName;
|
static std::string fontName;
|
||||||
if (ImGui::Button(_L("choose font").c_str())) {
|
if (ImGui::Button(_L("choose font").c_str())) {
|
||||||
@ -365,7 +370,7 @@ void GLGizmoEmboss::draw_font_list()
|
|||||||
ImGui::EndCombo();
|
ImGui::EndCombo();
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (m_font.has_value()) {
|
if (m_font.has_value() && m_font->count > 1) {
|
||||||
if (ImGui::BeginCombo("##font_collection_selector",
|
if (ImGui::BeginCombo("##font_collection_selector",
|
||||||
std::to_string(m_font->index).c_str())) {
|
std::to_string(m_font->index).c_str())) {
|
||||||
for (size_t i = 0; i < m_font->count; ++i) {
|
for (size_t i = 0; i < m_font->count; ++i) {
|
||||||
@ -383,39 +388,75 @@ void GLGizmoEmboss::draw_font_list()
|
|||||||
|
|
||||||
bool GLGizmoEmboss::load_font()
|
bool GLGizmoEmboss::load_font()
|
||||||
{
|
{
|
||||||
auto font_path = m_font_list[m_font_selected].path.c_str();
|
const Emboss::FontItem &fi = m_font_list[m_font_selected];
|
||||||
m_font = Emboss::load_font(font_path);
|
std::optional<Emboss::Font> loaded_font;
|
||||||
return m_font.has_value();
|
switch (fi.type) {
|
||||||
|
case Emboss::FontItem::Type::file_path:
|
||||||
|
loaded_font = Emboss::load_font(fi.path.c_str());
|
||||||
|
break;
|
||||||
|
case Emboss::FontItem::Type::wx_font_descr:
|
||||||
|
loaded_font = WxFontUtils::load_font(WxFontUtils::load_wxFont(fi.path));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool is_loaded = loaded_font.has_value();
|
||||||
|
if (is_loaded) {
|
||||||
|
m_font = std::move(loaded_font);
|
||||||
|
}
|
||||||
|
return is_loaded;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLGizmoEmboss::set_font(const wxFont &font) {
|
std::optional<Slic3r::Emboss::Font> WxFontUtils::load_font(const wxFont &font)
|
||||||
//std::string m_font_name = std::string((
|
{
|
||||||
// font.GetFamilyString() + " " +
|
if (!font.IsOk()) return {};
|
||||||
// font.GetStyleString() + " " +
|
|
||||||
// font.GetWeightString()
|
|
||||||
// ).c_str());
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
m_font = Emboss::load_font(font.GetHFONT());
|
return Slic3r::Emboss::load_font(font.GetHFONT());
|
||||||
#elif __linux__
|
#elif __linux__
|
||||||
// use file path
|
// use file path
|
||||||
|
return {};
|
||||||
#elif __APPLE__
|
#elif __APPLE__
|
||||||
const wxNativeFontInfo *info = font.GetNativeFontInfo();
|
const wxNativeFontInfo *info = font.GetNativeFontInfo();
|
||||||
CTFontDescriptorRef descriptor = info3->GetCTFontDescriptor();
|
CTFontDescriptorRef descriptor = info3->GetCTFontDescriptor();
|
||||||
CFDictionaryRef attribs = CTFontDescriptorCopyAttributes(descriptor);
|
CFDictionaryRef attribs = CTFontDescriptorCopyAttributes(descriptor);
|
||||||
CFStringRef url = (CFStringRef)CTFontDescriptorCopyAttribute(descriptor, kCTFontURLAttribute);
|
CFStringRef url = (CFStringRef)CTFontDescriptorCopyAttribute(descriptor, kCTFontURLAttribute);
|
||||||
std::string str(CFStringGetCStringPtr(CFURLGetString(anUrl),kCFStringEncodingUTF8));
|
std::string str(CFStringGetCStringPtr(CFURLGetString(anUrl),kCFStringEncodingUTF8));
|
||||||
m_font = Emboss::load_font(str);
|
return Emboss::load_font(str);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string GLGizmoEmboss::store_wxFont(const wxFont &font)
|
Slic3r::Emboss::FontItem WxFontUtils::get_os_font()
|
||||||
|
{
|
||||||
|
wxSystemSettings ss;
|
||||||
|
wxFont ss_font = ss.GetFont(wxSYS_ANSI_VAR_FONT);
|
||||||
|
std::string name = get_human_readable_name(ss_font) + " (" + _u8L("OS default") + ")";
|
||||||
|
std::string fontDesc = std::string(ss_font.GetNativeFontInfoDesc().c_str());
|
||||||
|
return Emboss::FontItem(name, fontDesc, Emboss::FontItem::Type::wx_font_descr);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string WxFontUtils::get_human_readable_name(const wxFont &font)
|
||||||
|
{
|
||||||
|
if (!font.IsOk()) return "Font is NOT ok.";
|
||||||
|
// Face name is optional in wxFont
|
||||||
|
if (!font.GetFaceName().empty()) {
|
||||||
|
return std::string(font.GetFaceName().c_str());
|
||||||
|
} else {
|
||||||
|
return std::string((
|
||||||
|
font.GetFamilyString() + " " +
|
||||||
|
font.GetStyleString() + " " +
|
||||||
|
font.GetWeightString()
|
||||||
|
).c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string WxFontUtils::store_wxFont(const wxFont &font)
|
||||||
{
|
{
|
||||||
//wxString os = wxPlatformInfo::Get().GetOperatingSystemIdName();
|
//wxString os = wxPlatformInfo::Get().GetOperatingSystemIdName();
|
||||||
wxString font_descriptor = font.GetNativeFontInfoDesc();
|
wxString font_descriptor = font.GetNativeFontInfoDesc();
|
||||||
return std::string(font_descriptor.c_str());
|
return std::string(font_descriptor.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
wxFont GLGizmoEmboss::load_wxFont(const std::string &font_descriptor)
|
wxFont WxFontUtils::load_wxFont(const std::string &font_descriptor)
|
||||||
{
|
{
|
||||||
wxString font_descriptor_wx(font_descriptor);
|
wxString font_descriptor_wx(font_descriptor);
|
||||||
return wxFont(font_descriptor_wx);
|
return wxFont(font_descriptor_wx);
|
||||||
|
@ -41,13 +41,6 @@ private:
|
|||||||
void draw_add_button();
|
void draw_add_button();
|
||||||
bool load_font();
|
bool load_font();
|
||||||
|
|
||||||
// os specific set of wxFont
|
|
||||||
void set_font(const wxFont &font);
|
|
||||||
|
|
||||||
// serialize / deserialize font
|
|
||||||
static std::string store_wxFont(const wxFont& font);
|
|
||||||
static wxFont load_wxFont(const std::string &font_descriptor);
|
|
||||||
|
|
||||||
void sort_fonts();
|
void sort_fonts();
|
||||||
void add_fonts(const Emboss::FontList &font_list);
|
void add_fonts(const Emboss::FontList &font_list);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user