1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-04 12:00:25 +00:00

Merge pull request #105725 from bruvzg/sc_grad

Use same oversampling granularity as fonts use for `SVGTexture`s .
This commit is contained in:
Thaddeus Crews
2025-04-25 11:35:59 -05:00
3 changed files with 21 additions and 13 deletions

View File

@@ -1170,6 +1170,7 @@
Maximum undo/redo history size for [TextEdit] fields. Maximum undo/redo history size for [TextEdit] fields.
</member> </member>
<member name="gui/fonts/dynamic_fonts/use_oversampling" type="bool" setter="" getter="" default="true"> <member name="gui/fonts/dynamic_fonts/use_oversampling" type="bool" setter="" getter="" default="true">
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.
</member> </member>
<member name="gui/theme/custom" type="String" setter="" getter="" default="&quot;&quot;"> <member name="gui/theme/custom" type="String" setter="" getter="" default="&quot;&quot;">
Path to a custom [Theme] resource file to use for the project ([code].theme[/code] or generic [code].tres[/code]/[code].res[/code] extension). Path to a custom [Theme] resource file to use for the project ([code].theme[/code] or generic [code].tres[/code]/[code].res[/code] extension).

View File

@@ -366,7 +366,7 @@
See also [member ProjectSettings.rendering/anti_aliasing/quality/msaa_3d] and [method RenderingServer.viewport_set_msaa_3d]. See also [member ProjectSettings.rendering/anti_aliasing/quality/msaa_3d] and [method RenderingServer.viewport_set_msaa_3d].
</member> </member>
<member name="oversampling" type="bool" setter="set_use_oversampling" getter="is_using_oversampling" default="true"> <member name="oversampling" type="bool" setter="set_use_oversampling" getter="is_using_oversampling" default="true">
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.
</member> </member>
<member name="oversampling_override" type="float" setter="set_oversampling_override" getter="get_oversampling_override" default="0.0"> <member name="oversampling_override" type="float" setter="set_oversampling_override" getter="get_oversampling_override" default="0.0">
If greater than zero, this value is used as the font oversampling factor, otherwise oversampling is equal to viewport scale. If greater than zero, this value is used as the font oversampling factor, otherwise oversampling is equal to viewport scale.

View File

@@ -45,35 +45,39 @@ Mutex SVGTexture::mutex;
HashMap<double, SVGTexture::ScalingLevel> SVGTexture::scaling_levels; HashMap<double, SVGTexture::ScalingLevel> SVGTexture::scaling_levels;
void SVGTexture::reference_scaling_level(double p_scale) { 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; return;
} }
double scale = double(oversampling) / 64.0;
MutexLock lock(mutex); MutexLock lock(mutex);
ScalingLevel *sl = scaling_levels.getptr(p_scale); ScalingLevel *sl = scaling_levels.getptr(scale);
if (sl) { if (sl) {
sl->refcount++; sl->refcount++;
} else { } else {
ScalingLevel new_sl; ScalingLevel new_sl;
scaling_levels.insert(p_scale, new_sl); scaling_levels.insert(scale, new_sl);
} }
} }
void SVGTexture::unreference_scaling_level(double p_scale) { 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; return;
} }
double scale = double(oversampling) / 64.0;
MutexLock lock(mutex); MutexLock lock(mutex);
ScalingLevel *sl = scaling_levels.getptr(p_scale); ScalingLevel *sl = scaling_levels.getptr(scale);
if (sl) { if (sl) {
sl->refcount--; sl->refcount--;
if (sl->refcount == 0) { if (sl->refcount == 0) {
for (SVGTexture *tx : sl->textures) { for (SVGTexture *tx : sl->textures) {
tx->_remove_scale(p_scale); tx->_remove_scale(scale);
} }
sl->textures.clear(); 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 { 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()) { if (base_texture.is_null()) {
base_texture = _load_at_scale(p_scale, true); base_texture = _load_at_scale(p_scale, true);
} }
return base_texture; return base_texture;
} }
RID *rid = texture_cache.getptr(p_scale); double scale = double(oversampling) / 64.0;
RID *rid = texture_cache.getptr(scale);
if (rid) { if (rid) {
return *rid; return *rid;
} }
MutexLock lock(mutex); 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"); ERR_FAIL_NULL_V_MSG(sl, RID(), "Invalid scaling level");
sl->textures.insert(const_cast<SVGTexture *>(this)); sl->textures.insert(const_cast<SVGTexture *>(this));
RID new_rid = _load_at_scale(p_scale, false); RID new_rid = _load_at_scale(scale, false);
texture_cache[p_scale] = new_rid; texture_cache[scale] = new_rid;
return new_rid; return new_rid;
} }