From a552b0168fba56a81be2db972e5c41e6f556f7bb Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sun, 31 Mar 2019 11:55:26 -0700 Subject: [PATCH] top level render caller controlling layout directly --- 4coder_API/4coder_types.h | 56 +----- 4coder_api_transition_30_31.cpp | 37 +++- 4coder_api_transition_30_31.h | 71 +++++++ 4coder_base_types.h | 15 +- 4coder_default_hooks.cpp | 97 +++++++--- 4coder_default_include.cpp | 1 + 4coder_generated/app_functions.h | 62 ++++-- 4coder_helper.cpp | 2 +- 4ed.cpp | 17 +- 4ed_api_implementation.cpp | 316 ++++++++++++++++++++++--------- 4ed_app_models.h | 8 +- 4ed_buffer.h | 6 +- 4ed_view.cpp | 139 ++------------ 4ed_view.h | 13 ++ 4ed_view_ui.cpp | 125 +++++++++++- 15 files changed, 633 insertions(+), 332 deletions(-) create mode 100644 4coder_api_transition_30_31.h diff --git a/4coder_API/4coder_types.h b/4coder_API/4coder_types.h index 8577dd9c..f8a22314 100644 --- a/4coder_API/4coder_types.h +++ b/4coder_API/4coder_types.h @@ -630,50 +630,6 @@ STRUCT File_Attributes{ u64 last_write_time; }; -/* DOC(Buffer_Summary acts as a handle to a buffer and describes the state of the buffer.) -DOC_SEE(Access_Flag) -DOC_SEE(Dirty_State) */ -STRUCT Buffer_Summary{ - /* DOC(This field indicates whether the Buffer_Summary describes a buffer that is open in 4coder. When this field is false the summary is referred to as a "null summary".) */ - b32 exists; - /* DOC(If this is not a null summary, this field indicates whether the buffer has finished loading.) */ - b32 ready; - /* DOC(If this is not a null summary this field is the id of the associated buffer. If this is a null summary then buffer_id is 0.) */ - Buffer_ID buffer_id; - /* DOC(If this is not a null summary, this field contains flags describing the protection status of the buffer.) */ - Access_Flag lock_flags; - - /* DOC(TODO) */ - Buffer_Edit_Handler *edit_handler; - - /* DOC(If this is not a null summary, this field specifies the number of bytes in the buffer.) */ - i32 size; - /* DOC(If this is not a null summary, this field specifies the number of lines in the buffer.) */ - i32 line_count; - - /* DOC(If this is not a null summary, this field specifies the file name associated to this buffer.) */ - char *file_name; - /* DOC(This field specifies the length of the file_name string.) */ - i32 file_name_len; - - /* DOC(If this is not a null summary, this field specifies the name of the buffer.) */ - char *buffer_name; - /* DOC(This field specifies the length of the buffer_name string.) */ - i32 buffer_name_len; - - /* DOC(This field indicates the dirty state of the buffer.) */ - Dirty_State dirty; - - /* DOC(If this is not a null summary, this field indicates whether the buffer is set to lex tokens.) */ - b32 is_lexed; - /* DOC(If this is not a null summary, this field indicates whether the buffer has up to date tokens available. If this field is false, it may simply mean the tokens are still being generated in a background task and will be available later. If that is the case, is_lexed will be true to indicate that the buffer is trying to get it's tokens up to date.) */ - b32 tokens_are_ready; - /* DOC(If this is not a null summary, this field specifies the id of the command map for this buffer.) */ - i32 map_id; - /* DOC(If this is not a null summary, this field indicates whether the buffer 'prefers' wrapped lines.) */ - b32 unwrapped_lines; -}; - /* DOC(A markers is a location in a buffer that, once placed, is effected by edits the same way characters are effected. In particular if an edit occurs in a location in the buffer before a marker, the marker is shifted forward or backward so that it remains on the same character.) DOC_SEE(buffer_add_markers) @@ -1067,14 +1023,6 @@ STRUCT Frame_Info{ TYPEDEF_FUNC void Render_Callback(struct Application_Links *app); -STRUCT Render_Parameters{ - Frame_Info frame; - View_ID view_id; - Range on_screen_range; - Rect_i32 buffer_region; - Render_Callback *do_core_render; -}; - /* DOC(Hook_IDs name the various hooks in 4coder, these hooks use the Hook_Function signature.) DOC_SEE(Hook_Function) */ ENUM(i32, Hook_ID){ @@ -1125,8 +1073,8 @@ ENUM(i32, Special_Hook_ID){ TYPEDEF_FUNC i32 Command_Caller_Hook_Function(struct Application_Links *app, Generic_Command cmd); #define COMMAND_CALLER_HOOK(name) i32 name(struct Application_Links *app, Generic_Command cmd) -TYPEDEF_FUNC void Render_Caller_Function(struct Application_Links *app, Render_Parameters render_params); -#define RENDER_CALLER_SIG(name) void name(struct Application_Links *app, Render_Parameters render_params) +TYPEDEF_FUNC void Render_Caller_Function(struct Application_Links *app, Frame_Info frame_info); +#define RENDER_CALLER_SIG(name) void name(struct Application_Links *app, Frame_Info frame_info) TYPEDEF_FUNC i32 Hook_Function(struct Application_Links *app); #define HOOK_SIG(name) i32 name(struct Application_Links *app) diff --git a/4coder_api_transition_30_31.cpp b/4coder_api_transition_30_31.cpp index 0ccecd8e..cd5d4304 100644 --- a/4coder_api_transition_30_31.cpp +++ b/4coder_api_transition_30_31.cpp @@ -3,7 +3,7 @@ * * In order to keep your layer on the old API you don't have to do anything, this provides wrappers * idential to the 4.0.30 API. - * In order to transition your entire layer over to the 4.0.31 API define 'REMOVE_TRANSITION_HELPER' and fix errors. + * In order to transition your entire layer over to the 4.0.31 API define 'REMOVE_TRANSITION_HELPER_31' and fix errors. * Or you can do it step by step by removing a few wrappers at a time. * This transition helper will be removed in a future version so it is recommended to get off sooner or laster. * @@ -22,10 +22,41 @@ // TOP -#if !defined(REMOVE_TRANSITION_HELPER) +#if !defined(REMOVE_TRANSITION_HELPER_31) typedef b32 bool32; +static b32 +get_buffer_summary(Application_Links *app, Buffer_ID buffer_id, Access_Flag access, Buffer_Summary *buffer){ + b32 result = false; + if (buffer_exists(app, buffer_id)){ + Access_Flag buffer_access_flags = 0; + buffer_get_access_flags(app, buffer_id, &buffer_access_flags); + if ((buffer_access_flags & ~access) == 0){ + result = true; + buffer->exists = true; + buffer->ready = buffer_ready(app, buffer_id); + buffer->buffer_id = buffer_id; + buffer_get_size(app, buffer_id, &buffer->size); + buffer_get_line_count(app, buffer_id, &buffer->line_count); + String file_name = make_fixed_width_string(buffer->file_name); + buffer_get_file_name(app, buffer_id, &file_name, 0); + buffer->file_name_len = file_name.size; + String buffer_name = make_fixed_width_string(buffer->buffer_name); + buffer_get_unique_buffer_name(app, buffer_id, &buffer_name, 0); + buffer->buffer_name_len = buffer_name.size; + buffer_get_dirty_state(app, buffer_id, &buffer->dirty); + buffer_get_setting(app, buffer_id, BufferSetting_Lex, &buffer->is_lexed); + buffer->tokens_are_ready = buffer_tokens_are_ready(app, buffer_id); + buffer_get_setting(app, buffer_id, BufferSetting_MapID, &buffer->map_id); + buffer_get_setting(app, buffer_id, BufferSetting_WrapLine, &buffer->unwrapped_lines); + buffer->unwrapped_lines = !buffer->unwrapped_lines; + buffer->lock_flags = buffer_access_flags; + } + } + return(result); +} + static b32 exec_system_command(Application_Links *app, View_Summary *view, Buffer_Identifier buffer_id, char *path, int32_t path_len, char *command, i32 command_len, Command_Line_Interface_Flag flags){ @@ -312,7 +343,7 @@ static View_Summary get_view_first(Application_Links *app, Access_Flag access){ View_Summary view = {}; View_ID view_id = 0; - if (get_view_first(app, access, &view_id)){ + if (get_view_next(app, 0, access, &view_id)){ get_view_summary(app, view_id, access, &view); } return(view); diff --git a/4coder_api_transition_30_31.h b/4coder_api_transition_30_31.h new file mode 100644 index 00000000..ff065f28 --- /dev/null +++ b/4coder_api_transition_30_31.h @@ -0,0 +1,71 @@ +/* + * Helpers for the API transition from 4.0.30 to 4.0.31 + * + * In order to keep your layer on the old API you don't have to do anything, this provides wrappers + * idential to the 4.0.30 API. + * In order to transition your entire layer over to the 4.0.31 API define 'REMOVE_TRANSITION_HELPER_31' and fix errors. + * Or you can do it step by step by removing a few wrappers at a time. + * This transition helper will be removed in a future version so it is recommended to get off sooner or laster. + * + * Tips on transitioning: +* +* Wrather than just try to inline this code everywhere, you can simplify things quite a lot by storing references +* to buffers and views and Buffer_ID and View_ID instead of Buffer_Summary and View_Summary. + * Just get the summaries when you need information in those structures. + * + * You will make your code simpler if you stick to String as much as possible, but whenever you want to you can switch + * to any string type you have to String by calling make_string(char_ptr, length) or make_string_slowly(null_terminated_c_str). + * To pull the char ptr and length out of a String named "string": string.str and str.size. + * If you need a null terminated string from a String use get_null_terminated in 4coder_helper.cpp + * + */ + +// TOP + +#if !defined(REMOVE_TRANSITION_HELPER_31) + +/* DOC(Buffer_Summary acts as a handle to a buffer and describes the state of the buffer.) +DOC_SEE(Access_Flag) +DOC_SEE(Dirty_State) */ +STRUCT Buffer_Summary{ + /* DOC(This field indicates whether the Buffer_Summary describes a buffer that is open in 4coder. When this field is false the summary is referred to as a "null summary".) */ + b32 exists; + /* DOC(If this is not a null summary, this field indicates whether the buffer has finished loading.) */ + b32 ready; + /* DOC(If this is not a null summary this field is the id of the associated buffer. If this is a null summary then buffer_id is 0.) */ + Buffer_ID buffer_id; + /* DOC(If this is not a null summary, this field contains flags describing the protection status of the buffer.) */ + Access_Flag lock_flags; + + /* DOC(If this is not a null summary, this field specifies the number of bytes in the buffer.) */ + i32 size; + /* DOC(If this is not a null summary, this field specifies the number of lines in the buffer.) */ + i32 line_count; + + /* DOC(If this is not a null summary, this field specifies the file name associated to this buffer.) */ + char file_name[256]; + /* DOC(This field specifies the length of the file_name string.) */ + i32 file_name_len; + + /* DOC(If this is not a null summary, this field specifies the name of the buffer.) */ + char buffer_name[256]; + /* DOC(This field specifies the length of the buffer_name string.) */ + i32 buffer_name_len; + + /* DOC(This field indicates the dirty state of the buffer.) */ + Dirty_State dirty; + + /* DOC(If this is not a null summary, this field indicates whether the buffer is set to lex tokens.) */ + b32 is_lexed; + /* DOC(If this is not a null summary, this field indicates whether the buffer has up to date tokens available. If this field is false, it may simply mean the tokens are still being generated in a background task and will be available later. If that is the case, is_lexed will be true to indicate that the buffer is trying to get it's tokens up to date.) */ + b32 tokens_are_ready; + /* DOC(If this is not a null summary, this field specifies the id of the command map for this buffer.) */ + i32 map_id; + /* DOC(If this is not a null summary, this field indicates whether the buffer 'prefers' wrapped lines.) */ + b32 unwrapped_lines; +}; + +#endif + +// BOTTOM + diff --git a/4coder_base_types.h b/4coder_base_types.h index 47fcb4f3..26b5c1ab 100644 --- a/4coder_base_types.h +++ b/4coder_base_types.h @@ -127,16 +127,11 @@ typedef double f64; #define min_u32 ((u32)0) #define min_u64 ((u64)0) -static f32 -max_f32_proc(void){ - union{ - u32 x; - f32 f; - } c; - c.x = 0x7f800000; - return(c.f); -} -static const f32 max_f32 = max_f32_proc(); +static const f32 max_f32 = 3.4028234e+38f; +static const f32 min_f32 = 1.1754943e-38f; + +static const f64 max_f64 = 1.7976931348623157e+308; +static const f64 min_f64 = 2.2250738585072014e-308; //////////////////////////////// diff --git a/4coder_default_hooks.cpp b/4coder_default_hooks.cpp index 5ab18a3f..ccbe94cd 100644 --- a/4coder_default_hooks.cpp +++ b/4coder_default_hooks.cpp @@ -315,17 +315,39 @@ GET_VIEW_BUFFER_REGION_SIG(default_view_buffer_region){ return(sub_region); } +struct View_Render_Parameters{ + View_ID view_id; + Range on_screen_range; + Rect_i32 buffer_rect; +}; + static void -default_buffer_render_caller(Application_Links *app, Render_Parameters render_params){ - View_Summary view = get_view(app, render_params.view_id, AccessAll); +default_buffer_render_caller(Application_Links *app, Frame_Info frame_info, View_ID view_id, Rect_i32 view_inner_rect){ + Buffer_ID buffer_id = 0; + view_get_buffer(app, view_id, AccessAll, &buffer_id); + + Rect_i32 sub_region = i32R(0, 0, rect_width(view_inner_rect), rect_height(view_inner_rect)); + sub_region = default_view_buffer_region(app, view_id, sub_region); + Rect_i32 buffer_rect = {}; + buffer_rect.p0 = view_inner_rect.p0 + sub_region.p0; + buffer_rect.p1 = view_inner_rect.p0 + sub_region.p1; + buffer_rect.x1 = clamp_top(buffer_rect.x1, view_inner_rect.x1); + buffer_rect.y1 = clamp_top(buffer_rect.y1, view_inner_rect.y1); + buffer_rect.x0 = clamp_top(buffer_rect.x0, buffer_rect.x1); + buffer_rect.y0 = clamp_top(buffer_rect.y0, buffer_rect.y1); + + Range on_screen_range = {}; + compute_render_layout(app, view_id, buffer_id, buffer_rect, &on_screen_range); + + View_Summary view = get_view(app, view_id, AccessAll); Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessAll); View_Summary active_view = get_active_view(app, AccessAll); - b32 is_active_view = (active_view.view_id == render_params.view_id); + b32 is_active_view = (active_view.view_id == view_id); f32 line_height = view.line_height; Arena *arena = context_get_arena(app); - Temp_Memory_Arena temp = begin_temp_memory(arena); + Temp_Memory_Arena major_temp = begin_temp_memory(arena); static Managed_Scope render_scope = 0; if (render_scope == 0){ @@ -338,7 +360,7 @@ default_buffer_render_caller(Application_Links *app, Render_Parameters render_pa // NOTE(allen): Filebar { b32 showing_file_bar = false; - if (view_get_setting(app, render_params.view_id, ViewSetting_ShowFileBar, &showing_file_bar)){ + if (view_get_setting(app, view_id, ViewSetting_ShowFileBar, &showing_file_bar)){ if (showing_file_bar){ Rect_f32 bar = r_cursor; bar.y1 = bar.y0 + line_height + 2.f; @@ -410,7 +432,7 @@ default_buffer_render_caller(Application_Links *app, Render_Parameters render_pa Query_Bar *space[32]; Query_Bar_Ptr_Array query_bars = {}; query_bars.ptrs = space; - if (get_active_query_bars(app, render_params.view_id, ArrayCount(space), &query_bars)){ + if (get_active_query_bars(app, view_id, ArrayCount(space), &query_bars)){ for (i32 i = 0; i < query_bars.count; i += 1){ Query_Bar *query_bar = query_bars.ptrs[i]; @@ -456,17 +478,17 @@ default_buffer_render_caller(Application_Links *app, Render_Parameters render_pa Fancy_Color line_color = fancy_id(Stag_Line_Numbers_Text); Full_Cursor cursor = {}; - view_compute_cursor(app, render_params.view_id, seek_pos(render_params.on_screen_range.first), &cursor); - for (;cursor.pos <= render_params.on_screen_range.one_past_last;){ + view_compute_cursor(app, view_id, seek_pos(on_screen_range.first), &cursor); + for (;cursor.pos <= on_screen_range.one_past_last;){ Vec2 p = panel_space_from_view_space(cursor.wrapped_p, view.scroll_vars.scroll_p); - p += V2(render_params.buffer_region.p0); + p += V2(buffer_rect.p0); p.x = left_margin.x0; Temp_Memory_Arena temp = begin_temp_memory(arena); Fancy_String *line_string = push_fancy_stringf(arena, line_color, "%*d", line_count_digit_count, cursor.line); draw_fancy_string(app, font_id, line_string, p, Stag_Margin_Active, 0); end_temp_memory(temp); i32 next_line = cursor.line + 1; - view_compute_cursor(app, render_params.view_id, seek_line_char(next_line, 1), &cursor); + view_compute_cursor(app, view_id, seek_line_char(next_line, 1), &cursor); if (cursor.line < next_line){ break; } @@ -481,16 +503,16 @@ default_buffer_render_caller(Application_Links *app, Render_Parameters render_pa // NOTE(allen): Scan for TODOs and NOTEs { Temp_Memory temp = begin_temp_memory(scratch); - i32 text_size = render_params.on_screen_range.one_past_last - render_params.on_screen_range.first; + i32 text_size = on_screen_range.one_past_last - on_screen_range.first; char *text = push_array(scratch, char, text_size); - buffer_read_range(app, &buffer, render_params.on_screen_range.first, render_params.on_screen_range.one_past_last, text); + buffer_read_range(app, &buffer, on_screen_range.first, on_screen_range.one_past_last, text); Highlight_Record *records = push_array(scratch, Highlight_Record, 0); String tail = make_string(text, text_size); for (i32 i = 0; i < text_size; tail.str += 1, tail.size -= 1, i += 1){ if (match_part(tail, make_lit_string("NOTE"))){ Highlight_Record *record = push_array(scratch, Highlight_Record, 1); - record->first = i + render_params.on_screen_range.first; + record->first = i + on_screen_range.first; record->one_past_last = record->first + 4; record->color = Stag_Text_Cycle_2; tail.str += 3; @@ -499,7 +521,7 @@ default_buffer_render_caller(Application_Links *app, Render_Parameters render_pa } else if (match_part(tail, make_lit_string("TODO"))){ Highlight_Record *record = push_array(scratch, Highlight_Record, 1); - record->first = i + render_params.on_screen_range.first; + record->first = i + on_screen_range.first; record->one_past_last = record->first + 4; record->color = Stag_Text_Cycle_1; tail.str += 3; @@ -664,7 +686,7 @@ default_buffer_render_caller(Application_Links *app, Render_Parameters render_pa mark_enclosures(app, scratch, render_scope, &buffer, pos, FindScope_Paren, VisualType_CharacterBlocks, 0, colors, color_count); } - render_params.do_core_render(app); + draw_render_layout(app, view_id); // NOTE(allen): FPS HUD if (show_fps_hud){ @@ -673,10 +695,10 @@ default_buffer_render_caller(Application_Links *app, Render_Parameters render_pa static f32 history_animation_dt[history_depth] = {}; static i32 history_frame_index[history_depth] = {}; - i32 wrapped_index = render_params.frame.index%history_depth; - history_literal_dt[wrapped_index] = render_params.frame.literal_dt; - history_animation_dt[wrapped_index] = render_params.frame.animation_dt; - history_frame_index[wrapped_index] = render_params.frame.index; + i32 wrapped_index = frame_info.index%history_depth; + history_literal_dt[wrapped_index] = frame_info.literal_dt; + history_animation_dt[wrapped_index] = frame_info.animation_dt; + history_frame_index[wrapped_index] = frame_info.index; Rect_f32 hud_rect = f32R(view.render_region); hud_rect.y0 = hud_rect.y1 - view.line_height*(f32)(history_depth); @@ -730,7 +752,7 @@ default_buffer_render_caller(Application_Links *app, Render_Parameters render_pa } } - end_temp_memory(temp); + end_temp_memory(major_temp); managed_scope_clear_self_all_dependent_scopes(app, render_scope); } @@ -756,12 +778,12 @@ get_margin_color(i32 level){ } static void -default_ui_render_caller(Application_Links *app, Render_Parameters render_params){ +default_ui_render_caller(Application_Links *app, View_ID view_id){ UI_Data *ui_data = 0; Arena *ui_arena = 0; - if (view_get_ui_data(app, render_params.view_id, ViewGetUIFlag_KeepDataAsIs, &ui_data, &ui_arena)){ + if (view_get_ui_data(app, view_id, ViewGetUIFlag_KeepDataAsIs, &ui_data, &ui_arena)){ View_Summary view = {}; - if (get_view_summary(app, render_params.view_id, AccessAll, &view)){ + if (get_view_summary(app, view_id, AccessAll, &view)){ Rect_f32 rect_f32 = f32R(view.render_region); GUI_Scroll_Vars ui_scroll = view.scroll_vars; @@ -806,12 +828,33 @@ default_ui_render_caller(Application_Links *app, Render_Parameters render_params } } -RENDER_CALLER_SIG(default_render_caller){ - if (view_is_in_ui_mode(app, render_params.view_id)){ - default_ui_render_caller(app, render_params); +static void +default_render_view(Application_Links *app, Frame_Info frame_info, View_ID view_id, b32 is_active){ + Rect_i32 view_rect = {}; + view_get_region(app, view_id, &view_rect); + Rect_i32 inner = get_inner_rect(view_rect, 3); + draw_rectangle(app, f32R(view_rect), get_margin_color(is_active?UIActivation_Active:UIActivation_None)); + draw_rectangle(app, f32R(inner), Stag_Back); + draw_clip_push(app, f32R(inner)); + draw_coordinate_center_push(app, V2(inner.p0)); + if (view_is_in_ui_mode(app, view_id)){ + default_ui_render_caller(app, view_id); } else{ - default_buffer_render_caller(app, render_params); + default_buffer_render_caller(app, frame_info, view_id, inner); + } + draw_clip_pop(app); + draw_coordinate_center_pop(app); +} + +RENDER_CALLER_SIG(default_render_caller){ + View_ID active_view_id = 0; + get_active_view(app, AccessAll, &active_view_id); + View_ID view_id = 0; + for (get_view_next(app, 0, AccessAll, &view_id); + view_id != 0; + get_view_next(app, view_id, AccessAll, &view_id)){ + default_render_view(app, frame_info, view_id, (active_view_id == view_id)); } } diff --git a/4coder_default_include.cpp b/4coder_default_include.cpp index 1ed64308..6e2d21c1 100644 --- a/4coder_default_include.cpp +++ b/4coder_default_include.cpp @@ -24,6 +24,7 @@ #include "4coder_lib/4coder_utf8.h" #include "4coder_lib/4cpp_lexer.h" +#include "4coder_api_transition_30_31.h" #include "4coder_helper.h" #include "4coder_fancy.h" diff --git a/4coder_generated/app_functions.h b/4coder_generated/app_functions.h index b045c64a..8063e795 100644 --- a/4coder_generated/app_functions.h +++ b/4coder_generated/app_functions.h @@ -14,7 +14,6 @@ struct Application_Links; #define GET_BUFFER_COUNT_SIG(n) i32 n(Application_Links *app) #define GET_BUFFER_FIRST_SIG(n) b32 n(Application_Links *app, Access_Flag access, Buffer_ID *buffer_id_out) #define GET_BUFFER_NEXT_SIG(n) b32 n(Application_Links *app, Buffer_ID buffer_id, Access_Flag access, Buffer_ID *buffer_id_out) -#define GET_BUFFER_SUMMARY_SIG(n) b32 n(Application_Links *app, Buffer_ID buffer_id, Access_Flag access, Buffer_Summary *buffer_summary_out) #define GET_BUFFER_BY_NAME_SIG(n) b32 n(Application_Links *app, String name, Access_Flag access, Buffer_ID *buffer_id_out) #define GET_BUFFER_BY_FILE_NAME_SIG(n) b32 n(Application_Links *app, String file_name, Access_Flag access, Buffer_ID *buffer_id_out) #define BUFFER_READ_RANGE_SIG(n) b32 n(Application_Links *app, Buffer_ID buffer_id, i32 start, i32 one_past_last, char *out) @@ -45,12 +44,12 @@ struct Application_Links; #define BUFFER_KILL_SIG(n) b32 n(Application_Links *app, Buffer_ID buffer_id, Buffer_Kill_Flag flags, Buffer_Kill_Result *result) #define BUFFER_REOPEN_SIG(n) b32 n(Application_Links *app, Buffer_ID buffer_id, Buffer_Reopen_Flag flags, Buffer_Reopen_Result *result) #define BUFFER_GET_FILE_ATTRIBUTES_SIG(n) b32 n(Application_Links *app, Buffer_ID buffer_id, File_Attributes *attributes_out) -#define GET_VIEW_FIRST_SIG(n) b32 n(Application_Links *app, Access_Flag access, View_ID *view_id_out) #define GET_VIEW_NEXT_SIG(n) b32 n(Application_Links *app, View_ID view_id, Access_Flag access, View_ID *view_id_out) #define GET_VIEW_PREV_SIG(n) b32 n(Application_Links *app, View_ID view_id, Access_Flag access, View_ID *view_id_out) #define GET_VIEW_SUMMARY_SIG(n) b32 n(Application_Links *app, View_ID view_id, Access_Flag access, View_Summary *view_summary_out) #define GET_ACTIVE_VIEW_SIG(n) b32 n(Application_Links *app, Access_Flag access, View_ID *view_id_out) #define GET_ACTIVE_PANEL_SIG(n) b32 n(Application_Links *app, Panel_ID *panel_id_out) +#define VIEW_GET_BUFFER_SIG(n) b32 n(Application_Links *app, View_ID view_id, Access_Flag access, Buffer_ID *buffer_id_out) #define VIEW_GET_PANEL_SIG(n) b32 n(Application_Links *app, View_ID view_id, Panel_ID *panel_id_out) #define PANEL_GET_VIEW_SIG(n) b32 n(Application_Links *app, Panel_ID panel_id, View_ID *view_id_out) #define PANEL_IS_SPLIT_SIG(n) b32 n(Application_Links *app, Panel_ID panel_id) @@ -63,6 +62,7 @@ struct Application_Links; #define PANEL_GET_MAX_SIG(n) b32 n(Application_Links *app, Panel_ID panel_id, Panel_ID *panel_id_out) #define PANEL_GET_MARGIN_SIG(n) b32 n(Application_Links *app, Panel_ID panel_id, i32_Rect *margins_out) #define VIEW_CLOSE_SIG(n) b32 n(Application_Links *app, View_ID view_id) +#define VIEW_GET_REGION_SIG(n) b32 n(Application_Links *app, View_ID view_id, Rect_i32 *region_out) #define VIEW_GET_BUFFER_REGION_SIG(n) b32 n(Application_Links *app, View_ID view_id, Rect_i32 *region_out) #define VIEW_SET_ACTIVE_SIG(n) b32 n(Application_Links *app, View_ID view_id) #define VIEW_GET_SETTING_SIG(n) b32 n(Application_Links *app, View_ID view_id, View_Setting_ID setting, i32 *value_out) @@ -158,11 +158,15 @@ struct Application_Links; #define GET_MICROSECONDS_TIMESTAMP_SIG(n) Microsecond_Time_Stamp n(Application_Links *app) #define DRAW_STRING_SIG(n) Vec2 n(Application_Links *app, Face_ID font_id, String str, Vec2 point, int_color color, u32 flags, Vec2 delta) #define GET_STRING_ADVANCE_SIG(n) f32 n(Application_Links *app, Face_ID font_id, String str) -#define DRAW_RECTANGLE_SIG(n) void n(Application_Links *app, f32_Rect rect, int_color color) +#define DRAW_RECTANGLE_SIG(n) void n(Application_Links *app, Rect_f32 rect, int_color color) #define DRAW_RECTANGLE_OUTLINE_SIG(n) void n(Application_Links *app, f32_Rect rect, int_color color) #define DRAW_CLIP_PUSH_SIG(n) void n(Application_Links *app, f32_Rect clip_box) #define DRAW_CLIP_POP_SIG(n) f32_Rect n(Application_Links *app) +#define DRAW_COORDINATE_CENTER_PUSH_SIG(n) void n(Application_Links *app, Vec2 point) +#define DRAW_COORDINATE_CENTER_POP_SIG(n) Vec2 n(Application_Links *app) #define GET_DEFAULT_FONT_FOR_VIEW_SIG(n) Face_ID n(Application_Links *app, View_ID view_id) +#define COMPUTE_RENDER_LAYOUT_SIG(n) b32 n(Application_Links *app, View_ID view_id, Buffer_ID buffer_id, Rect_i32 rect, Range *on_screen_range_out) +#define DRAW_RENDER_LAYOUT_SIG(n) void n(Application_Links *app, View_ID view_id) #define OPEN_COLOR_PICKER_SIG(n) void n(Application_Links *app, color_picker *picker) #define ANIMATE_IN_N_MILLISECONDS_SIG(n) void n(Application_Links *app, u32 n) #define FIND_ALL_IN_RANGE_INSENSITIVE_SIG(n) Found_String_List n(Application_Links *app, Buffer_ID buffer_id, i32 start, i32 end, String key, Partition *memory) @@ -182,7 +186,6 @@ typedef CREATE_PARSE_CONTEXT_SIG(Create_Parse_Context_Function); typedef GET_BUFFER_COUNT_SIG(Get_Buffer_Count_Function); typedef GET_BUFFER_FIRST_SIG(Get_Buffer_First_Function); typedef GET_BUFFER_NEXT_SIG(Get_Buffer_Next_Function); -typedef GET_BUFFER_SUMMARY_SIG(Get_Buffer_Summary_Function); typedef GET_BUFFER_BY_NAME_SIG(Get_Buffer_By_Name_Function); typedef GET_BUFFER_BY_FILE_NAME_SIG(Get_Buffer_By_File_Name_Function); typedef BUFFER_READ_RANGE_SIG(Buffer_Read_Range_Function); @@ -213,12 +216,12 @@ typedef BUFFER_SAVE_SIG(Buffer_Save_Function); typedef BUFFER_KILL_SIG(Buffer_Kill_Function); typedef BUFFER_REOPEN_SIG(Buffer_Reopen_Function); typedef BUFFER_GET_FILE_ATTRIBUTES_SIG(Buffer_Get_File_Attributes_Function); -typedef GET_VIEW_FIRST_SIG(Get_View_First_Function); typedef GET_VIEW_NEXT_SIG(Get_View_Next_Function); typedef GET_VIEW_PREV_SIG(Get_View_Prev_Function); typedef GET_VIEW_SUMMARY_SIG(Get_View_Summary_Function); typedef GET_ACTIVE_VIEW_SIG(Get_Active_View_Function); typedef GET_ACTIVE_PANEL_SIG(Get_Active_Panel_Function); +typedef VIEW_GET_BUFFER_SIG(View_Get_Buffer_Function); typedef VIEW_GET_PANEL_SIG(View_Get_Panel_Function); typedef PANEL_GET_VIEW_SIG(Panel_Get_View_Function); typedef PANEL_IS_SPLIT_SIG(Panel_Is_Split_Function); @@ -231,6 +234,7 @@ typedef PANEL_GET_CHILD_SIG(Panel_Get_Child_Function); typedef PANEL_GET_MAX_SIG(Panel_Get_Max_Function); typedef PANEL_GET_MARGIN_SIG(Panel_Get_Margin_Function); typedef VIEW_CLOSE_SIG(View_Close_Function); +typedef VIEW_GET_REGION_SIG(View_Get_Region_Function); typedef VIEW_GET_BUFFER_REGION_SIG(View_Get_Buffer_Region_Function); typedef VIEW_SET_ACTIVE_SIG(View_Set_Active_Function); typedef VIEW_GET_SETTING_SIG(View_Get_Setting_Function); @@ -330,7 +334,11 @@ typedef DRAW_RECTANGLE_SIG(Draw_Rectangle_Function); typedef DRAW_RECTANGLE_OUTLINE_SIG(Draw_Rectangle_Outline_Function); typedef DRAW_CLIP_PUSH_SIG(Draw_Clip_Push_Function); typedef DRAW_CLIP_POP_SIG(Draw_Clip_Pop_Function); +typedef DRAW_COORDINATE_CENTER_PUSH_SIG(Draw_Coordinate_Center_Push_Function); +typedef DRAW_COORDINATE_CENTER_POP_SIG(Draw_Coordinate_Center_Pop_Function); typedef GET_DEFAULT_FONT_FOR_VIEW_SIG(Get_Default_Font_For_View_Function); +typedef COMPUTE_RENDER_LAYOUT_SIG(Compute_Render_Layout_Function); +typedef DRAW_RENDER_LAYOUT_SIG(Draw_Render_Layout_Function); typedef OPEN_COLOR_PICKER_SIG(Open_Color_Picker_Function); typedef ANIMATE_IN_N_MILLISECONDS_SIG(Animate_In_N_Milliseconds_Function); typedef FIND_ALL_IN_RANGE_INSENSITIVE_SIG(Find_All_In_Range_Insensitive_Function); @@ -352,7 +360,6 @@ Create_Parse_Context_Function *create_parse_context; Get_Buffer_Count_Function *get_buffer_count; Get_Buffer_First_Function *get_buffer_first; Get_Buffer_Next_Function *get_buffer_next; -Get_Buffer_Summary_Function *get_buffer_summary; Get_Buffer_By_Name_Function *get_buffer_by_name; Get_Buffer_By_File_Name_Function *get_buffer_by_file_name; Buffer_Read_Range_Function *buffer_read_range; @@ -383,12 +390,12 @@ Buffer_Save_Function *buffer_save; Buffer_Kill_Function *buffer_kill; Buffer_Reopen_Function *buffer_reopen; Buffer_Get_File_Attributes_Function *buffer_get_file_attributes; -Get_View_First_Function *get_view_first; Get_View_Next_Function *get_view_next; Get_View_Prev_Function *get_view_prev; Get_View_Summary_Function *get_view_summary; Get_Active_View_Function *get_active_view; Get_Active_Panel_Function *get_active_panel; +View_Get_Buffer_Function *view_get_buffer; View_Get_Panel_Function *view_get_panel; Panel_Get_View_Function *panel_get_view; Panel_Is_Split_Function *panel_is_split; @@ -401,6 +408,7 @@ Panel_Get_Child_Function *panel_get_child; Panel_Get_Max_Function *panel_get_max; Panel_Get_Margin_Function *panel_get_margin; View_Close_Function *view_close; +View_Get_Region_Function *view_get_region; View_Get_Buffer_Region_Function *view_get_buffer_region; View_Set_Active_Function *view_set_active; View_Get_Setting_Function *view_get_setting; @@ -500,7 +508,11 @@ Draw_Rectangle_Function *draw_rectangle; Draw_Rectangle_Outline_Function *draw_rectangle_outline; Draw_Clip_Push_Function *draw_clip_push; Draw_Clip_Pop_Function *draw_clip_pop; +Draw_Coordinate_Center_Push_Function *draw_coordinate_center_push; +Draw_Coordinate_Center_Pop_Function *draw_coordinate_center_pop; Get_Default_Font_For_View_Function *get_default_font_for_view; +Compute_Render_Layout_Function *compute_render_layout; +Draw_Render_Layout_Function *draw_render_layout; Open_Color_Picker_Function *open_color_picker; Animate_In_N_Milliseconds_Function *animate_in_n_milliseconds; Find_All_In_Range_Insensitive_Function *find_all_in_range_insensitive; @@ -521,7 +533,6 @@ Create_Parse_Context_Function *create_parse_context_; Get_Buffer_Count_Function *get_buffer_count_; Get_Buffer_First_Function *get_buffer_first_; Get_Buffer_Next_Function *get_buffer_next_; -Get_Buffer_Summary_Function *get_buffer_summary_; Get_Buffer_By_Name_Function *get_buffer_by_name_; Get_Buffer_By_File_Name_Function *get_buffer_by_file_name_; Buffer_Read_Range_Function *buffer_read_range_; @@ -552,12 +563,12 @@ Buffer_Save_Function *buffer_save_; Buffer_Kill_Function *buffer_kill_; Buffer_Reopen_Function *buffer_reopen_; Buffer_Get_File_Attributes_Function *buffer_get_file_attributes_; -Get_View_First_Function *get_view_first_; Get_View_Next_Function *get_view_next_; Get_View_Prev_Function *get_view_prev_; Get_View_Summary_Function *get_view_summary_; Get_Active_View_Function *get_active_view_; Get_Active_Panel_Function *get_active_panel_; +View_Get_Buffer_Function *view_get_buffer_; View_Get_Panel_Function *view_get_panel_; Panel_Get_View_Function *panel_get_view_; Panel_Is_Split_Function *panel_is_split_; @@ -570,6 +581,7 @@ Panel_Get_Child_Function *panel_get_child_; Panel_Get_Max_Function *panel_get_max_; Panel_Get_Margin_Function *panel_get_margin_; View_Close_Function *view_close_; +View_Get_Region_Function *view_get_region_; View_Get_Buffer_Region_Function *view_get_buffer_region_; View_Set_Active_Function *view_set_active_; View_Get_Setting_Function *view_get_setting_; @@ -669,7 +681,11 @@ Draw_Rectangle_Function *draw_rectangle_; Draw_Rectangle_Outline_Function *draw_rectangle_outline_; Draw_Clip_Push_Function *draw_clip_push_; Draw_Clip_Pop_Function *draw_clip_pop_; +Draw_Coordinate_Center_Push_Function *draw_coordinate_center_push_; +Draw_Coordinate_Center_Pop_Function *draw_coordinate_center_pop_; Get_Default_Font_For_View_Function *get_default_font_for_view_; +Compute_Render_Layout_Function *compute_render_layout_; +Draw_Render_Layout_Function *draw_render_layout_; Open_Color_Picker_Function *open_color_picker_; Animate_In_N_Milliseconds_Function *animate_in_n_milliseconds_; Find_All_In_Range_Insensitive_Function *find_all_in_range_insensitive_; @@ -698,7 +714,6 @@ app_links->create_parse_context_ = Create_Parse_Context;\ app_links->get_buffer_count_ = Get_Buffer_Count;\ app_links->get_buffer_first_ = Get_Buffer_First;\ app_links->get_buffer_next_ = Get_Buffer_Next;\ -app_links->get_buffer_summary_ = Get_Buffer_Summary;\ app_links->get_buffer_by_name_ = Get_Buffer_By_Name;\ app_links->get_buffer_by_file_name_ = Get_Buffer_By_File_Name;\ app_links->buffer_read_range_ = Buffer_Read_Range;\ @@ -729,12 +744,12 @@ app_links->buffer_save_ = Buffer_Save;\ app_links->buffer_kill_ = Buffer_Kill;\ app_links->buffer_reopen_ = Buffer_Reopen;\ app_links->buffer_get_file_attributes_ = Buffer_Get_File_Attributes;\ -app_links->get_view_first_ = Get_View_First;\ app_links->get_view_next_ = Get_View_Next;\ app_links->get_view_prev_ = Get_View_Prev;\ app_links->get_view_summary_ = Get_View_Summary;\ app_links->get_active_view_ = Get_Active_View;\ app_links->get_active_panel_ = Get_Active_Panel;\ +app_links->view_get_buffer_ = View_Get_Buffer;\ app_links->view_get_panel_ = View_Get_Panel;\ app_links->panel_get_view_ = Panel_Get_View;\ app_links->panel_is_split_ = Panel_Is_Split;\ @@ -747,6 +762,7 @@ app_links->panel_get_child_ = Panel_Get_Child;\ app_links->panel_get_max_ = Panel_Get_Max;\ app_links->panel_get_margin_ = Panel_Get_Margin;\ app_links->view_close_ = View_Close;\ +app_links->view_get_region_ = View_Get_Region;\ app_links->view_get_buffer_region_ = View_Get_Buffer_Region;\ app_links->view_set_active_ = View_Set_Active;\ app_links->view_get_setting_ = View_Get_Setting;\ @@ -846,7 +862,11 @@ app_links->draw_rectangle_ = Draw_Rectangle;\ app_links->draw_rectangle_outline_ = Draw_Rectangle_Outline;\ app_links->draw_clip_push_ = Draw_Clip_Push;\ app_links->draw_clip_pop_ = Draw_Clip_Pop;\ +app_links->draw_coordinate_center_push_ = Draw_Coordinate_Center_Push;\ +app_links->draw_coordinate_center_pop_ = Draw_Coordinate_Center_Pop;\ app_links->get_default_font_for_view_ = Get_Default_Font_For_View;\ +app_links->compute_render_layout_ = Compute_Render_Layout;\ +app_links->draw_render_layout_ = Draw_Render_Layout;\ app_links->open_color_picker_ = Open_Color_Picker;\ app_links->animate_in_n_milliseconds_ = Animate_In_N_Milliseconds;\ app_links->find_all_in_range_insensitive_ = Find_All_In_Range_Insensitive;\ @@ -867,7 +887,6 @@ static Parse_Context_ID create_parse_context(Application_Links *app, Parser_Stri static i32 get_buffer_count(Application_Links *app){return(app->get_buffer_count(app));} static b32 get_buffer_first(Application_Links *app, Access_Flag access, Buffer_ID *buffer_id_out){return(app->get_buffer_first(app, access, buffer_id_out));} static b32 get_buffer_next(Application_Links *app, Buffer_ID buffer_id, Access_Flag access, Buffer_ID *buffer_id_out){return(app->get_buffer_next(app, buffer_id, access, buffer_id_out));} -static b32 get_buffer_summary(Application_Links *app, Buffer_ID buffer_id, Access_Flag access, Buffer_Summary *buffer_summary_out){return(app->get_buffer_summary(app, buffer_id, access, buffer_summary_out));} static b32 get_buffer_by_name(Application_Links *app, String name, Access_Flag access, Buffer_ID *buffer_id_out){return(app->get_buffer_by_name(app, name, access, buffer_id_out));} static b32 get_buffer_by_file_name(Application_Links *app, String file_name, Access_Flag access, Buffer_ID *buffer_id_out){return(app->get_buffer_by_file_name(app, file_name, access, buffer_id_out));} static b32 buffer_read_range(Application_Links *app, Buffer_ID buffer_id, i32 start, i32 one_past_last, char *out){return(app->buffer_read_range(app, buffer_id, start, one_past_last, out));} @@ -898,12 +917,12 @@ static b32 buffer_save(Application_Links *app, Buffer_ID buffer_id, String file_ static b32 buffer_kill(Application_Links *app, Buffer_ID buffer_id, Buffer_Kill_Flag flags, Buffer_Kill_Result *result){return(app->buffer_kill(app, buffer_id, flags, result));} static b32 buffer_reopen(Application_Links *app, Buffer_ID buffer_id, Buffer_Reopen_Flag flags, Buffer_Reopen_Result *result){return(app->buffer_reopen(app, buffer_id, flags, result));} static b32 buffer_get_file_attributes(Application_Links *app, Buffer_ID buffer_id, File_Attributes *attributes_out){return(app->buffer_get_file_attributes(app, buffer_id, attributes_out));} -static b32 get_view_first(Application_Links *app, Access_Flag access, View_ID *view_id_out){return(app->get_view_first(app, access, view_id_out));} static b32 get_view_next(Application_Links *app, View_ID view_id, Access_Flag access, View_ID *view_id_out){return(app->get_view_next(app, view_id, access, view_id_out));} static b32 get_view_prev(Application_Links *app, View_ID view_id, Access_Flag access, View_ID *view_id_out){return(app->get_view_prev(app, view_id, access, view_id_out));} static b32 get_view_summary(Application_Links *app, View_ID view_id, Access_Flag access, View_Summary *view_summary_out){return(app->get_view_summary(app, view_id, access, view_summary_out));} static b32 get_active_view(Application_Links *app, Access_Flag access, View_ID *view_id_out){return(app->get_active_view(app, access, view_id_out));} static b32 get_active_panel(Application_Links *app, Panel_ID *panel_id_out){return(app->get_active_panel(app, panel_id_out));} +static b32 view_get_buffer(Application_Links *app, View_ID view_id, Access_Flag access, Buffer_ID *buffer_id_out){return(app->view_get_buffer(app, view_id, access, buffer_id_out));} static b32 view_get_panel(Application_Links *app, View_ID view_id, Panel_ID *panel_id_out){return(app->view_get_panel(app, view_id, panel_id_out));} static b32 panel_get_view(Application_Links *app, Panel_ID panel_id, View_ID *view_id_out){return(app->panel_get_view(app, panel_id, view_id_out));} static b32 panel_is_split(Application_Links *app, Panel_ID panel_id){return(app->panel_is_split(app, panel_id));} @@ -916,6 +935,7 @@ static b32 panel_get_child(Application_Links *app, Panel_ID panel_id, Panel_Chil static b32 panel_get_max(Application_Links *app, Panel_ID panel_id, Panel_ID *panel_id_out){return(app->panel_get_max(app, panel_id, panel_id_out));} static b32 panel_get_margin(Application_Links *app, Panel_ID panel_id, i32_Rect *margins_out){return(app->panel_get_margin(app, panel_id, margins_out));} static b32 view_close(Application_Links *app, View_ID view_id){return(app->view_close(app, view_id));} +static b32 view_get_region(Application_Links *app, View_ID view_id, Rect_i32 *region_out){return(app->view_get_region(app, view_id, region_out));} static b32 view_get_buffer_region(Application_Links *app, View_ID view_id, Rect_i32 *region_out){return(app->view_get_buffer_region(app, view_id, region_out));} static b32 view_set_active(Application_Links *app, View_ID view_id){return(app->view_set_active(app, view_id));} static b32 view_get_setting(Application_Links *app, View_ID view_id, View_Setting_ID setting, i32 *value_out){return(app->view_get_setting(app, view_id, setting, value_out));} @@ -1011,11 +1031,15 @@ static b32 set_window_title(Application_Links *app, String title){return(app->se static Microsecond_Time_Stamp get_microseconds_timestamp(Application_Links *app){return(app->get_microseconds_timestamp(app));} static Vec2 draw_string(Application_Links *app, Face_ID font_id, String str, Vec2 point, int_color color, u32 flags, Vec2 delta){return(app->draw_string(app, font_id, str, point, color, flags, delta));} static f32 get_string_advance(Application_Links *app, Face_ID font_id, String str){return(app->get_string_advance(app, font_id, str));} -static void draw_rectangle(Application_Links *app, f32_Rect rect, int_color color){(app->draw_rectangle(app, rect, color));} +static void draw_rectangle(Application_Links *app, Rect_f32 rect, int_color color){(app->draw_rectangle(app, rect, color));} static void draw_rectangle_outline(Application_Links *app, f32_Rect rect, int_color color){(app->draw_rectangle_outline(app, rect, color));} static void draw_clip_push(Application_Links *app, f32_Rect clip_box){(app->draw_clip_push(app, clip_box));} static f32_Rect draw_clip_pop(Application_Links *app){return(app->draw_clip_pop(app));} +static void draw_coordinate_center_push(Application_Links *app, Vec2 point){(app->draw_coordinate_center_push(app, point));} +static Vec2 draw_coordinate_center_pop(Application_Links *app){return(app->draw_coordinate_center_pop(app));} static Face_ID get_default_font_for_view(Application_Links *app, View_ID view_id){return(app->get_default_font_for_view(app, view_id));} +static b32 compute_render_layout(Application_Links *app, View_ID view_id, Buffer_ID buffer_id, Rect_i32 rect, Range *on_screen_range_out){return(app->compute_render_layout(app, view_id, buffer_id, rect, on_screen_range_out));} +static void draw_render_layout(Application_Links *app, View_ID view_id){(app->draw_render_layout(app, view_id));} static void open_color_picker(Application_Links *app, color_picker *picker){(app->open_color_picker(app, picker));} static void animate_in_n_milliseconds(Application_Links *app, u32 n){(app->animate_in_n_milliseconds(app, n));} static Found_String_List find_all_in_range_insensitive(Application_Links *app, Buffer_ID buffer_id, i32 start, i32 end, String key, Partition *memory){return(app->find_all_in_range_insensitive(app, buffer_id, start, end, key, memory));} @@ -1036,7 +1060,6 @@ static Parse_Context_ID create_parse_context(Application_Links *app, Parser_Stri static i32 get_buffer_count(Application_Links *app){return(app->get_buffer_count_(app));} static b32 get_buffer_first(Application_Links *app, Access_Flag access, Buffer_ID *buffer_id_out){return(app->get_buffer_first_(app, access, buffer_id_out));} static b32 get_buffer_next(Application_Links *app, Buffer_ID buffer_id, Access_Flag access, Buffer_ID *buffer_id_out){return(app->get_buffer_next_(app, buffer_id, access, buffer_id_out));} -static b32 get_buffer_summary(Application_Links *app, Buffer_ID buffer_id, Access_Flag access, Buffer_Summary *buffer_summary_out){return(app->get_buffer_summary_(app, buffer_id, access, buffer_summary_out));} static b32 get_buffer_by_name(Application_Links *app, String name, Access_Flag access, Buffer_ID *buffer_id_out){return(app->get_buffer_by_name_(app, name, access, buffer_id_out));} static b32 get_buffer_by_file_name(Application_Links *app, String file_name, Access_Flag access, Buffer_ID *buffer_id_out){return(app->get_buffer_by_file_name_(app, file_name, access, buffer_id_out));} static b32 buffer_read_range(Application_Links *app, Buffer_ID buffer_id, i32 start, i32 one_past_last, char *out){return(app->buffer_read_range_(app, buffer_id, start, one_past_last, out));} @@ -1067,12 +1090,12 @@ static b32 buffer_save(Application_Links *app, Buffer_ID buffer_id, String file_ static b32 buffer_kill(Application_Links *app, Buffer_ID buffer_id, Buffer_Kill_Flag flags, Buffer_Kill_Result *result){return(app->buffer_kill_(app, buffer_id, flags, result));} static b32 buffer_reopen(Application_Links *app, Buffer_ID buffer_id, Buffer_Reopen_Flag flags, Buffer_Reopen_Result *result){return(app->buffer_reopen_(app, buffer_id, flags, result));} static b32 buffer_get_file_attributes(Application_Links *app, Buffer_ID buffer_id, File_Attributes *attributes_out){return(app->buffer_get_file_attributes_(app, buffer_id, attributes_out));} -static b32 get_view_first(Application_Links *app, Access_Flag access, View_ID *view_id_out){return(app->get_view_first_(app, access, view_id_out));} static b32 get_view_next(Application_Links *app, View_ID view_id, Access_Flag access, View_ID *view_id_out){return(app->get_view_next_(app, view_id, access, view_id_out));} static b32 get_view_prev(Application_Links *app, View_ID view_id, Access_Flag access, View_ID *view_id_out){return(app->get_view_prev_(app, view_id, access, view_id_out));} static b32 get_view_summary(Application_Links *app, View_ID view_id, Access_Flag access, View_Summary *view_summary_out){return(app->get_view_summary_(app, view_id, access, view_summary_out));} static b32 get_active_view(Application_Links *app, Access_Flag access, View_ID *view_id_out){return(app->get_active_view_(app, access, view_id_out));} static b32 get_active_panel(Application_Links *app, Panel_ID *panel_id_out){return(app->get_active_panel_(app, panel_id_out));} +static b32 view_get_buffer(Application_Links *app, View_ID view_id, Access_Flag access, Buffer_ID *buffer_id_out){return(app->view_get_buffer_(app, view_id, access, buffer_id_out));} static b32 view_get_panel(Application_Links *app, View_ID view_id, Panel_ID *panel_id_out){return(app->view_get_panel_(app, view_id, panel_id_out));} static b32 panel_get_view(Application_Links *app, Panel_ID panel_id, View_ID *view_id_out){return(app->panel_get_view_(app, panel_id, view_id_out));} static b32 panel_is_split(Application_Links *app, Panel_ID panel_id){return(app->panel_is_split_(app, panel_id));} @@ -1085,6 +1108,7 @@ static b32 panel_get_child(Application_Links *app, Panel_ID panel_id, Panel_Chil static b32 panel_get_max(Application_Links *app, Panel_ID panel_id, Panel_ID *panel_id_out){return(app->panel_get_max_(app, panel_id, panel_id_out));} static b32 panel_get_margin(Application_Links *app, Panel_ID panel_id, i32_Rect *margins_out){return(app->panel_get_margin_(app, panel_id, margins_out));} static b32 view_close(Application_Links *app, View_ID view_id){return(app->view_close_(app, view_id));} +static b32 view_get_region(Application_Links *app, View_ID view_id, Rect_i32 *region_out){return(app->view_get_region_(app, view_id, region_out));} static b32 view_get_buffer_region(Application_Links *app, View_ID view_id, Rect_i32 *region_out){return(app->view_get_buffer_region_(app, view_id, region_out));} static b32 view_set_active(Application_Links *app, View_ID view_id){return(app->view_set_active_(app, view_id));} static b32 view_get_setting(Application_Links *app, View_ID view_id, View_Setting_ID setting, i32 *value_out){return(app->view_get_setting_(app, view_id, setting, value_out));} @@ -1180,11 +1204,15 @@ static b32 set_window_title(Application_Links *app, String title){return(app->se static Microsecond_Time_Stamp get_microseconds_timestamp(Application_Links *app){return(app->get_microseconds_timestamp_(app));} static Vec2 draw_string(Application_Links *app, Face_ID font_id, String str, Vec2 point, int_color color, u32 flags, Vec2 delta){return(app->draw_string_(app, font_id, str, point, color, flags, delta));} static f32 get_string_advance(Application_Links *app, Face_ID font_id, String str){return(app->get_string_advance_(app, font_id, str));} -static void draw_rectangle(Application_Links *app, f32_Rect rect, int_color color){(app->draw_rectangle_(app, rect, color));} +static void draw_rectangle(Application_Links *app, Rect_f32 rect, int_color color){(app->draw_rectangle_(app, rect, color));} static void draw_rectangle_outline(Application_Links *app, f32_Rect rect, int_color color){(app->draw_rectangle_outline_(app, rect, color));} static void draw_clip_push(Application_Links *app, f32_Rect clip_box){(app->draw_clip_push_(app, clip_box));} static f32_Rect draw_clip_pop(Application_Links *app){return(app->draw_clip_pop_(app));} +static void draw_coordinate_center_push(Application_Links *app, Vec2 point){(app->draw_coordinate_center_push_(app, point));} +static Vec2 draw_coordinate_center_pop(Application_Links *app){return(app->draw_coordinate_center_pop_(app));} static Face_ID get_default_font_for_view(Application_Links *app, View_ID view_id){return(app->get_default_font_for_view_(app, view_id));} +static b32 compute_render_layout(Application_Links *app, View_ID view_id, Buffer_ID buffer_id, Rect_i32 rect, Range *on_screen_range_out){return(app->compute_render_layout_(app, view_id, buffer_id, rect, on_screen_range_out));} +static void draw_render_layout(Application_Links *app, View_ID view_id){(app->draw_render_layout_(app, view_id));} static void open_color_picker(Application_Links *app, color_picker *picker){(app->open_color_picker_(app, picker));} static void animate_in_n_milliseconds(Application_Links *app, u32 n){(app->animate_in_n_milliseconds_(app, n));} static Found_String_List find_all_in_range_insensitive(Application_Links *app, Buffer_ID buffer_id, i32 start, i32 end, String key, Partition *memory){return(app->find_all_in_range_insensitive_(app, buffer_id, start, end, key, memory));} diff --git a/4coder_helper.cpp b/4coder_helper.cpp index 469233d3..be7064a9 100644 --- a/4coder_helper.cpp +++ b/4coder_helper.cpp @@ -631,7 +631,7 @@ get_view_last(Application_Links *app, Access_Flag access, View_ID *view_id_out){ static View_ID get_next_view_looped_all_panels(Application_Links *app, View_ID view_id, Access_Flag access){ if (!get_view_next(app, view_id, access, &view_id)){ - if (!get_view_first(app, access, &view_id)){ + if (!get_view_next(app, 0, access, &view_id)){ view_id = 0; } } diff --git a/4ed.cpp b/4ed.cpp index 2d99d641..1769233e 100644 --- a/4ed.cpp +++ b/4ed.cpp @@ -1453,13 +1453,14 @@ App_Step_Sig(app_step){ animation_dt = literal_dt; } + Frame_Info frame = {}; + frame.index = models->frame_counter; + frame.literal_dt = literal_dt; + frame.animation_dt = animation_dt; + { Color_Table color_table = models->fallback_color_table; if (models->modify_color_table != 0){ - Frame_Info frame = {}; - frame.index = models->frame_counter; - frame.literal_dt = literal_dt; - frame.animation_dt = animation_dt; color_table = models->modify_color_table(&models->app_links, frame); if (color_table.count < models->fallback_color_table.count){ block_copy(models->fallback_color_table.vals, color_table.vals, color_table.count*sizeof(*color_table.vals)); @@ -1470,7 +1471,13 @@ App_Step_Sig(app_step){ } begin_render_section(target, system, models->frame_counter, literal_dt, animation_dt); + models->in_render_mode = true; + if (models->render_caller != 0){ + models->render_caller(&models->app_links, frame); + } + +#if 0 Panel *active_panel = layout_get_active_panel(layout); View *active_view = active_panel->view; @@ -1510,7 +1517,9 @@ App_Step_Sig(app_step){ draw_rectangle(target, i32R( full.x0, inner.y0, inner.x0, inner.y1), margin_color); draw_rectangle(target, i32R(inner.x1, inner.y0, full.x1, inner.y1), margin_color); } +#endif + models->in_render_mode = false; end_render_section(target, system); } diff --git a/4ed_api_implementation.cpp b/4ed_api_implementation.cpp index 48f87b03..3eb82ea9 100644 --- a/4ed_api_implementation.cpp +++ b/4ed_api_implementation.cpp @@ -16,35 +16,6 @@ access_test(u32 lock_flags, u32 access_flags){ return((lock_flags & ~access_flags) == 0); } -internal void -fill_buffer_summary(Buffer_Summary *buffer, Editing_File *file, Working_Set *working_set){ - block_zero_struct(buffer); - if (!file->is_dummy){ - buffer->exists = 1; - buffer->ready = file_is_ready(file); - - buffer->buffer_id = file->id.id; - buffer->size = buffer_size(&file->state.buffer); - buffer->line_count = file->state.buffer.line_count; - - buffer->file_name_len = file->canon.name.size; - buffer->file_name = file->canon.name.str; - - buffer->buffer_name_len = file->unique_name.name.size; - buffer->buffer_name = file->unique_name.name.str; - - buffer->dirty = file->state.dirty; - - buffer->is_lexed = file->settings.tokens_exist; - - buffer->tokens_are_ready = file_tokens_are_ready(file); - buffer->map_id = file->settings.base_map_id; - buffer->unwrapped_lines = file->settings.unwrapped_lines; - - buffer->lock_flags = file_get_access_flags(file); - } -} - internal void fill_view_summary(System_Functions *system, View_Summary *view, View *vptr, Live_Views *live_set, Working_Set *working_set){ block_zero_struct(view); @@ -691,12 +662,16 @@ DOC_SEE(get_buffer_first) *buffer_id_out = file->id.id; result = true; } + else{ + *buffer_id_out = 0; + } return(result); } +#if 0 // TODO(allen): redocument API_EXPORT b32 -Get_Buffer_Summary(Application_Links *app, Buffer_ID buffer_id, Access_Flag access, Buffer_Summary *buffer_summary_out) +//Get_Buffer_Summary(Application_Links *app, Buffer_ID buffer_id, Access_Flag access, Buffer_Summary *buffer_summary_out) /* DOC_PARAM(buffer_id, The parameter buffer_id specifies which buffer to try to get.) DOC_PARAM(access, The access parameter determines what levels of protection this call can access.) @@ -715,6 +690,7 @@ DOC_SEE(Buffer_ID) } return(result); } +#endif // TODO(allen): redocument API_EXPORT b32 @@ -1872,36 +1848,6 @@ get_view_prev__inner(Layout *layout, View *view){ return(view); } -// TODO(allen): replace this with get_view_next(app, 0, access, view_id_out); -// TODO(allen): redocument -API_EXPORT b32 -Get_View_First(Application_Links *app, Access_Flag access, View_ID *view_id_out) -/* -DOC_PARAM(access, The access parameter determines what levels of protection this call can access.) -DOC_RETURN(This call returns the summary of the first view in a view loop.) -DOC( -This call begins a loop across all the open views. - -If the View_Summary returned is a null summary, the loop is finished. -Views should not be closed or opened durring a view loop. -) -DOC_SEE(Access_Flag) -DOC_SEE(get_view_next) -*/{ - Models *models = (Models*)app->cmd_context; - Layout *layout = &models->layout; - View *view = get_view_next__inner(layout, 0); - for (;view != 0 && !access_test(view_get_access_flags(view), access);){ - view = get_view_next__inner(layout, view); - } - b32 result = false; - if (view != 0){ - *view_id_out = view_get_id(&models->live_set, view); - result = true; - } - return(result); -} - // TODO(allen): redocument API_EXPORT b32 Get_View_Next(Application_Links *app, View_ID view_id, Access_Flag access, View_ID *view_id_out) @@ -1930,6 +1876,9 @@ DOC_SEE(get_view_first) *view_id_out = view_get_id(&models->live_set, view); result = true; } + else{ + *view_id_out = 0; + } return(result); } @@ -2009,6 +1958,21 @@ Get_Active_Panel(Application_Links *app, Panel_ID *panel_id_out){ return(result); } +API_EXPORT b32 +View_Get_Buffer(Application_Links *app, View_ID view_id, Access_Flag access, Buffer_ID *buffer_id_out){ + Models *models = (Models*)app->cmd_context; + View *view = imp_get_view(models, view_id); + b32 result = false; + if (view_api_check_view(view)){ + Editing_File *file = view->file; + if (buffer_api_check_file(file, access)){ + *buffer_id_out = file->id.id; + result = true; + } + } + return(result); +} + API_EXPORT b32 View_Get_Panel(Application_Links *app, View_ID view_id, Panel_ID *panel_id_out){ Models *models = (Models*)app->cmd_context; @@ -2238,13 +2202,25 @@ in the system, the call will fail.) return(result); } +API_EXPORT b32 +View_Get_Region(Application_Links *app, View_ID view_id, Rect_i32 *region_out){ + Models *models = (Models*)app->cmd_context; + View *view = imp_get_view(models, view_id); + b32 result = false; + if (view_api_check_view(view)){ + *region_out = view->panel->rect_full; + result = true; + } + return(result); +} + API_EXPORT b32 View_Get_Buffer_Region(Application_Links *app, View_ID view_id, Rect_i32 *region_out){ Models *models = (Models*)app->cmd_context; View *view = imp_get_view(models, view_id); b32 result = false; if (view_api_check_view(view)){ - *region_out = view_get_file_region(models, view); + *region_out = view_get_buffer_rect(models, view); result = true; } return(result); @@ -4454,16 +4430,39 @@ DOC(Returns a microsecond resolution timestamp.) } internal Vec2 -draw_helper__view_space_to_screen_space(Models *models, Vec2 point){ - i32_Rect region = models->render_view_rect; +models_get_coordinate_center(Models *models){ + Vec2 result = {}; + if (models->coordinate_center_stack_top > 0){ + result = models->coordinate_center_stack[models->coordinate_center_stack_top - 1]; + } + return(result); +} + +internal Vec2 +draw_helper__models_space_to_screen_space(Models *models, Vec2 point){ + Vec2 c = models_get_coordinate_center(models); + return(point + c); +} + +internal f32_Rect +draw_helper__models_space_to_screen_space(Models *models, f32_Rect rect){ + Vec2 c = models_get_coordinate_center(models); + rect.p0 += c; + rect.p1 += c; + return(rect); +} + +internal Vec2 +draw_helper__view_space_to_screen_space(View *view, Vec2 point){ + i32_Rect region = view->render.view_rect; point.x += (f32)region.x0; point.y += (f32)region.y0; return(point); } internal f32_Rect -draw_helper__view_space_to_screen_space(Models *models, f32_Rect rect){ - i32_Rect region = models->render_view_rect; +draw_helper__view_space_to_screen_space(View *view, f32_Rect rect){ + i32_Rect region = view->render.view_rect; f32 x_corner = (f32)region.x0; f32 y_corner = (f32)region.y0; rect.x0 += x_corner; @@ -4474,16 +4473,16 @@ draw_helper__view_space_to_screen_space(Models *models, f32_Rect rect){ } internal Vec2 -draw_helper__screen_space_to_view_space(Models *models, Vec2 point){ - i32_Rect region = models->render_view_rect; +draw_helper__screen_space_to_view_space(View *view, Vec2 point){ + i32_Rect region = view->render.view_rect; point.x -= (f32)region.x0; point.y -= (f32)region.y0; return(point); } internal f32_Rect -draw_helper__screen_space_to_view_space(Models *models, f32_Rect rect){ - i32_Rect region = models->render_view_rect; +draw_helper__screen_space_to_view_space(View *view, f32_Rect rect){ + i32_Rect region = view->render.view_rect; f32 x_corner = (f32)region.x0; f32 y_corner = (f32)region.y0; rect.x0 -= x_corner; @@ -4502,13 +4501,13 @@ Draw_String(Application_Links *app, Face_ID font_id, String str, Vec2 point, int { Vec2 result = point; Models *models = (Models*)app->cmd_context; - if (models->render_view == 0){ + if (models->target == 0){ f32 width = font_string_width(models->system, models->target, font_id, str); result += delta*width; } else{ Color_Table color_table = models->color_table; - point = draw_helper__view_space_to_screen_space(models, point); + point = draw_helper__models_space_to_screen_space(models, point); u32 actual_color = finalize_color(color_table, color); f32 width = draw_string(models->system, models->target, font_id, str, point, actual_color, flags, delta); result += delta*width; @@ -4524,11 +4523,11 @@ Get_String_Advance(Application_Links *app, Face_ID font_id, String str) } API_EXPORT void -Draw_Rectangle(Application_Links *app, f32_Rect rect, int_color color){ +Draw_Rectangle(Application_Links *app, Rect_f32 rect, int_color color){ Models *models = (Models*)app->cmd_context; - if (models->render_view != 0){ + if (models->in_render_mode){ Color_Table color_table = models->color_table; - rect = draw_helper__view_space_to_screen_space(models, rect); + rect = draw_helper__models_space_to_screen_space(models, rect); u32 actual_color = finalize_color(color_table, color); draw_rectangle(models->target, rect, actual_color); } @@ -4538,13 +4537,9 @@ API_EXPORT void Draw_Rectangle_Outline(Application_Links *app, f32_Rect rect, int_color color) { Models *models = (Models*)app->cmd_context; - if (models->render_view != 0){ + if (models->in_render_mode){ Color_Table color_table = models->color_table; - //Style *style = &models->styles.styles[0]; - //Theme *theme_data = &style->theme; - - rect = draw_helper__view_space_to_screen_space(models, rect); - + rect = draw_helper__models_space_to_screen_space(models, rect); u32 actual_color = finalize_color(color_table, color); draw_rectangle_outline(models->target, rect, actual_color); } @@ -4553,7 +4548,7 @@ Draw_Rectangle_Outline(Application_Links *app, f32_Rect rect, int_color color) API_EXPORT void Draw_Clip_Push(Application_Links *app, f32_Rect clip_box){ Models *models = (Models*)app->cmd_context; - clip_box = draw_helper__view_space_to_screen_space(models, clip_box); + clip_box = draw_helper__models_space_to_screen_space(models, clip_box); render_push_clip(models->target, i32R(clip_box)); } @@ -4561,7 +4556,27 @@ API_EXPORT f32_Rect Draw_Clip_Pop(Application_Links *app){ Models *models = (Models*)app->cmd_context; f32_Rect result = f32R(render_pop_clip(models->target)); - result = draw_helper__screen_space_to_view_space(models, result); + return(result); +} + +API_EXPORT void +Draw_Coordinate_Center_Push(Application_Links *app, Vec2 point){ + Models *models = (Models*)app->cmd_context; + if (models->coordinate_center_stack_top < ArrayCount(models->coordinate_center_stack)){ + point = draw_helper__models_space_to_screen_space(models, point); + models->coordinate_center_stack[models->coordinate_center_stack_top] = point; + models->coordinate_center_stack_top += 1; + } +} + +API_EXPORT Vec2 +Draw_Coordinate_Center_Pop(Application_Links *app){ + Models *models = (Models*)app->cmd_context; + Vec2 result = {}; + if (models->coordinate_center_stack_top > 0){ + models->coordinate_center_stack_top -= 1; + result = models->coordinate_center_stack[models->coordinate_center_stack_top]; + } return(result); } @@ -4576,11 +4591,142 @@ Get_Default_Font_For_View(Application_Links *app, View_ID view_id) return(face_id); } +API_EXPORT b32 +Compute_Render_Layout(Application_Links *app, View_ID view_id, Buffer_ID buffer_id, Rect_i32 rect, Range *on_screen_range_out){ + Models *models = (Models*)app->cmd_context; + System_Functions *system = models->system; + View *view = imp_get_view(models, view_id); + Editing_File *file = imp_get_file(models, buffer_id); + b32 result = false; + if (view_api_check_view(view) && buffer_api_check_file(file)){ + i32 line_height = view->line_height; + f32 max_x = (f32)file->settings.display_width; + i32 max_y = rect.y1 - rect.y0 + line_height; + + f32 left_side_space = 0; + + // TODO(allen): Don't force me to over-allocate! Write a looser buffer render thingy, + // or just stop doing that nonsense all together. + f32 screen_width = (f32)rect_width(rect); + f32 screen_height = (f32)rect_height(rect); + f32 smallest_char_width = 6.f; + f32 smallest_char_height = 8.f; + i32 max = (i32)(screen_width*screen_height/(smallest_char_width*smallest_char_height))*2; + if (view->layout_arena.app == 0){ + view->layout_arena = make_arena(app); + } + else{ + arena_release_all(&view->layout_arena); + } + Buffer_Render_Item *items = push_array(&view->layout_arena, Buffer_Render_Item, max); + + b32 wrapped = !file->settings.unwrapped_lines; + Face_ID font_id = file->settings.font_id; + Font_Pointers font = system->font.get_pointers_by_id(font_id); + + File_Edit_Positions edit_pos = view_get_edit_pos(view); + f32 scroll_x = edit_pos.scroll.scroll_x; + f32 scroll_y = edit_pos.scroll.scroll_y; + + Full_Cursor render_cursor = view_get_render_cursor(system, view); + + i32 item_count = 0; + i32 end_pos = 0; + { + Buffer_Render_Params params; + params.buffer = &file->state.buffer; + params.items = items; + params.max = max; + params.count = &item_count; + params.port_x = (f32)rect.x0 + left_side_space; + params.port_y = (f32)rect.y0; + params.clip_w = view_width(models, view) - left_side_space; + params.scroll_x = scroll_x; + params.scroll_y = scroll_y; + params.width = max_x; + params.height = (f32)max_y; + params.start_cursor = render_cursor; + params.wrapped = wrapped; + params.system = system; + params.font = font; + params.virtual_white = file->settings.virtual_white; + params.wrap_slashes = file->settings.wrap_indicator; + + Buffer_Render_State state = {}; + Buffer_Layout_Stop stop = {}; + + f32 line_shift = 0.f; + b32 do_wrap = false; + i32 wrap_unit_end = 0; + + b32 first_wrap_determination = true; + i32 wrap_array_index = 0; + + do{ + stop = buffer_render_data(&state, params, line_shift, do_wrap, wrap_unit_end); + switch (stop.status){ + case BLStatus_NeedWrapDetermination: + { + if (first_wrap_determination){ + wrap_array_index = binary_search(file->state.wrap_positions, stop.pos, 0, file->state.wrap_position_count); + ++wrap_array_index; + if (file->state.wrap_positions[wrap_array_index] == stop.pos){ + do_wrap = true; + wrap_unit_end = file->state.wrap_positions[wrap_array_index]; + } + else{ + do_wrap = false; + wrap_unit_end = file->state.wrap_positions[wrap_array_index]; + } + first_wrap_determination = false; + } + else{ + Assert(stop.pos == wrap_unit_end); + do_wrap = true; + ++wrap_array_index; + wrap_unit_end = file->state.wrap_positions[wrap_array_index]; + } + }break; + + case BLStatus_NeedWrapLineShift: + case BLStatus_NeedLineShift: + { + line_shift = file->state.line_indents[stop.wrap_line_index]; + }break; + } + }while(stop.status != BLStatus_Finished); + + end_pos = state.i; + } + + Range range = {render_cursor.pos, end_pos}; + + view->render.view_rect = view->panel->rect_inner; + view->render.buffer_rect = rect; + view->render.cursor = render_cursor; + view->render.range = range; + view->render.items = items; + view->render.item_count = item_count; + + *on_screen_range_out = range; + } + return(result); +} + +API_EXPORT void +Draw_Render_Layout(Application_Links *app, View_ID view_id){ + Models *models = (Models*)app->cmd_context; + View *view = imp_get_view(models, view_id); + if (view_api_check_view(view) && models->target != 0){ + render_loaded_file_in_view__inner(models, models->target, view, view->render.buffer_rect, + view->render.cursor, view->render.range, + view->render.items, view->render.item_count); + arena_release_all(&view->layout_arena); + } +} + API_EXPORT void Open_Color_Picker(Application_Links *app, color_picker *picker) -/* -DOC(Opens a color picker using the parameters in the supplied structure.) -*/ { Models *models = (Models*)app->cmd_context; System_Functions *system = models->system; diff --git a/4ed_app_models.h b/4ed_app_models.h index e126ad07..186375fe 100644 --- a/4ed_app_models.h +++ b/4ed_app_models.h @@ -117,8 +117,13 @@ struct Models{ Application_Step_Input *input; Key_Event_Data key; - // Render Context Render_Target *target; + b32 in_render_mode; + // TODO(allen): endless stack? + Vec2 coordinate_center_stack[32]; + i32 coordinate_center_stack_top; + +#if 0 View *render_view; i32_Rect render_view_rect; i32_Rect render_buffer_rect; @@ -126,6 +131,7 @@ struct Models{ Range render_range; Buffer_Render_Item *render_items; i32 render_item_count; +#endif }; //////////////////////////////// diff --git a/4ed_buffer.h b/4ed_buffer.h index 171fa4a9..cb251d51 100644 --- a/4ed_buffer.h +++ b/4ed_buffer.h @@ -167,8 +167,10 @@ struct Buffer_Render_Item{ i32 index; u32 codepoint; u32 flags; - f32 x0, y0; - f32 x1, y1; + f32 x0; + f32 y0; + f32 x1; + f32 y1; }; struct Render_Item_Write{ diff --git a/4ed_view.cpp b/4ed_view.cpp index 3a8ee233..9462e538 100644 --- a/4ed_view.cpp +++ b/4ed_view.cpp @@ -87,7 +87,7 @@ view_set_edit_pos(View *view, File_Edit_Positions edit_pos){ //////////////////////////////// internal Rect_i32 -view_get_file_region(Models *models, View *view){ +view_get_buffer_rect(Models *models, View *view){ Rect_i32 region = {}; if (models->get_view_buffer_region != 0){ Rect_i32 rect = view->panel->rect_inner; @@ -108,12 +108,12 @@ view_get_file_region(Models *models, View *view){ internal i32 view_width(Models *models, View *view){ - return(rect_width(view_get_file_region(models, view))); + return(rect_width(view_get_buffer_rect(models, view))); } internal i32 view_height(Models *models, View *view){ - return(rect_height(view_get_file_region(models, view))); + return(rect_height(view_get_buffer_rect(models, view))); } internal Vec2_i32 @@ -1195,6 +1195,7 @@ render_loaded_file_in_view__inner(Models *models, Render_Target *target, View *v } } +#if 0 internal void dont_do_core_render(Application_Links *app){} @@ -1212,6 +1213,7 @@ do_core_render(Application_Links *app){ render_loaded_file_in_view__inner(models, target, view, rect, render_cursor, on_screen_range, items, item_count); draw_pop_clip(target); } +#endif internal Full_Cursor view_get_render_cursor(System_Functions *system, View *view, f32 scroll_y){ @@ -1242,6 +1244,7 @@ view_get_render_cursor_target(System_Functions *system, View *view){ return(view_get_render_cursor(system, view, scroll_y)); } +#if 0 internal void view_call_render_caller(Models *models, Render_Target *target, View *view, i32_Rect rect, Full_Cursor render_cursor, Range on_screen_range, Buffer_Render_Item *items, i32 item_count, Render_Callback *core_render){ @@ -1255,136 +1258,22 @@ view_call_render_caller(Models *models, Render_Target *target, View *view, models->render_items = items; models->render_item_count = item_count; + Frame_Info frame = {}; + frame.index = target->frame_index; + frame.literal_dt = target->literal_dt; + frame.animation_dt = target->animation_dt; +#if 0 Render_Parameters params = {}; params.view_id = view_id; params.on_screen_range = on_screen_range; - params.frame.index = target->frame_index; - params.frame.literal_dt = target->literal_dt; - params.frame.animation_dt = target->animation_dt; params.buffer_region = rect; params.do_core_render = core_render; - models->render_caller(&models->app_links, params); +#endif + models->render_caller(&models->app_links, frame); models->render_view = 0; } } - -internal void -render_loaded_file_in_view(System_Functions *system, View *view, Models *models, i32_Rect rect, b32 is_active, Render_Target *target){ - Editing_File *file = view->file; - i32 line_height = view->line_height; - - f32 max_x = (f32)file->settings.display_width; - i32 max_y = rect.y1 - rect.y0 + line_height; - - Assert(file != 0); - Assert(!file->is_dummy); - Assert(buffer_good(&file->state.buffer)); - - Partition *part = &models->mem.part; - Temp_Memory temp = begin_temp_memory(part); - - push_align(part, 4); - - f32 left_side_space = 0; - - i32 max = part_remaining(part)/sizeof(Buffer_Render_Item); - Buffer_Render_Item *items = push_array(part, Buffer_Render_Item, 0); - - b32 wrapped = !file->settings.unwrapped_lines; - Face_ID font_id = file->settings.font_id; - Font_Pointers font = system->font.get_pointers_by_id(font_id); - - File_Edit_Positions edit_pos = view_get_edit_pos(view); - f32 scroll_x = edit_pos.scroll.scroll_x; - f32 scroll_y = edit_pos.scroll.scroll_y; - - Full_Cursor render_cursor = view_get_render_cursor(system, view); - - i32 item_count = 0; - i32 end_pos = 0; - { - Buffer_Render_Params params; - params.buffer = &file->state.buffer; - params.items = items; - params.max = max; - params.count = &item_count; - params.port_x = (f32)rect.x0 + left_side_space; - params.port_y = (f32)rect.y0; - params.clip_w = view_width(models, view) - left_side_space; - params.scroll_x = scroll_x; - params.scroll_y = scroll_y; - params.width = max_x; - params.height = (f32)max_y; - params.start_cursor = render_cursor; - params.wrapped = wrapped; - params.system = system; - params.font = font; - params.virtual_white = file->settings.virtual_white; - params.wrap_slashes = file->settings.wrap_indicator; - - Buffer_Render_State state = {}; - Buffer_Layout_Stop stop = {}; - - f32 line_shift = 0.f; - b32 do_wrap = false; - i32 wrap_unit_end = 0; - - b32 first_wrap_determination = true; - i32 wrap_array_index = 0; - - do{ - stop = buffer_render_data(&state, params, line_shift, do_wrap, wrap_unit_end); - switch (stop.status){ - case BLStatus_NeedWrapDetermination: - { - if (first_wrap_determination){ - wrap_array_index = binary_search(file->state.wrap_positions, stop.pos, 0, file->state.wrap_position_count); - ++wrap_array_index; - if (file->state.wrap_positions[wrap_array_index] == stop.pos){ - do_wrap = true; - wrap_unit_end = file->state.wrap_positions[wrap_array_index]; - } - else{ - do_wrap = false; - wrap_unit_end = file->state.wrap_positions[wrap_array_index]; - } - first_wrap_determination = false; - } - else{ - Assert(stop.pos == wrap_unit_end); - do_wrap = true; - ++wrap_array_index; - wrap_unit_end = file->state.wrap_positions[wrap_array_index]; - } - }break; - - case BLStatus_NeedWrapLineShift: - case BLStatus_NeedLineShift: - { - line_shift = file->state.line_indents[stop.wrap_line_index]; - }break; - } - }while(stop.status != BLStatus_Finished); - - end_pos = state.i; - } - push_array(part, Buffer_Render_Item, item_count); - - Range on_screen_range = {}; - on_screen_range.first = render_cursor.pos; - on_screen_range.one_past_last = end_pos; - - //////////////////////////////// - - if (models->render_caller != 0){ - view_call_render_caller(models, target, view, rect, render_cursor, on_screen_range, items, item_count, do_core_render); - } - else{ - render_loaded_file_in_view__inner(models, target, view, rect, render_cursor, on_screen_range, items, item_count); - } - - end_temp_memory(temp); -} +#endif // BOTTOM diff --git a/4ed_view.h b/4ed_view.h index b2837e92..43f97a6f 100644 --- a/4ed_view.h +++ b/4ed_view.h @@ -46,6 +46,19 @@ struct View{ i32 line_height; Query_Set query_set; + + // Render Context + Arena layout_arena; + + struct{ + i32_Rect view_rect; + i32_Rect buffer_rect; + Full_Cursor cursor; + Range range; + Buffer_Render_Item *items; + i32 item_count; + } render; + #if 0 f32 widget_height; #endif diff --git a/4ed_view_ui.cpp b/4ed_view_ui.cpp index 18daa5cf..2ab6002d 100644 --- a/4ed_view_ui.cpp +++ b/4ed_view_ui.cpp @@ -38,6 +38,7 @@ do_step_file_view(System_Functions *system, Models *models, View *view, i32_Rect //////////////////////////////// +#if 0 internal void do_render_file_view(System_Functions *system, View *view, Models *models, GUI_Scroll_Vars *scroll, View *active, i32_Rect rect, b32 is_active, Render_Target *target){ Editing_File *file = view->file; @@ -45,17 +46,135 @@ do_render_file_view(System_Functions *system, View *view, Models *models, GUI_Sc draw_push_clip(target, rect); if (!view->ui_mode){ if (file_is_ready(file)){ - Rect_i32 file_region = view_get_file_region(models, view); - render_loaded_file_in_view(system, view, models, file_region, is_active, target); + Rect_i32 buffer_rect = view_get_buffer_rect(models, view); + //render_loaded_file_in_view(system, view, models, buffer_rect, is_active, target); + + Editing_File *file = view->file; + i32 line_height = view->line_height; + + f32 max_x = (f32)file->settings.display_width; + i32 max_y = buffer_rect.y1 - buffer_rect.y0 + line_height; + + Assert(file != 0); + Assert(!file->is_dummy); + Assert(buffer_good(&file->state.buffer)); + + Partition *part = &models->mem.part; + Temp_Memory temp = begin_temp_memory(part); + + push_align(part, 4); + + f32 left_side_space = 0; + + i32 max = part_remaining(part)/sizeof(Buffer_Render_Item); + Buffer_Render_Item *items = push_array(part, Buffer_Render_Item, 0); + + b32 wrapped = !file->settings.unwrapped_lines; + Face_ID font_id = file->settings.font_id; + Font_Pointers font = system->font.get_pointers_by_id(font_id); + + File_Edit_Positions edit_pos = view_get_edit_pos(view); + f32 scroll_x = edit_pos.scroll.scroll_x; + f32 scroll_y = edit_pos.scroll.scroll_y; + + Full_Cursor render_cursor = view_get_render_cursor(system, view); + + i32 item_count = 0; + i32 end_pos = 0; + { + Buffer_Render_Params params; + params.buffer = &file->state.buffer; + params.items = items; + params.max = max; + params.count = &item_count; + params.port_x = (f32)buffer_rect.x0 + left_side_space; + params.port_y = (f32)buffer_rect.y0; + params.clip_w = view_width(models, view) - left_side_space; + params.scroll_x = scroll_x; + params.scroll_y = scroll_y; + params.width = max_x; + params.height = (f32)max_y; + params.start_cursor = render_cursor; + params.wrapped = wrapped; + params.system = system; + params.font = font; + params.virtual_white = file->settings.virtual_white; + params.wrap_slashes = file->settings.wrap_indicator; + + Buffer_Render_State state = {}; + Buffer_Layout_Stop stop = {}; + + f32 line_shift = 0.f; + b32 do_wrap = false; + i32 wrap_unit_end = 0; + + b32 first_wrap_determination = true; + i32 wrap_array_index = 0; + + do{ + stop = buffer_render_data(&state, params, line_shift, do_wrap, wrap_unit_end); + switch (stop.status){ + case BLStatus_NeedWrapDetermination: + { + if (first_wrap_determination){ + wrap_array_index = binary_search(file->state.wrap_positions, stop.pos, 0, file->state.wrap_position_count); + ++wrap_array_index; + if (file->state.wrap_positions[wrap_array_index] == stop.pos){ + do_wrap = true; + wrap_unit_end = file->state.wrap_positions[wrap_array_index]; + } + else{ + do_wrap = false; + wrap_unit_end = file->state.wrap_positions[wrap_array_index]; + } + first_wrap_determination = false; + } + else{ + Assert(stop.pos == wrap_unit_end); + do_wrap = true; + ++wrap_array_index; + wrap_unit_end = file->state.wrap_positions[wrap_array_index]; + } + }break; + + case BLStatus_NeedWrapLineShift: + case BLStatus_NeedLineShift: + { + line_shift = file->state.line_indents[stop.wrap_line_index]; + }break; + } + }while(stop.status != BLStatus_Finished); + + end_pos = state.i; + } + push_array(part, Buffer_Render_Item, item_count); + + Range on_screen_range = {}; + on_screen_range.first = render_cursor.pos; + on_screen_range.one_past_last = end_pos; + + //////////////////////////////// + + if (models->render_caller != 0){ + view_call_render_caller(models, target, view, buffer_rect, render_cursor, on_screen_range, items, item_count, do_core_render); + } + else{ + render_loaded_file_in_view__inner(models, target, view, buffer_rect, render_cursor, on_screen_range, items, item_count); + } + + end_temp_memory(temp); } } else{ Full_Cursor render_cursor = {}; Range on_screen_range = {}; - view_call_render_caller(models, target, view, rect, render_cursor, on_screen_range, 0, 0, dont_do_core_render); + if (models->render_caller != 0){ + view_call_render_caller(models, target, view, buffer_rect, render_cursor, on_screen_range, 0, 0, dont_do_core_render); + } } draw_pop_clip(target); } +#endif // BOTTOM