builds godot
add more patches
bendn 2023-03-12
parent f68067d · commit ffe68f8
-rw-r--r--patches/fix_buffer_underrun.patch23
-rw-r--r--patches/hex_decode.patch168
-rw-r--r--patches/no-touchpad-gamepad.patch26
3 files changed, 217 insertions, 0 deletions
diff --git a/patches/fix_buffer_underrun.patch b/patches/fix_buffer_underrun.patch
new file mode 100644
index 0000000..4cddcbf
--- /dev/null
+++ b/patches/fix_buffer_underrun.patch
@@ -0,0 +1,23 @@
+From 5d10dc5da2508530a38c66d4aa1ec234327a3b34 Mon Sep 17 00:00:00 2001
+From: Ellen Poe <[email protected]>
+Date: Sun, 12 Feb 2023 07:34:55 -0800
+Subject: [PATCH] Fix AudioStreamGenerator stopping playback after a buffer
+ underrun
+
+---
+ servers/audio_server.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/servers/audio_server.cpp b/servers/audio_server.cpp
+index 0344bf322d68..5e71d7af0550 100644
+--- a/servers/audio_server.cpp
++++ b/servers/audio_server.cpp
+@@ -354,7 +354,7 @@ void AudioServer::_mix_step() {
+ playback->stream_playback->tag_used_streams();
+ }
+
+- if (mixed_frames != buffer_size) {
++ if (!playback->stream_playback->is_playing()) {
+ // We know we have at least the size of our lookahead buffer for fade-out purposes.
+
+ float fadeout_base = 0.94;
diff --git a/patches/hex_decode.patch b/patches/hex_decode.patch
new file mode 100644
index 0000000..c698394
--- /dev/null
+++ b/patches/hex_decode.patch
@@ -0,0 +1,168 @@
+From 0742ae2f2c3aea760f0dfd48379e19ffe81a9c2c Mon Sep 17 00:00:00 2001
+From: bendn <[email protected]>
+Date: Mon, 6 Mar 2023 10:17:33 +0700
+Subject: [PATCH] add `hex_decode()` to `String`
+
+---
+ core/string/ustring.cpp | 29 +++++++++++++++++++
+ core/string/ustring.h | 2 ++
+ core/variant/variant_call.cpp | 1 +
+ doc/classes/String.xml | 18 ++++++++++++
+ doc/classes/StringName.xml | 18 ++++++++++++
+ .../GodotSharp/Core/StringExtensions.cs | 20 +++++++++++++
+ 6 files changed, 88 insertions(+)
+
+diff --git a/core/string/ustring.cpp b/core/string/ustring.cpp
+index 1b3b070592b2..8381a176ce8a 100644
+--- a/core/string/ustring.cpp
++++ b/core/string/ustring.cpp
+@@ -1644,6 +1644,35 @@ String String::hex_encode_buffer(const uint8_t *p_buffer, int p_len) {
+ return ret;
+ }
+
++Vector<uint8_t> String::hex_decode() const {
++ ERR_FAIL_COND_V_MSG(length() % 2 != 0, Vector<uint8_t>(), "Hexadecimal string of uneven length.");
++
++#define HEX_TO_BYTE(m_output, m_index) \
++ uint8_t m_output; \
++ c = operator[](m_index); \
++ if (is_digit(c)) { \
++ m_output = c - '0'; \
++ } else if (c >= 'a' && c <= 'f') { \
++ m_output = c - 'a' + 10; \
++ } else if (c >= 'A' && c <= 'F') { \
++ m_output = c - 'A' + 10; \
++ } else { \
++ ERR_FAIL_V_MSG(Vector<uint8_t>(), "Invalid hexadecimal character \"" + chr(c) + "\" at index " + m_index + "."); \
++ }
++
++ Vector<uint8_t> out;
++ int len = length() / 2;
++ out.resize(len);
++ for (int i = 0; i < len; i++) {
++ char32_t c;
++ HEX_TO_BYTE(first, i * 2);
++ HEX_TO_BYTE(second, i * 2 + 1);
++ out.write[i] = first * 16 + second;
++ }
++ return out;
++#undef HEX_TO_BYTE
++}
++
+ void String::print_unicode_error(const String &p_message, bool p_critical) const {
+ if (p_critical) {
+ print_error(vformat("Unicode parsing error, some characters were replaced with spaces: %s", p_message));
+diff --git a/core/string/ustring.h b/core/string/ustring.h
+index 1582504c57d4..1b36608d353e 100644
+--- a/core/string/ustring.h
++++ b/core/string/ustring.h
+@@ -321,6 +321,8 @@ class String {
+ static String chr(char32_t p_char);
+ static String md5(const uint8_t *p_md5);
+ static String hex_encode_buffer(const uint8_t *p_buffer, int p_len);
++ Vector<uint8_t> hex_decode() const;
++
+ bool is_numeric() const;
+
+ double to_float() const;
+diff --git a/core/variant/variant_call.cpp b/core/variant/variant_call.cpp
+index 0c0c8f657a26..7e5830d2ae7c 100644
+--- a/core/variant/variant_call.cpp
++++ b/core/variant/variant_call.cpp
+@@ -1721,6 +1721,7 @@ static void _register_variant_builtin_methods() {
+ bind_string_method(to_utf8_buffer, sarray(), varray());
+ bind_string_method(to_utf16_buffer, sarray(), varray());
+ bind_string_method(to_utf32_buffer, sarray(), varray());
++ bind_string_method(hex_decode, sarray(), varray());
+
+ bind_static_method(String, num_scientific, sarray("number"), varray());
+ bind_static_method(String, num, sarray("number", "decimals"), varray(-1));
+diff --git a/doc/classes/String.xml b/doc/classes/String.xml
+index d629a31bca1b..f909ccdba938 100644
+--- a/doc/classes/String.xml
++++ b/doc/classes/String.xml
+@@ -313,6 +313,24 @@
+ [b]Note:[/b] Strings with equal hash values are [i]not[/i] guaranteed to be the same, as a result of hash collisions. On the countrary, strings with different hash values are guaranteed to be different.
+ </description>
+ </method>
++ <method name="hex_decode" qualifiers="const">
++ <return type="PackedByteArray" />
++ <description>
++ Decodes a hexadecimal string as a [PackedByteArray].
++ [codeblocks]
++ [gdscript]
++ var text = "hello world"
++ var encoded = text.to_utf8_buffer().hex_encode()
++ print(buf.hex_decode().get_string_from_utf8())
++ [/gdscript]
++ [csharp]
++ var text = "hello world";
++ var encoded = text.ToUtf8Buffer().HexEncode();
++ GD.Print(buf.HexDecode().GetStringFromUtf8());
++ [/csharp]
++ [/codeblocks]
++ </description>
++ </method>
+ <method name="hex_to_int" qualifiers="const">
+ <return type="int" />
+ <description>
+diff --git a/doc/classes/StringName.xml b/doc/classes/StringName.xml
+index 192cb1a6c2ab..57172b897b5f 100644
+--- a/doc/classes/StringName.xml
++++ b/doc/classes/StringName.xml
+@@ -296,6 +296,24 @@
+ [b]Note:[/b] Strings with equal hash values are [i]not[/i] guaranteed to be the same, as a result of hash collisions. On the countrary, strings with different hash values are guaranteed to be different.
+ </description>
+ </method>
++ <method name="hex_decode" qualifiers="const">
++ <return type="PackedByteArray" />
++ <description>
++ Decodes a hexadecimal string as a [PackedByteArray].
++ [codeblocks]
++ [gdscript]
++ var text = "hello world"
++ var encoded = text.to_utf8_buffer().hex_encode()
++ print(buf.hex_decode().get_string_from_utf8())
++ [/gdscript]
++ [csharp]
++ var text = "hello world";
++ var encoded = text.ToUtf8Buffer().HexEncode();
++ GD.Print(buf.HexDecode().GetStringFromUtf8());
++ [/csharp]
++ [/codeblocks]
++ </description>
++ </method>
+ <method name="hex_to_int" qualifiers="const">
+ <return type="int" />
+ <description>
+diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/StringExtensions.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/StringExtensions.cs
+index df67e075aca3..e67e18b27613 100644
+--- a/modules/mono/glue/GodotSharp/GodotSharp/Core/StringExtensions.cs
++++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/StringExtensions.cs
+@@ -728,6 +728,26 @@ public static uint Hash(this string instance)
+ return hash;
+ }
+
++ /// <summary>
++ /// Decodes a hexadecimal string.
++ /// </summary>
++ /// <param name="instance">The hexadecimal string.</param>
++ /// <returns>The byte array representation of this string.</returns>
++ public static byte[] HexDecode(this string instance)
++ {
++ if (instance.Length % 2 != 0)
++ {
++ throw new ArgumentException("Hexadecimal string of uneven length.", nameof(instance));
++ }
++ int len = instance.Length / 2;
++ byte[] ret = new byte[len];
++ for (int i = 0; i < len; i++)
++ {
++ ret[i] = (byte)int.Parse(instance.Substring(i * 2, 2), NumberStyles.HexNumber);
++ }
++ return ret;
++ }
++
+ /// <summary>
+ /// Returns a hexadecimal representation of this byte as a string.
+ /// </summary>
diff --git a/patches/no-touchpad-gamepad.patch b/patches/no-touchpad-gamepad.patch
new file mode 100644
index 0000000..41116af
--- /dev/null
+++ b/patches/no-touchpad-gamepad.patch
@@ -0,0 +1,26 @@
+From bc17abceea50eafee49824b8d93fbc2a94facc26 Mon Sep 17 00:00:00 2001
+From: Marcel Admiraal <[email protected]>
+Date: Tue, 22 Mar 2022 11:20:17 +0000
+Subject: [PATCH] Improve detection of gamepads on Linux
+
+Requires gamepads to have a right x and y axis.
+---
+ platform/linuxbsd/joypad_linux.cpp | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/platform/linuxbsd/joypad_linux.cpp b/platform/linuxbsd/joypad_linux.cpp
+index 65d53b266f7d..475107293f31 100644
+--- a/platform/linuxbsd/joypad_linux.cpp
++++ b/platform/linuxbsd/joypad_linux.cpp
+@@ -333,9 +333,8 @@ void JoypadLinux::open_joypad(const char *p_path) {
+ }
+
+ // Check if the device supports basic gamepad events
+- bool has_abs_left = (test_bit(ABS_X, absbit) && test_bit(ABS_Y, absbit));
+- bool has_abs_right = (test_bit(ABS_RX, absbit) && test_bit(ABS_RY, absbit));
+- if (!(test_bit(EV_KEY, evbit) && test_bit(EV_ABS, evbit) && (has_abs_left || has_abs_right))) {
++ if (!(test_bit(EV_KEY, evbit) && test_bit(EV_ABS, evbit) &&
++ test_bit(ABS_RX, absbit) && test_bit(ABS_RY, absbit))) {
+ close(fd);
+ return;
+ }