#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include "binaryninjaapi.h" #include "action.h" #include "notificationsdispatcher.h" #include "uitypes.h" class ContextMenuManager; class View; class SplitPaneWidget; /*! \defgroup featuremap FeatureMap \ingroup uiapi */ /*! \ingroup featuremap */ class BINARYNINJAUIAPI FeatureMap : public QWidget { Q_OBJECT mutable std::mutex m_imageMutex; std::vector m_imageData; std::unique_ptr m_image = nullptr; std::unique_ptr m_staticImage = nullptr; std::vector m_ranges; BinaryViewRef m_data; std::unique_ptr m_dispatcher = nullptr; std::atomic m_updatesPending = false; QTimer* m_updateTimer = nullptr; size_t m_imgWidth = 0; size_t m_imgHeight = 0; double m_verticalScaleFactor = 1.0; uint64_t m_bvLength = 0; bool m_verticalOrientation; int m_curLocX = 0; int m_curLocY = 0; uint64_t m_curAddr = 0; bool m_navigationInProgress = false; QVector m_colors; QVector m_colorTable; Menu m_menu; ContextMenuManager* m_contextMenuManager; QString generateTooltipText(uint8_t colorIndex); uint8_t getColorAtPosition(int x, int y); void updateCoordinates(); void updateMappedRegions(); void connectDataStore(); void disconnectDataStore(); public: FeatureMap(SplitPaneWidget* owner, BinaryViewRef data, bool vertical = true); virtual ~FeatureMap(); void enableBackgroundProcessing(bool enable); void backgroundRefresh(); std::pair getLinearOffsetForAddress(uint64_t addr); void notifyOffsetChanged(uint64_t offset); void notifyThemeChanged(); void renderDataVariable(const BinaryNinja::DataVariable& var, bool ignoreString = false); uint8_t getSymbolColor(const SymbolRef& symbol); void drawImageRect(uint64_t addr, size_t len, uint8_t color); virtual QSize sizeHint() const override; static int defaultWidth() { return 64; } protected: virtual bool event(QEvent* event) override; virtual void contextMenuEvent(QContextMenuEvent* event) override; virtual void mouseMoveEvent(QMouseEvent* event) override; virtual void mousePressEvent(QMouseEvent* event) override; virtual void resizeEvent(QResizeEvent* event) override; virtual void paintEvent(QPaintEvent* event) override; virtual void showEvent(QShowEvent* event) override; virtual void hideEvent(QHideEvent* event) override; void scrollTo(int x, int y, bool addHistoryEntry = false); private Q_SLOTS: void renderAnalysisData(); void updateThemeInternal(); };