summaryrefslogtreecommitdiffstats
path: root/scene
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2024-01-29 13:17:52 +0100
committerRémi Verschelde <rverschelde@gmail.com>2024-01-29 13:17:52 +0100
commit5c61803971a906b65cf1b61d3856b66b4737efe6 (patch)
tree9750ea34f1286d4aa83d6e37d4d335da955fa752 /scene
parent9a789adff27ccaae2e0445d4c60289f00ea8d9df (diff)
parent85df221610e72e4b93f4eaf57a2f470c6da8e54d (diff)
downloadredot-engine-5c61803971a906b65cf1b61d3856b66b4737efe6.tar.gz
Merge pull request #87668 from bruvzg/add_baseline_offset
[TextServer / Font] Add support for customizable baseline offset.
Diffstat (limited to 'scene')
-rw-r--r--scene/resources/font.compat.inc7
-rw-r--r--scene/resources/font.cpp59
-rw-r--r--scene/resources/font.h20
-rw-r--r--scene/resources/text_paragraph.h3
4 files changed, 71 insertions, 18 deletions
diff --git a/scene/resources/font.compat.inc b/scene/resources/font.compat.inc
index bf50432556..23fdee229d 100644
--- a/scene/resources/font.compat.inc
+++ b/scene/resources/font.compat.inc
@@ -31,11 +31,16 @@
#ifndef DISABLE_DEPRECATED
RID Font::_find_variation_compat_80954(const Dictionary &p_variation_coordinates, int p_face_index, float p_strength, Transform2D p_transform) const {
- return find_variation(p_variation_coordinates, p_face_index, p_strength, p_transform, 0, 0, 0, 0);
+ return find_variation(p_variation_coordinates, p_face_index, p_strength, p_transform, 0, 0, 0, 0, 0.0);
+}
+
+RID Font::_find_variation_compat_87668(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 {
+ return find_variation(p_variation_coordinates, p_face_index, p_strength, p_transform, p_spacing_top, p_spacing_bottom, p_spacing_space, p_spacing_glyph, 0.0);
}
void Font::_bind_compatibility_methods() {
ClassDB::bind_compatibility_method(D_METHOD("find_variation", "variation_coordinates", "face_index", "strength", "transform"), &Font::_find_variation_compat_80954, DEFVAL(0), DEFVAL(0.0), DEFVAL(Transform2D()));
+ ClassDB::bind_compatibility_method(D_METHOD("find_variation", "variation_coordinates", "face_index", "strength", "transform", "spacing_top", "spacing_bottom", "spacing_space", "spacing_glyph"), &Font::_find_variation_compat_87668, DEFVAL(0), DEFVAL(0.0), DEFVAL(Transform2D()), DEFVAL(0), DEFVAL(0), DEFVAL(0), DEFVAL(0));
}
#endif
diff --git a/scene/resources/font.cpp b/scene/resources/font.cpp
index 60c3816020..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);
@@ -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());
@@ -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();
diff --git a/scene/resources/font.h b/scene/resources/font.h
index 77bff8e8b0..1cce46a3e3 100644
--- a/scene/resources/font.h
+++ b/scene/resources/font.h
@@ -105,6 +105,7 @@ protected:
#ifndef DISABLE_DEPRECATED
RID _find_variation_compat_80954(const Dictionary &p_variation_coordinates, int p_face_index = 0, float p_strength = 0.0, Transform2D p_transform = Transform2D()) const;
+ RID _find_variation_compat_87668(const Dictionary &p_variation_coordinates, int p_face_index = 0, float p_strength = 0.0, Transform2D p_transform = Transform2D(), int p_spacing_top = 0, int p_spacing_bottom = 0, int p_spacing_space = 0, int p_spacing_glyph = 0) const;
static void _bind_compatibility_methods();
#endif
@@ -118,8 +119,8 @@ public:
virtual TypedArray<Font> get_fallbacks() const;
// Output.
- virtual RID find_variation(const Dictionary &p_variation_coordinates, int p_face_index = 0, float p_strength = 0.0, Transform2D p_transform = Transform2D(), int p_spacing_top = 0, int p_spacing_bottom = 0, int p_spacing_space = 0, int p_spacing_glyph = 0) const { return RID(); };
- virtual RID _get_rid() const { return RID(); };
+ virtual RID find_variation(const Dictionary &p_variation_coordinates, int p_face_index = 0, float p_strength = 0.0, Transform2D p_transform = Transform2D(), int p_spacing_top = 0, int p_spacing_bottom = 0, int p_spacing_space = 0, int p_spacing_glyph = 0, float p_baseline_offset = 0.0) const { return RID(); }
+ virtual RID _get_rid() const { return RID(); }
virtual TypedArray<RID> get_rids() const;
// Font metrics.
@@ -136,7 +137,7 @@ public:
virtual int get_font_weight() const;
virtual int get_font_stretch() const;
- virtual int get_spacing(TextServer::SpacingType p_spacing) const { return 0; };
+ virtual int get_spacing(TextServer::SpacingType p_spacing) const { return 0; }
virtual Dictionary get_opentype_features() const;
// Drawing string.
@@ -277,7 +278,7 @@ public:
virtual real_t get_oversampling() const;
// Cache.
- virtual RID find_variation(const Dictionary &p_variation_coordinates, int p_face_index = 0, float p_strength = 0.0, Transform2D p_transform = Transform2D(), int p_spacing_top = 0, int p_spacing_bottom = 0, int p_spacing_space = 0, int p_spacing_glyph = 0) const override;
+ virtual RID find_variation(const Dictionary &p_variation_coordinates, int p_face_index = 0, float p_strength = 0.0, Transform2D p_transform = Transform2D(), int p_spacing_top = 0, int p_spacing_bottom = 0, int p_spacing_space = 0, int p_spacing_glyph = 0, float p_baseline_offset = 0.0) const override;
virtual RID _get_rid() const override;
virtual int get_cache_count() const;
@@ -300,6 +301,9 @@ public:
virtual void set_extra_spacing(int p_cache_index, TextServer::SpacingType p_spacing, int64_t p_value);
virtual int64_t get_extra_spacing(int p_cache_index, TextServer::SpacingType p_spacing) const;
+ virtual float get_extra_baseline_offset(int p_cache_index) const;
+ virtual void set_extra_baseline_offset(int p_cache_index, float p_baseline_offset);
+
virtual void set_face_index(int p_cache_index, int64_t p_index);
virtual int64_t get_face_index(int p_cache_index) const;
@@ -400,6 +404,7 @@ class FontVariation : public Font {
Variation variation;
Dictionary opentype_features;
int extra_spacing[TextServer::SPACING_MAX];
+ float baseline_offset = 0.0;
protected:
static void _bind_methods();
@@ -431,8 +436,11 @@ public:
virtual void set_spacing(TextServer::SpacingType p_spacing, int p_value);
virtual int get_spacing(TextServer::SpacingType p_spacing) const override;
+ virtual float get_baseline_offset() const;
+ virtual void set_baseline_offset(float p_baseline_offset);
+
// Output.
- virtual RID find_variation(const Dictionary &p_variation_coordinates, int p_face_index = 0, float p_strength = 0.0, Transform2D p_transform = Transform2D(), int p_spacing_top = 0, int p_spacing_bottom = 0, int p_spacing_space = 0, int p_spacing_glyph = 0) const override;
+ virtual RID find_variation(const Dictionary &p_variation_coordinates, int p_face_index = 0, float p_strength = 0.0, Transform2D p_transform = Transform2D(), int p_spacing_top = 0, int p_spacing_bottom = 0, int p_spacing_space = 0, int p_spacing_glyph = 0, float p_baseline_offset = 0.0) const override;
virtual RID _get_rid() const override;
FontVariation();
@@ -525,7 +533,7 @@ public:
virtual int get_spacing(TextServer::SpacingType p_spacing) const override;
- virtual RID find_variation(const Dictionary &p_variation_coordinates, int p_face_index = 0, float p_strength = 0.0, Transform2D p_transform = Transform2D(), int p_spacing_top = 0, int p_spacing_bottom = 0, int p_spacing_space = 0, int p_spacing_glyph = 0) const override;
+ virtual RID find_variation(const Dictionary &p_variation_coordinates, int p_face_index = 0, float p_strength = 0.0, Transform2D p_transform = Transform2D(), int p_spacing_top = 0, int p_spacing_bottom = 0, int p_spacing_space = 0, int p_spacing_glyph = 0, float p_baseline_offset = 0.0) const override;
virtual RID _get_rid() const override;
int64_t get_face_count() const override;
diff --git a/scene/resources/text_paragraph.h b/scene/resources/text_paragraph.h
index 28c69967ac..7512955fb3 100644
--- a/scene/resources/text_paragraph.h
+++ b/scene/resources/text_paragraph.h
@@ -138,9 +138,6 @@ public:
float get_line_underline_position(int p_line) const;
float get_line_underline_thickness(int p_line) const;
- int get_spacing_top() const;
- int get_spacing_bottom() const;
-
Size2 get_dropcap_size() const;
int get_dropcap_lines() const;