diff options
Diffstat (limited to 'scene/resources/font.cpp')
-rw-r--r-- | scene/resources/font.cpp | 67 |
1 files changed, 55 insertions, 12 deletions
diff --git a/scene/resources/font.cpp b/scene/resources/font.cpp index 13b22ae12c..d0ad664c88 100644 --- a/scene/resources/font.cpp +++ b/scene/resources/font.cpp @@ -51,7 +51,7 @@ void Font::_bind_methods() { ClassDB::bind_method(D_METHOD("get_fallbacks"), &Font::get_fallbacks); // Output. - ClassDB::bind_method(D_METHOD("find_variation", "variation_coordinates", "face_index", "strength", "transform", "spacing_top", "spacing_bottom", "spacing_space", "spacing_glyph"), &Font::find_variation, DEFVAL(0), DEFVAL(0.0), DEFVAL(Transform2D()), DEFVAL(0), DEFVAL(0), DEFVAL(0), DEFVAL(0)); + ClassDB::bind_method(D_METHOD("find_variation", "variation_coordinates", "face_index", "strength", "transform", "spacing_top", "spacing_bottom", "spacing_space", "spacing_glyph", "baseline_offset"), &Font::find_variation, DEFVAL(0), DEFVAL(0.0), DEFVAL(Transform2D()), DEFVAL(0), DEFVAL(0), DEFVAL(0), DEFVAL(0), DEFVAL(0.0)); ClassDB::bind_method(D_METHOD("get_rids"), &Font::get_rids); // Font metrics. @@ -928,6 +928,9 @@ void FontFile::_bind_methods() { ClassDB::bind_method(D_METHOD("set_extra_spacing", "cache_index", "spacing", "value"), &FontFile::set_extra_spacing); ClassDB::bind_method(D_METHOD("get_extra_spacing", "cache_index", "spacing"), &FontFile::get_extra_spacing); + ClassDB::bind_method(D_METHOD("set_extra_baseline_offset", "cache_index", "baseline_offset"), &FontFile::set_extra_baseline_offset); + ClassDB::bind_method(D_METHOD("get_extra_baseline_offset", "cache_index"), &FontFile::get_extra_baseline_offset); + ClassDB::bind_method(D_METHOD("set_face_index", "cache_index", "face_index"), &FontFile::set_face_index); ClassDB::bind_method(D_METHOD("get_face_index", "cache_index"), &FontFile::get_face_index); @@ -1118,11 +1121,11 @@ bool FontFile::_set(const StringName &p_name, const Variant &p_value) { #endif // DISABLE_DEPRECATED if (tokens.size() == 2 && tokens[0] == "language_support_override") { - String lang_code = tokens[1]; + const String &lang_code = tokens[1]; set_language_support_override(lang_code, p_value); return true; } else if (tokens.size() == 2 && tokens[0] == "script_support_override") { - String script_code = tokens[1]; + const String &script_code = tokens[1]; set_script_support_override(script_code, p_value); return true; } else if (tokens.size() >= 3 && tokens[0] == "cache") { @@ -1151,6 +1154,9 @@ bool FontFile::_set(const StringName &p_name, const Variant &p_value) { } else if (tokens.size() == 3 && tokens[2] == "spacing_glyph") { set_extra_spacing(cache_index, TextServer::SPACING_GLYPH, p_value); return true; + } else if (tokens.size() == 3 && tokens[2] == "baseline_offset") { + set_extra_baseline_offset(cache_index, p_value); + return true; } if (tokens.size() >= 5) { Vector2i sz = Vector2i(tokens[2].to_int(), tokens[3].to_int()); @@ -1209,11 +1215,11 @@ bool FontFile::_set(const StringName &p_name, const Variant &p_value) { bool FontFile::_get(const StringName &p_name, Variant &r_ret) const { Vector<String> tokens = p_name.operator String().split("/"); if (tokens.size() == 2 && tokens[0] == "language_support_override") { - String lang_code = tokens[1]; + const String &lang_code = tokens[1]; r_ret = get_language_support_override(lang_code); return true; } else if (tokens.size() == 2 && tokens[0] == "script_support_override") { - String script_code = tokens[1]; + const String &script_code = tokens[1]; r_ret = get_script_support_override(script_code); return true; } else if (tokens.size() >= 3 && tokens[0] == "cache") { @@ -1242,6 +1248,9 @@ bool FontFile::_get(const StringName &p_name, Variant &r_ret) const { } else if (tokens.size() == 3 && tokens[2] == "spacing_glyph") { r_ret = get_extra_spacing(cache_index, TextServer::SPACING_GLYPH); return true; + } else if (tokens.size() == 3 && tokens[2] == "baseline_offset") { + r_ret = get_extra_baseline_offset(cache_index); + return true; } if (tokens.size() >= 5) { Vector2i sz = Vector2i(tokens[2].to_int(), tokens[3].to_int()); @@ -1317,6 +1326,7 @@ void FontFile::_get_property_list(List<PropertyInfo> *p_list) const { p_list->push_back(PropertyInfo(Variant::INT, prefix + "spacing_bottom", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE)); p_list->push_back(PropertyInfo(Variant::INT, prefix + "spacing_space", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE)); p_list->push_back(PropertyInfo(Variant::INT, prefix + "spacing_glyph", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE)); + p_list->push_back(PropertyInfo(Variant::FLOAT, prefix + "baseline_offset", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE)); for (int j = 0; j < sizes.size(); j++) { Vector2i sz = sizes[j]; @@ -2240,7 +2250,7 @@ real_t FontFile::get_oversampling() const { return oversampling; } -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 { +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, float p_baseline_offset) const { // Find existing variation cache. const Dictionary &supported_coords = get_supported_variation_list(); int make_linked_from = -1; @@ -2256,6 +2266,7 @@ RID FontFile::find_variation(const Dictionary &p_variation_coordinates, int p_fa 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); + match_linked = match_linked && (TS->font_get_baseline_offset(cache[i]) == p_baseline_offset); for (const Variant *V = supported_coords.next(nullptr); V && match; V = supported_coords.next(V)) { const Vector3 &def = supported_coords[*V]; @@ -2299,6 +2310,7 @@ RID FontFile::find_variation(const Dictionary &p_variation_coordinates, int p_fa 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); + TS->font_set_baseline_offset(cache[idx], p_baseline_offset); } else { _ensure_rid(idx); TS->font_set_variation_coordinates(cache[idx], p_variation_coordinates); @@ -2309,6 +2321,7 @@ RID FontFile::find_variation(const Dictionary &p_variation_coordinates, int p_fa 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); + TS->font_set_baseline_offset(cache[idx], p_baseline_offset); } return cache[idx]; } @@ -2403,6 +2416,18 @@ int64_t FontFile::get_extra_spacing(int p_cache_index, TextServer::SpacingType p return TS->font_get_spacing(cache[p_cache_index], p_spacing); } +float FontFile::get_extra_baseline_offset(int p_cache_index) const { + ERR_FAIL_COND_V(p_cache_index < 0, 0); + _ensure_rid(p_cache_index); + return TS->font_get_baseline_offset(cache[p_cache_index]); +} + +void FontFile::set_extra_baseline_offset(int p_cache_index, float p_baseline_offset) { + ERR_FAIL_COND(p_cache_index < 0); + _ensure_rid(p_cache_index); + TS->font_set_baseline_offset(cache[p_cache_index], p_baseline_offset); +} + void FontFile::set_face_index(int p_cache_index, int64_t p_index) { ERR_FAIL_COND(p_cache_index < 0); ERR_FAIL_COND(p_index < 0); @@ -2731,6 +2756,9 @@ void FontVariation::_bind_methods() { ClassDB::bind_method(D_METHOD("set_spacing", "spacing", "value"), &FontVariation::set_spacing); + ClassDB::bind_method(D_METHOD("set_baseline_offset", "baseline_offset"), &FontVariation::set_baseline_offset); + ClassDB::bind_method(D_METHOD("get_baseline_offset"), &FontVariation::get_baseline_offset); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "base_font", PROPERTY_HINT_RESOURCE_TYPE, "Font"), "set_base_font", "get_base_font"); ADD_GROUP("Variation", "variation_"); @@ -2747,6 +2775,9 @@ void FontVariation::_bind_methods() { ADD_PROPERTYI(PropertyInfo(Variant::INT, "spacing_space", PROPERTY_HINT_NONE, "suffix:px"), "set_spacing", "get_spacing", TextServer::SPACING_SPACE); ADD_PROPERTYI(PropertyInfo(Variant::INT, "spacing_top", PROPERTY_HINT_NONE, "suffix:px"), "set_spacing", "get_spacing", TextServer::SPACING_TOP); ADD_PROPERTYI(PropertyInfo(Variant::INT, "spacing_bottom", PROPERTY_HINT_NONE, "suffix:px"), "set_spacing", "get_spacing", TextServer::SPACING_BOTTOM); + + ADD_GROUP("Baseline", "baseline_"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "baseline_offset", PROPERTY_HINT_RANGE, "-2,2,0.005"), "set_baseline_offset", "get_baseline_offset"); } void FontVariation::_update_rids() const { @@ -2786,6 +2817,7 @@ void FontVariation::reset_state() { for (int i = 0; i < TextServer::SPACING_MAX; i++) { extra_spacing[i] = 0; } + baseline_offset = 0.0; Font::reset_state(); } @@ -2925,10 +2957,21 @@ int FontVariation::get_spacing(TextServer::SpacingType p_spacing) const { return extra_spacing[p_spacing]; } -RID FontVariation::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 { +void FontVariation::set_baseline_offset(float p_baseline_offset) { + if (baseline_offset != p_baseline_offset) { + baseline_offset = p_baseline_offset; + _invalidate_rids(); + } +} + +float FontVariation::get_baseline_offset() const { + return baseline_offset; +} + +RID FontVariation::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, float p_baseline_offset) const { Ref<Font> f = _get_base_font_or_default(); if (f.is_valid()) { - return f->find_variation(p_variation_coordinates, p_face_index, p_strength, p_transform, p_spacing_top, p_spacing_bottom, p_spacing_space, p_spacing_glyph); + return f->find_variation(p_variation_coordinates, p_face_index, p_strength, p_transform, p_spacing_top, p_spacing_bottom, p_spacing_space, p_spacing_glyph, p_baseline_offset); } return RID(); } @@ -2936,7 +2979,7 @@ RID FontVariation::find_variation(const Dictionary &p_variation_coordinates, int RID FontVariation::_get_rid() const { Ref<Font> f = _get_base_font_or_default(); if (f.is_valid()) { - return f->find_variation(variation.opentype, variation.face_index, variation.embolden, variation.transform, extra_spacing[TextServer::SPACING_TOP], extra_spacing[TextServer::SPACING_BOTTOM], extra_spacing[TextServer::SPACING_SPACE], extra_spacing[TextServer::SPACING_GLYPH]); + return f->find_variation(variation.opentype, variation.face_index, variation.embolden, variation.transform, extra_spacing[TextServer::SPACING_TOP], extra_spacing[TextServer::SPACING_BOTTOM], extra_spacing[TextServer::SPACING_SPACE], extra_spacing[TextServer::SPACING_GLYPH], baseline_offset); } return RID(); } @@ -3396,7 +3439,7 @@ int SystemFont::get_spacing(TextServer::SpacingType p_spacing) const { } } -RID SystemFont::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 { +RID SystemFont::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, float p_baseline_offset) const { Ref<Font> f = _get_base_font_or_default(); if (f.is_valid()) { Dictionary var = p_variation_coordinates; @@ -3412,9 +3455,9 @@ RID SystemFont::find_variation(const Dictionary &p_variation_coordinates, int p_ if (!face_indeces.is_empty()) { int face_index = CLAMP(p_face_index, 0, face_indeces.size() - 1); - return f->find_variation(var, face_indeces[face_index], p_strength, p_transform, p_spacing_top, p_spacing_bottom, p_spacing_space, p_spacing_glyph); + return f->find_variation(var, face_indeces[face_index], p_strength, p_transform, p_spacing_top, p_spacing_bottom, p_spacing_space, p_spacing_glyph, p_baseline_offset); } else { - return f->find_variation(var, 0, p_strength, p_transform, p_spacing_top, p_spacing_bottom, p_spacing_space, p_spacing_glyph); + return f->find_variation(var, 0, p_strength, p_transform, p_spacing_top, p_spacing_bottom, p_spacing_space, p_spacing_glyph, p_baseline_offset); } } return RID(); |