From 00b3d7809c21eb4d177581ee7a4e16ffa371b997 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Sat, 24 Feb 2024 23:23:53 +0100 Subject: [PATCH] fix: Various issues with the digram and layered distribution diagrams --- .../source/ui/imgui_imhex_extensions.cpp | 4 +- .../include/content/helpers/diagrams.hpp | 40 +++++++++++-------- .../content/data_information_sections.cpp | 27 +++++-------- 3 files changed, 35 insertions(+), 36 deletions(-) diff --git a/lib/libimhex/source/ui/imgui_imhex_extensions.cpp b/lib/libimhex/source/ui/imgui_imhex_extensions.cpp index 9a63ff6c2..06de33f95 100644 --- a/lib/libimhex/source/ui/imgui_imhex_extensions.cpp +++ b/lib/libimhex/source/ui/imgui_imhex_extensions.cpp @@ -74,7 +74,7 @@ namespace ImGuiExt { #endif glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_width, m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData); - stbi_image_free(imageData); + STBI_FREE(imageData); m_textureId = reinterpret_cast(static_cast(texture)); } @@ -100,7 +100,7 @@ namespace ImGuiExt { #endif glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_width, m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData); - stbi_image_free(imageData); + STBI_FREE(imageData); m_textureId = reinterpret_cast(static_cast(texture)); } diff --git a/plugins/builtin/include/content/helpers/diagrams.hpp b/plugins/builtin/include/content/helpers/diagrams.hpp index a51285bd6..82ce09f7a 100644 --- a/plugins/builtin/include/content/helpers/diagrams.hpp +++ b/plugins/builtin/include/content/helpers/diagrams.hpp @@ -115,23 +115,25 @@ namespace hex { auto drawList = ImGui::GetWindowDrawList(); if (!m_processing) { - if (!m_texture.isValid()) { + if (!m_textureValid) { std::vector pixels; - pixels.resize(0xFF * 0xFF, 0x00); + pixels.resize(0x100 * 0x100, 0x00); for (size_t i = 0; i < (m_buffer.empty() ? 0 : m_buffer.size() - 1); i++) { - const auto x = m_buffer[i]; - const auto y = m_buffer[i + 1]; + const u8 x = m_buffer[i]; + const u8 y = m_buffer[i + 1]; auto color = ImLerp( ImColor(0xFF, 0x6D, 0x01).Value, ImColor(0x01, 0x93, 0xFF).Value, float(i) / m_buffer.size()) + ImVec4(m_glowBuffer[i], m_glowBuffer[i], m_glowBuffer[i], 0.0F); - color.w = m_opacity; + color.w = m_opacity; - pixels[x * 0xFF + y] = ImAlphaBlendColors(pixels[x * 0xFF + y], ImColor(color)); + auto &pixel = pixels[x * 0xFF + y]; + pixel = ImAlphaBlendColors(pixel, ImColor(color)); } m_texture = ImGuiExt::Texture(reinterpret_cast(pixels.data()), pixels.size() * 4, m_filter, 0xFF, 0xFF); + m_textureValid = m_texture.isValid(); } auto pos = ImGui::GetWindowPos() + ImVec2(size.x * 0.025F, size.y * 0.025F); @@ -163,7 +165,7 @@ namespace hex { m_buffer.reserve(m_sampleSize == 0 ? size : m_sampleSize); m_byteCount = 0; m_fileSize = size; - m_texture = ImGuiExt::Texture(); + m_textureValid = false; } void update(u8 byte) { @@ -206,7 +208,7 @@ namespace hex { m_glowBuffer[i] = std::min(0.2F + (float(heatMap[m_buffer[i] << 8 | m_buffer[i + 1]]) / float(m_highestCount / 1000)), 1.0F); } - m_opacity = (log10(float(m_sampleSize == 0 ? m_buffer.size() : m_sampleSize)) / log10(float(m_highestCount))) / (100.0F * m_brightness); + m_opacity = (log10(float(m_sampleSize == 0 ? m_buffer.size() : m_sampleSize)) / log10(float(m_highestCount))) / (100.0F * (1.0F - m_brightness)); } private: @@ -223,6 +225,8 @@ namespace hex { float m_opacity = 0.0F; size_t m_highestCount = 0; std::atomic m_processing = false; + + bool m_textureValid = false; ImGuiExt::Texture m_texture; }; @@ -236,20 +240,22 @@ namespace hex { auto drawList = ImGui::GetWindowDrawList(); if (!m_processing) { - if (!m_texture.isValid()) { + if (!m_textureValid) { std::vector pixels; - pixels.resize(0xFF * 0xFF, 0x00); + pixels.resize(0x100 * 0x100, 0x00); for (size_t i = 0; i < (m_buffer.empty() ? 0 : m_buffer.size() - 1); i++) { - const auto x = m_buffer[i]; - const auto y = (float(i) / m_buffer.size()) * 0xFF; + const u8 x = m_buffer[i]; + const u8 y = (float(i) / m_buffer.size()) * 0xFF; auto color = ImLerp(ImColor(0xFF, 0x6D, 0x01).Value, ImColor(0x01, 0x93, 0xFF).Value, float(i) / m_buffer.size()) + ImVec4(m_glowBuffer[i], m_glowBuffer[i], m_glowBuffer[i], 0.0F); - color.w = m_opacity; + color.w = m_opacity; - pixels[x * 0xFF + y] = ImAlphaBlendColors(pixels[x * 0xFF + y], ImColor(color)); + auto &pixel = pixels[x * 0xFF + y]; + pixel = ImAlphaBlendColors(pixel, ImColor(color)); } m_texture = ImGuiExt::Texture(reinterpret_cast(pixels.data()), pixels.size() * 4, m_filter, 0xFF, 0xFF); + m_textureValid = m_texture.isValid(); } const auto pos = ImGui::GetWindowPos() + ImVec2(size.x * 0.025F, size.y * 0.025F); @@ -280,7 +286,7 @@ namespace hex { m_buffer.reserve(m_sampleSize == 0 ? size : m_sampleSize); m_byteCount = 0; m_fileSize = size; - m_texture = ImGuiExt::Texture(); + m_textureValid = false; } void update(u8 byte) { @@ -323,7 +329,7 @@ namespace hex { m_glowBuffer[i] = std::min(0.2F + (float(heatMap[m_buffer[i] << 8 | m_buffer[i + 1]]) / float(m_highestCount / 1000)), 1.0F); } - m_opacity = (log10(float(m_sampleSize == 0 ? m_buffer.size() : m_sampleSize)) / log10(float(m_highestCount))) / (100.0F * m_brightness); + m_opacity = (log10(float(m_sampleSize == 0 ? m_buffer.size() : m_sampleSize)) / log10(float(m_highestCount))) / (100.0F * (1.0F - m_brightness)); } private: @@ -341,6 +347,8 @@ namespace hex { float m_opacity = 0.0F; size_t m_highestCount = 0; std::atomic m_processing = false; + + bool m_textureValid = false; ImGuiExt::Texture m_texture; }; diff --git a/plugins/builtin/source/content/data_information_sections.cpp b/plugins/builtin/source/content/data_information_sections.cpp index 5c74c842c..db43ca14b 100644 --- a/plugins/builtin/source/content/data_information_sections.cpp +++ b/plugins/builtin/source/content/data_information_sections.cpp @@ -350,8 +350,6 @@ class InformationByteRelationshipAnalysis : public ContentRegistry::DataInformat public: InformationByteRelationshipAnalysis() : InformationSection("hex.builtin.information_section.relationship_analysis", "", true) { - } - ~InformationByteRelationshipAnalysis() override { } void process(Task &task, prv::Provider *provider, Region region) override { @@ -367,15 +365,15 @@ class InformationByteRelationshipAnalysis : public ContentRegistry::DataInformat // Loop over each byte of the selection and update each analysis // one byte at a time to process the file only once for (u8 byte : reader) { - m_layeredDistribution.update(byte); m_digram.update(byte); + m_layeredDistribution.update(byte); task.update(); } } void reset() override { - m_digram.reset(0); - m_layeredDistribution.reset(0); + m_digram.reset(m_sampleSize); + m_layeredDistribution.reset(m_sampleSize); updateSettings(); } @@ -395,19 +393,12 @@ class InformationByteRelationshipAnalysis : public ContentRegistry::DataInformat void drawContent() override { auto availableWidth = ImGui::GetContentRegionAvail().x; - ImGui::BeginGroup(); - { - ImGui::TextUnformatted("hex.builtin.information_section.relationship_analysis.digram"_lang); - m_digram.draw({ availableWidth, availableWidth }); - } - ImGui::EndGroup(); - ImGui::BeginGroup(); - { - ImGui::TextUnformatted("hex.builtin.information_section.relationship_analysis.layered_distribution"_lang); - m_layeredDistribution.draw({ availableWidth, availableWidth }); - } - ImGui::EndGroup(); + ImGui::TextUnformatted("hex.builtin.information_section.relationship_analysis.digram"_lang); + m_digram.draw({ availableWidth, availableWidth }); + + ImGui::TextUnformatted("hex.builtin.information_section.relationship_analysis.layered_distribution"_lang); + m_layeredDistribution.draw({ availableWidth, availableWidth }); } void load(const nlohmann::json &data) override { @@ -442,7 +433,7 @@ class InformationByteRelationshipAnalysis : public ContentRegistry::DataInformat private: ImGuiExt::Texture::Filter m_filter = ImGuiExt::Texture::Filter::Nearest; - u64 m_sampleSize = 0x90000; + u64 m_sampleSize = 0x9000; float m_brightness = 0.5F; DiagramDigram m_digram;