57 #define ImSnprintf _snprintf 59 #define ImSnprintf snprintf 63 #pragma warning (push) 64 #pragma warning (disable: 4996) // warning C4996: 'sprintf': This function or variable may be unsafe. 82 bool OptShowDataPreview;
85 bool OptGreyOutZeroes;
88 int OptAddrDigitsCount;
89 float OptFooterExtraHeight;
91 ImU8 (*ReadFn)(
const ImU8* data,
size_t off);
92 void (*WriteFn)(ImU8* data,
size_t off, ImU8 d);
93 bool (*HighlightFn)(
const ImU8* data,
size_t off);
96 bool ContentsWidthChanged;
97 size_t DataPreviewAddr;
98 size_t DataEditingAddr;
99 bool DataEditingTakeFocus;
100 char DataInputBuf[32];
101 char AddrInputBuf[32];
103 size_t HighlightMin, HighlightMax;
104 int PreviewEndianness;
105 ImGuiDataType PreviewDataType;
113 OptShowOptions =
true;
114 OptShowDataPreview =
false;
115 OptShowHexII =
false;
117 OptGreyOutZeroes =
true;
118 OptUpperCaseHex =
true;
120 OptAddrDigitsCount = 0;
121 OptFooterExtraHeight = 0.0f;
122 HighlightColor = IM_COL32(255, 255, 255, 50);
128 ContentsWidthChanged =
false;
129 DataPreviewAddr = DataEditingAddr = (size_t)-1;
130 DataEditingTakeFocus =
false;
131 memset(DataInputBuf, 0,
sizeof(DataInputBuf));
132 memset(AddrInputBuf, 0,
sizeof(AddrInputBuf));
133 GotoAddr = (size_t)-1;
134 HighlightMin = HighlightMax = (size_t)-1;
135 PreviewEndianness = 0;
136 PreviewDataType = ImGuiDataType_S32;
139 void GotoAddrAndHighlight(
size_t addr_min,
size_t addr_max)
142 HighlightMin = addr_min;
143 HighlightMax = addr_max;
152 float SpacingBetweenMidCols;
159 Sizes() { memset(
this, 0,
sizeof(*
this)); }
162 void CalcSizes(
Sizes& s,
size_t mem_size,
size_t base_display_addr)
165 s.AddrDigitsCount = OptAddrDigitsCount;
166 if (s.AddrDigitsCount == 0)
167 for (
size_t n = base_display_addr + mem_size - 1; n > 0; n >>= 4)
169 s.LineHeight = ImGui::GetTextLineHeight();
170 s.GlyphWidth = ImGui::CalcTextSize(
"F").x + 1;
171 s.HexCellWidth = (float)(
int)(s.GlyphWidth * 2.5f);
172 s.SpacingBetweenMidCols = (float)(
int)(s.HexCellWidth * 0.25f);
173 s.PosHexStart = (s.AddrDigitsCount + 2) * s.GlyphWidth;
174 s.PosHexEnd = s.PosHexStart + (s.HexCellWidth * Cols);
175 s.PosAsciiStart = s.PosAsciiEnd = s.PosHexEnd;
178 s.PosAsciiStart = s.PosHexEnd + s.GlyphWidth * 1;
179 if (OptMidColsCount > 0)
180 s.PosAsciiStart += (float)((Cols + OptMidColsCount - 1) / OptMidColsCount) * s.SpacingBetweenMidCols;
181 s.PosAsciiEnd = s.PosAsciiStart + Cols * s.GlyphWidth;
183 s.WindowWidth = s.PosAsciiEnd + style.ScrollbarSize + style.WindowPadding.x * 2 + s.GlyphWidth;
187 void DrawWindow(
const char* title,
void* mem_data,
size_t mem_size,
size_t base_display_addr = 0x0000)
190 CalcSizes(s, mem_size, base_display_addr);
191 ImGui::SetNextWindowSize(
ImVec2(s.WindowWidth, s.WindowWidth * 0.60f), ImGuiCond_FirstUseEver);
192 ImGui::SetNextWindowSizeConstraints(
ImVec2(0.0f, 0.0f),
ImVec2(s.WindowWidth, FLT_MAX));
195 if (ImGui::Begin(title, &Open, ImGuiWindowFlags_NoScrollbar))
197 if (ImGui::IsWindowHovered(ImGuiHoveredFlags_RootAndChildWindows) && ImGui::IsMouseReleased(ImGuiMouseButton_Right))
198 ImGui::OpenPopup(
"context");
199 DrawContents(mem_data, mem_size, base_display_addr);
200 if (ContentsWidthChanged)
202 CalcSizes(s, mem_size, base_display_addr);
203 ImGui::SetWindowSize(
ImVec2(s.WindowWidth, ImGui::GetWindowSize().y));
210 void DrawContents(
void* mem_data_void,
size_t mem_size,
size_t base_display_addr = 0x0000)
215 ImU8* mem_data = (ImU8*)mem_data_void;
217 CalcSizes(s, mem_size, base_display_addr);
222 const float height_separator = style.ItemSpacing.y;
223 float footer_height = OptFooterExtraHeight;
225 footer_height += height_separator + ImGui::GetFrameHeightWithSpacing() * 1;
226 if (OptShowDataPreview)
227 footer_height += height_separator + ImGui::GetFrameHeightWithSpacing() * 1 + ImGui::GetTextLineHeightWithSpacing() * 3;
228 ImGui::BeginChild(
"##scrolling",
ImVec2(0, -footer_height),
false, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoNav);
229 ImDrawList* draw_list = ImGui::GetWindowDrawList();
231 ImGui::PushStyleVar(ImGuiStyleVar_FramePadding,
ImVec2(0, 0));
232 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing,
ImVec2(0, 0));
235 const int line_total_count = (int)((mem_size + Cols - 1) / Cols);
237 clipper.Begin(line_total_count, s.LineHeight);
239 bool data_next =
false;
241 if (ReadOnly || DataEditingAddr >= mem_size)
242 DataEditingAddr = (size_t)-1;
243 if (DataPreviewAddr >= mem_size)
244 DataPreviewAddr = (size_t)-1;
246 size_t preview_data_type_size = OptShowDataPreview ? DataTypeGetSize(PreviewDataType) : 0;
248 size_t data_editing_addr_next = (size_t)-1;
249 if (DataEditingAddr != (
size_t)-1)
252 if (ImGui::IsKeyPressed(ImGuiKey_UpArrow) && (ptrdiff_t)DataEditingAddr >= (ptrdiff_t)Cols) { data_editing_addr_next = DataEditingAddr - Cols; }
253 else if (ImGui::IsKeyPressed(ImGuiKey_DownArrow) && (ptrdiff_t)DataEditingAddr < (ptrdiff_t)mem_size - Cols){ data_editing_addr_next = DataEditingAddr + Cols; }
254 else if (ImGui::IsKeyPressed(ImGuiKey_LeftArrow) && (ptrdiff_t)DataEditingAddr > (ptrdiff_t)0) { data_editing_addr_next = DataEditingAddr - 1; }
255 else if (ImGui::IsKeyPressed(ImGuiKey_RightArrow) && (ptrdiff_t)DataEditingAddr < (ptrdiff_t)mem_size - 1) { data_editing_addr_next = DataEditingAddr + 1; }
259 ImVec2 window_pos = ImGui::GetWindowPos();
261 draw_list->AddLine(
ImVec2(window_pos.x + s.PosAsciiStart - s.GlyphWidth, window_pos.y),
ImVec2(window_pos.x + s.PosAsciiStart - s.GlyphWidth, window_pos.y + 9999), ImGui::GetColorU32(ImGuiCol_Border));
263 const ImU32 color_text = ImGui::GetColorU32(ImGuiCol_Text);
264 const ImU32 color_disabled = OptGreyOutZeroes ? ImGui::GetColorU32(ImGuiCol_TextDisabled) : color_text;
266 const char* format_address = OptUpperCaseHex ?
"%0*zX: " :
"%0*zx: ";
267 const char* format_data = OptUpperCaseHex ?
"%0*zX" :
"%0*zx";
268 const char* format_byte = OptUpperCaseHex ?
"%02X" :
"%02x";
269 const char* format_byte_space = OptUpperCaseHex ?
"%02X " :
"%02x ";
271 while (clipper.Step())
272 for (
int line_i = clipper.DisplayStart; line_i < clipper.DisplayEnd; line_i++)
274 size_t addr = (size_t)(line_i * Cols);
275 ImGui::Text(format_address, s.AddrDigitsCount, base_display_addr + addr);
278 for (
int n = 0; n < Cols && addr < mem_size; n++, addr++)
280 float byte_pos_x = s.PosHexStart + s.HexCellWidth * n;
281 if (OptMidColsCount > 0)
282 byte_pos_x += (float)(n / OptMidColsCount) * s.SpacingBetweenMidCols;
283 ImGui::SameLine(byte_pos_x);
286 bool is_highlight_from_user_range = (addr >= HighlightMin && addr < HighlightMax);
287 bool is_highlight_from_user_func = (HighlightFn && HighlightFn(mem_data, addr));
288 bool is_highlight_from_preview = (addr >= DataPreviewAddr && addr < DataPreviewAddr + preview_data_type_size);
289 if (is_highlight_from_user_range || is_highlight_from_user_func || is_highlight_from_preview)
291 ImVec2 pos = ImGui::GetCursorScreenPos();
292 float highlight_width = s.GlyphWidth * 2;
293 bool is_next_byte_highlighted = (addr + 1 < mem_size) && ((HighlightMax != (
size_t)-1 && addr + 1 < HighlightMax) || (HighlightFn && HighlightFn(mem_data, addr + 1)));
294 if (is_next_byte_highlighted || (n + 1 == Cols))
296 highlight_width = s.HexCellWidth;
297 if (OptMidColsCount > 0 && n > 0 && (n + 1) < Cols && ((n + 1) % OptMidColsCount) == 0)
298 highlight_width += s.SpacingBetweenMidCols;
300 draw_list->AddRectFilled(pos,
ImVec2(pos.x + highlight_width, pos.y + s.LineHeight), HighlightColor);
303 if (DataEditingAddr == addr)
306 bool data_write =
false;
307 ImGui::PushID((
void*)addr);
308 if (DataEditingTakeFocus)
310 ImGui::SetKeyboardFocusHere(0);
311 snprintf(AddrInputBuf, 32, format_data, s.AddrDigitsCount, base_display_addr + addr);
312 snprintf(DataInputBuf, 32, format_byte, ReadFn ? ReadFn(mem_data, addr) : mem_data[addr]);
319 UserData* user_data = (UserData*)data->UserData;
320 if (!data->HasSelection())
321 user_data->CursorPos = data->CursorPos;
322 if (data->SelectionStart == 0 && data->SelectionEnd == data->BufTextLen)
326 data->DeleteChars(0, data->BufTextLen);
327 data->InsertChars(0, user_data->CurrentBufOverwrite);
328 data->SelectionStart = 0;
329 data->SelectionEnd = 2;
334 char CurrentBufOverwrite[3];
338 user_data.CursorPos = -1;
339 snprintf(user_data.CurrentBufOverwrite, 3, format_byte, ReadFn ? ReadFn(mem_data, addr) : mem_data[addr]);
340 ImGuiInputTextFlags flags = ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_NoHorizontalScroll | ImGuiInputTextFlags_CallbackAlways;
341 flags |= ImGuiInputTextFlags_AlwaysOverwrite;
342 ImGui::SetNextItemWidth(s.GlyphWidth * 2);
343 if (ImGui::InputText(
"##data", DataInputBuf, IM_ARRAYSIZE(DataInputBuf), flags, UserData::Callback, &user_data))
344 data_write = data_next =
true;
345 else if (!DataEditingTakeFocus && !ImGui::IsItemActive())
346 DataEditingAddr = data_editing_addr_next = (size_t)-1;
347 DataEditingTakeFocus =
false;
348 if (user_data.CursorPos >= 2)
349 data_write = data_next =
true;
350 if (data_editing_addr_next != (
size_t)-1)
351 data_write = data_next =
false;
352 unsigned int data_input_value = 0;
353 if (data_write && sscanf(DataInputBuf,
"%X", &data_input_value) == 1)
356 WriteFn(mem_data, addr, (ImU8)data_input_value);
358 mem_data[addr] = (ImU8)data_input_value;
365 ImU8 b = ReadFn ? ReadFn(mem_data, addr) : mem_data[addr];
369 if ((b >= 32 && b < 128))
370 ImGui::Text(
".%c ", b);
371 else if (b == 0xFF && OptGreyOutZeroes)
372 ImGui::TextDisabled(
"## ");
376 ImGui::Text(format_byte_space, b);
380 if (b == 0 && OptGreyOutZeroes)
381 ImGui::TextDisabled(
"00 ");
383 ImGui::Text(format_byte_space, b);
385 if (!ReadOnly && ImGui::IsItemHovered() && ImGui::IsMouseClicked(0))
387 DataEditingTakeFocus =
true;
388 data_editing_addr_next = addr;
396 ImGui::SameLine(s.PosAsciiStart);
397 ImVec2 pos = ImGui::GetCursorScreenPos();
398 addr = line_i * Cols;
399 ImGui::PushID(line_i);
400 if (ImGui::InvisibleButton(
"ascii",
ImVec2(s.PosAsciiEnd - s.PosAsciiStart, s.LineHeight)))
402 DataEditingAddr = DataPreviewAddr = addr + (size_t)((ImGui::GetIO().MousePos.x - pos.x) / s.GlyphWidth);
403 DataEditingTakeFocus =
true;
406 for (
int n = 0; n < Cols && addr < mem_size; n++, addr++)
408 if (addr == DataEditingAddr)
410 draw_list->AddRectFilled(pos,
ImVec2(pos.x + s.GlyphWidth, pos.y + s.LineHeight), ImGui::GetColorU32(ImGuiCol_FrameBg));
411 draw_list->AddRectFilled(pos,
ImVec2(pos.x + s.GlyphWidth, pos.y + s.LineHeight), ImGui::GetColorU32(ImGuiCol_TextSelectedBg));
413 unsigned char c = ReadFn ? ReadFn(mem_data, addr) : mem_data[addr];
414 char display_c = (c < 32 || c >= 128) ?
'.' : c;
415 draw_list->AddText(pos, (display_c == c) ? color_text : color_disabled, &display_c, &display_c + 1);
416 pos.x += s.GlyphWidth;
420 ImGui::PopStyleVar(2);
424 ImGui::SetCursorPosX(s.WindowWidth);
425 ImGui::Dummy(
ImVec2(0.0f, 0.0f));
427 if (data_next && DataEditingAddr + 1 < mem_size)
429 DataEditingAddr = DataPreviewAddr = DataEditingAddr + 1;
430 DataEditingTakeFocus =
true;
432 else if (data_editing_addr_next != (
size_t)-1)
434 DataEditingAddr = DataPreviewAddr = data_editing_addr_next;
435 DataEditingTakeFocus =
true;
438 const bool lock_show_data_preview = OptShowDataPreview;
442 DrawOptionsLine(s, mem_data, mem_size, base_display_addr);
445 if (lock_show_data_preview)
448 DrawPreviewLine(s, mem_data, mem_size, base_display_addr);
452 void DrawOptionsLine(
const Sizes& s,
void* mem_data,
size_t mem_size,
size_t base_display_addr)
456 const char* format_range = OptUpperCaseHex ?
"Range %0*zX..%0*zX" :
"Range %0*zx..%0*zx";
459 if (ImGui::Button(
"Options"))
460 ImGui::OpenPopup(
"context");
461 if (ImGui::BeginPopup(
"context"))
463 ImGui::SetNextItemWidth(s.GlyphWidth * 7 + style.FramePadding.x * 2.0f);
464 if (ImGui::DragInt(
"##cols", &Cols, 0.2f, 4, 32,
"%d cols")) { ContentsWidthChanged =
true;
if (Cols < 1) Cols = 1; }
465 ImGui::Checkbox(
"Show Data Preview", &OptShowDataPreview);
466 ImGui::Checkbox(
"Show HexII", &OptShowHexII);
467 if (ImGui::Checkbox(
"Show Ascii", &OptShowAscii)) { ContentsWidthChanged =
true; }
468 ImGui::Checkbox(
"Grey out zeroes", &OptGreyOutZeroes);
469 ImGui::Checkbox(
"Uppercase Hex", &OptUpperCaseHex);
475 ImGui::Text(format_range, s.AddrDigitsCount, base_display_addr, s.AddrDigitsCount, base_display_addr + mem_size - 1);
477 ImGui::SetNextItemWidth((s.AddrDigitsCount + 1) * s.GlyphWidth + style.FramePadding.x * 2.0f);
478 if (ImGui::InputText(
"##addr", AddrInputBuf, IM_ARRAYSIZE(AddrInputBuf), ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_EnterReturnsTrue))
481 if (sscanf(AddrInputBuf,
"%zX", &goto_addr) == 1)
483 GotoAddr = goto_addr - base_display_addr;
484 HighlightMin = HighlightMax = (size_t)-1;
488 if (GotoAddr != (
size_t)-1)
490 if (GotoAddr < mem_size)
492 ImGui::BeginChild(
"##scrolling");
493 ImGui::SetScrollFromPosY(ImGui::GetCursorStartPos().y + (GotoAddr / Cols) * ImGui::GetTextLineHeight());
495 DataEditingAddr = DataPreviewAddr = GotoAddr;
496 DataEditingTakeFocus =
true;
498 GotoAddr = (size_t)-1;
502 void DrawPreviewLine(
const Sizes& s,
void* mem_data_void,
size_t mem_size,
size_t base_display_addr)
504 IM_UNUSED(base_display_addr);
505 ImU8* mem_data = (ImU8*)mem_data_void;
507 ImGui::AlignTextToFramePadding();
508 ImGui::Text(
"Preview as:");
510 ImGui::SetNextItemWidth((s.GlyphWidth * 10.0f) + style.FramePadding.x * 2.0f + style.ItemInnerSpacing.x);
511 if (ImGui::BeginCombo(
"##combo_type", DataTypeGetDesc(PreviewDataType), ImGuiComboFlags_HeightLargest))
513 for (
int n = 0; n < ImGuiDataType_COUNT; n++)
514 if (ImGui::Selectable(DataTypeGetDesc((ImGuiDataType)n), PreviewDataType == n))
515 PreviewDataType = (ImGuiDataType)n;
519 ImGui::SetNextItemWidth((s.GlyphWidth * 6.0f) + style.FramePadding.x * 2.0f + style.ItemInnerSpacing.x);
520 ImGui::Combo(
"##combo_endianness", &PreviewEndianness,
"LE\0BE\0\0");
523 float x = s.GlyphWidth * 6.0f;
524 bool has_value = DataPreviewAddr != (size_t)-1;
526 DrawPreviewData(DataPreviewAddr, mem_data, mem_size, PreviewDataType, DataFormat_Dec, buf, (
size_t)IM_ARRAYSIZE(buf));
527 ImGui::Text(
"Dec"); ImGui::SameLine(x); ImGui::TextUnformatted(has_value ? buf :
"N/A");
529 DrawPreviewData(DataPreviewAddr, mem_data, mem_size, PreviewDataType, DataFormat_Hex, buf, (
size_t)IM_ARRAYSIZE(buf));
530 ImGui::Text(
"Hex"); ImGui::SameLine(x); ImGui::TextUnformatted(has_value ? buf :
"N/A");
532 DrawPreviewData(DataPreviewAddr, mem_data, mem_size, PreviewDataType, DataFormat_Bin, buf, (
size_t)IM_ARRAYSIZE(buf));
533 buf[IM_ARRAYSIZE(buf) - 1] = 0;
534 ImGui::Text(
"Bin"); ImGui::SameLine(x); ImGui::TextUnformatted(has_value ? buf :
"N/A");
538 const char* DataTypeGetDesc(ImGuiDataType data_type)
const 540 const char* descs[] = {
"Int8",
"Uint8",
"Int16",
"Uint16",
"Int32",
"Uint32",
"Int64",
"Uint64",
"Float",
"Double" };
541 IM_ASSERT(data_type >= 0 && data_type < ImGuiDataType_COUNT);
542 return descs[data_type];
545 size_t DataTypeGetSize(ImGuiDataType data_type)
const 547 const size_t sizes[] = { 1, 1, 2, 2, 4, 4, 8, 8,
sizeof(float),
sizeof(
double) };
548 IM_ASSERT(data_type >= 0 && data_type < ImGuiDataType_COUNT);
549 return sizes[data_type];
552 const char* DataFormatGetDesc(DataFormat data_format)
const 554 const char* descs[] = {
"Bin",
"Dec",
"Hex" };
555 IM_ASSERT(data_format >= 0 && data_format < DataFormat_COUNT);
556 return descs[data_format];
559 bool IsBigEndian()
const 567 static void* EndiannessCopyBigEndian(
void* _dst,
void* _src,
size_t s,
int is_little_endian)
569 if (is_little_endian)
571 uint8_t* dst = (uint8_t*)_dst;
572 uint8_t* src = (uint8_t*)_src + s - 1;
573 for (
int i = 0, n = (
int)s; i < n; ++i)
574 memcpy(dst++, src--, 1);
579 return memcpy(_dst, _src, s);
583 static void* EndiannessCopyLittleEndian(
void* _dst,
void* _src,
size_t s,
int is_little_endian)
585 if (is_little_endian)
587 return memcpy(_dst, _src, s);
591 uint8_t* dst = (uint8_t*)_dst;
592 uint8_t* src = (uint8_t*)_src + s - 1;
593 for (
int i = 0, n = (
int)s; i < n; ++i)
594 memcpy(dst++, src--, 1);
599 void* EndiannessCopy(
void* dst,
void* src,
size_t size)
const 601 static void* (*fp)(
void*,
void*, size_t, int) = NULL;
603 fp = IsBigEndian() ? EndiannessCopyBigEndian : EndiannessCopyLittleEndian;
604 return fp(dst, src, size, PreviewEndianness);
607 const char* FormatBinary(
const uint8_t* buf,
int width)
const 609 IM_ASSERT(width <= 64);
611 static char out_buf[64 + 8 + 1];
613 for (
int j = n - 1; j >= 0; --j)
615 for (
int i = 0; i < 8; ++i)
616 out_buf[out_n++] = (buf[j] & (1 << (7 - i))) ?
'1' :
'0';
617 out_buf[out_n++] =
' ';
619 IM_ASSERT(out_n < IM_ARRAYSIZE(out_buf));
625 void DrawPreviewData(
size_t addr,
const ImU8* mem_data,
size_t mem_size, ImGuiDataType data_type, DataFormat data_format,
char* out_buf,
size_t out_buf_size)
const 628 size_t elem_size = DataTypeGetSize(data_type);
629 size_t size = addr + elem_size > mem_size ? mem_size - addr : elem_size;
631 for (
int i = 0, n = (
int)size; i < n; ++i)
632 buf[i] = ReadFn(mem_data, addr + i);
634 memcpy(buf, mem_data + addr, size);
636 if (data_format == DataFormat_Bin)
639 EndiannessCopy(binbuf, buf, size);
640 ImSnprintf(out_buf, out_buf_size,
"%s", FormatBinary(binbuf, (
int)size * 8));
647 case ImGuiDataType_S8:
650 EndiannessCopy(&int8d, buf, size);
651 if (data_format == DataFormat_Dec) { ImSnprintf(out_buf, out_buf_size,
"%hhd", int8d);
return; }
652 if (data_format == DataFormat_Hex) { ImSnprintf(out_buf, out_buf_size,
"0x%02x", int8d & 0xFF);
return; }
655 case ImGuiDataType_U8:
658 EndiannessCopy(&uint8d, buf, size);
659 if (data_format == DataFormat_Dec) { ImSnprintf(out_buf, out_buf_size,
"%hhu", uint8d);
return; }
660 if (data_format == DataFormat_Hex) { ImSnprintf(out_buf, out_buf_size,
"0x%02x", uint8d & 0XFF);
return; }
663 case ImGuiDataType_S16:
666 EndiannessCopy(&int16d, buf, size);
667 if (data_format == DataFormat_Dec) { ImSnprintf(out_buf, out_buf_size,
"%hd", int16d);
return; }
668 if (data_format == DataFormat_Hex) { ImSnprintf(out_buf, out_buf_size,
"0x%04x", int16d & 0xFFFF);
return; }
671 case ImGuiDataType_U16:
673 uint16_t uint16d = 0;
674 EndiannessCopy(&uint16d, buf, size);
675 if (data_format == DataFormat_Dec) { ImSnprintf(out_buf, out_buf_size,
"%hu", uint16d);
return; }
676 if (data_format == DataFormat_Hex) { ImSnprintf(out_buf, out_buf_size,
"0x%04x", uint16d & 0xFFFF);
return; }
679 case ImGuiDataType_S32:
682 EndiannessCopy(&int32d, buf, size);
683 if (data_format == DataFormat_Dec) { ImSnprintf(out_buf, out_buf_size,
"%d", int32d);
return; }
684 if (data_format == DataFormat_Hex) { ImSnprintf(out_buf, out_buf_size,
"0x%08x", int32d);
return; }
687 case ImGuiDataType_U32:
689 uint32_t uint32d = 0;
690 EndiannessCopy(&uint32d, buf, size);
691 if (data_format == DataFormat_Dec) { ImSnprintf(out_buf, out_buf_size,
"%u", uint32d);
return; }
692 if (data_format == DataFormat_Hex) { ImSnprintf(out_buf, out_buf_size,
"0x%08x", uint32d);
return; }
695 case ImGuiDataType_S64:
698 EndiannessCopy(&int64d, buf, size);
699 if (data_format == DataFormat_Dec) { ImSnprintf(out_buf, out_buf_size,
"%lld", (
long long)int64d);
return; }
700 if (data_format == DataFormat_Hex) { ImSnprintf(out_buf, out_buf_size,
"0x%016llx", (
long long)int64d);
return; }
703 case ImGuiDataType_U64:
705 uint64_t uint64d = 0;
706 EndiannessCopy(&uint64d, buf, size);
707 if (data_format == DataFormat_Dec) { ImSnprintf(out_buf, out_buf_size,
"%llu", (
long long)uint64d);
return; }
708 if (data_format == DataFormat_Hex) { ImSnprintf(out_buf, out_buf_size,
"0x%016llx", (
long long)uint64d);
return; }
711 case ImGuiDataType_Float:
713 float float32d = 0.0f;
714 EndiannessCopy(&float32d, buf, size);
715 if (data_format == DataFormat_Dec) { ImSnprintf(out_buf, out_buf_size,
"%f", float32d);
return; }
716 if (data_format == DataFormat_Hex) { ImSnprintf(out_buf, out_buf_size,
"%a", float32d);
return; }
719 case ImGuiDataType_Double:
721 double float64d = 0.0;
722 EndiannessCopy(&float64d, buf, size);
723 if (data_format == DataFormat_Dec) { ImSnprintf(out_buf, out_buf_size,
"%f", float64d);
return; }
724 if (data_format == DataFormat_Hex) { ImSnprintf(out_buf, out_buf_size,
"%a", float64d);
return; }
727 case ImGuiDataType_COUNT:
737 #pragma warning (pop)
Definition: imgui_memory_editor.h:67
Definition: imgui_memory_editor.h:146