[Text Server] Restores bitmap font dynamic construction functions.
This commit is contained in:
@@ -74,6 +74,10 @@ typedef struct {
|
||||
godot_rid (*create_font_system)(void *, const godot_string *, int);
|
||||
godot_rid (*create_font_resource)(void *, const godot_string *, int);
|
||||
godot_rid (*create_font_memory)(void *, const uint8_t *, size_t, godot_string *, int);
|
||||
godot_rid (*create_font_bitmap)(void *, float, float, int);
|
||||
void (*font_bitmap_add_texture)(void *, godot_rid *, const godot_object *);
|
||||
void (*font_bitmap_add_char)(void *, godot_rid *, char32_t, int, const godot_rect2 *, const godot_vector2 *, float);
|
||||
void (*font_bitmap_add_kerning_pair)(void *, godot_rid *, char32_t, char32_t, int);
|
||||
float (*font_get_height)(void *, godot_rid *, int);
|
||||
float (*font_get_ascent)(void *, godot_rid *, int);
|
||||
float (*font_get_descent)(void *, godot_rid *, int);
|
||||
|
||||
@@ -113,6 +113,28 @@ RID TextServerGDNative::create_font_memory(const uint8_t *p_data, size_t p_size,
|
||||
return rid;
|
||||
}
|
||||
|
||||
RID TextServerGDNative::create_font_bitmap(float p_height, float p_ascent, int p_base_size) {
|
||||
ERR_FAIL_COND_V(interface == nullptr, RID());
|
||||
godot_rid result = interface->create_font_bitmap(data, p_height, p_ascent, p_base_size);
|
||||
RID rid = *(RID *)&result;
|
||||
return rid;
|
||||
}
|
||||
|
||||
void TextServerGDNative::font_bitmap_add_texture(RID p_font, const Ref<Texture> &p_texture) {
|
||||
ERR_FAIL_COND(interface == nullptr);
|
||||
interface->font_bitmap_add_texture(data, (godot_rid *)&p_font, (const godot_object *)p_texture.ptr());
|
||||
}
|
||||
|
||||
void TextServerGDNative::font_bitmap_add_char(RID p_font, char32_t p_char, int p_texture_idx, const Rect2 &p_rect, const Size2 &p_align, float p_advance) {
|
||||
ERR_FAIL_COND(interface == nullptr);
|
||||
interface->font_bitmap_add_char(data, (godot_rid *)&p_font, p_char, p_texture_idx, (const godot_rect2 *)&p_rect, (const godot_vector2 *)&p_align, p_advance);
|
||||
}
|
||||
|
||||
void TextServerGDNative::font_bitmap_add_kerning_pair(RID p_font, char32_t p_A, char32_t p_B, int p_kerning) {
|
||||
ERR_FAIL_COND(interface == nullptr);
|
||||
interface->font_bitmap_add_kerning_pair(data, (godot_rid *)&p_font, p_A, p_B, p_kerning);
|
||||
}
|
||||
|
||||
float TextServerGDNative::font_get_height(RID p_font, int p_size) const {
|
||||
ERR_FAIL_COND_V(interface == nullptr, 0.f);
|
||||
return interface->font_get_height(data, (godot_rid *)&p_font, p_size);
|
||||
|
||||
@@ -64,6 +64,11 @@ public:
|
||||
virtual RID create_font_system(const String &p_name, int p_base_size = 16) override;
|
||||
virtual RID create_font_resource(const String &p_filename, int p_base_size = 16) override;
|
||||
virtual RID create_font_memory(const uint8_t *p_data, size_t p_size, const String &p_type, int p_base_size = 16) override;
|
||||
virtual RID create_font_bitmap(float p_height, float p_ascent, int p_base_size = 16) override;
|
||||
|
||||
virtual void font_bitmap_add_texture(RID p_font, const Ref<Texture> &p_texture) override;
|
||||
virtual void font_bitmap_add_char(RID p_font, char32_t p_char, int p_texture_idx, const Rect2 &p_rect, const Size2 &p_align, float p_advance) override;
|
||||
virtual void font_bitmap_add_kerning_pair(RID p_font, char32_t p_A, char32_t p_B, int p_kerning) override;
|
||||
|
||||
virtual float font_get_height(RID p_font, int p_size) const override;
|
||||
virtual float font_get_ascent(RID p_font, int p_size) const override;
|
||||
|
||||
@@ -367,63 +367,65 @@ Error BitmapFontDataAdvanced::load_from_file(const String &p_filename, int p_bas
|
||||
return OK;
|
||||
}
|
||||
|
||||
Error BitmapFontDataAdvanced::load_from_memory(const uint8_t *p_data, size_t p_size, int p_base_size) {
|
||||
_THREAD_SAFE_METHOD_
|
||||
ERR_FAIL_COND_V(p_data == nullptr, ERR_CANT_CREATE);
|
||||
ERR_FAIL_COND_V(p_size != sizeof(TextServer::BitmapFontData), ERR_CANT_CREATE);
|
||||
|
||||
const TextServer::BitmapFontData *data = (const TextServer::BitmapFontData *)p_data;
|
||||
|
||||
if (RenderingServer::get_singleton() != nullptr) {
|
||||
Ref<Image> image = memnew(Image(data->img));
|
||||
Ref<ImageTexture> tex = memnew(ImageTexture);
|
||||
tex->create_from_image(image);
|
||||
|
||||
textures.push_back(tex);
|
||||
}
|
||||
|
||||
for (int i = 0; i < data->charcount; i++) {
|
||||
const int *c = &data->char_rects[i * 8];
|
||||
|
||||
Character chr;
|
||||
chr.rect.position.x = c[1];
|
||||
chr.rect.position.y = c[2];
|
||||
chr.rect.size.x = c[3];
|
||||
chr.rect.size.y = c[4];
|
||||
if (c[7] < 0) {
|
||||
chr.advance.x = c[3];
|
||||
} else {
|
||||
chr.advance.x = c[7];
|
||||
}
|
||||
chr.align = Vector2(c[6], c[5]);
|
||||
char_map[c[0]] = chr;
|
||||
}
|
||||
|
||||
for (int i = 0; i < data->kerning_count; i++) {
|
||||
KerningPairKey kpk;
|
||||
kpk.A = data->kernings[i * 3 + 0];
|
||||
kpk.B = data->kernings[i * 3 + 1];
|
||||
|
||||
if (data->kernings[i * 3 + 2] == 0 && kerning_map.has(kpk)) {
|
||||
kerning_map.erase(kpk);
|
||||
} else {
|
||||
kerning_map[kpk] = data->kernings[i * 3 + 2];
|
||||
}
|
||||
}
|
||||
|
||||
height = data->height;
|
||||
ascent = data->ascent;
|
||||
Error BitmapFontDataAdvanced::bitmap_new(float p_height, float p_ascent, int p_base_size) {
|
||||
height = p_height;
|
||||
ascent = p_ascent;
|
||||
|
||||
base_size = p_base_size;
|
||||
if (base_size == 0) {
|
||||
base_size = height;
|
||||
}
|
||||
|
||||
char_map.clear();
|
||||
textures.clear();
|
||||
kerning_map.clear();
|
||||
|
||||
for (Map<float, hb_font_t *>::Element *E = cache.front(); E; E = E->next()) {
|
||||
hb_font_destroy(E->get());
|
||||
}
|
||||
cache.clear();
|
||||
|
||||
valid = true;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
void BitmapFontDataAdvanced::bitmap_add_texture(const Ref<Texture> &p_texture) {
|
||||
ERR_FAIL_COND(!valid);
|
||||
ERR_FAIL_COND_MSG(p_texture.is_null(), "It's not a reference to a valid Texture object.");
|
||||
|
||||
textures.push_back(p_texture);
|
||||
}
|
||||
|
||||
void BitmapFontDataAdvanced::bitmap_add_char(char32_t p_char, int p_texture_idx, const Rect2 &p_rect, const Size2 &p_align, float p_advance) {
|
||||
ERR_FAIL_COND(!valid);
|
||||
|
||||
Character chr;
|
||||
chr.rect = p_rect;
|
||||
chr.texture_idx = p_texture_idx;
|
||||
if (p_advance < 0) {
|
||||
chr.advance.x = chr.rect.size.x;
|
||||
} else {
|
||||
chr.advance.x = p_advance;
|
||||
}
|
||||
chr.align = p_align;
|
||||
char_map[p_char] = chr;
|
||||
}
|
||||
|
||||
void BitmapFontDataAdvanced::bitmap_add_kerning_pair(char32_t p_A, char32_t p_B, int p_kerning) {
|
||||
ERR_FAIL_COND(!valid);
|
||||
|
||||
KerningPairKey kpk;
|
||||
kpk.A = p_A;
|
||||
kpk.B = p_B;
|
||||
|
||||
if (p_kerning == 0 && kerning_map.has(kpk)) {
|
||||
kerning_map.erase(kpk);
|
||||
} else {
|
||||
kerning_map[kpk] = p_kerning;
|
||||
}
|
||||
}
|
||||
|
||||
float BitmapFontDataAdvanced::get_height(int p_size) const {
|
||||
ERR_FAIL_COND_V(!valid, 0.f);
|
||||
return height * (float(p_size) / float(base_size));
|
||||
|
||||
@@ -74,7 +74,11 @@ public:
|
||||
virtual void clear_cache() override{};
|
||||
|
||||
virtual Error load_from_file(const String &p_filename, int p_base_size) override;
|
||||
virtual Error load_from_memory(const uint8_t *p_data, size_t p_size, int p_base_size) override;
|
||||
virtual Error bitmap_new(float p_height, float p_ascent, int p_base_size) override;
|
||||
|
||||
virtual void bitmap_add_texture(const Ref<Texture> &p_texture) override;
|
||||
virtual void bitmap_add_char(char32_t p_char, int p_texture_idx, const Rect2 &p_rect, const Size2 &p_align, float p_advance) override;
|
||||
virtual void bitmap_add_kerning_pair(char32_t p_A, char32_t p_B, int p_kerning) override;
|
||||
|
||||
virtual float get_height(int p_size) const override;
|
||||
virtual float get_ascent(int p_size) const override;
|
||||
|
||||
@@ -42,8 +42,13 @@ struct FontDataAdvanced {
|
||||
|
||||
virtual void clear_cache() = 0;
|
||||
|
||||
virtual Error load_from_file(const String &p_filename, int p_base_size) = 0;
|
||||
virtual Error load_from_memory(const uint8_t *p_data, size_t p_size, int p_base_size) = 0;
|
||||
virtual Error load_from_file(const String &p_filename, int p_base_size) { return ERR_CANT_CREATE; };
|
||||
virtual Error load_from_memory(const uint8_t *p_data, size_t p_size, int p_base_size) { return ERR_CANT_CREATE; };
|
||||
virtual Error bitmap_new(float p_height, float p_ascent, int p_base_size) { return ERR_CANT_CREATE; };
|
||||
|
||||
virtual void bitmap_add_texture(const Ref<Texture> &p_texture) { ERR_FAIL_MSG("Not supported."); };
|
||||
virtual void bitmap_add_char(char32_t p_char, int p_texture_idx, const Rect2 &p_rect, const Size2 &p_align, float p_advance) { ERR_FAIL_MSG("Not supported."); };
|
||||
virtual void bitmap_add_kerning_pair(char32_t p_A, char32_t p_B, int p_kerning) { ERR_FAIL_MSG("Not supported."); };
|
||||
|
||||
virtual float get_height(int p_size) const = 0;
|
||||
virtual float get_ascent(int p_size) const = 0;
|
||||
|
||||
@@ -566,6 +566,39 @@ RID TextServerAdvanced::create_font_memory(const uint8_t *p_data, size_t p_size,
|
||||
return font_owner.make_rid(fd);
|
||||
}
|
||||
|
||||
RID TextServerAdvanced::create_font_bitmap(float p_height, float p_ascent, int p_base_size) {
|
||||
_THREAD_SAFE_METHOD_
|
||||
FontDataAdvanced *fd = memnew(BitmapFontDataAdvanced);
|
||||
Error err = fd->bitmap_new(p_height, p_ascent, p_base_size);
|
||||
if (err != OK) {
|
||||
memdelete(fd);
|
||||
return RID();
|
||||
}
|
||||
|
||||
return font_owner.make_rid(fd);
|
||||
}
|
||||
|
||||
void TextServerAdvanced::font_bitmap_add_texture(RID p_font, const Ref<Texture> &p_texture) {
|
||||
_THREAD_SAFE_METHOD_
|
||||
FontDataAdvanced *fd = font_owner.getornull(p_font);
|
||||
ERR_FAIL_COND(!fd);
|
||||
fd->bitmap_add_texture(p_texture);
|
||||
}
|
||||
|
||||
void TextServerAdvanced::font_bitmap_add_char(RID p_font, char32_t p_char, int p_texture_idx, const Rect2 &p_rect, const Size2 &p_align, float p_advance) {
|
||||
_THREAD_SAFE_METHOD_
|
||||
FontDataAdvanced *fd = font_owner.getornull(p_font);
|
||||
ERR_FAIL_COND(!fd);
|
||||
fd->bitmap_add_char(p_char, p_texture_idx, p_rect, p_align, p_advance);
|
||||
}
|
||||
|
||||
void TextServerAdvanced::font_bitmap_add_kerning_pair(RID p_font, char32_t p_A, char32_t p_B, int p_kerning) {
|
||||
_THREAD_SAFE_METHOD_
|
||||
FontDataAdvanced *fd = font_owner.getornull(p_font);
|
||||
ERR_FAIL_COND(!fd);
|
||||
fd->bitmap_add_kerning_pair(p_A, p_B, p_kerning);
|
||||
}
|
||||
|
||||
float TextServerAdvanced::font_get_height(RID p_font, int p_size) const {
|
||||
_THREAD_SAFE_METHOD_
|
||||
const FontDataAdvanced *fd = font_owner.getornull(p_font);
|
||||
|
||||
@@ -126,6 +126,11 @@ public:
|
||||
virtual RID create_font_system(const String &p_name, int p_base_size = 16) override;
|
||||
virtual RID create_font_resource(const String &p_filename, int p_base_size = 16) override;
|
||||
virtual RID create_font_memory(const uint8_t *p_data, size_t p_size, const String &p_type, int p_base_size = 16) override;
|
||||
virtual RID create_font_bitmap(float p_height, float p_ascent, int p_base_size = 16) override;
|
||||
|
||||
virtual void font_bitmap_add_texture(RID p_font, const Ref<Texture> &p_texture) override;
|
||||
virtual void font_bitmap_add_char(RID p_font, char32_t p_char, int p_texture_idx, const Rect2 &p_rect, const Size2 &p_align, float p_advance) override;
|
||||
virtual void font_bitmap_add_kerning_pair(RID p_font, char32_t p_A, char32_t p_B, int p_kerning) override;
|
||||
|
||||
virtual float font_get_height(RID p_font, int p_size) const override;
|
||||
virtual float font_get_ascent(RID p_font, int p_size) const override;
|
||||
|
||||
@@ -175,63 +175,60 @@ Error BitmapFontDataFallback::load_from_file(const String &p_filename, int p_bas
|
||||
return OK;
|
||||
}
|
||||
|
||||
Error BitmapFontDataFallback::load_from_memory(const uint8_t *p_data, size_t p_size, int p_base_size) {
|
||||
_THREAD_SAFE_METHOD_
|
||||
ERR_FAIL_COND_V(p_data == nullptr, ERR_CANT_CREATE);
|
||||
ERR_FAIL_COND_V(p_size != sizeof(TextServer::BitmapFontData), ERR_CANT_CREATE);
|
||||
|
||||
const TextServer::BitmapFontData *data = (const TextServer::BitmapFontData *)p_data;
|
||||
|
||||
if (RenderingServer::get_singleton() != nullptr) {
|
||||
Ref<Image> image = memnew(Image(data->img));
|
||||
Ref<ImageTexture> tex = memnew(ImageTexture);
|
||||
tex->create_from_image(image);
|
||||
|
||||
textures.push_back(tex);
|
||||
}
|
||||
|
||||
for (int i = 0; i < data->charcount; i++) {
|
||||
const int *c = &data->char_rects[i * 8];
|
||||
|
||||
Character chr;
|
||||
chr.rect.position.x = c[1];
|
||||
chr.rect.position.y = c[2];
|
||||
chr.rect.size.x = c[3];
|
||||
chr.rect.size.y = c[4];
|
||||
if (c[7] < 0) {
|
||||
chr.advance.x = c[3];
|
||||
} else {
|
||||
chr.advance.x = c[7];
|
||||
}
|
||||
chr.align = Vector2(c[6], c[5]);
|
||||
char_map[c[0]] = chr;
|
||||
}
|
||||
|
||||
for (int i = 0; i < data->kerning_count; i++) {
|
||||
KerningPairKey kpk;
|
||||
kpk.A = data->kernings[i * 3 + 0];
|
||||
kpk.B = data->kernings[i * 3 + 1];
|
||||
|
||||
if (data->kernings[i * 3 + 2] == 0 && kerning_map.has(kpk)) {
|
||||
kerning_map.erase(kpk);
|
||||
} else {
|
||||
kerning_map[kpk] = data->kernings[i * 3 + 2];
|
||||
}
|
||||
}
|
||||
|
||||
height = data->height;
|
||||
ascent = data->ascent;
|
||||
Error BitmapFontDataFallback::bitmap_new(float p_height, float p_ascent, int p_base_size) {
|
||||
height = p_height;
|
||||
ascent = p_ascent;
|
||||
|
||||
base_size = p_base_size;
|
||||
if (base_size == 0) {
|
||||
base_size = height;
|
||||
}
|
||||
|
||||
char_map.clear();
|
||||
textures.clear();
|
||||
kerning_map.clear();
|
||||
|
||||
valid = true;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
void BitmapFontDataFallback::bitmap_add_texture(const Ref<Texture> &p_texture) {
|
||||
ERR_FAIL_COND(!valid);
|
||||
ERR_FAIL_COND_MSG(p_texture.is_null(), "It's not a reference to a valid Texture object.");
|
||||
|
||||
textures.push_back(p_texture);
|
||||
}
|
||||
|
||||
void BitmapFontDataFallback::bitmap_add_char(char32_t p_char, int p_texture_idx, const Rect2 &p_rect, const Size2 &p_align, float p_advance) {
|
||||
ERR_FAIL_COND(!valid);
|
||||
|
||||
Character chr;
|
||||
chr.rect = p_rect;
|
||||
chr.texture_idx = p_texture_idx;
|
||||
if (p_advance < 0) {
|
||||
chr.advance.x = chr.rect.size.x;
|
||||
} else {
|
||||
chr.advance.x = p_advance;
|
||||
}
|
||||
chr.align = p_align;
|
||||
char_map[p_char] = chr;
|
||||
}
|
||||
|
||||
void BitmapFontDataFallback::bitmap_add_kerning_pair(char32_t p_A, char32_t p_B, int p_kerning) {
|
||||
ERR_FAIL_COND(!valid);
|
||||
|
||||
KerningPairKey kpk;
|
||||
kpk.A = p_A;
|
||||
kpk.B = p_B;
|
||||
|
||||
if (p_kerning == 0 && kerning_map.has(kpk)) {
|
||||
kerning_map.erase(kpk);
|
||||
} else {
|
||||
kerning_map[kpk] = p_kerning;
|
||||
}
|
||||
}
|
||||
|
||||
float BitmapFontDataFallback::get_height(int p_size) const {
|
||||
ERR_FAIL_COND_V(!valid, 0.f);
|
||||
return height * (float(p_size) / float(base_size));
|
||||
|
||||
@@ -70,7 +70,11 @@ public:
|
||||
virtual void clear_cache() override{};
|
||||
|
||||
virtual Error load_from_file(const String &p_filename, int p_base_size) override;
|
||||
virtual Error load_from_memory(const uint8_t *p_data, size_t p_size, int p_base_size) override;
|
||||
virtual Error bitmap_new(float p_height, float p_ascent, int p_base_size) override;
|
||||
|
||||
virtual void bitmap_add_texture(const Ref<Texture> &p_texture) override;
|
||||
virtual void bitmap_add_char(char32_t p_char, int p_texture_idx, const Rect2 &p_rect, const Size2 &p_align, float p_advance) override;
|
||||
virtual void bitmap_add_kerning_pair(char32_t p_A, char32_t p_B, int p_kerning) override;
|
||||
|
||||
virtual float get_height(int p_size) const override;
|
||||
virtual float get_ascent(int p_size) const override;
|
||||
|
||||
@@ -40,8 +40,13 @@ struct FontDataFallback {
|
||||
|
||||
virtual void clear_cache() = 0;
|
||||
|
||||
virtual Error load_from_file(const String &p_filename, int p_base_size) = 0;
|
||||
virtual Error load_from_memory(const uint8_t *p_data, size_t p_size, int p_base_size) = 0;
|
||||
virtual Error load_from_file(const String &p_filename, int p_base_size) { return ERR_CANT_CREATE; };
|
||||
virtual Error load_from_memory(const uint8_t *p_data, size_t p_size, int p_base_size) { return ERR_CANT_CREATE; };
|
||||
virtual Error bitmap_new(float p_height, float p_ascent, int p_base_size) { return ERR_CANT_CREATE; };
|
||||
|
||||
virtual void bitmap_add_texture(const Ref<Texture> &p_texture) { ERR_FAIL_MSG("Not supported."); };
|
||||
virtual void bitmap_add_char(char32_t p_char, int p_texture_idx, const Rect2 &p_rect, const Size2 &p_align, float p_advance) { ERR_FAIL_MSG("Not supported."); };
|
||||
virtual void bitmap_add_kerning_pair(char32_t p_A, char32_t p_B, int p_kerning) { ERR_FAIL_MSG("Not supported."); };
|
||||
|
||||
virtual float get_height(int p_size) const = 0;
|
||||
virtual float get_ascent(int p_size) const = 0;
|
||||
|
||||
@@ -144,6 +144,39 @@ RID TextServerFallback::create_font_memory(const uint8_t *p_data, size_t p_size,
|
||||
return font_owner.make_rid(fd);
|
||||
}
|
||||
|
||||
RID TextServerFallback::create_font_bitmap(float p_height, float p_ascent, int p_base_size) {
|
||||
_THREAD_SAFE_METHOD_
|
||||
FontDataFallback *fd = memnew(BitmapFontDataFallback);
|
||||
Error err = fd->bitmap_new(p_height, p_ascent, p_base_size);
|
||||
if (err != OK) {
|
||||
memdelete(fd);
|
||||
return RID();
|
||||
}
|
||||
|
||||
return font_owner.make_rid(fd);
|
||||
}
|
||||
|
||||
void TextServerFallback::font_bitmap_add_texture(RID p_font, const Ref<Texture> &p_texture) {
|
||||
_THREAD_SAFE_METHOD_
|
||||
FontDataFallback *fd = font_owner.getornull(p_font);
|
||||
ERR_FAIL_COND(!fd);
|
||||
fd->bitmap_add_texture(p_texture);
|
||||
}
|
||||
|
||||
void TextServerFallback::font_bitmap_add_char(RID p_font, char32_t p_char, int p_texture_idx, const Rect2 &p_rect, const Size2 &p_align, float p_advance) {
|
||||
_THREAD_SAFE_METHOD_
|
||||
FontDataFallback *fd = font_owner.getornull(p_font);
|
||||
ERR_FAIL_COND(!fd);
|
||||
fd->bitmap_add_char(p_char, p_texture_idx, p_rect, p_align, p_advance);
|
||||
}
|
||||
|
||||
void TextServerFallback::font_bitmap_add_kerning_pair(RID p_font, char32_t p_A, char32_t p_B, int p_kerning) {
|
||||
_THREAD_SAFE_METHOD_
|
||||
FontDataFallback *fd = font_owner.getornull(p_font);
|
||||
ERR_FAIL_COND(!fd);
|
||||
fd->bitmap_add_kerning_pair(p_A, p_B, p_kerning);
|
||||
}
|
||||
|
||||
float TextServerFallback::font_get_height(RID p_font, int p_size) const {
|
||||
_THREAD_SAFE_METHOD_
|
||||
const FontDataFallback *fd = font_owner.getornull(p_font);
|
||||
|
||||
@@ -81,6 +81,11 @@ public:
|
||||
virtual RID create_font_system(const String &p_name, int p_base_size = 16) override;
|
||||
virtual RID create_font_resource(const String &p_filename, int p_base_size = 16) override;
|
||||
virtual RID create_font_memory(const uint8_t *p_data, size_t p_size, const String &p_type, int p_base_size = 16) override;
|
||||
virtual RID create_font_bitmap(float p_height, float p_ascent, int p_base_size = 16) override;
|
||||
|
||||
virtual void font_bitmap_add_texture(RID p_font, const Ref<Texture> &p_texture) override;
|
||||
virtual void font_bitmap_add_char(RID p_font, char32_t p_char, int p_texture_idx, const Rect2 &p_rect, const Size2 &p_align, float p_advance) override;
|
||||
virtual void font_bitmap_add_kerning_pair(RID p_font, char32_t p_A, char32_t p_B, int p_kerning) override;
|
||||
|
||||
virtual float font_get_height(RID p_font, int p_size) const override;
|
||||
virtual float font_get_ascent(RID p_font, int p_size) const override;
|
||||
|
||||
Reference in New Issue
Block a user