New text coloring system setup

This commit is contained in:
Allen Webster 2019-07-31 20:16:53 -07:00
parent 2e0992fdd3
commit 1f81120343
6 changed files with 36 additions and 12 deletions

View File

@ -557,7 +557,7 @@ default_buffer_render_caller(Application_Links *app, Frame_Info frame_info, View
{
if (is_active_view){
draw_character_block(app, text_layout_id, cursor_pos, Stag_Cursor);
paint_text_color(app, text_layout_id, make_range_i64(cursor_pos), Stag_At_Cursor);
paint_text_color(app, text_layout_id, cursor_pos, Stag_At_Cursor);
draw_character_wire_frame(app, text_layout_id, mark_pos, Stag_Mark);
}
else{
@ -596,7 +596,7 @@ default_buffer_render_caller(Application_Links *app, Frame_Info frame_info, View
}
draw_enclosures(app, text_layout_id, buffer,
cursor_pos, FindScope_Paren, RangeHighlightKind_CharacterHighlight,
colors, 0, color_count);
0, colors, color_count);
}
draw_clip_push(app, buffer_rect);

View File

@ -3908,7 +3908,18 @@ Text_Layout_Character_On_Screen(Application_Links *app, Text_Layout_ID layout_id
API_EXPORT void
Paint_Text_Color(Application_Links *app, Text_Layout_ID layout_id, Range_i64 range, int_color color){
//NotImplemented;
Models *models = (Models*)app->cmd_context;
Text_Layout layout = {};
Rect_f32 result = {};
if (text_layout_get(&models->text_layouts, layout_id, &layout)){
range.min = clamp_bot(layout.on_screen_range.min, range.min);
range.max = clamp_top(range.max, layout.on_screen_range.max);
range.min -= layout.on_screen_range.min;
range.max -= layout.on_screen_range.min;
for (i64 i = range.min; i < range.max; i += 1){
layout.item_colors[i] = color;
}
}
}
API_EXPORT b32
@ -4030,12 +4041,14 @@ Compute_Render_Layout(Application_Links *app, View_ID view_id, Buffer_ID buffer_
Range range = Ii32((i32)render_cursor.pos, (i32)end_pos);
// TODO(allen):
int_color *item_colors = push_array_zero(&view->layout_arena, int_color, range.max - range.min);
view->render.view_rect = view->panel->rect_inner;
view->render.buffer_rect = i32R(f32R(screen_p.x, screen_p.y,
screen_p.x + layout_dim.x, screen_p.y + layout_dim.y));
view->render.cursor = render_cursor;
view->render.range = range;
view->render.items = items;
view->render.item_colors = item_colors;
view->render.item_count = item_count;
f32 height = 0.f;
@ -4048,7 +4061,7 @@ Compute_Render_Layout(Application_Links *app, View_ID view_id, Buffer_ID buffer_
coordinates.on_screen_p0 = screen_p;
coordinates.in_buffer_p0 = in_buffer_p;
coordinates.dim = layout_dim;
result = text_layout_new(&models->mem.heap, &models->text_layouts, buffer_id, buffer_point, range, height, coordinates);
result = text_layout_new(&models->mem.heap, &models->text_layouts, buffer_id, buffer_point, range, height, coordinates, item_colors);
}
return(result);
}
@ -4060,7 +4073,9 @@ Draw_Render_Layout(Application_Links *app, View_ID view_id){
if (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);
view->render.items,
view->render.item_colors,
view->render.item_count);
linalloc_clear(&view->layout_arena);
}
}

View File

@ -29,13 +29,14 @@ text_layout_new__alloc_layout(Text_Layout_Container *container){
}
internal Text_Layout_ID
text_layout_new(Heap *heap, Text_Layout_Container *container, Buffer_ID buffer_id, Buffer_Point point, Range on_screen_range, f32 height, Text_Layout_Coordinates coordinates){
text_layout_new(Heap *heap, Text_Layout_Container *container, Buffer_ID buffer_id, Buffer_Point point, Range on_screen_range, f32 height, Text_Layout_Coordinates coordinates, int_color *item_colors){
Text_Layout *new_layout_data = text_layout_new__alloc_layout(container);
new_layout_data->buffer_id = buffer_id;
new_layout_data->point = point;
new_layout_data->on_screen_range = on_screen_range;
new_layout_data->height = height;
new_layout_data->coordinates = coordinates;
new_layout_data->item_colors = item_colors;
Text_Layout_ID new_id = ++container->id_counter;
insert_u32_Ptr_table(heap, &container->table, new_id, new_layout_data);
return(new_id);

View File

@ -26,6 +26,7 @@ struct Text_Layout{
f32 height;
Text_Layout_Coordinates coordinates;
int_color *item_colors;
};
union Text_Layout_Node{

View File

@ -790,8 +790,8 @@ render__get_brush_from_range_stack(Render_Range_Record *stack, i32 stack_top){
internal void
render_loaded_file_in_view__inner(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){
Rect_i32 rect, Full_Cursor render_cursor, Range on_screen_range,
Buffer_Render_Item *items, int_color *item_colors, i32 item_count){
Editing_File *file = view->file;
Arena *scratch = &models->mem.arena;
Color_Table color_table = models->color_table;
@ -929,7 +929,7 @@ render_loaded_file_in_view__inner(Models *models, Render_Target *target, View *v
i32 prev_ind = -1;
u32 highlight_color = 0;
for (; item < item_end; ++item){
for (i32 i = 0; item < item_end; item += 1, i += 1){
i32 ind = item->index;
// NOTE(allen): Line scanning
@ -998,10 +998,16 @@ render_loaded_file_in_view__inner(Models *models, Render_Target *target, View *v
Rect_f32 char_rect = f32R(item->x0, item->y0, item->x1, item->y1);
u32 char_color = main_color;
if (item->flags & BRFlag_Special_Character){
if (on_screen_range.min <= ind && ind < on_screen_range.max){
i32 index_shifted = ind - on_screen_range.min;
if (item_colors[index_shifted] != 0){
char_color = finalize_color(color_table, item_colors[index_shifted]);
}
}
if (HasFlag(item->flags, BRFlag_Special_Character)){
char_color = special_color;
}
else if (item->flags & BRFlag_Ghost_Character){
else if (HasFlag(item->flags, BRFlag_Ghost_Character)){
char_color = ghost_color;
}

View File

@ -52,6 +52,7 @@ struct View{
Full_Cursor cursor;
Range range;
Buffer_Render_Item *items;
int_color *item_colors;
i32 item_count;
} render;
};