Cancelation in the middle of getting text shape
This commit is contained in:
parent
00db58c823
commit
072c1752b1
4 changed files with 14 additions and 8 deletions
|
@ -651,9 +651,10 @@ std::optional<Emboss::Glyph> Emboss::letter2glyph(const FontFile &font,
|
||||||
return Private::get_glyph(*font_info_opt, letter, flatness);
|
return Private::get_glyph(*font_info_opt, letter, flatness);
|
||||||
}
|
}
|
||||||
|
|
||||||
ExPolygons Emboss::text2shapes(FontFileWithCache &font_with_cache,
|
ExPolygons Emboss::text2shapes(FontFileWithCache &font_with_cache,
|
||||||
const char * text,
|
const char *text,
|
||||||
const FontProp &font_prop)
|
const FontProp &font_prop,
|
||||||
|
std::function<bool()> was_canceled)
|
||||||
{
|
{
|
||||||
assert(font_with_cache.has_value());
|
assert(font_with_cache.has_value());
|
||||||
std::optional<stbtt_fontinfo> font_info_opt;
|
std::optional<stbtt_fontinfo> font_info_opt;
|
||||||
|
@ -688,7 +689,11 @@ ExPolygons Emboss::text2shapes(FontFileWithCache &font_with_cache,
|
||||||
if (wc == '\r') continue;
|
if (wc == '\r') continue;
|
||||||
|
|
||||||
int unicode = static_cast<int>(wc);
|
int unicode = static_cast<int>(wc);
|
||||||
const Glyph* glyph_ptr = Private::get_glyph(unicode, font, font_prop, cache, font_info_opt);
|
// check cancelation only before unknown symbol - loading of symbol could be timeconsuming on slow computer and dificult fonts
|
||||||
|
auto it = cache.find(unicode);
|
||||||
|
if (it == cache.end() && was_canceled != nullptr && was_canceled()) return {};
|
||||||
|
const Glyph *glyph_ptr = (it != cache.end())? &it->second :
|
||||||
|
Private::get_glyph(unicode, font, font_prop, cache, font_info_opt);
|
||||||
if (glyph_ptr == nullptr) continue;
|
if (glyph_ptr == nullptr) continue;
|
||||||
|
|
||||||
// move glyph to cursor position
|
// move glyph to cursor position
|
||||||
|
|
|
@ -152,8 +152,9 @@ public:
|
||||||
/// <param name="font">Define fonts + cache, which could extend</param>
|
/// <param name="font">Define fonts + cache, which could extend</param>
|
||||||
/// <param name="text">Characters to convert</param>
|
/// <param name="text">Characters to convert</param>
|
||||||
/// <param name="font_prop">User defined property of the font</param>
|
/// <param name="font_prop">User defined property of the font</param>
|
||||||
|
/// <param name="was_canceled">Way to interupt processing</param>
|
||||||
/// <returns>Inner polygon cw(outer ccw)</returns>
|
/// <returns>Inner polygon cw(outer ccw)</returns>
|
||||||
static ExPolygons text2shapes(FontFileWithCache &font, const char *text, const FontProp &font_prop);
|
static ExPolygons text2shapes(FontFileWithCache &font, const char *text, const FontProp &font_prop, std::function<bool()> was_canceled = nullptr);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Fix intersections and self intersections in polygons glyph shape
|
/// Fix intersections and self intersections in polygons glyph shape
|
||||||
|
|
|
@ -45,8 +45,8 @@ void CreateFontImageJob::process(Ctl &ctl)
|
||||||
text = text.substr(0, enter_pos);
|
text = text.substr(0, enter_pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
ExPolygons shapes = Emboss::text2shapes(font_file_with_cache,
|
std::function<bool()> was_canceled = [&ctl]() -> bool { return ctl.was_canceled(); };
|
||||||
text.c_str(), fp);
|
ExPolygons shapes = Emboss::text2shapes(font_file_with_cache, text.c_str(), fp, was_canceled);
|
||||||
// normalize height of font
|
// normalize height of font
|
||||||
BoundingBox bounding_box;
|
BoundingBox bounding_box;
|
||||||
for (ExPolygon &shape : shapes)
|
for (ExPolygon &shape : shapes)
|
||||||
|
|
|
@ -521,7 +521,7 @@ TriangleMesh priv::try_create_mesh(const EmbossDataBase &input, Emboss::FontFile
|
||||||
assert(font.has_value());
|
assert(font.has_value());
|
||||||
if (!font.has_value()) return {};
|
if (!font.has_value()) return {};
|
||||||
|
|
||||||
ExPolygons shapes = Emboss::text2shapes(font, text, prop);
|
ExPolygons shapes = Emboss::text2shapes(font, text, prop, was_canceled);
|
||||||
if (shapes.empty()) return {};
|
if (shapes.empty()) return {};
|
||||||
if (was_canceled()) return {};
|
if (was_canceled()) return {};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue