now only writing buffer render items if they fall in the clip range of the view.

This commit is contained in:
Allen Webster 2016-09-20 16:02:41 -04:00
parent 1e8bea250e
commit 33407c2258
3 changed files with 957 additions and 966 deletions

View File

@ -4898,6 +4898,7 @@ draw_file_loaded(View *view, i32_Rect rect, b32 is_active, Render_Target *target
Style *style = main_style(models); Style *style = main_style(models);
i32 line_height = view->line_height; i32 line_height = view->line_height;
f32 clip_w = view_width(view);
f32 max_x = view_file_display_width(view); f32 max_x = view_file_display_width(view);
i32 max_y = rect.y1 - rect.y0 + line_height; i32 max_y = rect.y1 - rect.y0 + line_height;
@ -4946,8 +4947,8 @@ draw_file_loaded(View *view, i32_Rect rect, b32 is_active, Render_Target *target
view->edit_pos->scroll_i = render_cursor.pos; view->edit_pos->scroll_i = render_cursor.pos;
buffer_get_render_data(&file->state.buffer, items, max, &count, buffer_get_render_data(&file->state.buffer, items, max, &count,
(f32)rect.x0, (f32)rect.y0, max_x, (f32)max_y, (f32)rect.x0, (f32)rect.y0, clip_w,
scroll_x, scroll_y, scroll_x, scroll_y, max_x, (f32)max_y,
render_cursor, !view->file_data.unwrapped_lines, render_cursor, !view->file_data.unwrapped_lines,
advance_data, (f32)line_height); advance_data, (f32)line_height);
} }

View File

@ -142,6 +142,7 @@
; [] more built in options for auto indenting ; [] more built in options for auto indenting
; ;
; [X] eliminate the need for the lexer state's spare array. ; [X] eliminate the need for the lexer state's spare array.
; [X] fix buffer render item capacity issue
; Arbitrary wrap positions ; Arbitrary wrap positions
; [X] allow for arbitrary wrap positions independent of view width ; [X] allow for arbitrary wrap positions independent of view width

View File

