1
0
mirror of synced 2025-02-17 18:59:21 +01:00

patterns: Added hex_viewer visualizer

This commit is contained in:
WerWolv 2023-06-02 10:47:18 +02:00
parent 117832e007
commit 504c022f01
3 changed files with 44 additions and 11 deletions

@ -1 +1 @@
Subproject commit 5f0c69ffa3a1a11c4c8834cfc87b851d46d287c0
Subproject commit 9fe6b2bd4b428f6e31473cbd83e66a5e04d4a045

View File

@ -21,7 +21,7 @@ namespace hex {
PerProvider(T data) : m_data({ { ImHexApi::Provider::get(), std::move(data) } }) { this->onCreate(); }
~PerProvider() = default;
~PerProvider() { this->onDestroy(); }
T* operator->() {
return &this->get();
@ -58,19 +58,25 @@ namespace hex {
private:
void onCreate() {
(void)EventManager::subscribe<EventProviderOpened>([this](prv::Provider *provider) {
EventManager::subscribe<EventProviderOpened>(this, [this](prv::Provider *provider) {
this->m_data.emplace(provider, T());
});
(void)EventManager::subscribe<EventProviderDeleted>([this](prv::Provider *provider){
EventManager::subscribe<EventProviderDeleted>(this, [this](prv::Provider *provider){
this->m_data.erase(provider);
});
EventManager::subscribe<EventImHexClosing>([this] {
EventManager::subscribe<EventImHexClosing>(this, [this] {
this->m_data.clear();
});
}
void onDestroy() {
EventManager::unsubscribe<EventProviderOpened>(this);
EventManager::unsubscribe<EventProviderDeleted>(this);
EventManager::unsubscribe<EventImHexClosing>(this);
}
private:
std::map<prv::Provider *, T> m_data;
};

View File

@ -22,6 +22,9 @@
#include <numeric>
#include <content/helpers/diagrams.hpp>
#include <ui/hex_editor.hpp>
#include <content/providers/memory_file_provider.hpp>
namespace hex::plugin::builtin {
@ -447,18 +450,41 @@ namespace hex::plugin::builtin {
}
void drawChunkBasedEntropyVisualizer(pl::ptrn::Pattern &, pl::ptrn::IIterable &, bool shouldReset, std::span<const pl::core::Token::Literal> arguments) {
// variable used to store the result to avoid having to recalculate the result at each frame
static DiagramChunkBasedEntropyAnalysis analyzer;
// variable used to store the result to avoid having to recalculate the result at each frame
static DiagramChunkBasedEntropyAnalysis analyzer;
// compute data
// compute data
if (shouldReset) {
auto pattern = arguments[0].toPattern();
auto chunkSize = arguments[1].toUnsigned();
analyzer.process(pattern->getBytes(), chunkSize);
analyzer.process(pattern->getBytes(), chunkSize);
}
// show results
analyzer.draw(ImVec2(400, 250), ImPlotFlags_NoChild | ImPlotFlags_CanvasOnly);
analyzer.draw(ImVec2(400, 250), ImPlotFlags_NoChild | ImPlotFlags_CanvasOnly);
}
void drawHexVisualizer(pl::ptrn::Pattern &, pl::ptrn::IIterable &, bool shouldReset, std::span<const pl::core::Token::Literal> arguments) {
static ui::HexEditor editor;
static std::unique_ptr<MemoryFileProvider> dataProvider;
if (shouldReset) {
auto pattern = arguments[0].toPattern();
auto data = pattern->getBytes();
dataProvider = std::make_unique<MemoryFileProvider>();
dataProvider->resize(data.size());
dataProvider->writeRaw(0x00, data.data(), data.size());
dataProvider->setReadOnly(true);
editor.setProvider(dataProvider.get());
}
if (ImGui::BeginChild("##editor", scaled(ImVec2(600, 400)))) {
editor.draw();
ImGui::EndChild();
}
}
}
@ -472,6 +498,7 @@ namespace hex::plugin::builtin {
ContentRegistry::PatternLanguage::addVisualizer("3d", draw3DVisualizer, 2);
ContentRegistry::PatternLanguage::addVisualizer("sound", drawSoundVisualizer, 3);
ContentRegistry::PatternLanguage::addVisualizer("chunk_entropy", drawChunkBasedEntropyVisualizer, 2);
ContentRegistry::PatternLanguage::addVisualizer("hex_viewer", drawHexVisualizer, 1);
}
}