[Text Server] Restores bitmap font dynamic construction functions.

This commit is contained in:
bruvzg
2021-02-06 16:34:06 +02:00
parent 8fa92c70ea
commit bee718f1af
20 changed files with 415 additions and 142 deletions

View File

@@ -128,6 +128,38 @@ static Ref<Texture2D> flip_icon(Ref<Texture2D> p_texture, bool p_flip_y = false,
return texture;
}
static Ref<FontData> make_font(int p_height, int p_ascent, int p_charcount, const int *p_char_rects, int p_kerning_count, const int *p_kernings, int p_w, int p_h, const unsigned char *p_img) {
Ref<FontData> font(memnew(FontData));
font->new_bitmap(p_height, p_ascent, p_height);
Ref<Image> image = memnew(Image(p_img));
Ref<ImageTexture> tex = memnew(ImageTexture);
tex->create_from_image(image);
font->bitmap_add_texture(tex);
for (int i = 0; i < p_charcount; i++) {
const int *c = &p_char_rects[i * 8];
int chr = c[0];
Rect2 frect;
frect.position.x = c[1];
frect.position.y = c[2];
frect.size.x = c[3];
frect.size.y = c[4];
Point2 align(c[6], c[5]);
int advance = c[7];
font->bitmap_add_char(chr, 0, frect, align, advance);
}
for (int i = 0; i < p_kerning_count; i++) {
font->bitmap_add_kerning_pair(p_kernings[i * 3 + 0], p_kernings[i * 3 + 1], p_kernings[i * 3 + 2]);
}
return font;
}
static Ref<StyleBox> make_empty_stylebox(float p_margin_left = -1, float p_margin_top = -1, float p_margin_right = -1, float p_margin_bottom = -1) {
Ref<StyleBox> style(memnew(StyleBoxEmpty));
@@ -987,41 +1019,11 @@ void make_default_theme(bool p_hidpi, Ref<Font> p_font) {
if (p_font.is_valid()) {
default_font = p_font;
} else if (p_hidpi) {
TextServer::BitmapFontData data;
data.height = _hidpi_font_height;
data.ascent = _hidpi_font_ascent;
data.charcount = _hidpi_font_charcount;
data.char_rects = &_hidpi_font_charrects[0][0];
data.kerning_count = _hidpi_font_kerning_pair_count;
data.kernings = &_hidpi_font_kerning_pairs[0][0];
data.w = _hidpi_font_img_width;
data.h = _hidpi_font_img_height;
data.img = _hidpi_font_img_data;
Ref<FontData> font_data;
font_data.instance();
font_data->load_memory((const uint8_t *)&data, sizeof(data), "fnt");
default_font_size = font_data->get_base_size();
Ref<FontData> font_data = make_font(_hidpi_font_height, _hidpi_font_ascent, _hidpi_font_charcount, &_hidpi_font_charrects[0][0], _hidpi_font_kerning_pair_count, &_hidpi_font_kerning_pairs[0][0], _hidpi_font_img_width, _hidpi_font_img_height, _hidpi_font_img_data);
default_font.instance();
default_font->add_data(font_data);
} else {
TextServer::BitmapFontData data;
data.height = _lodpi_font_height;
data.ascent = _lodpi_font_ascent;
data.charcount = _lodpi_font_charcount;
data.char_rects = &_lodpi_font_charrects[0][0];
data.kerning_count = _lodpi_font_kerning_pair_count;
data.kernings = &_lodpi_font_kerning_pairs[0][0];
data.w = _lodpi_font_img_width;
data.h = _lodpi_font_img_height;
data.img = _lodpi_font_img_data;
Ref<FontData> font_data;
font_data.instance();
font_data->load_memory((const uint8_t *)&data, sizeof(data), "fnt");
default_font_size = font_data->get_base_size();
Ref<FontData> font_data = make_font(_lodpi_font_height, _lodpi_font_ascent, _lodpi_font_charcount, &_lodpi_font_charrects[0][0], _lodpi_font_kerning_pair_count, &_lodpi_font_kerning_pairs[0][0], _lodpi_font_img_width, _lodpi_font_img_height, _lodpi_font_img_data);
default_font.instance();
default_font->add_data(font_data);
}

View File

@@ -39,6 +39,11 @@
void FontData::_bind_methods() {
ClassDB::bind_method(D_METHOD("load_resource", "filename", "base_size"), &FontData::load_resource, DEFVAL(16));
ClassDB::bind_method(D_METHOD("load_memory", "data", "type", "base_size"), &FontData::_load_memory, DEFVAL(16));
ClassDB::bind_method(D_METHOD("new_bitmap", "height", "ascent", "base_size"), &FontData::new_bitmap);
ClassDB::bind_method(D_METHOD("bitmap_add_texture", "texture"), &FontData::bitmap_add_texture);
ClassDB::bind_method(D_METHOD("bitmap_add_char", "char", "texture_idx", "rect", "align", "advance"), &FontData::bitmap_add_char);
ClassDB::bind_method(D_METHOD("bitmap_add_kerning_pair", "A", "B", "kerning"), &FontData::bitmap_add_kerning_pair);
ClassDB::bind_method(D_METHOD("set_data_path", "path"), &FontData::set_data_path);
ClassDB::bind_method(D_METHOD("get_data_path"), &FontData::get_data_path);
@@ -219,6 +224,34 @@ void FontData::load_memory(const uint8_t *p_data, size_t p_size, const String &p
emit_changed();
}
void FontData::new_bitmap(float p_height, float p_ascent, int p_base_size) {
if (rid != RID()) {
TS->free(rid);
}
rid = TS->create_font_bitmap(p_height, p_ascent, p_base_size);
path = TTR("(Bitmap: " + String::num_int64(rid.get_id(), 16, true) + ")");
base_size = TS->font_get_base_size(rid);
emit_changed();
}
void FontData::bitmap_add_texture(const Ref<Texture> &p_texture) {
if (rid != RID()) {
TS->font_bitmap_add_texture(rid, p_texture);
}
}
void FontData::bitmap_add_char(char32_t p_char, int p_texture_idx, const Rect2 &p_rect, const Size2 &p_align, float p_advance) {
if (rid != RID()) {
TS->font_bitmap_add_char(rid, p_char, p_texture_idx, p_rect, p_align, p_advance);
}
}
void FontData::bitmap_add_kerning_pair(char32_t p_A, char32_t p_B, int p_kerning) {
if (rid != RID()) {
TS->font_bitmap_add_kerning_pair(rid, p_A, p_B, p_kerning);
}
}
void FontData::set_data_path(const String &p_path) {
load_resource(p_path, base_size);
}

View File

@@ -62,6 +62,12 @@ public:
void load_memory(const uint8_t *p_data, size_t p_size, const String &p_type, int p_base_size = 16);
void _load_memory(const PackedByteArray &p_data, const String &p_type, int p_base_size = 16);
void new_bitmap(float p_height, float p_ascent, int p_base_size = 16);
void bitmap_add_texture(const Ref<Texture> &p_texture);
void bitmap_add_char(char32_t p_char, int p_texture_idx, const Rect2 &p_rect, const Size2 &p_align, float p_advance);
void bitmap_add_kerning_pair(char32_t p_A, char32_t p_B, int p_kerning);
void set_data_path(const String &p_path);
String get_data_path() const;