Files
ports/cad/OrcaSlicer/files/patch-src_libslic3r_Shape_TextShape.cpp
2026-10-04 04:07:15 +00:00

93 lines
4.1 KiB
C++

--- src/libslic3r/Shape/TextShape.cpp.orig 2026-03-22 17:56:38 UTC
+++ src/libslic3r/Shape/TextShape.cpp
@@ -6,6 +6,7 @@
#include <string>
#include <vector>
+#include <cstring>
#include "Standard_TypeDef.hxx"
#include "STEPCAFControl_Reader.hxx"
@@ -50,8 +51,7 @@ std::vector<std::string> init_occt_fonts()
Handle(Font_FontMgr) aFontMgr = Font_FontMgr::GetInstance();
aFontMgr->InitFontDataBase();
- TColStd_SequenceOfHAsciiString availFontNames;
- aFontMgr->GetAvailableFontsNames(availFontNames);
+ const NCollection_List<Handle(Font_SystemFont)>& availFontNames = aFontMgr->GetAvailableFonts();
stdFontNames.reserve(availFontNames.Size());
g_occt_fonts_maps.clear();
@@ -62,16 +62,17 @@ std::vector<std::string> init_occt_fonts()
stdFontNames.push_back("HarmonyOS Sans SC");
g_occt_fonts_maps.insert(std::make_pair("HarmoneyOS Sans SC", Slic3r::resources_dir() + "/fonts/" + "HarmonyOS_Sans_SC_Regular.ttf"));
#endif
- for (auto afn : availFontNames) {
+ for (auto sys_font : availFontNames) {
+ TCollection_AsciiString font_name = sys_font->FontName();
#ifdef __APPLE__
- if(afn->String().StartsWith("."))
+ if(font_name.StartsWith("."))
continue;
#endif
- if(afn->Search("Emoji") != -1 || afn->Search("emoji") != -1)
+ if(font_name.Search("Emoji") != -1 || font_name.Search("emoji") != -1)
continue;
bool repeat = false;
for (size_t i = 0; i < fonts_suffix.size(); i++) {
- if (afn->SearchFromEnd(fonts_suffix[i]) != -1) {
+ if (font_name.SearchFromEnd(fonts_suffix[i]) != -1) {
repeat = true;
break;
}
@@ -79,13 +80,12 @@ std::vector<std::string> init_occt_fonts()
if (repeat)
continue;
- Handle(Font_SystemFont) sys_font = aFontMgr->GetFont(afn->ToCString());
TCollection_AsciiString font_path = sys_font->FontPath(Font_FontAspect::Font_FontAspect_Regular);
if (!font_path.IsEmpty() && font_path.SearchFromEnd(".") != -1) {
auto file_type = font_path.SubString(font_path.SearchFromEnd(".") + 1, font_path.Length());
file_type.LowerCase();
if (file_type == "ttf" || file_type == "otf" || file_type == "ttc") {
- g_occt_fonts_maps.insert(std::make_pair(afn->ToCString(), decode_path(font_path.ToCString())));
+ g_occt_fonts_maps.insert(std::make_pair(font_name.ToCString(), decode_path(font_path.ToCString())));
}
}
}
@@ -131,12 +131,12 @@ static bool TextToBRep(const char* text, const char* f
aFormatter->Format();
// get the text width
- text_width = 0;
- NCollection_String coll_str = aText;
- for (NCollection_Utf8Iter anIter = coll_str.Iterator(); *anIter != 0;) {
- const Standard_Utf32Char aCharThis = *anIter;
- const Standard_Utf32Char aCharNext = *++anIter;
- double width = aFont.AdvanceX(aCharThis, aCharNext);
+ text_width = 0;
+ int str_len = strlen(aText);
+ for (int i = 0; i < str_len; ++i) {
+ Standard_Utf32Char aCharThis = (unsigned char)aText[i];
+ Standard_Utf32Char aCharNext = (i + 1 < str_len) ? (unsigned char)aText[i + 1] : 0;
+ double width = aFont.AdvanceX(aCharThis, aCharNext);
text_width += width;
}
@@ -199,7 +199,7 @@ static void MakeMesh(TopoDS_Shape& theSolid, TriangleM
for (Standard_Integer aNodeIter = 1; aNodeIter <= aTriangulation->NbNodes(); ++aNodeIter) {
gp_Pnt aPnt = aTriangulation->Node(aNodeIter);
aPnt.Transform(aTrsf);
- points.emplace_back(std::move(Vec3f(aPnt.X(), aPnt.Y(), aPnt.Z())));
+ points.emplace_back(Vec3f(aPnt.X(), aPnt.Y(), aPnt.Z()));
}
//BBS: copy triangles
const TopAbs_Orientation anOrientation = anExpSF.Current().Orientation();
@@ -269,4 +269,4 @@ void load_text_shape(const char*text, const char* font
MakeMesh(aTextShape, text_result.text_mesh);
}
-}; // namespace Slic3r
+}; // namespace Slic3r
\ No newline at end of file