summaryrefslogtreecommitdiffstats
path: root/scene/resources/font.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scene/resources/font.cpp')
-rw-r--r--scene/resources/font.cpp85
1 files changed, 54 insertions, 31 deletions
diff --git a/scene/resources/font.cpp b/scene/resources/font.cpp
index 7aa2f8e178..cb9cda59b2 100644
--- a/scene/resources/font.cpp
+++ b/scene/resources/font.cpp
@@ -558,24 +558,28 @@ _FORCE_INLINE_ void FontFile::_clear_cache() {
}
}
-_FORCE_INLINE_ void FontFile::_ensure_rid(int p_cache_index) const {
+_FORCE_INLINE_ void FontFile::_ensure_rid(int p_cache_index, int p_make_linked_from) const {
if (unlikely(p_cache_index >= cache.size())) {
cache.resize(p_cache_index + 1);
}
if (unlikely(!cache[p_cache_index].is_valid())) {
- cache.write[p_cache_index] = TS->create_font();
- TS->font_set_data_ptr(cache[p_cache_index], data_ptr, data_size);
- TS->font_set_antialiasing(cache[p_cache_index], antialiasing);
- TS->font_set_generate_mipmaps(cache[p_cache_index], mipmaps);
- TS->font_set_multichannel_signed_distance_field(cache[p_cache_index], msdf);
- TS->font_set_msdf_pixel_range(cache[p_cache_index], msdf_pixel_range);
- TS->font_set_msdf_size(cache[p_cache_index], msdf_size);
- TS->font_set_fixed_size(cache[p_cache_index], fixed_size);
- TS->font_set_force_autohinter(cache[p_cache_index], force_autohinter);
- TS->font_set_allow_system_fallback(cache[p_cache_index], allow_system_fallback);
- TS->font_set_hinting(cache[p_cache_index], hinting);
- TS->font_set_subpixel_positioning(cache[p_cache_index], subpixel_positioning);
- TS->font_set_oversampling(cache[p_cache_index], oversampling);
+ if (p_make_linked_from >= 0 && p_make_linked_from != p_cache_index && p_make_linked_from < cache.size()) {
+ cache.write[p_cache_index] = TS->create_font_linked_variation(cache[p_make_linked_from]);
+ } else {
+ cache.write[p_cache_index] = TS->create_font();
+ TS->font_set_data_ptr(cache[p_cache_index], data_ptr, data_size);
+ TS->font_set_antialiasing(cache[p_cache_index], antialiasing);
+ TS->font_set_generate_mipmaps(cache[p_cache_index], mipmaps);
+ TS->font_set_multichannel_signed_distance_field(cache[p_cache_index], msdf);
+ TS->font_set_msdf_pixel_range(cache[p_cache_index], msdf_pixel_range);
+ TS->font_set_msdf_size(cache[p_cache_index], msdf_size);
+ TS->font_set_fixed_size(cache[p_cache_index], fixed_size);
+ TS->font_set_force_autohinter(cache[p_cache_index], force_autohinter);
+ TS->font_set_allow_system_fallback(cache[p_cache_index], allow_system_fallback);
+ TS->font_set_hinting(cache[p_cache_index], hinting);
+ TS->font_set_subpixel_positioning(cache[p_cache_index], subpixel_positioning);
+ TS->font_set_oversampling(cache[p_cache_index], oversampling);
+ }
}
}
@@ -2218,17 +2222,19 @@ real_t FontFile::get_oversampling() const {
RID FontFile::find_variation(const Dictionary &p_variation_coordinates, int p_face_index, float p_strength, Transform2D p_transform, int p_spacing_top, int p_spacing_bottom, int p_spacing_space, int p_spacing_glyph) const {
// Find existing variation cache.
const Dictionary &supported_coords = get_supported_variation_list();
+ int make_linked_from = -1;
for (int i = 0; i < cache.size(); i++) {
if (cache[i].is_valid()) {
const Dictionary &cache_var = TS->font_get_variation_coordinates(cache[i]);
bool match = true;
+ bool match_linked = true;
match = match && (TS->font_get_face_index(cache[i]) == p_face_index);
match = match && (TS->font_get_embolden(cache[i]) == p_strength);
match = match && (TS->font_get_transform(cache[i]) == p_transform);
- match = match && (TS->font_get_spacing(cache[i], TextServer::SPACING_TOP) == p_spacing_top);
- match = match && (TS->font_get_spacing(cache[i], TextServer::SPACING_BOTTOM) == p_spacing_bottom);
- match = match && (TS->font_get_spacing(cache[i], TextServer::SPACING_SPACE) == p_spacing_space);
- match = match && (TS->font_get_spacing(cache[i], TextServer::SPACING_GLYPH) == p_spacing_glyph);
+ match_linked = match_linked && (TS->font_get_spacing(cache[i], TextServer::SPACING_TOP) == p_spacing_top);
+ match_linked = match_linked && (TS->font_get_spacing(cache[i], TextServer::SPACING_BOTTOM) == p_spacing_bottom);
+ match_linked = match_linked && (TS->font_get_spacing(cache[i], TextServer::SPACING_SPACE) == p_spacing_space);
+ match_linked = match_linked && (TS->font_get_spacing(cache[i], TextServer::SPACING_GLYPH) == p_spacing_glyph);
for (const Variant *V = supported_coords.next(nullptr); V && match; V = supported_coords.next(V)) {
const Vector3 &def = supported_coords[*V];
@@ -2255,22 +2261,34 @@ RID FontFile::find_variation(const Dictionary &p_variation_coordinates, int p_fa
match = match && (c_v == s_v);
}
if (match) {
- return cache[i];
+ if (match_linked) {
+ return cache[i];
+ } else {
+ make_linked_from = i;
+ }
}
}
}
// Create new variation cache.
int idx = cache.size();
- _ensure_rid(idx);
- TS->font_set_variation_coordinates(cache[idx], p_variation_coordinates);
- TS->font_set_face_index(cache[idx], p_face_index);
- TS->font_set_embolden(cache[idx], p_strength);
- TS->font_set_transform(cache[idx], p_transform);
- TS->font_set_spacing(cache[idx], TextServer::SPACING_TOP, p_spacing_top);
- TS->font_set_spacing(cache[idx], TextServer::SPACING_BOTTOM, p_spacing_bottom);
- TS->font_set_spacing(cache[idx], TextServer::SPACING_SPACE, p_spacing_space);
- TS->font_set_spacing(cache[idx], TextServer::SPACING_GLYPH, p_spacing_glyph);
+ if (make_linked_from >= 0) {
+ _ensure_rid(idx, make_linked_from);
+ TS->font_set_spacing(cache[idx], TextServer::SPACING_TOP, p_spacing_top);
+ TS->font_set_spacing(cache[idx], TextServer::SPACING_BOTTOM, p_spacing_bottom);
+ TS->font_set_spacing(cache[idx], TextServer::SPACING_SPACE, p_spacing_space);
+ TS->font_set_spacing(cache[idx], TextServer::SPACING_GLYPH, p_spacing_glyph);
+ } else {
+ _ensure_rid(idx);
+ TS->font_set_variation_coordinates(cache[idx], p_variation_coordinates);
+ TS->font_set_face_index(cache[idx], p_face_index);
+ TS->font_set_embolden(cache[idx], p_strength);
+ TS->font_set_transform(cache[idx], p_transform);
+ TS->font_set_spacing(cache[idx], TextServer::SPACING_TOP, p_spacing_top);
+ TS->font_set_spacing(cache[idx], TextServer::SPACING_BOTTOM, p_spacing_bottom);
+ TS->font_set_spacing(cache[idx], TextServer::SPACING_SPACE, p_spacing_space);
+ TS->font_set_spacing(cache[idx], TextServer::SPACING_GLYPH, p_spacing_glyph);
+ }
return cache[idx];
}
@@ -3016,14 +3034,19 @@ void SystemFont::_update_base_font() {
continue;
}
- // If it's a font collection check all faces to match requested style.
+ // If it's a font collection check all faces to match requested style and name.
int best_score = 0;
for (int i = 0; i < file->get_face_count(); i++) {
+ int score = 0;
file->set_face_index(0, i);
+ const String n = file->get_font_name();
+ if (n.to_upper() == E.to_upper()) {
+ score += 80;
+ }
BitField<TextServer::FontStyle> style = file->get_font_style();
int font_weight = file->get_font_weight();
int font_stretch = file->get_font_stretch();
- int score = (20 - Math::abs(font_weight - weight) / 50);
+ score += (20 - Math::abs(font_weight - weight) / 50);
score += (20 - Math::abs(font_stretch - stretch) / 10);
if (bool(style & TextServer::FONT_ITALIC) == italic) {
score += 30;
@@ -3042,7 +3065,7 @@ void SystemFont::_update_base_font() {
file->set_face_index(0, face_indeces[0]);
// If it's a variable font, apply weight, stretch and italic coordinates to match requested style.
- if (best_score != 50) {
+ if (best_score != 150) {
Dictionary ftr = file->get_supported_variation_list();
if (ftr.has(TS->name_to_tag("width"))) {
ftr_stretch = stretch;