From 82cb7917e40aaae552fb68ba27cc60f9eb56602f Mon Sep 17 00:00:00 2001 From: WerWolv Date: Wed, 1 Sep 2021 00:23:45 +0200 Subject: [PATCH] ui: Added half floats to data inspector --- .../builtin/source/content/data_inspector.cpp | 5 +++ plugins/builtin/source/lang/de_DE.cpp | 1 + plugins/builtin/source/lang/en_US.cpp | 1 + plugins/builtin/source/lang/it_IT.cpp | 1 + .../libimhex/include/hex/helpers/utils.hpp | 2 ++ plugins/libimhex/source/helpers/utils.cpp | 34 +++++++++++++++++++ 6 files changed, 44 insertions(+) diff --git a/plugins/builtin/source/content/data_inspector.cpp b/plugins/builtin/source/content/data_inspector.cpp index 3f4baff76..0cc96fb6f 100644 --- a/plugins/builtin/source/content/data_inspector.cpp +++ b/plugins/builtin/source/content/data_inspector.cpp @@ -82,6 +82,11 @@ namespace hex::plugin::builtin { return [value] { ImGui::TextUnformatted(value.c_str()); return value; }; }); + ContentRegistry::DataInspector::add("hex.builtin.inspector.float16", sizeof(u16), [](auto buffer, auto endian, auto style) { + auto value = hex::format("{0:G}", hex::changeEndianess(float16ToFloat32(*reinterpret_cast(buffer.data())), endian)); + return [value] { ImGui::TextUnformatted(value.c_str()); return value; }; + }); + ContentRegistry::DataInspector::add("hex.builtin.inspector.float", sizeof(float), [](auto buffer, auto endian, auto style) { auto value = hex::format("{0:G}", hex::changeEndianess(*reinterpret_cast(buffer.data()), endian)); return [value] { ImGui::TextUnformatted(value.c_str()); return value; }; diff --git a/plugins/builtin/source/lang/de_DE.cpp b/plugins/builtin/source/lang/de_DE.cpp index 5d7901e11..2ed45ded5 100644 --- a/plugins/builtin/source/lang/de_DE.cpp +++ b/plugins/builtin/source/lang/de_DE.cpp @@ -313,6 +313,7 @@ namespace hex::plugin::builtin { { "hex.builtin.inspector.s32", "int32_t" }, { "hex.builtin.inspector.u64", "uint64_t" }, { "hex.builtin.inspector.s64", "int64_t" }, + { "hex.builtin.inspector.float16", "half float (16 bit)" }, { "hex.builtin.inspector.float", "float (32 bit)" }, { "hex.builtin.inspector.double", "double (64 bit)" }, { "hex.builtin.inspector.ascii", "ASCII Zeichen" }, diff --git a/plugins/builtin/source/lang/en_US.cpp b/plugins/builtin/source/lang/en_US.cpp index 7a1fc6f6d..3ce90c7f4 100644 --- a/plugins/builtin/source/lang/en_US.cpp +++ b/plugins/builtin/source/lang/en_US.cpp @@ -313,6 +313,7 @@ namespace hex::plugin::builtin { { "hex.builtin.inspector.s32", "int32_t" }, { "hex.builtin.inspector.u64", "uint64_t" }, { "hex.builtin.inspector.s64", "int64_t" }, + { "hex.builtin.inspector.float16", "half float (16 bit)" }, { "hex.builtin.inspector.float", "float (32 bit)" }, { "hex.builtin.inspector.double", "double (64 bit)" }, { "hex.builtin.inspector.ascii", "ASCII Character" }, diff --git a/plugins/builtin/source/lang/it_IT.cpp b/plugins/builtin/source/lang/it_IT.cpp index 6c1bf0649..ee9d6e6da 100644 --- a/plugins/builtin/source/lang/it_IT.cpp +++ b/plugins/builtin/source/lang/it_IT.cpp @@ -312,6 +312,7 @@ namespace hex::plugin::builtin { { "hex.builtin.inspector.s32", "int32_t" }, { "hex.builtin.inspector.u64", "uint64_t" }, { "hex.builtin.inspector.s64", "int64_t" }, + { "hex.builtin.inspector.float16", "half float (16 bit)" }, { "hex.builtin.inspector.float", "float (32 bit)" }, { "hex.builtin.inspector.double", "double (64 bit)" }, { "hex.builtin.inspector.ascii", "ASCII Character" }, diff --git a/plugins/libimhex/include/hex/helpers/utils.hpp b/plugins/libimhex/include/hex/helpers/utils.hpp index 9e5fc9f9b..835fecab6 100644 --- a/plugins/libimhex/include/hex/helpers/utils.hpp +++ b/plugins/libimhex/include/hex/helpers/utils.hpp @@ -179,6 +179,8 @@ namespace hex { void openFileBrowser(std::string_view title, DialogMode mode, const std::vector &validExtensions, const std::function &callback); + float float16ToFloat32(u16 float16); + namespace scope_guard { #define SCOPE_GUARD ::hex::scope_guard::ScopeGuardOnExit() + [&]() diff --git a/plugins/libimhex/source/helpers/utils.cpp b/plugins/libimhex/source/helpers/utils.cpp index e6db56bc5..cff4e43b9 100644 --- a/plugins/libimhex/source/helpers/utils.cpp +++ b/plugins/libimhex/source/helpers/utils.cpp @@ -325,4 +325,38 @@ namespace hex { NFD::Quit(); } + float float16ToFloat32(u16 float16) { + u32 sign = float16 >> 15; + u32 exponent = (float16 >> 10) & 0x1F; + u32 mantissa = float16 & 0x3FF; + + u32 result; + + if (exponent == 0) { + if (mantissa == 0) { + // +- Zero + result = sign << 31; + } else { + // Subnormal value + exponent = 0x7F - 14; + + while ((mantissa & (1 << 10)) == 0) { + exponent--; + mantissa <<= 1; + } + + mantissa &= 0x3FF; + result = (sign << 31) | (exponent << 23) | (mantissa << 13); + } + } else if (exponent == 0x1F) { + // +-Inf or +-NaN + result = (sign << 31) | (0xFF << 23) | (mantissa << 13); + } else { + // Normal value + result = (sign << 31) | ((exponent + (0x7F - 15)) << 23) | (mantissa << 13); + } + + return reinterpret_cast(result); + } + } \ No newline at end of file