diff --git a/scene/main/canvas_item.cpp b/scene/main/canvas_item.cpp index 4e257690d05..788efca2a72 100644 --- a/scene/main/canvas_item.cpp +++ b/scene/main/canvas_item.cpp @@ -143,18 +143,13 @@ void CanvasItem::_redraw_callback() { if (is_visible_in_tree()) { drawing = true; - Ref ts = TextServerManager::get_singleton()->get_primary_interface(); - if (ts.is_valid()) { - ts->set_current_drawn_item_oversampling(get_viewport()->get_oversampling()); - } + TextServer::set_current_drawn_item_oversampling(get_viewport()->get_oversampling()); current_item_drawn = this; notification(NOTIFICATION_DRAW); emit_signal(SceneStringName(draw)); GDVIRTUAL_CALL(_draw); current_item_drawn = nullptr; - if (ts.is_valid()) { - ts->set_current_drawn_item_oversampling(0.0); - } + TextServer::set_current_drawn_item_oversampling(0.0); drawing = false; draw_commands_dirty = true; } diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index c61932035ec..f84a2c9f2e6 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -356,6 +356,8 @@ void Viewport::_sub_window_update(Window *p_window) { const Rect2i r = Rect2i(p_window->get_position(), p_window->get_size()); if (!p_window->get_flag(Window::FLAG_BORDERLESS)) { + TextServer::set_current_drawn_item_oversampling(get_oversampling()); + Ref panel = gui.subwindow_focused == p_window ? p_window->theme_cache.embedded_border : p_window->theme_cache.embedded_unfocused_border; panel->draw(sw.canvas_item, r); @@ -386,6 +388,8 @@ void Viewport::_sub_window_update(Window *p_window) { bool pressed = gui.subwindow_focused == sw.window && gui.subwindow_drag == SUB_WINDOW_DRAG_CLOSE && gui.subwindow_drag_close_inside; Ref close_icon = pressed ? p_window->theme_cache.close_pressed : p_window->theme_cache.close; close_icon->draw(sw.canvas_item, r.position + Vector2(r.size.width - close_h_ofs, -close_v_ofs)); + + TextServer::set_current_drawn_item_oversampling(0.0); } const Transform2D xform = sw.window->window_transform * sw.window->stretch_transform; @@ -3048,7 +3052,8 @@ bool Viewport::_sub_windows_forward_input(const Ref &p_event) { int close_h_ofs = sw.window->theme_cache.close_h_offset; int close_v_ofs = sw.window->theme_cache.close_v_offset; - Ref close_icon = sw.window->theme_cache.close; + bool pressed = gui.subwindow_focused == sw.window && gui.subwindow_drag == SUB_WINDOW_DRAG_CLOSE && gui.subwindow_drag_close_inside; + Ref close_icon = pressed ? sw.window->theme_cache.close_pressed : sw.window->theme_cache.close; Rect2 close_rect; close_rect.position = Vector2(r.position.x + r.size.x - close_h_ofs, r.position.y - close_v_ofs); diff --git a/scene/resources/dpi_texture.cpp b/scene/resources/dpi_texture.cpp index 40743ee0e8b..a02491fc61b 100644 --- a/scene/resources/dpi_texture.cpp +++ b/scene/resources/dpi_texture.cpp @@ -204,14 +204,14 @@ RID DPITexture::_load_at_scale(double p_scale, bool p_set_size) const { } Size2 current_size = size; - if (p_set_size) { - size.x = img->get_width(); - base_size.x = img->get_width(); + if (p_set_size || size.is_zero_approx()) { + size.x = img->get_width() / p_scale; + base_size.x = size.x; if (size_override.x != 0) { size.x = size_override.x; } - size.y = img->get_height(); - base_size.y = img->get_height(); + size.y = img->get_height() / p_scale; + base_size.y = size.y; if (size_override.y != 0) { size.y = size_override.y; } @@ -274,19 +274,16 @@ bool DPITexture::has_alpha() const { } RID DPITexture::get_scaled_rid() const { - double scale = 1.0; - CanvasItem *ci = CanvasItem::get_current_item_drawn(); - if (ci) { - Viewport *vp = ci->get_viewport(); - if (vp) { - scale = vp->get_oversampling(); - } + double scale = TextServer::get_current_drawn_item_oversampling(); + if (scale == 0.0) { + scale = 1.0; } return _ensure_scale(scale); } void DPITexture::draw(RID p_canvas_item, const Point2 &p_pos, const Color &p_modulate, bool p_transpose) const { - RenderingServer::get_singleton()->canvas_item_add_texture_rect(p_canvas_item, Rect2(p_pos, size), get_scaled_rid(), false, p_modulate, p_transpose); + RID rid = get_scaled_rid(); // Note: call `get_scaled_rid` before using `size` to ensure it is loaded. + RenderingServer::get_singleton()->canvas_item_add_texture_rect(p_canvas_item, Rect2(p_pos, size), rid, false, p_modulate, p_transpose); } void DPITexture::draw_rect(RID p_canvas_item, const Rect2 &p_rect, bool p_tile, const Color &p_modulate, bool p_transpose) const { diff --git a/scene/resources/style_box_flat.cpp b/scene/resources/style_box_flat.cpp index 79506148332..9637f9d702a 100644 --- a/scene/resources/style_box_flat.cpp +++ b/scene/resources/style_box_flat.cpp @@ -496,13 +496,9 @@ void StyleBoxFlat::draw(RID p_canvas_item, const Rect2 &p_rect) const { real_t aa_size_scaled = 1.0f; if (aa_on) { - real_t scale_factor = 1.0f; - CanvasItem *ci = CanvasItem::get_current_item_drawn(); - if (ci) { - Viewport *vp = ci->get_viewport(); - if (vp) { - scale_factor = vp->get_oversampling(); - } + real_t scale_factor = TextServer::get_current_drawn_item_oversampling(); + if (scale_factor == 0.0) { + scale_factor = 1.0; } // Adjust AA feather size to account for the 2D scale factor, so that diff --git a/servers/text/text_server.cpp b/servers/text/text_server.cpp index 436eb2400a6..8394fe912b8 100644 --- a/servers/text/text_server.cpp +++ b/servers/text/text_server.cpp @@ -193,6 +193,8 @@ bool Glyph::operator>(const Glyph &p_a) const { return p_a.start > start; } +double TextServer::vp_oversampling = 0.0; + void TextServer::_bind_methods() { ClassDB::bind_method(D_METHOD("has_feature", "feature"), &TextServer::has_feature); ClassDB::bind_method(D_METHOD("get_name"), &TextServer::get_name); diff --git a/servers/text/text_server.h b/servers/text/text_server.h index 90c4df51afd..3b08c305b45 100644 --- a/servers/text/text_server.h +++ b/servers/text/text_server.h @@ -230,7 +230,7 @@ public: void _draw_hex_code_box_number(const RID &p_canvas, int64_t p_size, const Vector2 &p_pos, uint8_t p_index, const Color &p_color) const; protected: - double vp_oversampling = 0.0; + static double vp_oversampling; HashMap diacritics_map; void _diacritics_map_add(const String &p_from, char32_t p_to); void _init_diacritics_map(); @@ -610,7 +610,8 @@ public: TypedArray parse_structured_text(StructuredTextParser p_parser_type, const Array &p_args, const String &p_text) const; - virtual void set_current_drawn_item_oversampling(double p_vp_oversampling) { vp_oversampling = p_vp_oversampling; } + static void set_current_drawn_item_oversampling(double p_vp_oversampling) { vp_oversampling = p_vp_oversampling; } + static double get_current_drawn_item_oversampling() { return vp_oversampling; } virtual void cleanup() {}