You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-08 12:40:44 +00:00
Merge pull request #67409 from bruvzg/fix_oversampling_rounding
[TextServer] Do not round glyph advances / coordinates if font oversampling or bitmap glyph scaling is used.
This commit is contained in:
@@ -1711,9 +1711,10 @@ Vector2 TextServerFallback::_font_get_glyph_advance(const RID &p_font_rid, int64
|
||||
ea.x = fd->embolden * double(size.x) / 64.0;
|
||||
}
|
||||
|
||||
double scale = _font_get_scale(p_font_rid, p_size);
|
||||
if (fd->msdf) {
|
||||
return (gl[p_glyph | mod].advance + ea) * (double)p_size / (double)fd->msdf_source_size;
|
||||
} else if ((fd->subpixel_positioning == SUBPIXEL_POSITIONING_DISABLED) || (fd->subpixel_positioning == SUBPIXEL_POSITIONING_AUTO && size.x > SUBPIXEL_POSITIONING_ONE_HALF_MAX_SIZE)) {
|
||||
} else if ((scale == 1.0) && ((fd->subpixel_positioning == SUBPIXEL_POSITIONING_DISABLED) || (fd->subpixel_positioning == SUBPIXEL_POSITIONING_AUTO && size.x > SUBPIXEL_POSITIONING_ONE_HALF_MAX_SIZE))) {
|
||||
return (gl[p_glyph | mod].advance + ea).round();
|
||||
} else {
|
||||
return gl[p_glyph | mod].advance + ea;
|
||||
@@ -2325,12 +2326,14 @@ void TextServerFallback::_font_draw_glyph(const RID &p_font_rid, const RID &p_ca
|
||||
RenderingServer::get_singleton()->canvas_item_add_msdf_texture_rect_region(p_canvas, Rect2(cpos, csize), texture, gl.uv_rect, modulate, 0, fd->msdf_range);
|
||||
} else {
|
||||
Point2 cpos = p_pos;
|
||||
cpos.y = Math::floor(cpos.y);
|
||||
double scale = _font_get_scale(p_font_rid, p_size);
|
||||
if ((fd->subpixel_positioning == SUBPIXEL_POSITIONING_ONE_QUARTER) || (fd->subpixel_positioning == SUBPIXEL_POSITIONING_AUTO && size.x <= SUBPIXEL_POSITIONING_ONE_QUARTER_MAX_SIZE)) {
|
||||
cpos.x = ((int)Math::floor(cpos.x + 0.125));
|
||||
cpos.x = cpos.x + 0.125;
|
||||
} else if ((fd->subpixel_positioning == SUBPIXEL_POSITIONING_ONE_HALF) || (fd->subpixel_positioning == SUBPIXEL_POSITIONING_AUTO && size.x <= SUBPIXEL_POSITIONING_ONE_HALF_MAX_SIZE)) {
|
||||
cpos.x = ((int)Math::floor(cpos.x + 0.25));
|
||||
} else {
|
||||
cpos.x = cpos.x + 0.25;
|
||||
}
|
||||
if (scale == 1.0) {
|
||||
cpos.y = Math::floor(cpos.y);
|
||||
cpos.x = Math::floor(cpos.x);
|
||||
}
|
||||
cpos += gl.rect.position;
|
||||
@@ -2415,12 +2418,14 @@ void TextServerFallback::_font_draw_glyph_outline(const RID &p_font_rid, const R
|
||||
RenderingServer::get_singleton()->canvas_item_add_msdf_texture_rect_region(p_canvas, Rect2(cpos, csize), texture, gl.uv_rect, modulate, p_outline_size * 2, fd->msdf_range);
|
||||
} else {
|
||||
Point2 cpos = p_pos;
|
||||
cpos.y = Math::floor(cpos.y);
|
||||
double scale = _font_get_scale(p_font_rid, p_size);
|
||||
if ((fd->subpixel_positioning == SUBPIXEL_POSITIONING_ONE_QUARTER) || (fd->subpixel_positioning == SUBPIXEL_POSITIONING_AUTO && size.x <= SUBPIXEL_POSITIONING_ONE_QUARTER_MAX_SIZE)) {
|
||||
cpos.x = ((int)Math::floor(cpos.x + 0.125));
|
||||
cpos.x = cpos.x + 0.125;
|
||||
} else if ((fd->subpixel_positioning == SUBPIXEL_POSITIONING_ONE_HALF) || (fd->subpixel_positioning == SUBPIXEL_POSITIONING_AUTO && size.x <= SUBPIXEL_POSITIONING_ONE_HALF_MAX_SIZE)) {
|
||||
cpos.x = ((int)Math::floor(cpos.x + 0.25));
|
||||
} else {
|
||||
cpos.x = cpos.x + 0.25;
|
||||
}
|
||||
if (scale == 1.0) {
|
||||
cpos.y = Math::floor(cpos.y);
|
||||
cpos.x = Math::floor(cpos.x);
|
||||
}
|
||||
cpos += gl.rect.position;
|
||||
@@ -3643,17 +3648,18 @@ bool TextServerFallback::_shaped_text_shape(const RID &p_shaped) {
|
||||
}
|
||||
}
|
||||
|
||||
double scale = _font_get_scale(gl.font_rid, gl.font_size);
|
||||
if (gl.font_rid.is_valid()) {
|
||||
bool subpos = (_font_get_subpixel_positioning(gl.font_rid) == SUBPIXEL_POSITIONING_ONE_HALF) || (_font_get_subpixel_positioning(gl.font_rid) == SUBPIXEL_POSITIONING_ONE_QUARTER) || (_font_get_subpixel_positioning(gl.font_rid) == SUBPIXEL_POSITIONING_AUTO && gl.font_size <= SUBPIXEL_POSITIONING_ONE_HALF_MAX_SIZE);
|
||||
bool subpos = (scale != 1.0) || (_font_get_subpixel_positioning(gl.font_rid) == SUBPIXEL_POSITIONING_ONE_HALF) || (_font_get_subpixel_positioning(gl.font_rid) == SUBPIXEL_POSITIONING_ONE_QUARTER) || (_font_get_subpixel_positioning(gl.font_rid) == SUBPIXEL_POSITIONING_AUTO && gl.font_size <= SUBPIXEL_POSITIONING_ONE_HALF_MAX_SIZE);
|
||||
if (sd->text[j - sd->start] != 0 && !is_linebreak(sd->text[j - sd->start])) {
|
||||
if (sd->orientation == ORIENTATION_HORIZONTAL) {
|
||||
gl.advance = Math::round(_font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x);
|
||||
gl.advance = _font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x;
|
||||
gl.x_off = 0;
|
||||
gl.y_off = 0;
|
||||
sd->ascent = MAX(sd->ascent, _font_get_ascent(gl.font_rid, gl.font_size));
|
||||
sd->descent = MAX(sd->descent, _font_get_descent(gl.font_rid, gl.font_size));
|
||||
} else {
|
||||
gl.advance = Math::round(_font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).y);
|
||||
gl.advance = _font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).y;
|
||||
gl.x_off = -Math::round(_font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5);
|
||||
gl.y_off = _font_get_ascent(gl.font_rid, gl.font_size);
|
||||
sd->ascent = MAX(sd->ascent, Math::round(_font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5));
|
||||
|
||||
Reference in New Issue
Block a user