Fix storing of wxFont property which describing font to reconstruct on another computer

This commit is contained in:
Filip Sykala - NTB T15p 2022-09-29 07:59:31 +02:00
parent b716872702
commit 1e2fe6027d
4 changed files with 28 additions and 14 deletions

View File

@ -1256,6 +1256,9 @@ bool GLGizmoEmboss::select_facename(const wxString &facename) {
const wxFontEncoding &encoding = m_face_names.encoding; const wxFontEncoding &encoding = m_face_names.encoding;
wxFont wx_font(wxFontInfo().FaceName(facename).Encoding(encoding)); wxFont wx_font(wxFontInfo().FaceName(facename).Encoding(encoding));
if (!wx_font.IsOk()) return false; if (!wx_font.IsOk()) return false;
// wx font could change source file by size of font
int point_size = static_cast<int>(m_style_manager.get_font_prop().size_in_mm);
wx_font.SetPointSize(point_size);
if (!m_style_manager.set_wx_font(wx_font)) return false; if (!m_style_manager.set_wx_font(wx_font)) return false;
process(); process();
return true; return true;
@ -2832,9 +2835,18 @@ void GLGizmoEmboss::create_notification_not_valid_font(
const std::string &origin_font_name = origin_family.has_value() ? const std::string &origin_font_name = origin_family.has_value() ?
*origin_family : *origin_family :
tc.style.path; tc.style.path;
const std::string &actual_font_name = actual_family.has_value() ?
*actual_family : std::string actual_wx_face_name;
es.name; if (!actual_family.has_value()) {
auto& wx_font = m_style_manager.get_wx_font();
if (wx_font.has_value()) {
wxString wx_face_name = wx_font->GetFaceName();
actual_wx_face_name = std::string((const char *) wx_face_name.ToUTF8());
}
}
const std::string &actual_font_name = actual_family.has_value() ? *actual_family :
(!actual_wx_face_name.empty() ? actual_wx_face_name : es.path);
std::string text = std::string text =
GUI::format(_L("Can't load exactly same font(\"%1%\"), " GUI::format(_L("Can't load exactly same font(\"%1%\"), "

View File

@ -474,6 +474,7 @@ bool EmbossStyleManager::set_wx_font(const wxFont &wx_font, std::unique_ptr<Embo
style.type = WxFontUtils::get_actual_type(); style.type = WxFontUtils::get_actual_type();
// update string path // update string path
style.path = WxFontUtils::store_wxFont(wx_font); style.path = WxFontUtils::store_wxFont(wx_font);
WxFontUtils::update_property(style.prop, wx_font);
clear_imgui_font(); clear_imgui_font();
return true; return true;
} }

View File

@ -118,7 +118,14 @@ EmbossStyle WxFontUtils::create_emboss_style(const wxFont &font, const std::stri
EmbossStyle::Type type = get_actual_type(); EmbossStyle::Type type = get_actual_type();
// synchronize font property with actual font // synchronize font property with actual font
FontProp font_prop; FontProp font_prop;
// The point size is defined as 1/72 of the Anglo-Saxon inch (25.4 mm): it
// is approximately 0.0139 inch or 352.8 um. But it is too small, so I
// decide use point size as mm for emboss
font_prop.size_in_mm = font.GetPointSize(); // *0.3528f;
font_prop.emboss = font_prop.size_in_mm / 2.f;
WxFontUtils::update_property(font_prop, font); WxFontUtils::update_property(font_prop, font);
return { name_item, fontDesc, type, font_prop }; return { name_item, fontDesc, type, font_prop };
} }
@ -129,7 +136,7 @@ EmbossStyle WxFontUtils::get_os_font()
wxFont font = wxSystemSettings::GetFont(system_font); wxFont font = wxSystemSettings::GetFont(system_font);
EmbossStyle es = create_emboss_style(font); EmbossStyle es = create_emboss_style(font);
es.name += std::string(" (OS default)"); es.name += std::string(" (OS default)");
return create_emboss_style(font); return es;
} }
std::string WxFontUtils::get_human_readable_name(const wxFont &font) std::string WxFontUtils::get_human_readable_name(const wxFont &font)
@ -233,13 +240,7 @@ std::optional<wxFont> WxFontUtils::create_wxFont(const EmbossStyle &style)
void WxFontUtils::update_property(FontProp &font_prop, const wxFont &font) void WxFontUtils::update_property(FontProp &font_prop, const wxFont &font)
{ {
// The point size is defined as 1/72 of the Anglo-Saxon inch (25.4 mm): it wxString wx_face_name = font.GetFaceName();
// is approximately 0.0139 inch or 352.8 um. But it is too small, so I
// decide use point size as mm for emboss
font_prop.size_in_mm = font.GetPointSize(); // *0.3528f;
font_prop.emboss = font_prop.size_in_mm / 2.f;
wxString wx_face_name = font.GetFaceName();
std::string face_name((const char *) wx_face_name.ToUTF8()); std::string face_name((const char *) wx_face_name.ToUTF8());
if (!face_name.empty()) font_prop.face_name = face_name; if (!face_name.empty()) font_prop.face_name = face_name;

View File

@ -37,7 +37,7 @@ public:
// Try to create similar font, loaded from 3mf from different Computer // Try to create similar font, loaded from 3mf from different Computer
static std::optional<wxFont> create_wxFont(const EmbossStyle &style); static std::optional<wxFont> create_wxFont(const EmbossStyle &style);
// update font property by wxFont // update font property by wxFont - without emboss depth and font size
static void update_property(FontProp &font_prop, const wxFont &font); static void update_property(FontProp &font_prop, const wxFont &font);
static bool is_italic(const wxFont &font); static bool is_italic(const wxFont &font);