Skip to content

Commit

Permalink
Adjust StyleBoxFlat antialiasing to account for 2D stretch scale
Browse files Browse the repository at this point in the history
This prevents the antialiasing feather from becoming too wide
at viewport sizes higher than the default, which can lead to blurry visuals.

This is adjusted to account for the 2D scale factor returned on the root
Window, so it takes both the `canvas_items` scaling and
`content_scale_factor` into account.
  • Loading branch information
Calinou committed Oct 2, 2024
1 parent a478a00 commit 7db69a9
Showing 1 changed file with 29 additions and 8 deletions.
37 changes: 29 additions & 8 deletions scene/resources/style_box_flat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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<SceneTree>(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);
}
}
}
Expand Down Expand Up @@ -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;
}
}

Expand Down Expand Up @@ -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++) {
Expand Down

0 comments on commit 7db69a9

Please sign in to comment.