mirror of
https://github.com/godotengine/godot.git
synced 2025-12-07 22:00:10 +00:00
[TextServer] Reset subpixel shift on blank glyphs and import option to enable/disable it.
This commit is contained in:
parent
c6c464cf9a
commit
e81a2afbc4
18 changed files with 185 additions and 6 deletions
|
|
@ -2467,6 +2467,22 @@ TextServer::SubpixelPositioning TextServerAdvanced::_font_get_subpixel_positioni
|
|||
return fd->subpixel_positioning;
|
||||
}
|
||||
|
||||
void TextServerAdvanced::_font_set_keep_rounding_remainders(const RID &p_font_rid, bool p_keep_rounding_remainders) {
|
||||
FontAdvanced *fd = _get_font_data(p_font_rid);
|
||||
ERR_FAIL_NULL(fd);
|
||||
|
||||
MutexLock lock(fd->mutex);
|
||||
fd->keep_rounding_remainders = p_keep_rounding_remainders;
|
||||
}
|
||||
|
||||
bool TextServerAdvanced::_font_get_keep_rounding_remainders(const RID &p_font_rid) const {
|
||||
FontAdvanced *fd = _get_font_data(p_font_rid);
|
||||
ERR_FAIL_NULL_V(fd, false);
|
||||
|
||||
MutexLock lock(fd->mutex);
|
||||
return fd->keep_rounding_remainders;
|
||||
}
|
||||
|
||||
void TextServerAdvanced::_font_set_embolden(const RID &p_font_rid, double p_strength) {
|
||||
FontAdvanced *fd = _get_font_data(p_font_rid);
|
||||
ERR_FAIL_NULL(fd);
|
||||
|
|
@ -5195,6 +5211,7 @@ RID TextServerAdvanced::_find_sys_font_for_text(const RID &p_fdef, const String
|
|||
_font_set_force_autohinter(sysf.rid, key.force_autohinter);
|
||||
_font_set_hinting(sysf.rid, key.hinting);
|
||||
_font_set_subpixel_positioning(sysf.rid, key.subpixel_positioning);
|
||||
_font_set_keep_rounding_remainders(sysf.rid, key.keep_rounding_remainders);
|
||||
_font_set_variation_coordinates(sysf.rid, var);
|
||||
_font_set_oversampling(sysf.rid, key.oversampling);
|
||||
_font_set_embolden(sysf.rid, key.embolden);
|
||||
|
|
@ -6233,6 +6250,9 @@ void TextServerAdvanced::_shape_run(ShapedTextDataAdvanced *p_sd, int64_t p_star
|
|||
#endif
|
||||
|
||||
gl.index = glyph_info[i].codepoint;
|
||||
if ((p_sd->text[glyph_info[i].cluster] == 0x0009) || u_isblank(p_sd->text[glyph_info[i].cluster]) || is_linebreak(p_sd->text[glyph_info[i].cluster])) {
|
||||
adv_rem = 0.0; // Reset on blank.
|
||||
}
|
||||
if (gl.index != 0) {
|
||||
FontGlyph fgl;
|
||||
_ensure_glyph(fd, fss, gl.index | mod, fgl);
|
||||
|
|
@ -6254,12 +6274,16 @@ void TextServerAdvanced::_shape_run(ShapedTextDataAdvanced *p_sd, int64_t p_star
|
|||
} else {
|
||||
double full_adv = adv_rem + ((double)glyph_pos[i].x_advance / (64.0 / scale) + ea);
|
||||
gl.advance = Math::round(full_adv);
|
||||
adv_rem = full_adv - gl.advance;
|
||||
if (fd->keep_rounding_remainders) {
|
||||
adv_rem = full_adv - gl.advance;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
double full_adv = adv_rem + ((double)glyph_pos[i].y_advance / (64.0 / scale));
|
||||
gl.advance = -Math::round(full_adv);
|
||||
adv_rem = full_adv + gl.advance;
|
||||
if (fd->keep_rounding_remainders) {
|
||||
adv_rem = full_adv + gl.advance;
|
||||
}
|
||||
}
|
||||
if (p_sd->orientation == ORIENTATION_HORIZONTAL) {
|
||||
gl.y_off += _font_get_baseline_offset(gl.font_rid) * (double)(_font_get_ascent(gl.font_rid, gl.font_size) + _font_get_descent(gl.font_rid, gl.font_size));
|
||||
|
|
|
|||
|
|
@ -328,6 +328,7 @@ class TextServerAdvanced : public TextServerExtension {
|
|||
bool force_autohinter = false;
|
||||
TextServer::Hinting hinting = TextServer::HINTING_LIGHT;
|
||||
TextServer::SubpixelPositioning subpixel_positioning = TextServer::SUBPIXEL_POSITIONING_AUTO;
|
||||
bool keep_rounding_remainders = true;
|
||||
Dictionary variation_coordinates;
|
||||
double oversampling = 0.0;
|
||||
double embolden = 0.0;
|
||||
|
|
@ -588,6 +589,7 @@ class TextServerAdvanced : public TextServerExtension {
|
|||
int fixed_size = 0;
|
||||
TextServer::Hinting hinting = TextServer::HINTING_LIGHT;
|
||||
TextServer::SubpixelPositioning subpixel_positioning = TextServer::SUBPIXEL_POSITIONING_AUTO;
|
||||
bool keep_rounding_remainders = true;
|
||||
Dictionary variation_coordinates;
|
||||
double oversampling = 0.0;
|
||||
double embolden = 0.0;
|
||||
|
|
@ -596,7 +598,7 @@ class TextServerAdvanced : public TextServerExtension {
|
|||
double baseline_offset = 0.0;
|
||||
|
||||
bool operator==(const SystemFontKey &p_b) const {
|
||||
return (font_name == p_b.font_name) && (antialiasing == p_b.antialiasing) && (italic == p_b.italic) && (disable_embedded_bitmaps == p_b.disable_embedded_bitmaps) && (mipmaps == p_b.mipmaps) && (msdf == p_b.msdf) && (force_autohinter == p_b.force_autohinter) && (weight == p_b.weight) && (stretch == p_b.stretch) && (msdf_range == p_b.msdf_range) && (msdf_source_size == p_b.msdf_source_size) && (fixed_size == p_b.fixed_size) && (hinting == p_b.hinting) && (subpixel_positioning == p_b.subpixel_positioning) && (variation_coordinates == p_b.variation_coordinates) && (oversampling == p_b.oversampling) && (embolden == p_b.embolden) && (transform == p_b.transform) && (extra_spacing[SPACING_TOP] == p_b.extra_spacing[SPACING_TOP]) && (extra_spacing[SPACING_BOTTOM] == p_b.extra_spacing[SPACING_BOTTOM]) && (extra_spacing[SPACING_SPACE] == p_b.extra_spacing[SPACING_SPACE]) && (extra_spacing[SPACING_GLYPH] == p_b.extra_spacing[SPACING_GLYPH]) && (baseline_offset == p_b.baseline_offset);
|
||||
return (font_name == p_b.font_name) && (antialiasing == p_b.antialiasing) && (italic == p_b.italic) && (disable_embedded_bitmaps == p_b.disable_embedded_bitmaps) && (mipmaps == p_b.mipmaps) && (msdf == p_b.msdf) && (force_autohinter == p_b.force_autohinter) && (weight == p_b.weight) && (stretch == p_b.stretch) && (msdf_range == p_b.msdf_range) && (msdf_source_size == p_b.msdf_source_size) && (fixed_size == p_b.fixed_size) && (hinting == p_b.hinting) && (subpixel_positioning == p_b.subpixel_positioning) && (keep_rounding_remainders == p_b.keep_rounding_remainders) && (variation_coordinates == p_b.variation_coordinates) && (oversampling == p_b.oversampling) && (embolden == p_b.embolden) && (transform == p_b.transform) && (extra_spacing[SPACING_TOP] == p_b.extra_spacing[SPACING_TOP]) && (extra_spacing[SPACING_BOTTOM] == p_b.extra_spacing[SPACING_BOTTOM]) && (extra_spacing[SPACING_SPACE] == p_b.extra_spacing[SPACING_SPACE]) && (extra_spacing[SPACING_GLYPH] == p_b.extra_spacing[SPACING_GLYPH]) && (baseline_offset == p_b.baseline_offset);
|
||||
}
|
||||
|
||||
SystemFontKey(const String &p_font_name, bool p_italic, int p_weight, int p_stretch, RID p_font, const TextServerAdvanced *p_fb) {
|
||||
|
|
@ -614,6 +616,7 @@ class TextServerAdvanced : public TextServerExtension {
|
|||
force_autohinter = p_fb->_font_is_force_autohinter(p_font);
|
||||
hinting = p_fb->_font_get_hinting(p_font);
|
||||
subpixel_positioning = p_fb->_font_get_subpixel_positioning(p_font);
|
||||
keep_rounding_remainders = p_fb->_font_get_keep_rounding_remainders(p_font);
|
||||
variation_coordinates = p_fb->_font_get_variation_coordinates(p_font);
|
||||
oversampling = p_fb->_font_get_oversampling(p_font);
|
||||
embolden = p_fb->_font_get_embolden(p_font);
|
||||
|
|
@ -656,7 +659,7 @@ class TextServerAdvanced : public TextServerExtension {
|
|||
hash = hash_murmur3_one_32(p_a.extra_spacing[SPACING_SPACE], hash);
|
||||
hash = hash_murmur3_one_32(p_a.extra_spacing[SPACING_GLYPH], hash);
|
||||
hash = hash_murmur3_one_double(p_a.baseline_offset, hash);
|
||||
return hash_fmix32(hash_murmur3_one_32(((int)p_a.mipmaps) | ((int)p_a.msdf << 1) | ((int)p_a.italic << 2) | ((int)p_a.force_autohinter << 3) | ((int)p_a.hinting << 4) | ((int)p_a.subpixel_positioning << 8) | ((int)p_a.antialiasing << 12) | ((int)p_a.disable_embedded_bitmaps << 14), hash));
|
||||
return hash_fmix32(hash_murmur3_one_32(((int)p_a.mipmaps) | ((int)p_a.msdf << 1) | ((int)p_a.italic << 2) | ((int)p_a.force_autohinter << 3) | ((int)p_a.hinting << 4) | ((int)p_a.subpixel_positioning << 8) | ((int)p_a.antialiasing << 12) | ((int)p_a.disable_embedded_bitmaps << 14) | ((int)p_a.keep_rounding_remainders << 15), hash));
|
||||
}
|
||||
};
|
||||
mutable HashMap<SystemFontKey, SystemFontCache, SystemFontKeyHasher> system_fonts;
|
||||
|
|
@ -800,6 +803,9 @@ public:
|
|||
MODBIND2(font_set_subpixel_positioning, const RID &, SubpixelPositioning);
|
||||
MODBIND1RC(SubpixelPositioning, font_get_subpixel_positioning, const RID &);
|
||||
|
||||
MODBIND2(font_set_keep_rounding_remainders, const RID &, bool);
|
||||
MODBIND1RC(bool, font_get_keep_rounding_remainders, const RID &);
|
||||
|
||||
MODBIND2(font_set_embolden, const RID &, double);
|
||||
MODBIND1RC(double, font_get_embolden, const RID &);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue