From c1741b4f395d5b9b9e0f2920a0374eb2cb0b3dc9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 1 Apr 2024 14:51:30 +0100 Subject: [PATCH] odin_map visualization with nested key-value pairs --- src/df/core/df_core.mdesk | 2 +- src/df/core/generated/df_core.meta.c | 2 +- src/df/core/generated/df_core.meta.h | 2 +- src/df/gfx/df_gfx.mdesk | 2 + src/df/gfx/df_view_rule_hooks.c | 285 ++++++++++++++++++--------- src/df/gfx/generated/df_gfx.meta.c | 4 +- src/df/gfx/generated/df_gfx.meta.h | 3 + 7 files changed, 203 insertions(+), 97 deletions(-) diff --git a/src/df/core/df_core.mdesk b/src/df/core/df_core.mdesk index 6cde1472..6963fe54 100644 --- a/src/df/core/df_core.mdesk +++ b/src/df/core/df_core.mdesk @@ -500,7 +500,7 @@ DF_CoreViewRuleTable: {Disasm disasm "disasm" - x - x "Disassembly" x "Displays as disassembled instructions, interpreting the data as raw machine code." } {Bitmap bitmap "bitmap" - x - x "Bitmap" x "Displays as a bitmap, interpreting the data as raw pixel data." } {Geo geo "geo" - x - x "Geometry" x "Displays as geometry, interpreting the data as vertex data." } - {OdinMap odin_map "odin_map" - - x - "Odin map" x "Specifies that a struct to be rendered as an Odin map type." } + {OdinMap odin_map "odin_map" - x - x "Odin map" x "Specifies that a struct to be rendered as an Odin map type." } } //////////////////////////////// diff --git a/src/df/core/generated/df_core.meta.c b/src/df/core/generated/df_core.meta.c index 4fd22249..63da64fc 100644 --- a/src/df/core/generated/df_core.meta.c +++ b/src/df/core/generated/df_core.meta.c @@ -438,7 +438,7 @@ DF_CoreViewRuleSpecInfo df_g_core_view_rule_spec_info_table[18] = {str8_lit_comp("disasm"), str8_lit_comp("Disassembly"), str8_lit_comp("Displays as disassembled instructions, interpreting the data as raw machine code."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*1)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(disasm) , }, {str8_lit_comp("bitmap"), str8_lit_comp("Bitmap"), str8_lit_comp("Displays as a bitmap, interpreting the data as raw pixel data."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*1)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(bitmap) , }, {str8_lit_comp("geo"), str8_lit_comp("Geometry"), str8_lit_comp("Displays as geometry, interpreting the data as vertex data."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*1)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(geo) , }, -{str8_lit_comp("odin_map"), str8_lit_comp("Odin map"), str8_lit_comp("Specifies that a struct to be rendered as an Odin map type."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*1)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME(odin_map) , 0, }, +{str8_lit_comp("odin_map"), str8_lit_comp("Odin map"), str8_lit_comp("Specifies that a struct to be rendered as an Odin map type."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*1)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(odin_map) , }, }; String8 df_g_icon_kind_text_table[69] = diff --git a/src/df/core/generated/df_core.meta.h b/src/df/core/generated/df_core.meta.h index bcec746a..8e351bfb 100644 --- a/src/df/core/generated/df_core.meta.h +++ b/src/df/core/generated/df_core.meta.h @@ -405,7 +405,6 @@ B32 force_confirm; DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(array); DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(slice); DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(bswap); -DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(odin_map); DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(list); DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(only); DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(omit); @@ -414,6 +413,7 @@ DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(text); DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(disasm); DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(bitmap); DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(geo); +DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(odin_map); struct{String8 mnemonic; String8 summary;} df_g_inst_table_x64[] = { diff --git a/src/df/gfx/df_gfx.mdesk b/src/df/gfx/df_gfx.mdesk index 4fbcbf72..e764b418 100644 --- a/src/df/gfx/df_gfx.mdesk +++ b/src/df/gfx/df_gfx.mdesk @@ -244,6 +244,7 @@ DF_CmdParamSlot2ViewSpecMap: DF_GfxViewRuleTable: { {"array" - - - - - } + {"slice" - - - - - } {"list" x - - - - } {"dec" - x - - - } {"bin" - x - - - } @@ -256,6 +257,7 @@ DF_GfxViewRuleTable: {"text" - - - x - } {"disasm" - - - x - } {"bitmap" - - x x x } + {"odin_map" - - x x x } {"geo" - - x x - } } diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index 4d7bb5b4..ac9adb12 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -463,9 +463,9 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(slice) //////////////////////////////// //~ bill: "odin_map" - typedef struct DF_OdinMapCellInfo DF_OdinMapCellInfo; -struct DF_OdinMapCellInfo { +struct DF_OdinMapCellInfo +{ U64 size_of_type; U64 size_of_cell; U64 elements_per_cell; @@ -565,112 +565,211 @@ internal U64 df_evaluate_hash_from_offset(EVAL_ParseCtx *parse_ctx, DF_CtrlCtx * } -DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(odin_map) +typedef struct DF_OdinMapData DF_OdinMapData; +struct DF_OdinMapData { + U64 len; + U64 cap; + + TG_Key key; + TG_Key value; + TG_Key hash; + TG_Key key_cell; + TG_Key value_cell; + + U64 key_ptr; + U64 value_ptr; + U64 hash_ptr; + + DF_OdinMapCellInfo key_cell_info; + DF_OdinMapCellInfo value_cell_info; + U64 size_of_hash; +}; + + +internal B32 df_odin_map_data(Arena *arena, EVAL_ParseCtx *parse_ctx, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, DF_OdinMapData *md) +{ + B32 ok = false; + *md = zero_struct; + TG_Key type_key = eval.type_key; TG_Kind type_kind = tg_kind_from_key(type_key); if (type_kind == TG_Kind_Struct) { - DF_CfgNode *struct_node = val->last; - if (struct_node != &df_g_nil_cfg_node) + TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(arena, parse_ctx->type_graph, parse_ctx->rdi, type_key); + + TG_Member *member_data = tg_member_from_name(data_members, str8_lit("data"), 0); + TG_Member *member_len = tg_member_from_name(data_members, str8_lit("len"), 0); + + if (member_data && member_len) { - TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(arena, parse_ctx->type_graph, parse_ctx->rdi, type_key); - - TG_Member *member_data = tg_member_from_name(data_members, str8_lit("data"), 0); - TG_Member *member_len = tg_member_from_name(data_members, str8_lit("len"), 0); - - if (member_data && member_len) + TG_Key metadata = member_data->type_key; + metadata = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, metadata); + if (tg_kind_from_key(metadata) != TG_Kind_Struct) { - TG_Key metadata = member_data->type_key; - metadata = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, metadata); - if (tg_kind_from_key(metadata) != TG_Kind_Struct) - { - return eval; - } - - TG_MemberArray md_members = tg_data_members_from_graph_rdi_key(arena, parse_ctx->type_graph, parse_ctx->rdi, metadata); - TG_Member *m_key = tg_member_from_name(md_members, str8_lit("key"), 0); - TG_Member *m_value = tg_member_from_name(md_members, str8_lit("value"), 0); - TG_Member *m_hash = tg_member_from_name(md_members, str8_lit("hash"), 0); - TG_Member *m_key_cell = tg_member_from_name(md_members, str8_lit("key_cell"), 0); - TG_Member *m_value_cell = tg_member_from_name(md_members, str8_lit("value_cell"), 0); - - if (m_key == NULL || - m_value == NULL || - m_hash == NULL || - m_key_cell == NULL || - m_value_cell == NULL) - { - return eval; - } - - TG_Key key = m_key->type_key; - TG_Key value = m_value->type_key; - TG_Key hash = m_hash->type_key; - TG_Key key_cell = m_key_cell->type_key; - TG_Key value_cell = m_value_cell->type_key; - - U64 raw_data = df_evaluate_integer_from_eval(parse_ctx, ctrl_ctx, eval, member_data); - U64 ptr = raw_data & ~(U64)63; - U64 len = df_evaluate_integer_from_eval(parse_ctx, ctrl_ctx, eval, member_len); - U64 cap_log2 = raw_data & 63; - U64 cap = cap_log2 ? ((U64)1)<type_graph, parse_ctx->rdi, hash); - - U64 key_ptr = ptr; - U64 value_ptr = df_odin_map_cell_index(key_ptr, &key_cell_info, cap); - U64 hash_ptr = df_odin_map_cell_index(value_ptr, &value_cell_info, cap); - (void)value_ptr; - (void)hash_ptr; - - U64 TOMBSTONE_MASK = ((U64)1u)<<(size_of_hash*8 - 1); - - for (U64 i = 0; i < cap; i += 1) - { - U64 offset_hash = hash_ptr + i*size_of_hash; - - U64 h = df_evaluate_hash_from_offset(parse_ctx, ctrl_ctx, offset_hash, hash); - if (h != 0 && (h & TOMBSTONE_MASK) == 0) - { - U64 offset_key = df_odin_map_cell_index(key_ptr, &key_cell_info, i); - U64 offset_value = df_odin_map_cell_index(value_ptr, &value_cell_info, i); - - - DF_Eval addr_key = zero_struct; - addr_key.mode = EVAL_EvalMode_Addr; - addr_key.offset = offset_key; - addr_key.type_key = key; - - DF_Eval addr_value = zero_struct; - addr_value.mode = EVAL_EvalMode_Addr; - addr_value.offset = offset_value; - addr_value.type_key = value; - - // render element - } - } - - TG_Key key_array_type = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Array, key_cell, cap/key_cell_info.elements_per_cell); - DF_Eval new_eval = zero_struct; - new_eval.mode = EVAL_EvalMode_Value; - new_eval.imm_u64 = key_ptr; - new_eval.type_key = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Ptr, key_array_type, 0); - eval = new_eval; - + goto end; } + + TG_MemberArray md_members = tg_data_members_from_graph_rdi_key(arena, parse_ctx->type_graph, parse_ctx->rdi, metadata); + TG_Member *m_key = tg_member_from_name(md_members, str8_lit("key"), 0); + TG_Member *m_value = tg_member_from_name(md_members, str8_lit("value"), 0); + TG_Member *m_hash = tg_member_from_name(md_members, str8_lit("hash"), 0); + TG_Member *m_key_cell = tg_member_from_name(md_members, str8_lit("key_cell"), 0); + TG_Member *m_value_cell = tg_member_from_name(md_members, str8_lit("value_cell"), 0); + + if (m_key == NULL || + m_value == NULL || + m_hash == NULL || + m_key_cell == NULL || + m_value_cell == NULL) + { + goto end; + } + + md->key = m_key->type_key; + md->value = m_value->type_key; + md->hash = m_hash->type_key; + md->key_cell = m_key_cell->type_key; + md->value_cell = m_value_cell->type_key; + + U64 raw_data = df_evaluate_integer_from_eval(parse_ctx, ctrl_ctx, eval, member_data); + U64 ptr = raw_data & ~(U64)63; + md->len = df_evaluate_integer_from_eval(parse_ctx, ctrl_ctx, eval, member_len); + U64 cap_log2 = raw_data & 63; + md->cap = cap_log2 ? ((U64)1)<key_cell_info = df_odin_map_cell_info(arena, parse_ctx, md->key, md->key_cell); + md->value_cell_info = df_odin_map_cell_info(arena, parse_ctx, md->value, md->value_cell); + md->size_of_hash = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, md->hash); + + md->key_ptr = ptr; + md->value_ptr = df_odin_map_cell_index(md->key_ptr, &md->key_cell_info, md->cap); + md->hash_ptr = df_odin_map_cell_index(md->value_ptr, &md->value_cell_info, md->cap); + + ok = true; } } - return eval; + +end:; + + return ok; } +DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(odin_map) +{ + Temp scratch = scratch_begin(&arena, 1); + + DF_EvalVizBlock *vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Canvas, key, df_expand_key_make(df_hash_from_expand_key(key), 1), depth); + vb->eval = eval; + vb->cfg_table = *cfg_table; + + U64 row_length = 0; + U64 row_capacity = 0; + + DF_OdinMapData md = zero_struct; + if (df_odin_map_data(scratch.arena, parse_ctx, ctrl_ctx, eval, &md)) + { + U64 const TOMBSTONE_MASK = ((U64)1u)<<(md.size_of_hash*8 - 1); + + U64 key_index = 0; + for (U64 i = 0; i < md.cap; i += 1) + { + U64 offset_hash = md.hash_ptr + i*md.size_of_hash; + + U64 h = df_evaluate_hash_from_offset(parse_ctx, ctrl_ctx, offset_hash, md.hash); + if (h == 0 || (h & TOMBSTONE_MASK) != 0) + { + continue; + } + U64 offset_key = df_odin_map_cell_index(md.key_ptr, &md.key_cell_info, i); + U64 offset_value = df_odin_map_cell_index(md.value_ptr, &md.value_cell_info, i); + + DF_Eval addr_key = zero_struct; + addr_key.mode = EVAL_EvalMode_Addr; + addr_key.offset = offset_key; + addr_key.type_key = md.key; + + DF_Eval addr_value = zero_struct; + addr_value.mode = EVAL_EvalMode_Addr; + addr_value.offset = offset_value; + addr_value.type_key = md.value; + + // render element + + DF_CfgTable child_cfg = *cfg_table; + child_cfg = df_cfg_table_from_inheritance(arena, cfg_table); + + DF_ExpandKey row_key = df_expand_key_make(df_hash_from_expand_key(vb->parent_key), i); + + DF_EvalVizBlock *block = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Root, vb->parent_key, row_key, depth+1); + block->eval = addr_key; + block->cfg_table = child_cfg; + block->string = push_str8f(arena, "key", i); + block->visual_idx_range = r1u64(0, 1); + block->semantic_idx_range = r1u64(0, 1); + + B32 row_expanded = df_expand_key_is_set(&eval_view->expand_tree_table, row_key); + + DF_EvalVizBlock *nested_block = NULL; + if (row_expanded) + { + nested_block = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Root, row_key, zero_struct, depth+2); + nested_block->eval = addr_value; + nested_block->cfg_table = child_cfg; + nested_block->string = push_str8f(arena, "value", i); + nested_block->visual_idx_range = r1u64(0, 1); + nested_block->semantic_idx_range = r1u64(0, 1); + } + + df_eval_viz_block_end(out, block); + + if (row_expanded) + { + df_eval_viz_block_end(out, nested_block); + } + + key_index += 1; + } + } + + df_eval_viz_block_end(out, vb); + + scratch_end(scratch); +} + +DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(odin_map) +{ + Temp scratch = scratch_begin(0, 0); + + DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); + U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; + + DF_OdinMapData md = zero_struct; + df_odin_map_data(scratch.arena, parse_ctx, ctrl_ctx, eval, &md); + + UI_Font(df_font_from_slot(DF_FontSlot_Code)) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) + ui_labelf("0x%I64x -> Odin map len: %I64u cap: %I64u", base_vaddr, md.len, md.cap); + + scratch_end(scratch); +} + +DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(odin_map) +{ + +} + + +DF_GFX_VIEW_RULE_WHOLE_UI_FUNCTION_DEF(odin_map) +{ + +} + + + //////////////////////////////// //~ rjf: "list" diff --git a/src/df/gfx/generated/df_gfx.meta.c b/src/df/gfx/generated/df_gfx.meta.c index 287fc4c8..4bb7504a 100644 --- a/src/df/gfx/generated/df_gfx.meta.c +++ b/src/df/gfx/generated/df_gfx.meta.c @@ -713,9 +713,10 @@ str8_lit_comp("open_user"), str8_lit_comp("open_profile"), }; -DF_GfxViewRuleSpecInfo df_g_gfx_view_rule_spec_info_table[14] = +DF_GfxViewRuleSpecInfo df_g_gfx_view_rule_spec_info_table[16] = { { str8_lit_comp("array"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, 0, 0, 0, 0 }, +{ str8_lit_comp("slice"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, 0, 0, 0, 0 }, { str8_lit_comp("list"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*1)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_NAME(list) , 0, 0, 0, 0 }, { str8_lit_comp("dec"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*1)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(dec) , 0, 0, 0 }, { str8_lit_comp("bin"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*1)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(bin) , 0, 0, 0 }, @@ -728,6 +729,7 @@ DF_GfxViewRuleSpecInfo df_g_gfx_view_rule_spec_info_table[14] = { str8_lit_comp("text"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*1), 0, 0, 0, DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(text) , 0 }, { str8_lit_comp("disasm"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*1), 0, 0, 0, DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(disasm) , 0 }, { str8_lit_comp("bitmap"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*1)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*1), 0, 0, DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(bitmap) , DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(bitmap) , DF_GFX_VIEW_RULE_WHOLE_UI_FUNCTION_NAME(bitmap) }, +{ str8_lit_comp("odin_map"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*1)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*1), 0, 0, DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(odin_map) , DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(odin_map) , DF_GFX_VIEW_RULE_WHOLE_UI_FUNCTION_NAME(odin_map) }, { str8_lit_comp("geo"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*1)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*1), 0, 0, DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(geo) , DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(geo) , 0 }, }; diff --git a/src/df/gfx/generated/df_gfx.meta.h b/src/df/gfx/generated/df_gfx.meta.h index f9efdf56..1f4ba593 100644 --- a/src/df/gfx/generated/df_gfx.meta.h +++ b/src/df/gfx/generated/df_gfx.meta.h @@ -255,13 +255,16 @@ DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(omit); DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(no_addr); DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(rgba); DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(bitmap); +DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(odin_map); DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(geo); DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(rgba); DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(text); DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(disasm); DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(bitmap); +DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(odin_map); DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(geo); DF_GFX_VIEW_RULE_WHOLE_UI_FUNCTION_DEF(bitmap); +DF_GFX_VIEW_RULE_WHOLE_UI_FUNCTION_DEF(odin_map); C_LINKAGE_BEGIN extern String8 df_g_theme_preset_display_string_table[9]; extern String8 df_g_theme_preset_code_string_table[9];