#ifndef slic3r_Emboss_hpp_ #define slic3r_Emboss_hpp_ #include #include #include #include #include // indexed_triangle_set #include "Polygon.hpp" #include "ExPolygon.hpp" #include "TextConfiguration.hpp" namespace Slic3r { /// /// class with only static function add ability to engraved OR raised /// text OR polygons onto model surface /// class Emboss { public: Emboss() = delete; // every glyph's shape point is divided by SHAPE_SCALE - increase precission of fixed point value static double SHAPE_SCALE; /// /// Collect fonts registred inside OS /// /// OS registred TTF font files(full path) with names static FontList get_font_list(); #ifdef _WIN32 static FontList get_font_list_by_register(); static FontList get_font_list_by_enumeration(); static FontList get_font_list_by_folder(); #endif /// /// OS dependent function to get location of font by its name descriptor /// /// Unique identificator for font /// File path to font when found static std::optional get_font_path(const std::wstring &font_face_name); // description of one letter struct Glyph { ExPolygons shape; int advance_width=0, left_side_bearing=0; }; // cache for glyph by unicode using Glyphs = std::map; /// /// keep information from file about font /// (store file data itself) /// + cache data readed from buffer /// + cache shape of glyphs (optionaly modified) /// struct FontFile { // loaded data from font file const std::vector buffer; unsigned int index; // index of actual file info in collection const unsigned int count; // count of fonts in file collection // vertical position is "scale*(ascent - descent + lineGap)" const int ascent, descent, linegap; Emboss::Glyphs cache; // cache of glyphs FontFile(std::vector &&buffer, unsigned int count, int ascent, int descent, int linegap) : buffer(std::move(buffer)) , index(0) // select default font on index 0 , count(count) , ascent(ascent) , descent(descent) , linegap(linegap) {} }; /// /// Load font file into buffer /// /// Location of .ttf or .ttc font file /// Font object when loaded. static std::unique_ptr load_font(const char *file_path); // data = raw file data static std::unique_ptr load_font(std::vector&& data); #ifdef _WIN32 // fix for unknown pointer HFONT using HFONT = void*; static void * can_load(HFONT hfont); static std::unique_ptr load_font(HFONT hfont); #endif // _WIN32 /// /// convert letter into polygons /// /// Define fonts /// One character defined by unicode codepoint /// Precision of lettter outline curve in conversion to lines /// inner polygon cw(outer ccw) static std::optional letter2glyph(const FontFile &font, int letter, float flatness); /// /// Convert text into polygons /// /// Define fonts + cache, which could extend /// Characters to convert /// User defined property of the font /// Inner polygon cw(outer ccw) static ExPolygons text2shapes(FontFile & font, const char * text, const FontProp &font_prop); /// /// Read information from naming table of font file /// search for italic (or oblique), bold italic (or bold oblique) /// /// Selector of font /// True when the font description contains italic/obligue otherwise False static bool is_italic(FontFile &font); /// /// Project 2d point into space /// Could be plane, sphere, cylindric, ... /// class IProject { public: virtual ~IProject() = default; /// /// convert 2d point to 3d point /// /// 2d coordinate /// /// first - front spatial point /// second - back spatial point /// virtual std::pair project(const Point &p) const = 0; }; /// /// Create triangle model for text /// /// text or image /// Define transformation from 2d to 3d(orientation, position, scale, ...) /// Projected shape into space static indexed_triangle_set polygons2model(const ExPolygons &shape2d, const IProject& projection); /// /// Create transformation for emboss text object to lay on surface point /// /// Position of surface point /// Normal of surface point /// Is compared with normal.z to suggest up direction /// Transformation onto surface point static Transform3d create_transformation_onto_surface( const Vec3f &position, const Vec3f &normal, float up_limit = 0.9f); class ProjectZ : public IProject { public: ProjectZ(float depth) : m_depth(depth) {} // Inherited via IProject virtual std::pair project(const Point &p) const override; float m_depth; }; class ProjectScale : public IProject { std::unique_ptr core; public: ProjectScale(std::unique_ptr core, float scale) : m_scale(scale) , core(std::move(core)) {} // Inherited via IProject virtual std::pair project(const Point &p) const override { auto res = core->project(p); return std::make_pair(res.first * m_scale, res.second * m_scale); } float m_scale; }; }; } // namespace Slic3r #endif // slic3r_Emboss_hpp_