patterns: Added hex_viewer visualizer
This commit is contained in:
parent
117832e007
commit
504c022f01
2
lib/external/pattern_language
vendored
2
lib/external/pattern_language
vendored
@ -1 +1 @@
|
||||
Subproject commit 5f0c69ffa3a1a11c4c8834cfc87b851d46d287c0
|
||||
Subproject commit 9fe6b2bd4b428f6e31473cbd83e66a5e04d4a045
|
@ -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;
|
||||
};
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user