[GDExtension] Expose some low level functions and String operators.
This commit is contained in:
@ -248,11 +248,7 @@ _FORCE_INLINE_ TextServerFallback::FontTexturePosition TextServerFallback::find_
|
||||
// Could not find texture to fit, create one.
|
||||
int texsize = MAX(p_data->size.x * p_data->oversampling * 8, 256);
|
||||
|
||||
#ifdef GDEXTENSION
|
||||
texsize = Math::next_power_of_2(texsize);
|
||||
#else
|
||||
texsize = next_power_of_2(texsize);
|
||||
#endif
|
||||
|
||||
if (p_msdf) {
|
||||
texsize = MIN(texsize, 2048);
|
||||
@ -260,18 +256,10 @@ _FORCE_INLINE_ TextServerFallback::FontTexturePosition TextServerFallback::find_
|
||||
texsize = MIN(texsize, 1024);
|
||||
}
|
||||
if (mw > texsize) { // Special case, adapt to it?
|
||||
#ifdef GDEXTENSION
|
||||
texsize = Math::next_power_of_2(mw);
|
||||
#else
|
||||
texsize = next_power_of_2(mw);
|
||||
#endif
|
||||
}
|
||||
if (mh > texsize) { // Special case, adapt to it?
|
||||
#ifdef GDEXTENSION
|
||||
texsize = Math::next_power_of_2(mh);
|
||||
#else
|
||||
texsize = next_power_of_2(mh);
|
||||
#endif
|
||||
}
|
||||
|
||||
ShelfPackTexture tex = ShelfPackTexture(texsize, texsize);
|
||||
@ -374,14 +362,14 @@ static int ft_cubic_to(const FT_Vector *control1, const FT_Vector *control2, con
|
||||
return 0;
|
||||
}
|
||||
|
||||
void TextServerFallback::_generateMTSDF_threaded(uint32_t y, void *p_td) const {
|
||||
void TextServerFallback::_generateMTSDF_threaded(void *p_td, uint32_t p_y) {
|
||||
MSDFThreadData *td = static_cast<MSDFThreadData *>(p_td);
|
||||
|
||||
msdfgen::ShapeDistanceFinder<msdfgen::OverlappingContourCombiner<msdfgen::MultiAndTrueDistanceSelector>> distanceFinder(*td->shape);
|
||||
int row = td->shape->inverseYAxis ? td->output->height() - y - 1 : y;
|
||||
int row = td->shape->inverseYAxis ? td->output->height() - p_y - 1 : p_y;
|
||||
for (int col = 0; col < td->output->width(); ++col) {
|
||||
int x = (y % 2) ? td->output->width() - col - 1 : col;
|
||||
msdfgen::Point2 p = td->projection->unproject(msdfgen::Point2(x + .5, y + .5));
|
||||
int x = (p_y % 2) ? td->output->width() - col - 1 : col;
|
||||
msdfgen::Point2 p = td->projection->unproject(msdfgen::Point2(x + .5, p_y + .5));
|
||||
msdfgen::MultiAndTrueDistance distance = distanceFinder.distance(p);
|
||||
td->distancePixelConversion->operator()(td->output->operator()(x, row), distance);
|
||||
}
|
||||
@ -451,14 +439,8 @@ _FORCE_INLINE_ TextServerFallback::FontGlyph TextServerFallback::rasterize_msdf(
|
||||
td.projection = &projection;
|
||||
td.distancePixelConversion = &distancePixelConversion;
|
||||
|
||||
#ifdef GDEXTENSION
|
||||
for (int i = 0; i < h; i++) {
|
||||
_generateMTSDF_threaded(i, &td);
|
||||
}
|
||||
#else
|
||||
WorkerThreadPool::GroupID group_id = WorkerThreadPool::get_singleton()->add_template_group_task(this, &TextServerFallback::_generateMTSDF_threaded, &td, h, -1, true, SNAME("TextServerFBRenderMSDF"));
|
||||
WorkerThreadPool::get_singleton()->wait_for_group_task_completion(group_id);
|
||||
#endif
|
||||
WorkerThreadPool::GroupID group_task = WorkerThreadPool::get_singleton()->add_native_group_task(&TextServerFallback::_generateMTSDF_threaded, &td, h, -1, true, String("TextServerFBRenderMSDF"));
|
||||
WorkerThreadPool::get_singleton()->wait_for_group_task_completion(group_task);
|
||||
|
||||
msdfgen::msdfErrorCorrection(image, shape, projection, p_pixel_range, config);
|
||||
|
||||
|
||||
@ -67,11 +67,11 @@
|
||||
#include <godot_cpp/classes/image.hpp>
|
||||
#include <godot_cpp/classes/image_texture.hpp>
|
||||
#include <godot_cpp/classes/ref.hpp>
|
||||
#include <godot_cpp/classes/worker_thread_pool.hpp>
|
||||
|
||||
#include <godot_cpp/templates/hash_map.hpp>
|
||||
#include <godot_cpp/templates/hash_set.hpp>
|
||||
#include <godot_cpp/templates/rid_owner.hpp>
|
||||
#include <godot_cpp/templates/thread_work_pool.hpp>
|
||||
#include <godot_cpp/templates/vector.hpp>
|
||||
|
||||
using namespace godot;
|
||||
@ -303,7 +303,7 @@ class TextServerFallback : public TextServerExtension {
|
||||
_FORCE_INLINE_ bool _ensure_glyph(FontFallback *p_font_data, const Vector2i &p_size, int32_t p_glyph) const;
|
||||
_FORCE_INLINE_ bool _ensure_cache_for_size(FontFallback *p_font_data, const Vector2i &p_size) const;
|
||||
_FORCE_INLINE_ void _font_clear_cache(FontFallback *p_font_data);
|
||||
void _generateMTSDF_threaded(uint32_t y, void *p_td) const;
|
||||
static void _generateMTSDF_threaded(void *p_td, uint32_t p_y);
|
||||
|
||||
_FORCE_INLINE_ Vector2i _get_size(const FontFallback *p_font_data, int p_size) const {
|
||||
if (p_font_data->msdf) {
|
||||
|
||||
@ -88,24 +88,13 @@ FT_Error tvg_svg_in_ot_preset_slot(FT_GlyphSlot p_slot, FT_Bool p_cache, FT_Poin
|
||||
if (!gl_state.ready) {
|
||||
Ref<XMLParser> parser;
|
||||
parser.instantiate();
|
||||
#ifdef GDEXTENSION
|
||||
PackedByteArray data;
|
||||
data.resize(document->svg_document_length);
|
||||
memcpy(data.ptrw(), document->svg_document, document->svg_document_length);
|
||||
parser->open_buffer(data);
|
||||
#else
|
||||
parser->_open_buffer((const uint8_t *)document->svg_document, document->svg_document_length);
|
||||
#endif
|
||||
|
||||
float aspect = 1.0f;
|
||||
String xml_body;
|
||||
while (parser->read() == OK) {
|
||||
if (parser->has_attribute("id")) {
|
||||
#ifdef GDEXTENSION
|
||||
const String &gl_name = parser->get_named_attribute_value("id");
|
||||
#else
|
||||
const String &gl_name = parser->get_attribute_value("id");
|
||||
#endif
|
||||
if (gl_name.begins_with("glyph")) {
|
||||
int dot_pos = gl_name.find(".");
|
||||
int64_t gl_idx = gl_name.substr(5, (dot_pos > 0) ? dot_pos - 5 : -1).to_int();
|
||||
@ -117,11 +106,7 @@ FT_Error tvg_svg_in_ot_preset_slot(FT_GlyphSlot p_slot, FT_Bool p_cache, FT_Poin
|
||||
}
|
||||
if (parser->get_node_type() == XMLParser::NODE_ELEMENT && parser->get_node_name() == "svg") {
|
||||
if (parser->has_attribute("viewBox")) {
|
||||
#ifdef GDEXTENSION
|
||||
PackedStringArray vb = parser->get_named_attribute_value("viewBox").split(" ");
|
||||
#else
|
||||
Vector<String> vb = parser->get_attribute_value("viewBox").split(" ");
|
||||
#endif
|
||||
|
||||
if (vb.size() == 4) {
|
||||
aspect = vb[2].to_float() / vb[3].to_float();
|
||||
@ -129,19 +114,6 @@ FT_Error tvg_svg_in_ot_preset_slot(FT_GlyphSlot p_slot, FT_Bool p_cache, FT_Poin
|
||||
}
|
||||
continue;
|
||||
}
|
||||
#ifdef GDEXTENSION
|
||||
if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
|
||||
xml_body = xml_body + "<" + parser->get_node_name();
|
||||
for (int i = 0; i < parser->get_attribute_count(); i++) {
|
||||
xml_body = xml_body + " " + parser->get_attribute_name(i) + "=\"" + parser->get_attribute_value(i) + "\"";
|
||||
}
|
||||
xml_body = xml_body + ">";
|
||||
} else if (parser->get_node_type() == XMLParser::NODE_TEXT) {
|
||||
xml_body = xml_body + parser->get_node_data();
|
||||
} else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END) {
|
||||
xml_body = xml_body + "</" + parser->get_node_name() + ">";
|
||||
}
|
||||
#else
|
||||
if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
|
||||
xml_body += vformat("<%s", parser->get_node_name());
|
||||
for (int i = 0; i < parser->get_attribute_count(); i++) {
|
||||
@ -153,7 +125,6 @@ FT_Error tvg_svg_in_ot_preset_slot(FT_GlyphSlot p_slot, FT_Bool p_cache, FT_Poin
|
||||
} else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END) {
|
||||
xml_body += vformat("</%s>", parser->get_node_name());
|
||||
}
|
||||
#endif
|
||||
}
|
||||
String temp_xml = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 0 0\">" + xml_body;
|
||||
|
||||
@ -175,11 +146,7 @@ FT_Error tvg_svg_in_ot_preset_slot(FT_GlyphSlot p_slot, FT_Bool p_cache, FT_Poin
|
||||
new_h = (new_w / aspect);
|
||||
}
|
||||
|
||||
#ifdef GDEXTENSION
|
||||
gl_state.xml_code = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"" + rtos(min_x) + " " + rtos(min_y) + " " + rtos(new_w) + " " + rtos(new_h) + "\">" + xml_body;
|
||||
#else
|
||||
gl_state.xml_code = vformat("<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"%f %f %f %f\">", min_x, min_y, new_w, new_h) + xml_body;
|
||||
#endif
|
||||
|
||||
picture = tvg::Picture::gen();
|
||||
result = picture->load(gl_state.xml_code.utf8().get_data(), gl_state.xml_code.utf8().length(), "svg+xml", false);
|
||||
|
||||
Reference in New Issue
Block a user