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; }