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.
</member>
<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 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).

View File

@@ -366,7 +366,7 @@
See also [member ProjectSettings.rendering/anti_aliasing/quality/msaa_3d] and [method RenderingServer.viewport_set_msaa_3d].
</member>
<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 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.

View File

@@ -45,35 +45,39 @@ Mutex SVGTexture::mutex;
HashMap<double, SVGTexture::ScalingLevel> 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<SVGTexture *>(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;
}