1
0
mirror of synced 2024-11-28 17:40:51 +01:00

impr: Improve frame rate when lots of bytes are highlighted

This commit is contained in:
WerWolv 2023-07-24 23:24:31 +02:00
parent 440e2d91fc
commit 4d4f223357
4 changed files with 48 additions and 17 deletions

View File

@ -76,6 +76,8 @@ namespace hex::plugin::builtin {
PerProvider<std::optional<u64>> m_selectionStart, m_selectionEnd; PerProvider<std::optional<u64>> m_selectionStart, m_selectionEnd;
PerProvider<float> m_scrollPosition; PerProvider<float> m_scrollPosition;
PerProvider<std::map<u64, color_t>> m_foregroundHighlights, m_backgroundHighlights;
}; };
} }

View File

@ -15,9 +15,11 @@ namespace hex::plugin::builtin {
~ViewPatches() override = default; ~ViewPatches() override = default;
void drawContent() override; void drawContent() override;
void drawAlwaysVisible() override;
private: private:
u64 m_selectedPatch = 0x00; u64 m_selectedPatch = 0x00;
PerProvider<u32> m_numPatches;
}; };
} }

View File

@ -505,40 +505,50 @@ namespace hex::plugin::builtin {
/* Hex Editor */ /* Hex Editor */
ViewHexEditor::ViewHexEditor() : View("hex.builtin.view.hex_editor.name") { ViewHexEditor::ViewHexEditor() : View("hex.builtin.view.hex_editor.name") {
this->m_hexEditor.setForegroundHighlightCallback([](u64 address, const u8 *data, size_t size) -> std::optional<color_t> { this->m_hexEditor.setForegroundHighlightCallback([this](u64 address, const u8 *data, size_t size) -> std::optional<color_t> {
if (auto highlight = this->m_foregroundHighlights->find(address); highlight != this->m_foregroundHighlights->end())
return highlight->second;
std::optional<color_t> result; std::optional<color_t> result;
for (const auto &[id, callback] : ImHexApi::HexEditor::impl::getForegroundHighlightingFunctions()) { for (const auto &[id, callback] : ImHexApi::HexEditor::impl::getForegroundHighlightingFunctions()) {
if (auto color = callback(address, data, size, result.has_value()); color.has_value()) if (auto color = callback(address, data, size, result.has_value()); color.has_value())
result = color; result = color;
} }
if (result.has_value()) if (!result.has_value()) {
return result; for (const auto &[id, highlighting] : ImHexApi::HexEditor::impl::getForegroundHighlights()) {
if (highlighting.getRegion().overlaps({ address, size }))
for (const auto &[id, highlighting] : ImHexApi::HexEditor::impl::getForegroundHighlights()) { return highlighting.getColor();
if (highlighting.getRegion().overlaps({ address, size })) }
return highlighting.getColor();
} }
return std::nullopt; if (result.has_value())
this->m_foregroundHighlights->insert({ address, result.value() });
return result;
}); });
this->m_hexEditor.setBackgroundHighlightCallback([](u64 address, const u8 *data, size_t size) -> std::optional<color_t> { this->m_hexEditor.setBackgroundHighlightCallback([this](u64 address, const u8 *data, size_t size) -> std::optional<color_t> {
if (auto highlight = this->m_backgroundHighlights->find(address); highlight != this->m_backgroundHighlights->end())
return highlight->second;
std::optional<color_t> result; std::optional<color_t> result;
for (const auto &[id, callback] : ImHexApi::HexEditor::impl::getBackgroundHighlightingFunctions()) { for (const auto &[id, callback] : ImHexApi::HexEditor::impl::getBackgroundHighlightingFunctions()) {
if (auto color = callback(address, data, size, result.has_value()); color.has_value()) if (auto color = callback(address, data, size, result.has_value()); color.has_value())
return color.value(); result = color;
}
if (!result.has_value()) {
for (const auto &[id, highlighting] : ImHexApi::HexEditor::impl::getBackgroundHighlights()) {
if (highlighting.getRegion().overlaps({ address, size }))
return highlighting.getColor();
}
} }
if (result.has_value()) if (result.has_value())
return result; this->m_backgroundHighlights->insert({ address, result.value() });
for (const auto &[id, highlighting] : ImHexApi::HexEditor::impl::getBackgroundHighlights()) { return result;
if (highlighting.getRegion().overlaps({ address, size }))
return highlighting.getColor();
}
return std::nullopt;
}); });
this->m_hexEditor.setTooltipCallback([](u64 address, const u8 *data, size_t size) { this->m_hexEditor.setTooltipCallback([](u64 address, const u8 *data, size_t size) {
@ -573,8 +583,10 @@ namespace hex::plugin::builtin {
} }
ViewHexEditor::~ViewHexEditor() { ViewHexEditor::~ViewHexEditor() {
EventManager::unsubscribe<RequestSelectionChange>(this);
EventManager::unsubscribe<EventProviderChanged>(this); EventManager::unsubscribe<EventProviderChanged>(this);
EventManager::unsubscribe<EventProviderOpened>(this); EventManager::unsubscribe<EventProviderOpened>(this);
EventManager::unsubscribe<EventHighlightingChanged>(this);
} }
void ViewHexEditor::drawPopup() { void ViewHexEditor::drawPopup() {
@ -931,6 +943,11 @@ namespace hex::plugin::builtin {
ImHexApi::HexEditor::clearSelection(); ImHexApi::HexEditor::clearSelection();
}); });
EventManager::subscribe<EventHighlightingChanged>(this, [this]{
this->m_foregroundHighlights->clear();
this->m_backgroundHighlights->clear();
});
ProjectFile::registerPerProviderHandler({ ProjectFile::registerPerProviderHandler({
.basePath = "custom_encoding.tbl", .basePath = "custom_encoding.tbl",
.required = false, .required = false,

View File

@ -117,4 +117,14 @@ namespace hex::plugin::builtin {
ImGui::End(); ImGui::End();
} }
void ViewPatches::drawAlwaysVisible() {
if (auto provider = ImHexApi::Provider::get(); provider != nullptr) {
const auto &patches = provider->getPatches();
if (this->m_numPatches.get(provider) != patches.size()) {
this->m_numPatches.get(provider) = patches.size();
EventManager::post<EventHighlightingChanged>();
}
}
}
} }