blob: fa35d51c9d3bab91c8106c8b8e6705c37f578bd2 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
#pragma once
#include <QtGui/QColor>
#include <QtGui/QAction>
#include <QtGui/QImage>
#include <QtWidgets/QMenu>
#include <QtGui/QPainter>
#include <QtCore/QRect>
#include <QtCore/QPointer>
#include <QtCore/QTimer>
#include <QtCore/QVector>
#include <QtWidgets/QWidget>
#include <mutex>
#include <tuple>
#include <vector>
#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<uint8_t> m_imageData;
std::unique_ptr<QImage> m_image = nullptr;
std::unique_ptr<QImage> m_staticImage = nullptr;
std::vector<BNAddressRange> m_ranges;
BinaryViewRef m_data;
std::unique_ptr<NotificationsDispatcher> m_dispatcher = nullptr;
std::atomic<bool> 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<QColor> m_colors;
QVector<QRgb> 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<uint64_t, bool> 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();
};
|