mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-16 00:52:23 -07:00
cache font setting calculations per-frame rather than recomputing all the time, fix some expandability calculations in eval visualization w/ multiple composing views
This commit is contained in:
@@ -1264,7 +1264,7 @@ e_type_data_members_from_key(Arena *arena, E_TypeKey key)
|
||||
U64 last_member_off = 0;
|
||||
for(U64 member_idx = 0; member_idx < type->count; member_idx += 1)
|
||||
{
|
||||
if(type->members[member_idx].kind == E_MemberKind_DataField)
|
||||
if(type->members[member_idx].name.size != 0 && type->members[member_idx].kind == E_MemberKind_DataField)
|
||||
{
|
||||
E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1);
|
||||
MemoryCopyStruct(&n->v, &type->members[member_idx]);
|
||||
|
||||
@@ -79,38 +79,65 @@ ev_hash_from_key(EV_Key key)
|
||||
|
||||
//- rjf: type info -> expandability/editablity
|
||||
|
||||
internal E_TypeKey
|
||||
ev_expansion_type_from_key(E_TypeKey type_key)
|
||||
{
|
||||
E_TypeKey result = zero_struct;
|
||||
for(E_TypeKey key = type_key;
|
||||
!e_type_key_match(key, e_type_key_zero());
|
||||
key = e_type_key_direct(key))
|
||||
{
|
||||
B32 done = 1;
|
||||
E_TypeKind kind = e_type_kind_from_key(key);
|
||||
|
||||
//- rjf: lenses -> try to see if this lens has special expansion rules. if
|
||||
// so, choose the current eval
|
||||
if(kind == E_TypeKind_Lens)
|
||||
{
|
||||
E_Type *type = e_type_from_key__cached(key);
|
||||
if(type->expand.info != 0 ||
|
||||
ev_expand_rule_from_string(type->name))
|
||||
{
|
||||
done = 1;
|
||||
result = key;
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: if we have meta-expression tags in the type chain, defer
|
||||
// to the next type in the chain.
|
||||
else if(E_TypeKind_FirstMeta <= kind && kind <= E_TypeKind_LastMeta)
|
||||
{
|
||||
done = 0;
|
||||
}
|
||||
|
||||
//- rjf: break if done
|
||||
if(done)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
internal B32
|
||||
ev_type_key_and_mode_is_expandable(E_TypeKey type_key, E_Mode mode)
|
||||
{
|
||||
B32 result = 0;
|
||||
if(!e_type_key_match(ev_expansion_type_from_key(type_key), e_type_key_zero()))
|
||||
{
|
||||
if(!result && e_type_kind_from_key(type_key) == E_TypeKind_Lens)
|
||||
result = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
E_TypeKey default_expansion_type_key = e_default_expansion_type_from_key(type_key);
|
||||
E_TypeKind kind = e_type_kind_from_key(default_expansion_type_key);
|
||||
if(kind == E_TypeKind_Enum)
|
||||
{
|
||||
for(E_Type *lens_type = e_type_from_key__cached(type_key);
|
||||
lens_type->kind == E_TypeKind_Lens;
|
||||
lens_type = e_type_from_key__cached(lens_type->direct_type_key))
|
||||
{
|
||||
if(lens_type->expand.info != 0)
|
||||
{
|
||||
result = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
result = (mode == E_Mode_Null);
|
||||
}
|
||||
if(!result)
|
||||
else if(kind != E_TypeKind_Null)
|
||||
{
|
||||
E_TypeKey expand_type_key = e_default_expansion_type_from_key(type_key);
|
||||
E_TypeKind expand_type_kind = e_type_kind_from_key(expand_type_key);
|
||||
if(expand_type_kind == E_TypeKind_Struct ||
|
||||
expand_type_kind == E_TypeKind_Union ||
|
||||
expand_type_kind == E_TypeKind_Class ||
|
||||
expand_type_kind == E_TypeKind_Array ||
|
||||
expand_type_kind == E_TypeKind_Set ||
|
||||
e_type_kind_is_pointer_or_ref(expand_type_kind) ||
|
||||
(expand_type_kind == E_TypeKind_Enum && mode == E_Mode_Null))
|
||||
{
|
||||
result = 1;
|
||||
}
|
||||
result = 1;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
@@ -512,7 +539,7 @@ ev_resolved_from_expr(Arena *arena, E_Expr *expr)
|
||||
//~ rjf: Block Building
|
||||
|
||||
internal EV_BlockTree
|
||||
ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval eval)
|
||||
ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval root_eval)
|
||||
{
|
||||
ProfBeginFunction();
|
||||
EV_BlockTree tree = {&ev_nil_block};
|
||||
@@ -528,7 +555,7 @@ ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval eval
|
||||
MemoryCopyStruct(tree.root, &ev_nil_block);
|
||||
tree.root->key = root_key;
|
||||
tree.root->string = str8_zero();
|
||||
tree.root->eval = eval;
|
||||
tree.root->eval = root_eval;
|
||||
tree.root->type_expand_rule = &e_type_expand_rule__default;
|
||||
tree.root->viz_expand_rule = &ev_nil_expand_rule;
|
||||
tree.root->row_count = 1;
|
||||
@@ -574,21 +601,26 @@ ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval eval
|
||||
|
||||
// rjf: unpack eval
|
||||
E_Mode mode = t->eval.irtree.mode;
|
||||
E_TypeKey type_key = t->eval.irtree.type_key;
|
||||
E_Eval eval = t->eval;
|
||||
E_TypeKey expansion_type_key = ev_expansion_type_from_key(eval.irtree.type_key);
|
||||
if(!e_type_key_match(expansion_type_key, e_type_key_zero()))
|
||||
{
|
||||
eval.irtree.type_key = expansion_type_key;
|
||||
}
|
||||
|
||||
// rjf: get expansion rules from type
|
||||
E_TypeExpandRule *type_expand_rule = e_expand_rule_from_type_key(type_key);
|
||||
EV_ExpandRule *viz_expand_rule = ev_expand_rule_from_type_key(type_key);
|
||||
E_TypeExpandRule *type_expand_rule = e_expand_rule_from_type_key(eval.irtree.type_key);
|
||||
EV_ExpandRule *viz_expand_rule = ev_expand_rule_from_type_key(eval.irtree.type_key);
|
||||
|
||||
// rjf: skip if no expansion rule, & type info disallows expansion
|
||||
if(viz_expand_rule == &ev_nil_expand_rule && !ev_type_key_and_mode_is_expandable(type_key, mode))
|
||||
if(viz_expand_rule == &ev_nil_expand_rule && !ev_type_key_and_mode_is_expandable(eval.irtree.type_key, mode))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// rjf: get top-level lookup/expansion info
|
||||
E_TypeExpandInfo type_expand_info = type_expand_rule->info(arena, t->eval, filter);
|
||||
EV_ExpandInfo viz_expand_info = viz_expand_rule->info(arena, view, filter, t->eval.expr);
|
||||
E_TypeExpandInfo type_expand_info = type_expand_rule->info(arena, eval, filter);
|
||||
EV_ExpandInfo viz_expand_info = viz_expand_rule->info(arena, view, filter, eval.expr);
|
||||
|
||||
// rjf: determine expansion info
|
||||
U64 expansion_row_count = type_expand_info.expr_count;
|
||||
@@ -615,7 +647,7 @@ ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval eval
|
||||
expansion_block->parent = t->parent_block;
|
||||
expansion_block->key = key;
|
||||
expansion_block->split_relative_idx = t->split_relative_idx;
|
||||
expansion_block->eval = t->eval;
|
||||
expansion_block->eval = eval;
|
||||
expansion_block->type_expand_info = type_expand_info;
|
||||
expansion_block->type_expand_rule = type_expand_rule;
|
||||
expansion_block->viz_expand_info = viz_expand_info;
|
||||
@@ -702,7 +734,7 @@ ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval eval
|
||||
{
|
||||
Rng1U64 child_range = r1u64(split_relative_idx, split_relative_idx+1);
|
||||
E_Eval child_eval = {0};
|
||||
type_expand_rule->range(arena, type_expand_info.user_data, t->eval, filter, r1u64(split_relative_idx, split_relative_idx+1), &child_eval);
|
||||
type_expand_rule->range(arena, type_expand_info.user_data, eval, filter, r1u64(split_relative_idx, split_relative_idx+1), &child_eval);
|
||||
EV_Key child_key = child_keys[idx];
|
||||
BlockTreeBuildTask *task = push_array(scratch.arena, BlockTreeBuildTask, 1);
|
||||
SLLQueuePush(first_task, last_task, task);
|
||||
|
||||
@@ -315,6 +315,7 @@ internal U64 ev_hash_from_key(EV_Key key);
|
||||
//~ rjf: Type Info Helpers
|
||||
|
||||
//- rjf: type info -> expandability/editablity
|
||||
internal E_TypeKey ev_expansion_type_from_key(E_TypeKey type_key);
|
||||
internal B32 ev_type_key_and_mode_is_expandable(E_TypeKey type_key, E_Mode mode);
|
||||
internal B32 ev_type_key_is_editable(E_TypeKey type_key);
|
||||
|
||||
@@ -351,7 +352,7 @@ internal E_Expr *ev_resolved_from_expr(Arena *arena, E_Expr *expr);
|
||||
////////////////////////////////
|
||||
//~ rjf: Block Building
|
||||
|
||||
internal EV_BlockTree ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval eval);
|
||||
internal EV_BlockTree ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval root_eval);
|
||||
internal U64 ev_depth_from_block(EV_Block *block);
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
+23
-29
@@ -4570,6 +4570,7 @@ rd_view_ui(Rng2F32 rect)
|
||||
|
||||
// rjf: form cell build parameters
|
||||
RD_CellParams cell_params = {0};
|
||||
ProfScope("form cell build parameters")
|
||||
{
|
||||
// rjf: set up base parameters
|
||||
cell_params.flags = (RD_CellFlag_KeyboardClickable|RD_CellFlag_NoBackground|RD_CellFlag_CodeContents);
|
||||
@@ -10389,35 +10390,8 @@ rd_theme_color_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 str
|
||||
internal FNT_Tag
|
||||
rd_font_from_slot(RD_FontSlot slot)
|
||||
{
|
||||
// rjf: determine key name for this font slot
|
||||
String8 key = {0};
|
||||
switch(slot)
|
||||
{
|
||||
default:{}break;
|
||||
case RD_FontSlot_Main:{key = str8_lit("main_font");}break;
|
||||
case RD_FontSlot_Code:{key = str8_lit("code_font");}break;
|
||||
}
|
||||
|
||||
// rjf: determine font name
|
||||
String8 font_name = rd_setting_from_name(key);
|
||||
|
||||
// rjf: map name -> tag
|
||||
FNT_Tag result = {0};
|
||||
if(font_name.size != 0)
|
||||
{
|
||||
result = fnt_tag_from_path(font_name);
|
||||
}
|
||||
if(font_name.size == 0 || fnt_tag_match(fnt_tag_zero(), result))
|
||||
{
|
||||
switch(slot)
|
||||
{
|
||||
default:
|
||||
case RD_FontSlot_Main: {result = fnt_tag_from_static_data_string(&rd_default_main_font_bytes);}break;
|
||||
case RD_FontSlot_Code: {result = fnt_tag_from_static_data_string(&rd_default_code_font_bytes);}break;
|
||||
case RD_FontSlot_Icons:{result = fnt_tag_from_static_data_string(&rd_icon_font_bytes);}break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
FNT_Tag tag = rd_state->font_slot_table[slot];
|
||||
return tag;
|
||||
}
|
||||
|
||||
internal FNT_RasterFlags
|
||||
@@ -11609,6 +11583,26 @@ rd_frame(void)
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////
|
||||
//- rjf: get fonts from config
|
||||
//
|
||||
ProfScope("get fonts from config")
|
||||
{
|
||||
String8 main_font_name = rd_setting_from_name(str8_lit("main_font"));
|
||||
String8 code_font_name = rd_setting_from_name(str8_lit("code_font"));
|
||||
rd_state->font_slot_table[RD_FontSlot_Main] = fnt_tag_from_path(main_font_name);
|
||||
rd_state->font_slot_table[RD_FontSlot_Code] = fnt_tag_from_path(code_font_name);
|
||||
if(fnt_tag_match(rd_state->font_slot_table[RD_FontSlot_Main], fnt_tag_zero()))
|
||||
{
|
||||
rd_state->font_slot_table[RD_FontSlot_Main] = fnt_tag_from_static_data_string(&rd_default_main_font_bytes);
|
||||
}
|
||||
if(fnt_tag_match(rd_state->font_slot_table[RD_FontSlot_Code], fnt_tag_zero()))
|
||||
{
|
||||
rd_state->font_slot_table[RD_FontSlot_Code] = fnt_tag_from_static_data_string(&rd_default_code_font_bytes);
|
||||
}
|
||||
rd_state->font_slot_table[RD_FontSlot_Icons] = fnt_tag_from_static_data_string(&rd_icon_font_bytes);
|
||||
}
|
||||
|
||||
//////////////////////////////
|
||||
//- rjf: build theme from config
|
||||
//
|
||||
|
||||
@@ -655,6 +655,9 @@ struct RD_State
|
||||
// rjf: key map (constructed from-scratch each frame)
|
||||
RD_KeyMap *key_map;
|
||||
|
||||
// rjf: slot -> font tag map (constructed from-scratch each frame)
|
||||
FNT_Tag font_slot_table[RD_FontSlot_COUNT];
|
||||
|
||||
// rjf: theme target (constructed from-scratch each frame)
|
||||
RD_Theme *theme;
|
||||
RD_Theme *theme_target;
|
||||
|
||||
Reference in New Issue
Block a user