You've already forked godot
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:
@@ -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="""">
|
<member name="gui/theme/custom" type="String" setter="" getter="" default="""">
|
||||||
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).
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user