diff --git a/scene/resources/style_box_flat.cpp b/scene/resources/style_box_flat.cpp index 15816925c1f5..3e172523b764 100644 --- a/scene/resources/style_box_flat.cpp +++ b/scene/resources/style_box_flat.cpp @@ -30,6 +30,8 @@ #include "style_box_flat.h" +#include "scene/main/scene_tree.h" +#include "scene/main/window.h" #include "servers/rendering_server.h" float StyleBoxFlat::get_style_margin(Side p_side) const { @@ -407,10 +409,28 @@ void StyleBoxFlat::draw(RID p_canvas_item, const Rect2 &p_rect) const { Rect2 infill_rect = style_rect.grow_individual(-adapted_border[SIDE_LEFT], -adapted_border[SIDE_TOP], -adapted_border[SIDE_RIGHT], -adapted_border[SIDE_BOTTOM]); Rect2 border_style_rect = style_rect; + + real_t aa_size_scaled = 1.0f; + if (aa_on) { + real_t scale_factor = 1.0f; + const SceneTree *tree = Object::cast_to(OS::get_singleton()->get_main_loop()); + if (tree) { + const Window *window = tree->get_root(); + const Vector2 stretch_scale = window->get_stretch_transform().get_scale(); + scale_factor = MIN(stretch_scale.x, stretch_scale.y); + } + + // Adjust AA feather size to account for the 2D scale factor, so that + // antialiasing doesn't become blurry at viewport resolutions higher + // than the default when using the `canvas_items` stretch mode + // (or when using `content_scale_factor` values different than `1.0`). + aa_size_scaled = aa_size / scale_factor; + } + if (aa_on) { for (int i = 0; i < 4; i++) { if (border_width[i] > 0) { - border_style_rect = border_style_rect.grow_side((Side)i, -aa_size); + border_style_rect = border_style_rect.grow_side((Side)i, -aa_size_scaled); } } } @@ -456,26 +476,27 @@ void StyleBoxFlat::draw(RID p_canvas_item, const Rect2 &p_rect) const { real_t aa_border_width_half[4]; real_t aa_fill_width[4]; real_t aa_fill_width_half[4]; + if (draw_border) { for (int i = 0; i < 4; i++) { if (border_width[i] > 0) { - aa_border_width[i] = aa_size; - aa_border_width_half[i] = aa_size / 2; + aa_border_width[i] = aa_size_scaled; + aa_border_width_half[i] = aa_size_scaled * 0.5; aa_fill_width[i] = 0; aa_fill_width_half[i] = 0; } else { aa_border_width[i] = 0; aa_border_width_half[i] = 0; - aa_fill_width[i] = aa_size; - aa_fill_width_half[i] = aa_size / 2; + aa_fill_width[i] = aa_size_scaled; + aa_fill_width_half[i] = aa_size_scaled * 0.5; } } } else { for (int i = 0; i < 4; i++) { aa_border_width[i] = 0; aa_border_width_half[i] = 0; - aa_fill_width[i] = aa_size; - aa_fill_width_half[i] = aa_size / 2; + aa_fill_width[i] = aa_size_scaled; + aa_fill_width_half[i] = aa_size_scaled * 0.5; } } @@ -528,7 +549,7 @@ void StyleBoxFlat::draw(RID p_canvas_item, const Rect2 &p_rect) const { } // Compute UV coordinates. - Rect2 uv_rect = style_rect.grow(aa_on ? aa_size : 0); + Rect2 uv_rect = style_rect.grow(aa_on ? aa_size_scaled : 0); uvs.resize(verts.size()); Point2 *uvs_ptr = uvs.ptrw(); for (int i = 0; i < verts.size(); i++) {