diff --git a/doc/classes/Viewport.xml b/doc/classes/Viewport.xml
index 678b7690d97..3e772c4e884 100644
--- a/doc/classes/Viewport.xml
+++ b/doc/classes/Viewport.xml
@@ -104,6 +104,13 @@
Returns the transform from the Viewport's coordinates to the screen coordinates of the containing window manager window.
+
+
+
+ Returns the automatically computed 2D stretch transform, taking the [Viewport]'s stretch settings into account. The final value is multiplied by [member Window.content_scale_factor], but only for the root viewport. If this method is called on a [SubViewport] (e.g., in a scene tree with [SubViewportContainer] and [SubViewport]), the scale factor of the root window will not be applied. Using [method Transform2D.get_scale] on the returned value, this can be used to compensate for scaling when zooming a [Camera2D] node, or to scale down a [TextureRect] to be pixel-perfect regardless of the automatically computed scale factor.
+ [b]Note:[/b] Due to how pixel scaling works, the transform's X scale value may differ slightly from the Y scale, even when [member Window.content_scale_aspect] is set to a mode that preserves pixel aspect ratio. If [member Window.content_scale_aspect] is [constant Window.CONTENT_SCALE_ASPECT_IGNORE], the X value may differ [i]significantly[/i] from Y due to differences between the original aspect ratio and the window aspect ratio.
+
+
diff --git a/doc/classes/Window.xml b/doc/classes/Window.xml
index 424941b8422..6e833ef25a5 100644
--- a/doc/classes/Window.xml
+++ b/doc/classes/Window.xml
@@ -572,7 +572,7 @@
Specifies how the content's aspect behaves when the [Window] is resized. The base aspect is determined by [member content_scale_size].
- Specifies the base scale of [Window]'s content when its [member size] is equal to [member content_scale_size].
+ Specifies the base scale of [Window]'s content when its [member size] is equal to [member content_scale_size]. See also [method Viewport.get_stretch_transform].
Specifies how the content is scaled when the [Window] is resized.
diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp
index a0f39462a0e..dd3ae1ad3cb 100644
--- a/scene/main/viewport.cpp
+++ b/scene/main/viewport.cpp
@@ -1254,6 +1254,10 @@ Ref Viewport::get_world_2d() const {
return world_2d;
}
+Transform2D Viewport::get_stretch_transform() const {
+ return stretch_transform;
+}
+
Transform2D Viewport::get_final_transform() const {
ERR_READ_THREAD_GUARD_V(Transform2D());
return stretch_transform * global_canvas_transform;
@@ -4636,6 +4640,7 @@ void Viewport::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_global_canvas_transform", "xform"), &Viewport::set_global_canvas_transform);
ClassDB::bind_method(D_METHOD("get_global_canvas_transform"), &Viewport::get_global_canvas_transform);
+ ClassDB::bind_method(D_METHOD("get_stretch_transform"), &Viewport::get_stretch_transform);
ClassDB::bind_method(D_METHOD("get_final_transform"), &Viewport::get_final_transform);
ClassDB::bind_method(D_METHOD("get_screen_transform"), &Viewport::get_screen_transform);
diff --git a/scene/main/viewport.h b/scene/main/viewport.h
index 92691ccbec3..3a5ad2d83cb 100644
--- a/scene/main/viewport.h
+++ b/scene/main/viewport.h
@@ -515,6 +515,7 @@ public:
void set_global_canvas_transform(const Transform2D &p_transform);
Transform2D get_global_canvas_transform() const;
+ Transform2D get_stretch_transform() const;
virtual Transform2D get_final_transform() const;
void gui_set_root_order_dirty();