OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::GUI::CreateFontImageJob Class Reference

Create image for face name. More...

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/slic3r/GUI/Jobs/CreateFontNameImageJob.hpp>

Inheritance diagram for Slic3r::GUI::CreateFontImageJob:
Collaboration diagram for Slic3r::GUI::CreateFontImageJob:

Public Types

enum  JobPrepareState { PREPARE_STATE_DEFAULT = 0 , PREPARE_STATE_MENU = 1 }

Public Member Functions

 CreateFontImageJob (FontImageData &&input)
void process (Ctl &ctl) override
 Rasterize text into image (result).
void finalize (bool canceled, std::exception_ptr &) override
 Copy image data into OpenGL texture.

Static Public Attributes

static const std::string default_text = "AaBbCc 123"
 Text used for generate preview for empty text and when no glyph for given m_input.text.

Private Attributes

FontImageData m_input
std::vector< unsigned char > m_result
Point m_tex_size

Detailed Description

Create image for face name.

Member Enumeration Documentation

◆ JobPrepareState

Enumerator
PREPARE_STATE_DEFAULT 
PREPARE_STATE_MENU 
22 {
25 };
@ PREPARE_STATE_MENU
Definition Job.hpp:24
@ PREPARE_STATE_DEFAULT
Definition Job.hpp:23

Constructor & Destructor Documentation

◆ CreateFontImageJob()

CreateFontImageJob::CreateFontImageJob ( FontImageData && input)
38 : m_input(std::move(input))
39{
40 assert(wxFontEnumerator::IsValidFacename(m_input.font_name));
41 assert(m_input.gray_level > 0 && m_input.gray_level < 255);
42 assert(m_input.texture_id != 0);
43}
FontImageData m_input
Definition CreateFontNameImageJob.hpp:58

References m_input.

Member Function Documentation

◆ finalize()

void CreateFontImageJob::finalize ( bool canceled,
std::exception_ptr &  )
overridevirtual

Copy image data into OpenGL texture.

Parameters
canceled

Reimplemented from Slic3r::GUI::Job.

139{
140 if (m_input.count_opened_font_files)
141 --(*m_input.count_opened_font_files);
142 if (canceled || m_input.cancel->load()) return;
143
144 *m_input.is_created = true;
145
146 // Exist result bitmap with preview?
147 // (not valid input. e.g. not loadable font)
148 if (m_result.empty()) {
149 // TODO: write text cannot load into texture
150 m_result = std::vector<unsigned char>(m_tex_size.x() * m_tex_size.y() * 4, {255});
151 }
152
153 // upload texture on GPU
154 const GLenum target = GL_TEXTURE_2D;
155 glsafe(::glBindTexture(target, m_input.texture_id));
156
157 GLsizei w = m_tex_size.x(), h = m_tex_size.y();
158 GLint xoffset = 0; // align to left
159 // GLint xoffset = m_input.size.x() - m_tex_size.x(); // align right
160 GLint yoffset = m_input.size.y() * m_input.index;
161 glsafe(::glTexSubImage2D(target, m_input.level, xoffset, yoffset, w, h,
162 m_input.format, m_input.type, m_result.data()));
163
164 // clear rest of texture
165 std::vector<unsigned char> empty_data(xoffset * h * 4, {0});
166 glsafe(::glTexSubImage2D(target, m_input.level, 0, yoffset, xoffset, h,
167 m_input.format, m_input.type, empty_data.data()));
168
169 // bind default texture
170 GLuint no_texture_id = 0;
171 glsafe(::glBindTexture(target, no_texture_id));
172
173 // show rendered texture
174 wxGetApp().plater()->canvas3D()->schedule_extra_frame(0);
175
176 BOOST_LOG_TRIVIAL(info)
177 << "Generate Preview font('" << m_input.font_name << "' id:" << m_input.index << ") "
178 << "with text: '" << m_input.text << "' "
179 << "texture_size " << m_input.size.x() << " x " << m_input.size.y();
180}
#define glsafe(cmd)
Definition OpenGLUtils.hpp:25
Point m_tex_size
Definition CreateFontNameImageJob.hpp:60
std::vector< unsigned char > m_result
Definition CreateFontNameImageJob.hpp:59
int GLint
Definition gl.h:2062
unsigned int GLenum
Definition gl.h:2054
#define glTexSubImage2D
Definition gl.h:4927
int GLsizei
Definition gl.h:2065
#define glBindTexture
Definition gl.h:3299
unsigned int GLuint
Definition gl.h:2063
#define GL_TEXTURE_2D
Definition gl.h:1739

