From 5b9a29e215cfea34832fa8c40605e86b89979d0d Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sun, 3 Nov 2019 16:03:23 -0800 Subject: [PATCH] Cleaning up layout types --- 4ed_api_implementation.cpp | 7 +-- 4ed_buffer.cpp | 94 +++++++++++++++++------------------ 4ed_text_layout.cpp | 2 +- custom/4coder_code_index.cpp | 14 +++--- custom/4coder_layout_rule.cpp | 29 +++++------ custom/4coder_types.h | 10 ++-- 6 files changed, 75 insertions(+), 81 deletions(-) diff --git a/4ed_api_implementation.cpp b/4ed_api_implementation.cpp index 28616ed9..527c62ce 100644 --- a/4ed_api_implementation.cpp +++ b/4ed_api_implementation.cpp @@ -2938,14 +2938,15 @@ text_layout_character_on_screen(Application_Links *app, Text_Layout_ID layout_id for (Layout_Item_Block *block = line.first; block != 0; block = block->next){ + i64 count = block->item_count; Layout_Item *item_ptr = block->items; - i64 count = block->count; for (i32 i = 0; i < count; i += 1, item_ptr += 1){ + if (HasFlag(item_ptr->flags, LayoutItemFlag_Ghost_Character)){ + continue; + } i64 index = item_ptr->index; if (index == pos){ - if (!HasFlag(item_ptr->flags, LayoutItemFlag_Ghost_Character)){ result = rect_union(result, item_ptr->rect); - } } else if (index > pos){ break; diff --git a/4ed_buffer.cpp b/4ed_buffer.cpp index b76cb3e7..9a75169a 100644 --- a/4ed_buffer.cpp +++ b/4ed_buffer.cpp @@ -872,7 +872,7 @@ buffer_layout_nearest_pos_to_xy(Layout_Item_List list, Vec2_f32 p){ for (Layout_Item_Block *block = list.first; block != 0; block = block->next){ - i64 count = block->count; + i64 count = block->item_count; Layout_Item *item = block->items; for (i32 i = 0; i < count; i += 1, item += 1){ if (HasFlag(item->flags, LayoutItemFlag_Ghost_Character)){ @@ -910,7 +910,7 @@ buffer_layout_nearest_pos_to_xy(Layout_Item_List list, Vec2_f32 p){ for (Layout_Item_Block *block = list.first; block != 0; block = block->next){ - i64 count = block->count; + i64 count = block->item_count; Layout_Item *item = block->items; for (i32 i = 0; i < count; i += 1, item += 1){ if (HasFlag(item->flags, LayoutItemFlag_Ghost_Character)){ @@ -939,7 +939,7 @@ buffer_layout_nearest_pos_to_xy(Layout_Item_List list, Vec2_f32 p){ for (Layout_Item_Block *block = list.first; block != 0; block = block->next){ - i64 count = block->count; + i64 count = block->item_count; Layout_Item *item = block->items; for (i32 i = 0; i < count; i += 1, item += 1){ if (HasFlag(item->flags, LayoutItemFlag_Ghost_Character)){ @@ -971,48 +971,6 @@ buffer_layout_nearest_pos_to_xy(Layout_Item_List list, Vec2_f32 p){ return(closest_match); } -internal i64 -buffer_layout_get_pos_at_character(Layout_Item_List list, i64 character){ - i64 result = 0; - if (character <= 0){ - result = list.manifested_index_range.min; - } - else if (character >= list.character_count){ - result = list.manifested_index_range.max; - } - else{ - i64 counter = 0; - for (Layout_Item_Block *node = list.first; - node != 0; - node = node->next){ - i64 next_counter = counter + node->character_count; - if (character < next_counter){ - i64 count = node->count; - i64 relative_character = character - counter; - i64 relative_character_counter = 0; - i64 prev_index = -1; - Layout_Item *item = node->items; - for (i64 i = 0; i < count; i += 1, item += 1){ - if (HasFlag(item->flags, LayoutItemFlag_Ghost_Character)){ - continue; - } - if (prev_index != item->index){ - prev_index = item->index; - if (relative_character_counter == relative_character){ - result = prev_index; - break; - } - relative_character_counter += 1; - } - } - break; - } - counter = next_counter; - } - } - return(result); -} - internal Layout_Item* buffer_layout_get_first_with_index(Layout_Item_List list, i64 index){ Layout_Item *result = 0; @@ -1020,7 +978,7 @@ buffer_layout_get_first_with_index(Layout_Item_List list, i64 index){ for (Layout_Item_Block *block = list.first; block != 0; block = block->next){ - i64 count = block->count; + i64 count = block->item_count; Layout_Item *item = block->items; for (i32 i = 0; i < count; i += 1, item += 1){ if (HasFlag(item->flags, LayoutItemFlag_Ghost_Character)){ @@ -1054,6 +1012,48 @@ buffer_layout_box_of_pos(Layout_Item_List list, i64 index){ return(result); } +internal i64 +buffer_layout_get_pos_at_character(Layout_Item_List list, i64 character){ + i64 result = 0; + if (character <= 0){ + result = list.manifested_index_range.min; + } + else if (character >= list.character_count){ + result = list.manifested_index_range.max; + } + else{ + i64 counter = 0; + i64 next_counter = 0; + for (Layout_Item_Block *node = list.first; + node != 0; + node = node->next, counter = next_counter){ + next_counter = counter + node->character_count; + if (character >= next_counter){ + continue; + } + + i64 count = node->item_count; + i64 relative_character = character - counter; + i64 relative_character_counter = 0; + + Layout_Item *item = node->items; + for (i64 i = 0; i < count; i += 1, item += 1){ + if (HasFlag(item->flags, LayoutItemFlag_Ghost_Character)){ + continue; + } + if (relative_character_counter == relative_character){ + result = item->index; + break; + } + relative_character_counter += 1; + } + + break; + } + } + return(result); +} + internal i64 buffer_layout_character_from_pos(Layout_Item_List list, i64 index){ i64 result = 0; @@ -1069,7 +1069,7 @@ buffer_layout_character_from_pos(Layout_Item_List list, i64 index){ node != 0; node = node->next){ Layout_Item *item = node->items; - i64 count = node->count; + i64 count = node->item_count; for (i64 i = 0; i < count; i += 1, item += 1){ if (item->index >= index){ goto double_break; diff --git a/4ed_text_layout.cpp b/4ed_text_layout.cpp index d937e6f1..41c8889a 100644 --- a/4ed_text_layout.cpp +++ b/4ed_text_layout.cpp @@ -107,7 +107,7 @@ text_layout_render(Thread_Context *tctx, Models *models, Text_Layout *layout){ block != 0; block = block->next){ Layout_Item *item = block->items; - i64 count = block->count; + i64 count = block->item_count; FColor *item_colors = layout->item_colors; for (i32 i = 0; i < count; i += 1, item += 1){ if (item->codepoint != 0){ diff --git a/custom/4coder_code_index.cpp b/custom/4coder_code_index.cpp index 63c4ecbd..fa81b98c 100644 --- a/custom/4coder_code_index.cpp +++ b/custom/4coder_code_index.cpp @@ -409,6 +409,11 @@ generic_parse_scope(Code_Index_File *index, Generic_Parse_State *state, i64 inde continue; } + if (token->kind == TokenBaseKind_ParentheticalClose){ + generic_parse_inc(state); + continue; + } + { Code_Index_Nest *nest = generic_parse_statement(index, state, indentation); nest->parent = result; @@ -487,12 +492,6 @@ generic_parse_paren(Code_Index_File *index, Generic_Parse_State *state, i64 inde break; } - if (token->kind == TokenBaseKind_Preprocessor){ - Code_Index_Nest *nest = generic_parse_preprocessor(index, state, indentation); - code_index_push_nest(&index->nest_list, nest); - continue; - } - if (token->kind == TokenBaseKind_ScopeOpen){ Code_Index_Nest *nest = generic_parse_scope(index, state, indentation); nest->parent = result; @@ -575,8 +574,7 @@ default_comment_index(Application_Links *app, Arena *arena, Code_Index_File *ind } function void -generic_parse_init(Application_Links *app, Arena *arena, String_Const_u8 contents, Token_Array *tokens, - Generic_Parse_State *state){ +generic_parse_init(Application_Links *app, Arena *arena, String_Const_u8 contents, Token_Array *tokens, Generic_Parse_State *state){ generic_parse_init(app, arena, contents, tokens, default_comment_index, state); } diff --git a/custom/4coder_layout_rule.cpp b/custom/4coder_layout_rule.cpp index 182032dd..053860ec 100644 --- a/custom/4coder_layout_rule.cpp +++ b/custom/4coder_layout_rule.cpp @@ -30,8 +30,8 @@ layout_write(Arena *arena, Layout_Item_List *list, i64 index, u32 codepoint, Lay Layout_Item_Block *block = list->first; if (block != 0){ - if (block->items + block->count == item){ - block->count += 1; + if (block->items + block->item_count == item){ + block->item_count += 1; } else{ block = 0; @@ -44,17 +44,16 @@ layout_write(Arena *arena, Layout_Item_List *list, i64 index, u32 codepoint, Lay sll_queue_push(list->first, list->last, block); list->node_count += 1; block->items = item; - block->count = 1; + block->item_count = 1; } - list->total_count += 1; + list->item_count += 1; - if (index < list->manifested_index_range.min){ - list->manifested_index_range.min = index; - } - if (index > list->manifested_index_range.max){ + list->manifested_index_range.min = min(list->manifested_index_range.min, index); + list->manifested_index_range.max = max(list->manifested_index_range.max, index); + + if (!HasFlag(flags, LayoutItemFlag_Ghost_Character)){ block->character_count += 1; list->character_count += 1; - list->manifested_index_range.max = index; } item->index = index; @@ -186,17 +185,15 @@ lr_tb_write_byte_with_advance(LefRig_TopBot_Layout_Vars *vars, f32 advance, Aren f32 text_y = vars->text_y; Layout_Item_Flag flags = LayoutItemFlag_Special_Character; - - layout_write(arena, list, index, '\\', flags, - Rf32(p, V2f32(next_x, text_y))); + layout_write(arena, list, index, '\\', flags, Rf32(p, V2f32(next_x, text_y))); p.x = next_x; + + flags = LayoutItemFlag_Ghost_Character; next_x += metrics->byte_sub_advances[1]; - layout_write(arena, list, index, integer_symbols[hi], flags, - Rf32(p, V2f32(next_x, text_y))); + layout_write(arena, list, index, integer_symbols[hi], flags, Rf32(p, V2f32(next_x, text_y))); p.x = next_x; next_x += metrics->byte_sub_advances[2]; - layout_write(arena, list, index, integer_symbols[lo], flags, - Rf32(p, V2f32(next_x, text_y))); + layout_write(arena, list, index, integer_symbols[lo], flags, Rf32(p, V2f32(next_x, text_y))); vars->p.x = final_next_x; } diff --git a/custom/4coder_types.h b/custom/4coder_types.h index 00f0bcb8..0889a0f8 100644 --- a/custom/4coder_types.h +++ b/custom/4coder_types.h @@ -618,25 +618,23 @@ struct Layout_Item{ struct Layout_Item_Block{ Layout_Item_Block *next; Layout_Item *items; - i64 count; + i64 item_count; i64 character_count; }; struct Layout_Item_List{ Layout_Item_Block *first; Layout_Item_Block *last; + i64 item_count; + i64 character_count; i32 node_count; - i32 total_count; f32 height; f32 bottom_padding; - i64 character_count; Range_i64 input_index_range; Range_i64 manifested_index_range; }; -typedef Layout_Item_List Layout_Function(Application_Links *app, Arena *arena, - Buffer_ID buffer, Range_i64 range, - Face_ID face, f32 width); +typedef Layout_Item_List Layout_Function(Application_Links *app, Arena *arena, Buffer_ID buffer, Range_i64 range, Face_ID face, f32 width); typedef i64 Command_Map_ID;