@ -788,34 +788,35 @@ typedef struct Render_Item_Write{
f32 x, y; f32 x, y;
f32 *adv; f32 *adv;
f32 font_height; f32 font_height;
f32 x_min;
f32 x_max;
} Render_Item_Write; } Render_Item_Write;
inline_4tech f32 inline_4tech Render_Item_Write
write_render_item(Buffer_Render_Item *item,
i32 index, u16 glyphid, u16 flags,
f32 x, f32 y, f32 *adv, f32 h){
f32 ch_width = measure_character(adv, (char)glyphid);
item->index = index;
item->glyphid = glyphid;
item->flags = flags;
item->x0 = x;
item->y0 = y;
item->x1 = x + ch_width;
item->y1 = y + h;
return(ch_width);
}
inline_4tech f32
write_render_item(Render_Item_Write write, i32 index, u16 glyphid, u16 flags){ write_render_item(Render_Item_Write write, i32 index, u16 glyphid, u16 flags){
f32 w = write_render_item(write.item, index, glyphid, flags, f32 ch_width = measure_character(write.adv, (char)glyphid);
write.x, write.y, write.adv, write.font_height);
return(w); if (write.x <= write.x_max && write.x + ch_width >= write.x_min){
write.item->index = index;
write.item->glyphid = glyphid;
write.item->flags = flags;
write.item->x0 = write.x;
write.item->y0 = write.y;
write.item->x1 = write.x + ch_width;
write.item->y1 = write.y + write.font_height;
++write.item;
}
write.x += ch_width;
return(write);
} }
internal_4tech void internal_4tech void
buffer_get_render_data(Buffer_Type *buffer, Buffer_Render_Item *items, i32 max, i32 *count, buffer_get_render_data(Buffer_Type *buffer, Buffer_Render_Item *items, i32 max, i32 *count,
f32 port_x, f32 port_y, f32 width, f32 height, f32 port_x, f32 port_y, f32 clip_w,
f32 scroll_x, f32 scroll_y, f32 scroll_x, f32 scroll_y, f32 width, f32 height,
Full_Cursor start_cursor, Full_Cursor start_cursor,
i32 wrapped, f32 *adv, f32 font_height){ i32 wrapped, f32 *adv, f32 font_height){
@ -841,11 +842,9 @@ buffer_get_render_data(Buffer_Type *buffer, Buffer_Render_Item *items, i32 max,
write.y = shift_y; write.y = shift_y;
write.adv = adv; write.adv = adv;
write.font_height = font_height; write.font_height = font_height;
write.x_min = port_x;
write.x_max = port_x + clip_w;
// TODO(allen): What's the plan for when there is not enough space to store
// more render items? It seems like we should be able to use the view_x
// to skip items that are not in view right? That way I think it would
// just always fit in the buffer.
if (adv){ if (adv){
for (loop = buffer_stringify_loop(buffer, start_cursor.pos, size); for (loop = buffer_stringify_loop(buffer, start_cursor.pos, size);
buffer_stringify_good(&loop) && write.item < item_end; buffer_stringify_good(&loop) && write.item < item_end;
@ -869,8 +868,7 @@ buffer_get_render_data(Buffer_Type *buffer, Buffer_Render_Item *items, i32 max,
switch (ch){ switch (ch){
case '\n': case '\n':
if (write.item < item_end){ if (write.item < item_end){
write_render_item(write, i, ' ', 0); write = write_render_item(write, i, ' ', 0);
++write.item;
write.x = shift_x; write.x = shift_x;
write.y += font_height; write.y += font_height;
} }
@ -878,34 +876,29 @@ buffer_get_render_data(Buffer_Type *buffer, Buffer_Render_Item *items, i32 max,
case '\r': case '\r':
if (write.item < item_end){ if (write.item < item_end){
write.x += write_render_item(write, i, '\\', BRFlag_Special_Character); write = write_render_item(write, i, '\\', BRFlag_Special_Character);
++write.item;
if (write.item < item_end){ if (write.item < item_end){
write.x += write_render_item(write, i, 'r', BRFlag_Special_Character); write = write_render_item(write, i, 'r', BRFlag_Special_Character);
++write.item;
} }
} }
break; break;
case '\t': case '\t':
if (write.item < item_end){ if (write.item < item_end){
write_render_item(write, i, ' ', 0); i32 new_x = write.x + ch_width;
++write.item; write = write_render_item(write, i, ' ', 0);
write.x += ch_width; write.x = new_x;
} }
break; break;
default: default:
if (write.item < item_end){ if (write.item < item_end){
if (ch >= ' ' && ch <= '~'){ if (ch >= ' ' && ch <= '~'){
write_render_item(write, i, ch, 0); write = write_render_item(write, i, ch, 0);
++write.item;
write.x += ch_width;
} }
else{ else{
write.x += write_render_item(write, i, '\\', BRFlag_Special_Character); write = write_render_item(write, i, '\\', BRFlag_Special_Character);
++write.item;
char C = '0' + (ch / 0x10); char C = '0' + (ch / 0x10);
if ((ch / 0x10) > 0x9){ if ((ch / 0x10) > 0x9){
@ -913,8 +906,7 @@ buffer_get_render_data(Buffer_Type *buffer, Buffer_Render_Item *items, i32 max,
} }
if (write.item < item_end){ if (write.item < item_end){
write.x += write_render_item(write, i, C, BRFlag_Special_Character); write = write_render_item(write, i, C, BRFlag_Special_Character);
++write.item;
} }
ch = (ch % 0x10); ch = (ch % 0x10);
@ -924,8 +916,7 @@ buffer_get_render_data(Buffer_Type *buffer, Buffer_Render_Item *items, i32 max,
} }
if (write.item < item_end){ if (write.item < item_end){
write.x += write_render_item(write, i, C, BRFlag_Special_Character); write = write_render_item(write, i, C, BRFlag_Special_Character);
++write.item;
} }
} }
} }
@ -942,7 +933,6 @@ buffer_get_render_data(Buffer_Type *buffer, Buffer_Render_Item *items, i32 max,
if (write.y <= height + shift_y || write.item == items){ if (write.y <= height + shift_y || write.item == items){
if (write.item < item_end){ if (write.item < item_end){
write_render_item(write, size, ' ', 0); write_render_item(write, size, ' ', 0);
++write.item;
} }
} }
} }
@ -952,7 +942,6 @@ buffer_get_render_data(Buffer_Type *buffer, Buffer_Render_Item *items, i32 max,
if (write.item < item_end){ if (write.item < item_end){
write_render_item(write, size, 0, 0); write_render_item(write, size, 0, 0);
++write.item;
} }
} }