diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml
index 6d6a4de968b..c301222264d 100644
--- a/doc/classes/ProjectSettings.xml
+++ b/doc/classes/ProjectSettings.xml
@@ -1160,6 +1160,7 @@
Maximum undo/redo history size for [TextEdit] fields.
+ If set to [code]true[/code] and [member display/window/stretch/mode] is set to [b]"canvas_items"[/b], font and [SVGTexture] oversampling is enabled in the main window. Use [member Viewport.oversampling] to control oversampling in other viewports and windows.
Path to a custom [Theme] resource file to use for the project ([code].theme[/code] or generic [code].tres[/code]/[code].res[/code] extension).
diff --git a/doc/classes/Viewport.xml b/doc/classes/Viewport.xml
index 827240e5375..8f82d9f587b 100644
--- a/doc/classes/Viewport.xml
+++ b/doc/classes/Viewport.xml
@@ -366,7 +366,7 @@
See also [member ProjectSettings.rendering/anti_aliasing/quality/msaa_3d] and [method RenderingServer.viewport_set_msaa_3d].
- If [code]true[/code] and one of the following conditions is true: [member SubViewport.size_2d_override_stretch] and [member SubViewport.size_2d_override] are set, [member Window.content_scale_factor] is set and scaling is enabled, [member oversampling_override] is set, font oversampling is enabled.
+ If [code]true[/code] and one of the following conditions is true: [member SubViewport.size_2d_override_stretch] and [member SubViewport.size_2d_override] are set, [member Window.content_scale_factor] is set and scaling is enabled, [member oversampling_override] is set, font and [SVGTexture] oversampling is enabled.
If greater than zero, this value is used as the font oversampling factor, otherwise oversampling is equal to viewport scale.
diff --git a/scene/resources/svg_texture.cpp b/scene/resources/svg_texture.cpp
index 3e3ce5994c1..8b5e58eb9c1 100644
--- a/scene/resources/svg_texture.cpp
+++ b/scene/resources/svg_texture.cpp
@@ -45,35 +45,39 @@ Mutex SVGTexture::mutex;
HashMap SVGTexture::scaling_levels;
void SVGTexture::reference_scaling_level(double p_scale) {
- if (Math::is_equal_approx(p_scale, 1.0)) {
+ uint32_t oversampling = CLAMP(p_scale, 0.1, 100.0) * 64;
+ if (oversampling == 64) {
return;
}
+ double scale = double(oversampling) / 64.0;
MutexLock lock(mutex);
- ScalingLevel *sl = scaling_levels.getptr(p_scale);
+ ScalingLevel *sl = scaling_levels.getptr(scale);
if (sl) {
sl->refcount++;
} else {
ScalingLevel new_sl;
- scaling_levels.insert(p_scale, new_sl);
+ scaling_levels.insert(scale, new_sl);
}
}
void SVGTexture::unreference_scaling_level(double p_scale) {
- if (Math::is_equal_approx(p_scale, 1.0)) {
+ uint32_t oversampling = CLAMP(p_scale, 0.1, 100.0) * 64;
+ if (oversampling == 64) {
return;
}
+ double scale = double(oversampling) / 64.0;
MutexLock lock(mutex);
- ScalingLevel *sl = scaling_levels.getptr(p_scale);
+ ScalingLevel *sl = scaling_levels.getptr(scale);
if (sl) {
sl->refcount--;
if (sl->refcount == 0) {
for (SVGTexture *tx : sl->textures) {
- tx->_remove_scale(p_scale);
+ tx->_remove_scale(scale);
}
sl->textures.clear();
- scaling_levels.erase(p_scale);
+ scaling_levels.erase(scale);
}
}
}
@@ -158,24 +162,27 @@ void SVGTexture::_remove_scale(double p_scale) {
}
RID SVGTexture::_ensure_scale(double p_scale) const {
- if (Math::is_equal_approx(p_scale, 1.0)) {
+ uint32_t oversampling = CLAMP(p_scale, 0.1, 100.0) * 64;
+ if (oversampling == 64) {
if (base_texture.is_null()) {
base_texture = _load_at_scale(p_scale, true);
}
return base_texture;
}
- RID *rid = texture_cache.getptr(p_scale);
+ double scale = double(oversampling) / 64.0;
+
+ RID *rid = texture_cache.getptr(scale);
if (rid) {
return *rid;
}
MutexLock lock(mutex);
- ScalingLevel *sl = scaling_levels.getptr(p_scale);
+ ScalingLevel *sl = scaling_levels.getptr(scale);
ERR_FAIL_NULL_V_MSG(sl, RID(), "Invalid scaling level");
sl->textures.insert(const_cast(this));
- RID new_rid = _load_at_scale(p_scale, false);
- texture_cache[p_scale] = new_rid;
+ RID new_rid = _load_at_scale(scale, false);
+ texture_cache[scale] = new_rid;
return new_rid;
}