mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-07-16 14:31:24 -07:00
1012 lines
31 KiB
C
1012 lines
31 KiB
C
// Copyright (c) 2024 Epic Games Tools
|
|
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
|
|
|
#ifndef DF_GFX_H
|
|
#define DF_GFX_H
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Basic Types
|
|
|
|
typedef struct DF_PathQuery DF_PathQuery;
|
|
struct DF_PathQuery
|
|
{
|
|
String8 prefix;
|
|
String8 path;
|
|
String8 search;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Binding Types
|
|
|
|
typedef struct DF_Binding DF_Binding;
|
|
struct DF_Binding
|
|
{
|
|
OS_Key key;
|
|
OS_EventFlags flags;
|
|
};
|
|
|
|
typedef struct DF_BindingNode DF_BindingNode;
|
|
struct DF_BindingNode
|
|
{
|
|
DF_BindingNode *next;
|
|
DF_Binding binding;
|
|
};
|
|
|
|
typedef struct DF_BindingList DF_BindingList;
|
|
struct DF_BindingList
|
|
{
|
|
DF_BindingNode *first;
|
|
DF_BindingNode *last;
|
|
U64 count;
|
|
};
|
|
|
|
typedef struct DF_StringBindingPair DF_StringBindingPair;
|
|
struct DF_StringBindingPair
|
|
{
|
|
String8 string;
|
|
DF_Binding binding;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Key Map Types
|
|
|
|
typedef struct DF_KeyMapNode DF_KeyMapNode;
|
|
struct DF_KeyMapNode
|
|
{
|
|
DF_KeyMapNode *hash_next;
|
|
DF_KeyMapNode *hash_prev;
|
|
DF_CmdSpec *spec;
|
|
DF_Binding binding;
|
|
};
|
|
|
|
typedef struct DF_KeyMapSlot DF_KeyMapSlot;
|
|
struct DF_KeyMapSlot
|
|
{
|
|
DF_KeyMapNode *first;
|
|
DF_KeyMapNode *last;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: View Functions
|
|
|
|
struct DF_View;
|
|
struct DF_Panel;
|
|
struct DF_Window;
|
|
|
|
#define DF_VIEW_SETUP_FUNCTION_SIG(name) void name(DF_Window *ws, struct DF_View *view, DF_CfgNode *cfg_root)
|
|
#define DF_VIEW_SETUP_FUNCTION_NAME(name) df_view_setup_##name
|
|
#define DF_VIEW_SETUP_FUNCTION_DEF(name) internal DF_VIEW_SETUP_FUNCTION_SIG(DF_VIEW_SETUP_FUNCTION_NAME(name))
|
|
typedef DF_VIEW_SETUP_FUNCTION_SIG(DF_ViewSetupFunctionType);
|
|
|
|
#define DF_VIEW_STRING_FROM_STATE_FUNCTION_SIG(name) String8 name(Arena *arena, struct DF_View *view)
|
|
#define DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(name) df_view_string_from_state_##name
|
|
#define DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(name) internal DF_VIEW_STRING_FROM_STATE_FUNCTION_SIG(DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(name))
|
|
typedef DF_VIEW_STRING_FROM_STATE_FUNCTION_SIG(DF_ViewStringFromStateFunctionType);
|
|
|
|
#define DF_VIEW_CMD_FUNCTION_SIG(name) void name(struct DF_Window *ws, struct DF_Panel *panel, struct DF_View *view, struct DF_CmdList *cmds)
|
|
#define DF_VIEW_CMD_FUNCTION_NAME(name) df_view_cmds_##name
|
|
#define DF_VIEW_CMD_FUNCTION_DEF(name) internal DF_VIEW_CMD_FUNCTION_SIG(DF_VIEW_CMD_FUNCTION_NAME(name))
|
|
typedef DF_VIEW_CMD_FUNCTION_SIG(DF_ViewCmdFunctionType);
|
|
|
|
#define DF_VIEW_UI_FUNCTION_SIG(name) void name(struct DF_Window *ws, struct DF_Panel *panel, struct DF_View *view, Rng2F32 rect)
|
|
#define DF_VIEW_UI_FUNCTION_NAME(name) df_view_ui_##name
|
|
#define DF_VIEW_UI_FUNCTION_DEF(name) internal DF_VIEW_UI_FUNCTION_SIG(DF_VIEW_UI_FUNCTION_NAME(name))
|
|
typedef DF_VIEW_UI_FUNCTION_SIG(DF_ViewUIFunctionType);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: View Specification Types
|
|
|
|
typedef U32 DF_ViewSpecFlags;
|
|
enum
|
|
{
|
|
DF_ViewSpecFlag_ParameterizedByEntity = (1<<0),
|
|
DF_ViewSpecFlag_CanSerialize = (1<<1),
|
|
DF_ViewSpecFlag_CanSerializeEntityPath = (1<<2),
|
|
DF_ViewSpecFlag_CanSerializeQuery = (1<<3),
|
|
DF_ViewSpecFlag_CanFilter = (1<<4),
|
|
DF_ViewSpecFlag_FilterIsCode = (1<<5),
|
|
DF_ViewSpecFlag_TypingAutomaticallyFilters = (1<<6),
|
|
};
|
|
|
|
typedef struct DF_ViewSpecInfo DF_ViewSpecInfo;
|
|
struct DF_ViewSpecInfo
|
|
{
|
|
DF_ViewSpecFlags flags;
|
|
String8 name;
|
|
String8 display_string;
|
|
enum DF_NameKind name_kind;
|
|
DF_IconKind icon_kind;
|
|
DF_ViewSetupFunctionType *setup_hook;
|
|
DF_ViewStringFromStateFunctionType *string_from_state_hook;
|
|
DF_ViewCmdFunctionType *cmd_hook;
|
|
DF_ViewUIFunctionType *ui_hook;
|
|
};
|
|
|
|
typedef struct DF_ViewSpec DF_ViewSpec;
|
|
struct DF_ViewSpec
|
|
{
|
|
DF_ViewSpec *hash_next;
|
|
DF_ViewSpecInfo info;
|
|
};
|
|
|
|
typedef struct DF_ViewSpecInfoArray DF_ViewSpecInfoArray;
|
|
struct DF_ViewSpecInfoArray
|
|
{
|
|
DF_ViewSpecInfo *v;
|
|
U64 count;
|
|
};
|
|
|
|
typedef struct DF_CmdParamSlotViewSpecRuleNode DF_CmdParamSlotViewSpecRuleNode;
|
|
struct DF_CmdParamSlotViewSpecRuleNode
|
|
{
|
|
DF_CmdParamSlotViewSpecRuleNode *next;
|
|
DF_ViewSpec *view_spec;
|
|
DF_CmdSpec *cmd_spec;
|
|
};
|
|
|
|
typedef struct DF_CmdParamSlotViewSpecRuleList DF_CmdParamSlotViewSpecRuleList;
|
|
struct DF_CmdParamSlotViewSpecRuleList
|
|
{
|
|
DF_CmdParamSlotViewSpecRuleNode *first;
|
|
DF_CmdParamSlotViewSpecRuleNode *last;
|
|
U64 count;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: View Types
|
|
|
|
typedef struct DF_ArenaExt DF_ArenaExt;
|
|
struct DF_ArenaExt
|
|
{
|
|
DF_ArenaExt *next;
|
|
Arena *arena;
|
|
};
|
|
|
|
typedef struct DF_View DF_View;
|
|
struct DF_View
|
|
{
|
|
// rjf: ownership links ('owners' can have lists of views)
|
|
DF_View *next;
|
|
DF_View *prev;
|
|
|
|
// rjf: allocation info
|
|
U64 generation;
|
|
|
|
// rjf: loading animation state
|
|
F32 loading_t;
|
|
F32 loading_t_target;
|
|
U64 loading_progress_v;
|
|
U64 loading_progress_v_target;
|
|
|
|
// rjf: update flash animation state
|
|
F32 flash_t;
|
|
|
|
// rjf: view state
|
|
UI_ScrollPt2 scroll_pos;
|
|
|
|
// rjf: ctrl context overrides
|
|
DF_CtrlCtx ctrl_ctx_overrides;
|
|
|
|
// rjf: allocation & user data extensions
|
|
Arena *arena;
|
|
DF_ArenaExt *first_arena_ext;
|
|
DF_ArenaExt *last_arena_ext;
|
|
void *user_data;
|
|
|
|
// rjf: view kind info
|
|
DF_ViewSpec *spec;
|
|
DF_Handle entity;
|
|
|
|
// rjf: filter mode
|
|
B32 is_filtering;
|
|
F32 is_filtering_t;
|
|
|
|
// rjf: query -> params data
|
|
TxtPt query_cursor;
|
|
TxtPt query_mark;
|
|
U8 query_buffer[1024];
|
|
U64 query_string_size;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Panel Types
|
|
|
|
typedef struct DF_Panel DF_Panel;
|
|
struct DF_Panel
|
|
{
|
|
// rjf: tree links/data
|
|
DF_Panel *first;
|
|
DF_Panel *last;
|
|
DF_Panel *next;
|
|
DF_Panel *prev;
|
|
DF_Panel *parent;
|
|
U64 child_count;
|
|
|
|
// rjf: allocation data
|
|
U64 generation;
|
|
|
|
// rjf: split data
|
|
Axis2 split_axis;
|
|
F32 pct_of_parent;
|
|
|
|
// rjf: animated rectangle data
|
|
Rng2F32 animated_rect_pct;
|
|
|
|
// rjf: tab params
|
|
Side tab_side;
|
|
|
|
// rjf: stable view stacks (tabs)
|
|
DF_View *first_tab_view;
|
|
DF_View *last_tab_view;
|
|
U64 tab_view_count;
|
|
DF_Handle selected_tab_view;
|
|
};
|
|
|
|
typedef struct DF_PanelRec DF_PanelRec;
|
|
struct DF_PanelRec
|
|
{
|
|
DF_Panel *next;
|
|
int push_count;
|
|
int pop_count;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Drag/Drop Types
|
|
|
|
typedef enum DF_DragDropState
|
|
{
|
|
DF_DragDropState_Null,
|
|
DF_DragDropState_Dragging,
|
|
DF_DragDropState_Dropping,
|
|
DF_DragDropState_COUNT
|
|
}
|
|
DF_DragDropState;
|
|
|
|
typedef struct DF_DragDropPayload DF_DragDropPayload;
|
|
struct DF_DragDropPayload
|
|
{
|
|
UI_Key key;
|
|
DF_Handle panel;
|
|
DF_Handle view;
|
|
DF_Handle entity;
|
|
TxtPt text_point;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: View Rule Spec Types
|
|
|
|
typedef U32 DF_GfxViewRuleSpecInfoFlags; // NOTE(rjf): see @view_rule_info
|
|
enum
|
|
{
|
|
DF_GfxViewRuleSpecInfoFlag_VizRowProd = (1<<0),
|
|
DF_GfxViewRuleSpecInfoFlag_LineStringize = (1<<1),
|
|
DF_GfxViewRuleSpecInfoFlag_RowUI = (1<<2),
|
|
DF_GfxViewRuleSpecInfoFlag_BlockUI = (1<<3),
|
|
};
|
|
|
|
#define DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_SIG(name) void name(void)
|
|
#define DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_NAME(name) df_gfx_view_rule_viz_row_prod__##name
|
|
#define DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_DEF(name) internal DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_SIG(DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_NAME(name))
|
|
|
|
#define DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_SIG(name) void name(void)
|
|
#define DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(name) df_gfx_view_rule_line_stringize__##name
|
|
#define DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(name) internal DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_SIG(DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(name))
|
|
|
|
#define DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_SIG(name) void name(DF_ExpandKey key, DF_Eval eval, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, struct DF_CfgNode *cfg)
|
|
#define DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(name) df_gfx_view_rule_row_ui__##name
|
|
#define DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(name) DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_SIG(DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(name))
|
|
|
|
#define DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_SIG(name) void name(struct DF_Window *ws, DF_ExpandKey key, DF_Eval eval, String8 string, DBGI_Scope *dbgi_scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, struct DF_CfgNode *cfg, Vec2F32 dim)
|
|
#define DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(name) df_gfx_view_rule_block_ui__##name
|
|
#define DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(name) DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_SIG(DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(name))
|
|
|
|
typedef DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_SIG(DF_GfxViewRuleVizRowProdHookFunctionType);
|
|
typedef DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_SIG(DF_GfxViewRuleLineStringizeHookFunctionType);
|
|
typedef DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_SIG(DF_GfxViewRuleRowUIFunctionType);
|
|
typedef DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_SIG(DF_GfxViewRuleBlockUIFunctionType);
|
|
|
|
typedef struct DF_GfxViewRuleSpecInfo DF_GfxViewRuleSpecInfo;
|
|
struct DF_GfxViewRuleSpecInfo
|
|
{
|
|
String8 string;
|
|
DF_GfxViewRuleSpecInfoFlags flags;
|
|
DF_GfxViewRuleVizRowProdHookFunctionType *viz_row_prod;
|
|
DF_GfxViewRuleLineStringizeHookFunctionType *line_stringize;
|
|
DF_GfxViewRuleRowUIFunctionType *row_ui;
|
|
DF_GfxViewRuleBlockUIFunctionType *block_ui;
|
|
String8 tab_view_spec_name;
|
|
};
|
|
|
|
typedef struct DF_GfxViewRuleSpecInfoArray DF_GfxViewRuleSpecInfoArray;
|
|
struct DF_GfxViewRuleSpecInfoArray
|
|
{
|
|
DF_GfxViewRuleSpecInfo *v;
|
|
U64 count;
|
|
};
|
|
|
|
typedef struct DF_GfxViewRuleSpec DF_GfxViewRuleSpec;
|
|
struct DF_GfxViewRuleSpec
|
|
{
|
|
DF_GfxViewRuleSpec *hash_next;
|
|
DF_GfxViewRuleSpecInfo info;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Generated Code
|
|
|
|
#include "generated/df_gfx.meta.h"
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Theme Types
|
|
|
|
typedef struct DF_Theme DF_Theme;
|
|
struct DF_Theme
|
|
{
|
|
Vec4F32 colors[DF_ThemeColor_COUNT];
|
|
};
|
|
|
|
typedef enum DF_FontSlot
|
|
{
|
|
DF_FontSlot_Main,
|
|
DF_FontSlot_Code,
|
|
DF_FontSlot_Icons,
|
|
DF_FontSlot_COUNT
|
|
}
|
|
DF_FontSlot;
|
|
|
|
////////////////////////////////
|
|
//~ rjf: UI Helper & Widget Types
|
|
|
|
//- rjf: line edits
|
|
|
|
typedef U32 DF_LineEditFlags;
|
|
enum
|
|
{
|
|
DF_LineEditFlag_Expander = (1<<0),
|
|
DF_LineEditFlag_ExpanderSpace = (1<<1),
|
|
DF_LineEditFlag_ExpanderPlaceholder = (1<<2),
|
|
DF_LineEditFlag_DisableEdit = (1<<3),
|
|
DF_LineEditFlag_CodeContents = (1<<4),
|
|
DF_LineEditFlag_Border = (1<<5),
|
|
DF_LineEditFlag_NoBackground = (1<<6),
|
|
DF_LineEditFlag_PreferDisplayString = (1<<7),
|
|
DF_LineEditFlag_DisplayStringIsCode = (1<<8),
|
|
};
|
|
|
|
//- rjf: code viewing/editing widgets
|
|
|
|
typedef U32 DF_CodeSliceFlags;
|
|
enum
|
|
{
|
|
DF_CodeSliceFlag_Clickable = (1<<0),
|
|
DF_CodeSliceFlag_Margin = (1<<1),
|
|
DF_CodeSliceFlag_LineNums = (1<<2),
|
|
};
|
|
|
|
typedef struct DF_CodeSliceParams DF_CodeSliceParams;
|
|
struct DF_CodeSliceParams
|
|
{
|
|
// rjf: content
|
|
DF_CodeSliceFlags flags;
|
|
Rng1S64 line_num_range;
|
|
String8 *line_text;
|
|
Rng1U64 *line_ranges;
|
|
TXT_TokenArray *line_tokens;
|
|
DF_EntityList *line_bps;
|
|
DF_EntityList *line_ips;
|
|
DF_EntityList *line_pins;
|
|
DF_TextLineDasm2SrcInfoList *line_dasm2src;
|
|
DF_TextLineSrc2DasmInfoList *line_src2dasm;
|
|
DF_EntityList relevant_binaries;
|
|
|
|
// rjf: visual parameters
|
|
F_Tag font;
|
|
F32 font_size;
|
|
String8 search_query;
|
|
F32 line_height_px;
|
|
F32 margin_width_px;
|
|
F32 line_num_width_px;
|
|
F32 line_text_max_width_px;
|
|
DF_EntityList flash_ranges;
|
|
};
|
|
|
|
typedef struct DF_CodeSliceSignal DF_CodeSliceSignal;
|
|
struct DF_CodeSliceSignal
|
|
{
|
|
UI_Signal base;
|
|
TxtPt mouse_pt;
|
|
TxtRng mouse_expr_rng;
|
|
Vec2F32 mouse_expr_baseline_pos;
|
|
S64 clicked_margin_line_num;
|
|
DF_Entity *dropped_entity;
|
|
S64 dropped_entity_line_num;
|
|
TxtRng copy_range;
|
|
B32 toggle_cursor_watch;
|
|
S64 set_next_statement_line_num;
|
|
S64 run_to_line_num;
|
|
S64 goto_disasm_line_num;
|
|
S64 goto_src_line_num;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Auto-Complete Lister Types
|
|
|
|
typedef U32 DF_AutoCompListerFlags;
|
|
enum
|
|
{
|
|
DF_AutoCompListerFlag_Locals = (1<<0),
|
|
DF_AutoCompListerFlag_Registers = (1<<1),
|
|
DF_AutoCompListerFlag_ViewRules = (1<<2),
|
|
};
|
|
|
|
typedef struct DF_AutoCompListerItem DF_AutoCompListerItem;
|
|
struct DF_AutoCompListerItem
|
|
{
|
|
String8 string;
|
|
String8 kind_string;
|
|
FuzzyMatchRangeList matches;
|
|
};
|
|
|
|
typedef struct DF_AutoCompListerItemChunkNode DF_AutoCompListerItemChunkNode;
|
|
struct DF_AutoCompListerItemChunkNode
|
|
{
|
|
DF_AutoCompListerItemChunkNode *next;
|
|
DF_AutoCompListerItem *v;
|
|
U64 count;
|
|
U64 cap;
|
|
};
|
|
|
|
typedef struct DF_AutoCompListerItemChunkList DF_AutoCompListerItemChunkList;
|
|
struct DF_AutoCompListerItemChunkList
|
|
{
|
|
DF_AutoCompListerItemChunkNode *first;
|
|
DF_AutoCompListerItemChunkNode *last;
|
|
U64 chunk_count;
|
|
U64 total_count;
|
|
};
|
|
|
|
typedef struct DF_AutoCompListerItemArray DF_AutoCompListerItemArray;
|
|
struct DF_AutoCompListerItemArray
|
|
{
|
|
DF_AutoCompListerItem *v;
|
|
U64 count;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Per-Window State
|
|
|
|
typedef struct DF_Window DF_Window;
|
|
struct DF_Window
|
|
{
|
|
// rjf: links & metadata
|
|
DF_Window *next;
|
|
DF_Window *prev;
|
|
U64 gen;
|
|
U64 frames_alive;
|
|
DF_CfgSrc cfg_src;
|
|
|
|
// rjf: top-level info & handles
|
|
Arena *arena;
|
|
OS_Handle os;
|
|
R_Handle r;
|
|
UI_State *ui;
|
|
F32 code_font_size_delta;
|
|
F32 main_font_size_delta;
|
|
|
|
// rjf: view state delta history
|
|
DF_StateDeltaHistory *view_state_hist;
|
|
|
|
// rjf: context menu info
|
|
B32 dev_menu_is_open;
|
|
B32 menu_bar_focused;
|
|
B32 menu_bar_focused_on_press;
|
|
B32 menu_bar_key_held;
|
|
B32 menu_bar_focus_press_started;
|
|
UI_Key drop_completion_ctx_menu_key;
|
|
DF_Handle drop_completion_entity;
|
|
DF_Handle drop_completion_panel;
|
|
UI_Key entity_ctx_menu_key;
|
|
DF_Handle entity_ctx_menu_entity;
|
|
U8 entity_ctx_menu_input_buffer[1024];
|
|
U64 entity_ctx_menu_input_size;
|
|
TxtPt entity_ctx_menu_input_cursor;
|
|
TxtPt entity_ctx_menu_input_mark;
|
|
UI_Key tab_ctx_menu_key;
|
|
DF_Handle tab_ctx_menu_view;
|
|
|
|
// rjf: autocomplete lister state
|
|
U64 autocomp_last_frame_idx;
|
|
B32 autocomp_force_closed;
|
|
UI_Key autocomp_root_key;
|
|
DF_CtrlCtx autocomp_ctrl_ctx;
|
|
DF_AutoCompListerFlags autocomp_lister_flags;
|
|
U8 autocomp_lister_query_buffer[1024];
|
|
U64 autocomp_lister_query_size;
|
|
F32 autocomp_open_t;
|
|
F32 autocomp_num_visible_rows_t;
|
|
S64 autocomp_cursor_num;
|
|
|
|
// rjf: query view stack
|
|
Arena *query_cmd_arena;
|
|
DF_CmdSpec *query_cmd_spec;
|
|
DF_CmdParams query_cmd_params;
|
|
DF_View *query_view_stack_top;
|
|
B32 query_view_selected;
|
|
F32 query_view_selected_t;
|
|
F32 query_view_t;
|
|
|
|
// rjf: hover eval stable state
|
|
TxtPt hover_eval_txt_cursor;
|
|
TxtPt hover_eval_txt_mark;
|
|
U8 hover_eval_txt_buffer[1024];
|
|
U64 hover_eval_txt_size;
|
|
Arena *hover_eval_arena;
|
|
Vec2F32 hover_eval_spawn_pos;
|
|
String8 hover_eval_string;
|
|
|
|
// rjf: hover eval timer
|
|
U64 hover_eval_first_frame_idx;
|
|
U64 hover_eval_last_frame_idx;
|
|
|
|
// rjf: hover eval params
|
|
DF_CtrlCtx hover_eval_ctrl_ctx;
|
|
DF_Handle hover_eval_file;
|
|
TxtPt hover_eval_file_pt;
|
|
U64 hover_eval_vaddr;
|
|
F32 hover_eval_open_t;
|
|
F32 hover_eval_num_visible_rows_t;
|
|
|
|
// rjf: error state
|
|
U8 error_buffer[512];
|
|
U64 error_string_size;
|
|
F32 error_t;
|
|
|
|
// rjf: context overrides
|
|
DF_CtrlCtx ctrl_ctx_overrides;
|
|
|
|
// rjf: panel state
|
|
DF_Panel *root_panel;
|
|
DF_Panel *free_panel;
|
|
DF_Panel *focused_panel;
|
|
|
|
// rjf: per-frame drawing state
|
|
D_Bucket *draw_bucket;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: View Rule Block State Types
|
|
|
|
typedef struct DF_ViewRuleBlockArenaExt DF_ViewRuleBlockArenaExt;
|
|
struct DF_ViewRuleBlockArenaExt
|
|
{
|
|
DF_ViewRuleBlockArenaExt *next;
|
|
Arena *arena;
|
|
};
|
|
|
|
typedef struct DF_ViewRuleBlockNode DF_ViewRuleBlockNode;
|
|
struct DF_ViewRuleBlockNode
|
|
{
|
|
DF_ViewRuleBlockNode *next;
|
|
DF_ExpandKey key;
|
|
DF_ViewRuleBlockArenaExt *first_arena_ext;
|
|
DF_ViewRuleBlockArenaExt *last_arena_ext;
|
|
Arena *user_state_arena;
|
|
void *user_state;
|
|
U64 user_state_size;
|
|
};
|
|
|
|
typedef struct DF_ViewRuleBlockSlot DF_ViewRuleBlockSlot;
|
|
struct DF_ViewRuleBlockSlot
|
|
{
|
|
DF_ViewRuleBlockNode *first;
|
|
DF_ViewRuleBlockNode *last;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Main Per-Process Graphical State
|
|
|
|
typedef struct DF_String2ViewNode DF_String2ViewNode;
|
|
struct DF_String2ViewNode
|
|
{
|
|
DF_String2ViewNode *hash_next;
|
|
String8 string;
|
|
String8 view_name;
|
|
};
|
|
|
|
typedef struct DF_String2ViewSlot DF_String2ViewSlot;
|
|
struct DF_String2ViewSlot
|
|
{
|
|
DF_String2ViewNode *first;
|
|
DF_String2ViewNode *last;
|
|
};
|
|
|
|
typedef struct DF_GfxState DF_GfxState;
|
|
struct DF_GfxState
|
|
{
|
|
// rjf: arenas
|
|
Arena *arena;
|
|
|
|
// rjf: frame request state
|
|
U64 num_frames_requested;
|
|
|
|
// rjf: history cache
|
|
DF_StateDeltaHistory *hist;
|
|
|
|
// rjf: key map table
|
|
Arena *key_map_arena;
|
|
U64 key_map_table_size;
|
|
DF_KeyMapSlot *key_map_table;
|
|
DF_KeyMapNode *free_key_map_node;
|
|
U64 key_map_total_count;
|
|
|
|
// rjf: bind change
|
|
B32 bind_change_active;
|
|
DF_CmdSpec *bind_change_cmd_spec;
|
|
DF_Binding bind_change_binding;
|
|
|
|
// rjf: confirmation popup state
|
|
UI_Key confirm_key;
|
|
B32 confirm_active;
|
|
F32 confirm_t;
|
|
Arena *confirm_arena;
|
|
DF_CmdList confirm_cmds;
|
|
String8 confirm_title;
|
|
String8 confirm_msg;
|
|
|
|
// rjf: string search state
|
|
Arena *string_search_arena;
|
|
String8 string_search_string;
|
|
|
|
// rjf: view specs
|
|
U64 view_spec_table_size;
|
|
DF_ViewSpec **view_spec_table;
|
|
|
|
// rjf: view rule specs
|
|
U64 view_rule_spec_table_size;
|
|
DF_GfxViewRuleSpec **view_rule_spec_table;
|
|
|
|
// rjf: view rule block state
|
|
U64 view_rule_block_slots_count;
|
|
DF_ViewRuleBlockSlot *view_rule_block_slots;
|
|
DF_ViewRuleBlockNode *free_view_rule_block_node;
|
|
|
|
// rjf: cmd param slot -> view spec rule table
|
|
DF_CmdParamSlotViewSpecRuleList cmd_param_slot_view_spec_table[DF_CmdParamSlot_COUNT];
|
|
|
|
// rjf: windows
|
|
OS_WindowRepaintFunctionType *repaint_hook;
|
|
DF_Window *first_window;
|
|
DF_Window *last_window;
|
|
DF_Window *free_window;
|
|
U64 window_count;
|
|
B32 last_window_queued_save;
|
|
|
|
// rjf: view state
|
|
DF_View *free_view;
|
|
U64 free_view_count;
|
|
U64 allocated_view_count;
|
|
|
|
// rjf: drag/drop state machine
|
|
DF_DragDropState drag_drop_state;
|
|
|
|
// rjf: hover line info correllation state
|
|
DF_Handle hover_line_binary;
|
|
U64 hover_line_voff;
|
|
B32 hover_line_set_this_frame;
|
|
|
|
// rjf: running theme state
|
|
DF_Theme cfg_theme_target;
|
|
DF_Theme cfg_theme;
|
|
Arena *cfg_main_font_path_arena;
|
|
Arena *cfg_code_font_path_arena;
|
|
String8 cfg_main_font_path;
|
|
String8 cfg_code_font_path;
|
|
F_Tag cfg_font_tags[DF_FontSlot_COUNT];
|
|
|
|
// rjf: icon texture
|
|
R_Handle icon_texture;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Globals
|
|
|
|
read_only global DF_ViewSpec df_g_nil_view_spec =
|
|
{
|
|
&df_g_nil_view_spec,
|
|
{
|
|
0,
|
|
{0},
|
|
{0},
|
|
DF_NameKind_Null,
|
|
DF_IconKind_Null,
|
|
DF_VIEW_SETUP_FUNCTION_NAME(Null),
|
|
DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Null),
|
|
DF_VIEW_CMD_FUNCTION_NAME(Null),
|
|
DF_VIEW_UI_FUNCTION_NAME(Null),
|
|
},
|
|
};
|
|
|
|
read_only global DF_GfxViewRuleSpec df_g_nil_gfx_view_rule_spec =
|
|
{
|
|
&df_g_nil_gfx_view_rule_spec,
|
|
};
|
|
|
|
read_only global DF_View df_g_nil_view =
|
|
{
|
|
&df_g_nil_view,
|
|
&df_g_nil_view,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
{0},
|
|
{0},
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
&df_g_nil_view_spec,
|
|
{0},
|
|
};
|
|
|
|
read_only global DF_Panel df_g_nil_panel =
|
|
{
|
|
&df_g_nil_panel,
|
|
&df_g_nil_panel,
|
|
&df_g_nil_panel,
|
|
&df_g_nil_panel,
|
|
&df_g_nil_panel,
|
|
0,
|
|
};
|
|
|
|
global DF_GfxState *df_gfx_state = 0;
|
|
global DF_DragDropPayload df_g_drag_drop_payload = {0};
|
|
global DF_Handle df_g_last_drag_drop_panel = {0};
|
|
global DF_Handle df_g_last_drag_drop_prev_tab = {0};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Basic Helpers
|
|
|
|
internal DF_PathQuery df_path_query_from_string(String8 string);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: View Type Functions
|
|
|
|
internal B32 df_view_is_nil(DF_View *view);
|
|
internal DF_Handle df_handle_from_view(DF_View *view);
|
|
internal DF_View *df_view_from_handle(DF_Handle handle);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: View Spec Type Functions
|
|
|
|
internal DF_GfxViewKind df_gfx_view_kind_from_string(String8 string);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Panel Type Functions
|
|
|
|
//- rjf: basic type functions
|
|
internal B32 df_panel_is_nil(DF_Panel *panel);
|
|
internal DF_Handle df_handle_from_panel(DF_Panel *panel);
|
|
internal DF_Panel *df_panel_from_handle(DF_Handle handle);
|
|
internal UI_Key df_ui_key_from_panel(DF_Panel *panel);
|
|
|
|
//- rjf: panel tree mutation notification
|
|
internal void df_panel_notify_mutation(DF_Window *window, DF_Panel *panel);
|
|
|
|
//- rjf: tree construction
|
|
internal void df_panel_insert(DF_Panel *parent, DF_Panel *prev_child, DF_Panel *new_child);
|
|
internal void df_panel_remove(DF_Panel *parent, DF_Panel *child);
|
|
|
|
//- rjf: tree walk
|
|
internal DF_PanelRec df_panel_rec_df(DF_Panel *panel, U64 sib_off, U64 child_off);
|
|
#define df_panel_rec_df_pre(panel) df_panel_rec_df(panel, OffsetOf(DF_Panel, next), OffsetOf(DF_Panel, first))
|
|
#define df_panel_rec_df_post(panel) df_panel_rec_df(panel, OffsetOf(DF_Panel, prev), OffsetOf(DF_Panel, last))
|
|
|
|
//- rjf: panel -> rect calculations
|
|
internal Rng2F32 df_target_rect_from_panel_child(Rng2F32 parent_rect, DF_Panel *parent, DF_Panel *panel);
|
|
internal Rng2F32 df_target_rect_from_panel(Rng2F32 root_rect, DF_Panel *root, DF_Panel *panel);
|
|
|
|
//- rjf: view ownership insertion/removal
|
|
internal void df_panel_insert_tab_view(DF_Panel *panel, DF_View *prev_view, DF_View *view);
|
|
internal void df_panel_remove_tab_view(DF_Panel *panel, DF_View *view);
|
|
|
|
//- rjf: icons & display strings
|
|
internal String8 df_display_string_from_view(Arena *arena, DF_CtrlCtx ctrl_ctx, DF_View *view);
|
|
internal DF_IconKind df_icon_kind_from_view(DF_View *view);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Window Type Functions
|
|
|
|
internal DF_Handle df_handle_from_window(DF_Window *window);
|
|
internal DF_Window *df_window_from_handle(DF_Handle handle);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Control Context
|
|
|
|
internal DF_CtrlCtx df_ctrl_ctx_from_window(DF_Window *ws);
|
|
internal DF_CtrlCtx df_ctrl_ctx_from_view(DF_Window *ws, DF_View *view);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Command Parameters From Context
|
|
|
|
internal DF_CmdParams df_cmd_params_from_gfx(void);
|
|
internal B32 df_prefer_dasm_from_window(DF_Window *window);
|
|
internal DF_CmdParams df_cmd_params_from_window(DF_Window *window);
|
|
internal DF_CmdParams df_cmd_params_from_panel(DF_Window *window, DF_Panel *panel);
|
|
internal DF_CmdParams df_cmd_params_from_view(DF_Window *window, DF_Panel *panel, DF_View *view);
|
|
internal DF_CmdParams df_cmd_params_copy(Arena *arena, DF_CmdParams *src);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Global Cross-Window UI Interaction State Functions
|
|
|
|
internal B32 df_drag_is_active(void);
|
|
internal void df_drag_begin(DF_DragDropPayload *payload);
|
|
internal B32 df_drag_drop(DF_DragDropPayload *out_payload);
|
|
internal void df_drag_kill(void);
|
|
internal void df_queue_drag_drop(void);
|
|
|
|
internal void df_set_hovered_line_info(DF_Entity *binary, U64 voff);
|
|
internal DF_Entity *df_get_hovered_line_info_binary(void);
|
|
internal U64 df_get_hovered_line_info_voff(void);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: View Spec State Functions
|
|
|
|
internal void df_register_view_specs(DF_ViewSpecInfoArray specs);
|
|
internal DF_ViewSpec *df_view_spec_from_string(String8 string);
|
|
internal DF_ViewSpec *df_view_spec_from_gfx_view_kind(DF_GfxViewKind gfx_view_kind);
|
|
internal DF_ViewSpec *df_view_spec_from_cmd_param_slot_spec(DF_CmdParamSlot slot, DF_CmdSpec *cmd_spec);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: View Rule Spec State Functions
|
|
|
|
internal void df_register_gfx_view_rule_specs(DF_GfxViewRuleSpecInfoArray specs);
|
|
internal DF_GfxViewRuleSpec *df_gfx_view_rule_spec_from_string(String8 string);
|
|
internal DF_ViewSpec *df_tab_view_spec_from_gfx_view_rule_spec(DF_GfxViewRuleSpec *spec);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: View State Functions
|
|
|
|
internal DF_View *df_view_alloc(void);
|
|
internal void df_view_release(DF_View *view);
|
|
internal void df_view_equip_spec(DF_Window *window, DF_View *view, DF_ViewSpec *spec, DF_Entity *entity, String8 default_query, DF_CfgNode *cfg_root);
|
|
internal void df_view_equip_loading_info(DF_View *view, B32 is_loading, U64 progress_v, U64 progress_target);
|
|
internal void df_view_clear_user_state(DF_View *view);
|
|
internal void *df_view_get_or_push_user_state(DF_View *view, U64 size);
|
|
internal Arena *df_view_push_arena_ext(DF_View *view);
|
|
#define df_view_user_state(view, type) (type *)df_view_get_or_push_user_state((view), sizeof(type))
|
|
|
|
////////////////////////////////
|
|
//~ rjf: View Rule Instance State Functions
|
|
|
|
internal void *df_view_rule_block_get_or_push_user_state(DF_ExpandKey key, U64 size);
|
|
#define df_view_rule_block_user_state(key, type) (type *)df_view_rule_block_get_or_push_user_state(key, sizeof(type))
|
|
internal Arena *df_view_rule_block_push_arena_ext(DF_ExpandKey key);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Panel State Functions
|
|
|
|
internal DF_Panel *df_panel_alloc(DF_Window *ws);
|
|
internal void df_panel_release(DF_Window *ws, DF_Panel *panel);
|
|
internal void df_panel_release_all_views(DF_Panel *panel);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Window State Functions
|
|
|
|
internal DF_Window *df_window_open(Vec2F32 size, OS_Handle preferred_monitor, DF_CfgSrc cfg_src);
|
|
|
|
internal DF_Window *df_window_from_os_handle(OS_Handle os);
|
|
|
|
internal void df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, DF_CmdList *cmds);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Eval Viz
|
|
|
|
internal String8 df_eval_escaped_from_raw_string(Arena *arena, String8 raw);
|
|
internal String8List df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table);
|
|
internal DF_EvalVizWindowedRowList df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_EvalView *eval_view, U32 default_radix, F_Tag font, F32 font_size, Rng1S64 visible_range, DF_EvalVizBlockList *blocks);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Hover Eval
|
|
|
|
internal void df_set_hover_eval(DF_Window *ws, Vec2F32 pos, DF_CtrlCtx ctrl_ctx, DF_Entity *file, TxtPt pt, U64 vaddr, String8 string);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Auto-Complete Lister
|
|
|
|
internal void df_autocomp_lister_item_chunk_list_push(Arena *arena, DF_AutoCompListerItemChunkList *list, U64 cap, DF_AutoCompListerItem *item);
|
|
internal DF_AutoCompListerItemArray df_autocomp_lister_item_array_from_chunk_list(Arena *arena, DF_AutoCompListerItemChunkList *list);
|
|
internal int df_autocomp_lister_item_qsort_compare(DF_AutoCompListerItem *a, DF_AutoCompListerItem *b);
|
|
internal void df_autocomp_lister_item_array_sort__in_place(DF_AutoCompListerItemArray *array);
|
|
|
|
internal void df_set_autocomp_lister_query(DF_Window *ws, UI_Key root_key, DF_CtrlCtx ctrl_ctx, DF_AutoCompListerFlags flags, String8 query);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Search Strings
|
|
|
|
internal void df_set_search_string(String8 string);
|
|
internal String8 df_push_search_string(Arena *arena);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Colors, Fonts, Config
|
|
|
|
//- rjf: keybindings
|
|
internal OS_Key df_os_key_from_cfg_string(String8 string);
|
|
internal void df_clear_bindings(void);
|
|
internal DF_BindingList df_bindings_from_spec(Arena *arena, DF_CmdSpec *spec);
|
|
internal void df_bind_spec(DF_CmdSpec *spec, DF_Binding binding);
|
|
internal void df_unbind_spec(DF_CmdSpec *spec, DF_Binding binding);
|
|
internal DF_CmdSpecList df_cmd_spec_list_from_binding(Arena *arena, DF_Binding binding);
|
|
internal DF_CmdSpecList df_cmd_spec_list_from_event_flags(Arena *arena, OS_EventFlags flags);
|
|
|
|
//- rjf: colors
|
|
internal Vec4F32 df_rgba_from_theme_color(DF_ThemeColor color);
|
|
internal DF_ThemeColor df_theme_color_from_txt_token_kind(TXT_TokenKind kind);
|
|
|
|
//- rjf: fonts/sizes
|
|
internal F_Tag df_font_from_slot(DF_FontSlot slot);
|
|
internal F32 df_font_size_from_slot(DF_Window *ws, DF_FontSlot slot);
|
|
|
|
//- rjf: config serialization
|
|
internal String8List df_cfg_strings_from_gfx(Arena *arena, String8 root_path, DF_CfgSrc source);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Process Control Info Stringification
|
|
|
|
internal String8 df_string_from_exception_code(U32 code);
|
|
internal String8 df_stop_explanation_string_icon_from_ctrl_event(Arena *arena, CTRL_Event *event, DF_IconKind *icon_out);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: UI Widgets: Fancy Buttons
|
|
|
|
internal void df_cmd_binding_button(DF_CmdSpec *spec);
|
|
internal UI_Signal df_menu_bar_button(String8 string);
|
|
internal UI_Signal df_cmd_spec_button(DF_CmdSpec *spec);
|
|
internal void df_cmd_list_menu_buttons(DF_Window *ws, U64 count, DF_CoreCmdKind *cmds, U32 *fastpath_codepoints);
|
|
internal UI_Signal df_icon_button(DF_IconKind kind, FuzzyMatchRangeList *matches, String8 string);
|
|
internal UI_Signal df_icon_buttonf(DF_IconKind kind, FuzzyMatchRangeList *matches, char *fmt, ...);
|
|
internal void df_entity_tooltips(DF_Entity *entity);
|
|
internal void df_entity_desc_button(DF_Window *ws, DF_Entity *entity, FuzzyMatchRangeList *name_matches, String8 fuzzy_query);
|
|
internal void df_entity_src_loc_button(DF_Window *ws, DF_Entity *entity, TxtPt point);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: UI Widgets: Text View
|
|
|
|
internal UI_BOX_CUSTOM_DRAW(df_thread_box_draw_extensions);
|
|
internal UI_BOX_CUSTOM_DRAW(df_bp_box_draw_extensions);
|
|
internal DF_CodeSliceSignal df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, String8 string);
|
|
internal DF_CodeSliceSignal df_code_slicef(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, char *fmt, ...);
|
|
|
|
internal B32 df_do_txt_controls(TXT_TextInfo *info, String8 data, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column);
|
|
internal B32 df_do_txti_controls(TXTI_Handle handle, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: UI Widgets: Fancy Labels
|
|
|
|
internal UI_Signal df_error_label(String8 string);
|
|
internal B32 df_help_label(String8 string);
|
|
internal D_FancyStringList df_fancy_string_list_from_code_string(Arena *arena, F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string);
|
|
internal UI_Box *df_code_label(F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: UI Widgets: Line Edit
|
|
|
|
internal UI_Signal df_line_edit(DF_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, B32 *expanded_out, String8 pre_edit_value, String8 string);
|
|
internal UI_Signal df_line_editf(DF_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, B32 *expanded_out, String8 pre_edit_value, char *fmt, ...);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Continuous Frame Requests
|
|
|
|
internal void df_gfx_request_frame(void);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Main Layer Top-Level Calls
|
|
|
|
internal void df_gfx_init(OS_WindowRepaintFunctionType *window_repaint_entry_point, DF_StateDeltaHistory *hist);
|
|
internal void df_gfx_begin_frame(Arena *arena, DF_CmdList *cmds);
|
|
internal void df_gfx_end_frame(void);
|
|
|
|
#endif // DF_GFX_H
|