References GL_TEXTURE_2D, glBindTexture, glsafe, glTexSubImage2D, m_input, m_result, and m_tex_size.

◆ process()

void CreateFontImageJob::process ( Ctl & ctl)
overridevirtual

Rasterize text into image (result).

Parameters
ctlCheck for cancelation

Implements Slic3r::GUI::Job.

46{
47 if (!wxFontEnumerator::IsValidFacename(m_input.font_name)) return;
48 // Select font
49 wxFont wx_font(
50 wxFontInfo().FaceName(m_input.font_name).Encoding(m_input.encoding));
51 if (!wx_font.IsOk()) return;
52
53 std::unique_ptr<Emboss::FontFile> font_file =
55 if (font_file == nullptr) return;
56
57 Emboss::FontFileWithCache font_file_with_cache(std::move(font_file));
58 // use only first line of text
59 std::string& text = m_input.text;
60 if (text.empty())
61 text = default_text; // copy
62
63 size_t enter_pos = text.find('\n');
64 if (enter_pos < text.size()) {
65 // text start with enter
66 if (enter_pos == 0) return;
67 // exist enter, soo delete all after enter
68 text = text.substr(0, enter_pos);
69 }
70
71 std::function<bool()> was_canceled = [&ctl, cancel = m_input.cancel]() -> bool {
72 if (ctl.was_canceled()) return true;
73 if (cancel->load()) return true;
74 return false;
75 };
76
77 FontProp fp; // create default font parameters
78 ExPolygons shapes = Emboss::text2shapes(font_file_with_cache, text.c_str(), fp, was_canceled);
79
80 // select some character from font e.g. default text
81 if (shapes.empty())
82 shapes = Emboss::text2shapes(font_file_with_cache, default_text.c_str(), fp, was_canceled);
83 if (shapes.empty()) {
84 m_input.cancel->store(true);
85 return;
86 }
87
88 // normalize height of font
89 BoundingBox bounding_box;
90 for (const ExPolygon &shape : shapes)
91 bounding_box.merge(BoundingBox(shape.contour.points));
92 if (bounding_box.size().x() < 1 || bounding_box.size().y() < 1) {
93 m_input.cancel->store(true);
94 return;
95 }
96 double scale = m_input.size.y() / (double) bounding_box.size().y();
97 BoundingBoxf bb2(bounding_box.min.cast<double>(),
98 bounding_box.max.cast<double>());
99 bb2.scale(scale);
100 Vec2d size_f = bb2.size();
101 m_tex_size = Point(std::ceil(size_f.x()), std::ceil(size_f.y()));
102 // crop image width
103 if (m_tex_size.x() > m_input.size.x()) m_tex_size.x() = m_input.size.x();
104 if (m_tex_size.y() > m_input.size.y()) m_tex_size.y() = m_input.size.y();
105
106 // Set up result
107 unsigned bit_count = 4; // RGBA
108 m_result = std::vector<unsigned char>(m_tex_size.x() * m_tex_size.y() * bit_count, {255});
109
110 sla::Resolution resolution(m_tex_size.x(), m_tex_size.y());
111 double pixel_dim = SCALING_FACTOR / scale;
112 sla::PixelDim dim(pixel_dim, pixel_dim);
113 double gamma = 1.;
114 std::unique_ptr<sla::RasterBase> r =
116 for (ExPolygon &shape : shapes) shape.translate(-bounding_box.min);
117 for (const ExPolygon &shape : shapes) r->draw(shape);
118
119 // copy rastered data to pixels
120 sla::RasterEncoder encoder =
121 [&pix = m_result, w = m_tex_size.x(), h = m_tex_size.y(),
122 gray_level = m_input.gray_level]
123 (const void *ptr, size_t width, size_t height, size_t num_components) {
124 size_t size {static_cast<size_t>(w*h)};
125 const unsigned char *ptr2 = (const unsigned char *) ptr;
126 for (size_t x = 0; x < width; ++x)
127 for (size_t y = 0; y < height; ++y) {
128 size_t index = y*w + x;
129 assert(index < size);
130 if (index >= size) continue;
131 pix[3+4*index] = ptr2[y * width + x] / gray_level;
132 }
133 return sla::EncodedRaster();
134 };
135 r->encode(encoder);
136}
int scale(const int val)
Definition WipeTowerDialog.cpp:58
PointType size() const
Definition BoundingBox.cpp:187
void merge(const PointType &point)
Definition BoundingBox.cpp:139
static const std::string default_text
Text used for generate preview for empty text and when no glyph for given m_input....
Definition CreateFontNameImageJob.hpp:80
static std::unique_ptr< Slic3r::Emboss::FontFile > create_font_file(const wxFont &font)
Definition WxFontUtils.cpp:93
double SCALING_FACTOR
Definition libslic3r.cpp:3
HealedExPolygons text2shapes(FontFileWithCache &font, const char *text, const FontProp &font_prop, const std::function< bool()> &was_canceled=[]() {return false;})
Convert text into polygons.
Definition Emboss.cpp:1388
Kernel::Point_3 Point
Definition MeshRepair.cpp:81
coord_t width(const BoundingBox &box)
Definition Arrange.cpp:1184
coord_t height(const BoundingBox &box)
Definition Arrange.cpp:1185
std::function< EncodedRaster(const void *ptr, size_t w, size_t h, size_t num_components)> RasterEncoder
Definition RasterBase.hpp:59
std::unique_ptr< RasterBase > create_raster_grayscale_aa(const Resolution &res, const PixelDim &pxdim, double gamma, const RasterBase::Trafo &tr)
Definition RasterBase.cpp:77
std::vector< ExPolygon > ExPolygons
Definition ExPolygon.hpp:20
BoundingBoxf3 bounding_box(const TriangleMesh &m)
Definition TriangleMesh.hpp:391
zaa_minimize_perimeter_height resolution((ConfigOptionFloats, retraction_minimum_travel))((ConfigOptionBools
Eigen::Matrix< double, 2, 1, Eigen::DontAlign > Vec2d
Definition Point.hpp:67
auto was_canceled(const Job::Ctl &ctl, const DataBase &base)
Definition EmbossJob.cpp:292

References Slic3r::bounding_box(), Slic3r::GUI::WxFontUtils::create_font_file(), Slic3r::sla::create_raster_grayscale_aa(), default_text, m_input, m_result, m_tex_size, Slic3r::resolution(), scale(), Slic3r::BoundingBoxBase< PointType, APointsType >::scale(), SCALING_FACTOR, Slic3r::BoundingBoxBase< PointType, APointsType >::size(), Slic3r::Emboss::text2shapes(), and Slic3r::GUI::Job::Ctl::was_canceled().

Here is the call graph for this function:

Member Data Documentation

◆ default_text

const std::string CreateFontImageJob::default_text = "AaBbCc 123"
static

Text used for generate preview for empty text and when no glyph for given m_input.text.

Referenced by process().

◆ m_input

FontImageData Slic3r::GUI::CreateFontImageJob::m_input
private

◆ m_result

std::vector<unsigned char> Slic3r::GUI::CreateFontImageJob::m_result
private

Referenced by finalize(), and process().

◆ m_tex_size

Point Slic3r::GUI::CreateFontImageJob::m_tex_size
private

Referenced by finalize(), and process().


The documentation for this class was generated from the following files: