Skip to content

Commit 04bcd4c

Browse files
committed
Merge pull request godotengine#105725 from bruvzg/sc_grad
Use same oversampling granularity as fonts use for `SVGTexture`s .
2 parents ea5548f + 98817a5 commit 04bcd4c

File tree

3 files changed

+21
-13
lines changed

3 files changed

+21
-13
lines changed

doc/classes/ProjectSettings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,6 +1170,7 @@
11701170
Maximum undo/redo history size for [TextEdit] fields.
11711171
</member>
11721172
<member name="gui/fonts/dynamic_fonts/use_oversampling" type="bool" setter="" getter="" default="true">
1173+
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.
11731174
</member>
11741175
<member name="gui/theme/custom" type="String" setter="" getter="" default="&quot;&quot;">
11751176
Path to a custom [Theme] resource file to use for the project ([code].theme[/code] or generic [code].tres[/code]/[code].res[/code] extension).

doc/classes/Viewport.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@
366366
See also [member ProjectSettings.rendering/anti_aliasing/quality/msaa_3d] and [method RenderingServer.viewport_set_msaa_3d].
367367
</member>
368368
<member name="oversampling" type="bool" setter="set_use_oversampling" getter="is_using_oversampling" default="true">
369-
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.
369+
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.
370370
</member>
371371
<member name="oversampling_override" type="float" setter="set_oversampling_override" getter="get_oversampling_override" default="0.0">
372372
If greater than zero, this value is used as the font oversampling factor, otherwise oversampling is equal to viewport scale.

scene/resources/svg_texture.cpp

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,35 +45,39 @@ Mutex SVGTexture::mutex;
4545
HashMap<double, SVGTexture::ScalingLevel> SVGTexture::scaling_levels;
4646

4747
void SVGTexture::reference_scaling_level(double p_scale) {
48-
if (Math::is_equal_approx(p_scale, 1.0)) {
48+
uint32_t oversampling = CLAMP(p_scale, 0.1, 100.0) * 64;
49+
if (oversampling == 64) {
4950
return;
5051
}
52+
double scale = double(oversampling) / 64.0;
5153

5254
MutexLock lock(mutex);
53-
ScalingLevel *sl = scaling_levels.getptr(p_scale);
55+
ScalingLevel *sl = scaling_levels.getptr(scale);
5456
if (sl) {
5557
sl->refcount++;
5658
} else {
5759
ScalingLevel new_sl;
58-
scaling_levels.insert(p_scale, new_sl);
60+
scaling_levels.insert(scale, new_sl);
5961
}
6062
}
6163

6264
void SVGTexture::unreference_scaling_level(double p_scale) {
63-
if (Math::is_equal_approx(p_scale, 1.0)) {
65+
uint32_t oversampling = CLAMP(p_scale, 0.1, 100.0) * 64;
66+
if (oversampling == 64) {
6467
return;
6568
}
69+
double scale = double(oversampling) / 64.0;
6670

6771
MutexLock lock(mutex);
68-
ScalingLevel *sl = scaling_levels.getptr(p_scale);
72+
ScalingLevel *sl = scaling_levels.getptr(scale);
6973
if (sl) {
7074
sl->refcount--;
7175
if (sl->refcount == 0) {
7276
for (SVGTexture *tx : sl->textures) {
73-
tx->_remove_scale(p_scale);
77+
tx->_remove_scale(scale);
7478
}
7579
sl->textures.clear();
76-
scaling_levels.erase(p_scale);
80+
scaling_levels.erase(scale);
7781
}
7882
}
7983
}
@@ -158,24 +162,27 @@ void SVGTexture::_remove_scale(double p_scale) {
158162
}
159163

160164
RID SVGTexture::_ensure_scale(double p_scale) const {
161-
if (Math::is_equal_approx(p_scale, 1.0)) {
165+
uint32_t oversampling = CLAMP(p_scale, 0.1, 100.0) * 64;
166+
if (oversampling == 64) {
162167
if (base_texture.is_null()) {
163168
base_texture = _load_at_scale(p_scale, true);
164169
}
165170
return base_texture;
166171
}
167-
RID *rid = texture_cache.getptr(p_scale);
172+
double scale = double(oversampling) / 64.0;
173+
174+
RID *rid = texture_cache.getptr(scale);
168175
if (rid) {
169176
return *rid;
170177
}
171178

172179
MutexLock lock(mutex);
173-
ScalingLevel *sl = scaling_levels.getptr(p_scale);
180+
ScalingLevel *sl = scaling_levels.getptr(scale);
174181
ERR_FAIL_NULL_V_MSG(sl, RID(), "Invalid scaling level");
175182
sl->textures.insert(const_cast<SVGTexture *>(this));
176183

177-
RID new_rid = _load_at_scale(p_scale, false);
178-
texture_cache[p_scale] = new_rid;
184+
RID new_rid = _load_at_scale(scale, false);
185+
texture_cache[scale] = new_rid;
179186
return new_rid;
180187
}
181188

0 commit comments

Comments
 (0)