diff --git a/lib/libimhex/include/hex/ui/imgui_imhex_extensions.h b/lib/libimhex/include/hex/ui/imgui_imhex_extensions.h index 713a0582d..dd1af3700 100644 --- a/lib/libimhex/include/hex/ui/imgui_imhex_extensions.h +++ b/lib/libimhex/include/hex/ui/imgui_imhex_extensions.h @@ -29,8 +29,8 @@ enum ImGuiCustomCol { namespace ImGui { struct Texture { - ImTextureID textureId; - int width, height; + ImTextureID textureId = nullptr; + int width = 0, height = 0; [[nodiscard]] constexpr bool valid() const noexcept { return this->textureId != nullptr; @@ -43,6 +43,12 @@ namespace ImGui { [[nodiscard]] auto size() const noexcept { return ImVec2(this->width, this->height); } + + [[nodiscard]] constexpr auto aspectRatio() const noexcept { + if (this->height == 0) return 1.0F; + + return float(this->width) / float(this->height); + } }; int UpdateStringSizeCallback(ImGuiInputTextCallbackData *data); diff --git a/plugins/builtin/source/content/data_processor_nodes.cpp b/plugins/builtin/source/content/data_processor_nodes.cpp index 32ff66973..a4a9aafdb 100644 --- a/plugins/builtin/source/content/data_processor_nodes.cpp +++ b/plugins/builtin/source/content/data_processor_nodes.cpp @@ -835,6 +835,27 @@ namespace hex::plugin::builtin { size_t m_highestCount = 0; }; + class NodeVisualizerImage : public dp::Node { + public: + NodeVisualizerImage() : Node("hex.builtin.nodes.visualizer.image.header", { dp::Attribute(dp::Attribute::IOType::In, dp::Attribute::Type::Buffer, "hex.builtin.nodes.visualizer.image.input") }) { } + + void drawNode() override { + ImGui::Image(this->m_texture, scaled(ImVec2(this->m_texture.aspectRatio() * 200, 200))); + } + + void process() override { + auto rawData = this->getBufferOnInput(0); + + if (this->m_texture.valid()) + ImGui::UnloadImage(this->m_texture); + + this->m_texture = ImGui::LoadImageFromMemory(rawData.data(), rawData.size()); + } + + private: + ImGui::Texture m_texture; + }; + void registerDataProcessorNodes() { ContentRegistry::DataProcessorNode::add("hex.builtin.nodes.constants", "hex.builtin.nodes.constants.int"); ContentRegistry::DataProcessorNode::add("hex.builtin.nodes.constants", "hex.builtin.nodes.constants.float"); @@ -883,6 +904,7 @@ namespace hex::plugin::builtin { ContentRegistry::DataProcessorNode::add("hex.builtin.nodes.crypto", "hex.builtin.nodes.crypto.aes"); ContentRegistry::DataProcessorNode::add("hex.builtin.nodes.visualizer", "hex.builtin.nodes.visualizer.digram"); + ContentRegistry::DataProcessorNode::add("hex.builtin.nodes.visualizer", "hex.builtin.nodes.visualizer.image"); } } \ No newline at end of file diff --git a/plugins/builtin/source/lang/en_US.cpp b/plugins/builtin/source/lang/en_US.cpp index f6caf6528..e8598d418 100644 --- a/plugins/builtin/source/lang/en_US.cpp +++ b/plugins/builtin/source/lang/en_US.cpp @@ -607,6 +607,9 @@ namespace hex::plugin::builtin { { "hex.builtin.nodes.visualizer.digram", "Digram" }, { "hex.builtin.nodes.visualizer.digram.header", "Digram Visualizer" }, { "hex.builtin.nodes.visualizer.digram.input", "Input" }, + { "hex.builtin.nodes.visualizer.image", "Image" }, + { "hex.builtin.nodes.visualizer.image.header", "Image Visualizer" }, + { "hex.builtin.nodes.visualizer.image.input", "Input" }, { "hex.builtin.tools.demangler", "Itanium/MSVC demangler" },