1
1
#include <vix.h>
2
2
#include <simtk/simtk.h>
3
+ #include <region.h>
3
4
#include "hexview.h"
4
5
5
6
struct simtk_hexview_properties *
@@ -17,6 +18,14 @@ simtk_hexview_properties_new (uint32_t vaddr, const void *base, uint32_t size)
17
18
return NULL ;
18
19
}
19
20
21
+ if ((new -> regions = file_region_tree_new ()) == NULL )
22
+ {
23
+ SDL_DestroyMutex (new -> lock );
24
+ free (new );
25
+
26
+ return NULL ;
27
+ }
28
+
20
29
new -> map = base ;
21
30
new -> map_size = size ;
22
31
@@ -40,6 +49,8 @@ simtk_hexview_properties_destroy (struct simtk_hexview_properties *prop)
40
49
{
41
50
SDL_DestroyMutex (prop -> lock );
42
51
52
+ rbtree_destroy (prop -> regions );
53
+
43
54
free (prop );
44
55
}
45
56
@@ -80,6 +91,61 @@ simtk_hexview_set_opaque (struct simtk_widget *widget, void *opaque)
80
91
simtk_hexview_properties_unlock (prop );
81
92
}
82
93
94
+ void
95
+ simtk_hexview_clear_regions (const struct simtk_widget * widget )
96
+ {
97
+ struct simtk_hexview_properties * prop ;
98
+
99
+ prop = simtk_hexview_get_properties (widget );
100
+
101
+ simtk_hexview_properties_lock (prop );
102
+
103
+ rbtree_clear (prop -> regions );
104
+
105
+ simtk_hexview_properties_unlock (prop );
106
+ }
107
+
108
+ int
109
+ simtk_hexview_mark_region_noflip (const struct simtk_widget * widget ,
110
+ const char * name ,
111
+ uint64_t start ,
112
+ uint64_t length ,
113
+ uint32_t fgcolor ,
114
+ uint32_t bgcolor )
115
+ {
116
+ struct simtk_hexview_properties * prop ;
117
+
118
+ int result ;
119
+
120
+ prop = simtk_hexview_get_properties (widget );
121
+
122
+ simtk_hexview_properties_lock (prop );
123
+
124
+ result = file_region_register (prop -> regions , name , start , length , fgcolor , bgcolor );
125
+
126
+ simtk_hexview_properties_unlock (prop );
127
+
128
+ return result ;
129
+ }
130
+
131
+ int
132
+ simtk_hexview_mark_region (struct simtk_widget * widget ,
133
+ const char * name ,
134
+ uint64_t start ,
135
+ uint64_t length ,
136
+ uint32_t fgcolor ,
137
+ uint32_t bgcolor )
138
+
139
+ {
140
+ int result ;
141
+
142
+ result = simtk_hexview_mark_region_noflip (widget , name , start , length , fgcolor , bgcolor );
143
+
144
+ simtk_widget_switch_buffers (widget );
145
+
146
+ return result ;
147
+ }
148
+
83
149
#define HEX_MINIMAL 0x80
84
150
#define ASCII_MINIMAL 0x80
85
151
@@ -88,6 +154,11 @@ simtk_hexview_render_noflip (struct simtk_widget *widget)
88
154
{
89
155
struct simtk_hexview_properties * hprop ;
90
156
struct simtk_textview_properties * prop ;
157
+ struct file_region * region ;
158
+
159
+ uint32_t hex_bgcolor , hex_fgcolor ;
160
+ uint32_t asc_bgcolor , asc_fgcolor ;
161
+ uint32_t offset ;
91
162
92
163
unsigned int i ;
93
164
const void * addr ;
@@ -97,6 +168,7 @@ simtk_hexview_render_noflip (struct simtk_widget *widget)
97
168
uint8_t byte ;
98
169
uint32_t vaddr ;
99
170
unsigned int maxcols = 16 ;
171
+ struct rbtree_node * node ;
100
172
101
173
hprop = simtk_hexview_get_properties (widget );
102
174
prop = simtk_textview_get_properties (widget );
@@ -105,6 +177,13 @@ simtk_hexview_render_noflip (struct simtk_widget *widget)
105
177
106
178
vaddr = hprop -> vaddr + hprop -> start ;
107
179
addr = hprop -> map + hprop -> start ;
180
+
181
+ if ((node = file_region_find (hprop -> regions , hprop -> start )) != NULL )
182
+ region = (struct file_region * ) rbtree_node_data (node );
183
+ else
184
+ region = NULL ;
185
+
186
+ offset = hprop -> start ;
108
187
109
188
for (i = hprop -> start ; i < hprop -> map_size ; ++ i )
110
189
{
@@ -121,13 +200,41 @@ simtk_hexview_render_noflip (struct simtk_widget *widget)
121
200
simtk_textview_set_text (widget , 0 , common_y , OPAQUE (0xff0000 ), 0x80000000 , buffer , 10 );
122
201
}
123
202
203
+ if (region != NULL )
204
+ if (offset >= region -> start + region -> length )
205
+ {
206
+ if ((node = rbtree_node_next (node )) != NULL )
207
+ region = (struct file_region * ) rbtree_node_data (node );
208
+ else
209
+ region = NULL ;
210
+ }
211
+
124
212
sprintf (buffer , "%02x " , byte = * ((uint8_t * ) addr ));
213
+
214
+ if (region != NULL && offset >= region -> start && offset < region -> start + region -> length )
215
+ {
216
+ hex_fgcolor = region -> fgcolor ;
217
+ asc_fgcolor = region -> fgcolor ;
125
218
126
- simtk_textview_set_text (widget , 3 * this_x + 10 , common_y , OPAQUE (RGB ((byte + HEX_MINIMAL ) * 0xff / (0xff + HEX_MINIMAL ), (byte + HEX_MINIMAL ) * 0xa5 / (0xff + HEX_MINIMAL ), 0 )), 0x80000000 , buffer , 3 );
127
- simtk_textview_set_text (widget , 10 + 3 * maxcols + this_x , common_y , OPAQUE (RGB (0 , (byte + ASCII_MINIMAL ) * 0xff / (0xff + HEX_MINIMAL ), 0 )), 0x80000000 , addr ++ , 1 );
219
+ hex_bgcolor = region -> bgcolor ;
220
+ asc_bgcolor = region -> bgcolor ;
221
+ }
222
+ else
223
+ {
224
+ hex_fgcolor = OPAQUE (RGB ((byte + HEX_MINIMAL ) * 0xff / (0xff + HEX_MINIMAL ), (byte + HEX_MINIMAL ) * 0xa5 / (0xff + HEX_MINIMAL ), 0 ));
225
+ hex_bgcolor = 0x80000000 ;
226
+
227
+ asc_fgcolor = OPAQUE (RGB (0 , (byte + ASCII_MINIMAL ) * 0xff / (0xff + HEX_MINIMAL ), 0 ));
228
+ asc_bgcolor = 0x80000000 ;
229
+ }
230
+
231
+ simtk_textview_set_text (widget , 3 * this_x + 10 , common_y , hex_fgcolor , hex_bgcolor , buffer , 3 );
232
+
233
+ simtk_textview_set_text (widget , 10 + 3 * maxcols + this_x , common_y , asc_fgcolor , asc_bgcolor , addr ++ , 1 );
128
234
129
235
++ this_x ;
130
236
++ vaddr ;
237
+ ++ offset ;
131
238
}
132
239
133
240
simtk_hexview_properties_unlock (hprop );
0 commit comments