setup the font interface, complete with an opaque Render_Font; started breaking down the translation interface

This commit is contained in:
Allen Webster 2017-03-11 20:20:24 -05:00
parent b871d5d2e5
commit dc90ec0c83
14 changed files with 525 additions and 369 deletions

View File

@ -40,6 +40,15 @@ typedef int32_t b32_4tech;
#endif #endif
// standard preamble end // standard preamble end
static b32_4tech
codepoint_is_whitespace(u32_4tech codepoint){
b32_4tech result = false;
if (codepoint == ' ' || codepoint == '\r' || codepoint == '\n' || codepoint == '\t'){
result = true;
}
return(result);
}
static u32_4tech static u32_4tech
utf8_to_u32_length_unchecked(u8_4tech *buffer, u32_4tech *length_out){ utf8_to_u32_length_unchecked(u8_4tech *buffer, u32_4tech *length_out){
u32_4tech result = 0; u32_4tech result = 0;

25
4ed.cpp
View File

@ -235,7 +235,7 @@ do_feedback_message(System_Functions *system, Models *models, String value, b32
for (View_Iter iter = file_view_iter_init(&models->layout, file, 0); for (View_Iter iter = file_view_iter_init(&models->layout, file, 0);
file_view_iter_good(iter); file_view_iter_good(iter);
iter = file_view_iter_next(iter)){ iter = file_view_iter_next(iter)){
view_cursor_move(iter.view, pos); view_cursor_move(system, iter.view, pos);
} }
} }
} }
@ -274,7 +274,7 @@ panel_make_empty(System_Functions *system, App_Vars *vars, Panel *panel){
Assert(panel->view == 0); Assert(panel->view == 0);
new_view = live_set_alloc_view(&vars->live_set, panel, models); new_view = live_set_alloc_view(&vars->live_set, panel, models);
view_set_file(new_view.view, models->scratch_buffer, models); view_set_file(system, new_view.view, models->scratch_buffer, models);
new_view.view->map = get_map(models, mapid_file); new_view.view->map = get_map(models, mapid_file);
return(new_view.view); return(new_view.view);
@ -362,16 +362,15 @@ COMMAND_DECL(reopen){
init_normal_file(system, models, file, buffer, size); init_normal_file(system, models, file, buffer, size);
for (i32 i = 0; i < vptr_count; ++i){ for (i32 i = 0; i < vptr_count; ++i){
view_set_file(vptrs[i], file, models); view_set_file(system, vptrs[i], file, models);
int32_t line = line_number[i]; int32_t line = line_number[i];
int32_t character = column_number[i]; int32_t character = column_number[i];
*vptrs[i]->edit_pos = edit_poss[i]; *vptrs[i]->edit_pos = edit_poss[i];
Full_Cursor cursor = view_compute_cursor(vptrs[i], seek_line_char(line, character), 0); Full_Cursor cursor = view_compute_cursor(system, vptrs[i], seek_line_char(line, character), 0);
view_set_cursor(vptrs[i], cursor, true, view_set_cursor(vptrs[i], cursor, true, file->settings.unwrapped_lines);
file->settings.unwrapped_lines);
} }
} }
else{ else{
@ -449,12 +448,11 @@ COMMAND_DECL(toggle_line_wrap){
if (file->settings.unwrapped_lines){ if (file->settings.unwrapped_lines){
file->settings.unwrapped_lines = 0; file->settings.unwrapped_lines = 0;
view->edit_pos->scroll.target_x = 0; view->edit_pos->scroll.target_x = 0;
view_cursor_move(view, view->edit_pos->cursor.pos);
} }
else{ else{
file->settings.unwrapped_lines = 1; file->settings.unwrapped_lines = 1;
view_cursor_move(view, view->edit_pos->cursor.pos);
} }
view_cursor_move(system, view, view->edit_pos->cursor.pos);
view_set_relative_scrolling(view, scrolling); view_set_relative_scrolling(view, scrolling);
} }
@ -520,7 +518,7 @@ COMMAND_DECL(open_menu){
COMMAND_DECL(open_debug){ COMMAND_DECL(open_debug){
USE_VIEW(view); USE_VIEW(view);
view_show_GUI(view, VUI_Debug); view_show_GUI(view, VUI_Debug);
view->debug_vars = debug_vars_zero(); view->debug_vars = null_debug_vars;
} }
COMMAND_DECL(user_callback){ COMMAND_DECL(user_callback){
@ -1616,8 +1614,7 @@ update_cli_handle_without_file(System_Functions *system, Models *models,
} }
internal i32 internal i32
update_cli_handle_with_file(System_Functions *system, Models *models, update_cli_handle_with_file(System_Functions *system, Models *models, CLI_Handles *cli, Editing_File *file, char *dest, i32 max, b32 cursor_at_end){
CLI_Handles *cli, Editing_File *file, char *dest, i32 max, b32 cursor_at_end){
i32 result = 0; i32 result = 0;
u32 amount = 0; u32 amount = 0;
@ -1642,7 +1639,7 @@ update_cli_handle_with_file(System_Functions *system, Models *models,
for (View_Iter iter = file_view_iter_init(&models->layout, file, 0); for (View_Iter iter = file_view_iter_init(&models->layout, file, 0);
file_view_iter_good(iter); file_view_iter_good(iter);
iter = file_view_iter_next(iter)){ iter = file_view_iter_next(iter)){
view_cursor_move(iter.view, new_cursor); view_cursor_move(system, iter.view, new_cursor);
} }
} }
@ -1947,7 +1944,7 @@ App_Step_Sig(app_step){
} }
if (i < models->layout.panel_count){ if (i < models->layout.panel_count){
view_set_file(panel->view, models->message_buffer, models); view_set_file(system, panel->view, models->message_buffer, models);
view_show_file(panel->view); view_show_file(panel->view);
++i; ++i;
panel = panel->next; panel = panel->next;
@ -2262,7 +2259,7 @@ App_Step_Sig(app_step){
if (!gui_scroll_eq(scroll_vars, &ip_result.vars)){ if (!gui_scroll_eq(scroll_vars, &ip_result.vars)){
if (file_scroll){ if (file_scroll){
view_set_scroll(view, ip_result.vars); view_set_scroll(system, view, ip_result.vars);
} }
else{ else{
*scroll_vars = ip_result.vars; *scroll_vars = ip_result.vars;

View File

@ -64,7 +64,7 @@ fill_buffer_summary(Buffer_Summary *buffer, Editing_File *file, Command_Data *cm
} }
internal void internal void
fill_view_summary(View_Summary *view, View *vptr, Live_Views *live_set, Working_Set *working_set){ fill_view_summary(System_Functions *system, View_Summary *view, View *vptr, Live_Views *live_set, Working_Set *working_set){
Buffer_ID buffer_id = 0; Buffer_ID buffer_id = 0;
File_Viewing_Data *data = &vptr->file_data; File_Viewing_Data *data = &vptr->file_data;
@ -84,7 +84,7 @@ fill_view_summary(View_Summary *view, View *vptr, Live_Views *live_set, Working_
view->buffer_id = buffer_id; view->buffer_id = buffer_id;
view->mark = view_compute_cursor(vptr, seek_pos(vptr->edit_pos->mark), 0); view->mark = view_compute_cursor(system, vptr, seek_pos(vptr->edit_pos->mark), 0);
view->cursor = vptr->edit_pos->cursor; view->cursor = vptr->edit_pos->cursor;
view->preferred_x = vptr->edit_pos->preferred_x; view->preferred_x = vptr->edit_pos->preferred_x;
@ -96,8 +96,8 @@ fill_view_summary(View_Summary *view, View *vptr, Live_Views *live_set, Working_
inline void inline void
fill_view_summary(View_Summary *view, View *vptr, Command_Data *cmd){ fill_view_summary(System_Functions *system, View_Summary *view, View *vptr, Command_Data *cmd){
fill_view_summary(view, vptr, &cmd->vars->live_set, &cmd->models->working_set); fill_view_summary(system, view, vptr, &cmd->vars->live_set, &cmd->models->working_set);
} }
internal Editing_File* internal Editing_File*
@ -195,8 +195,7 @@ DOC_PARAM(command, The command parameter specifies the command that shall be exe
DOC_PARAM(command_len, The parameter command_len specifies the length of the command string.) DOC_PARAM(command_len, The parameter command_len specifies the length of the command string.)
DOC_PARAM(flags, Flags for the behavior of the call are specified in the flags parameter.) DOC_PARAM(flags, Flags for the behavior of the call are specified in the flags parameter.)
DOC_RETURN(This call returns non-zero on success.) DOC_RETURN(This call returns non-zero on success.)
DOC( DOC(A call to exec_system_command executes a command as if called from the command line, and sends the output to a buffer. The buffer identifier can name a new buffer that does not exist, name a buffer that does exist, or provide the id of a buffer that does exist.
A call to exec_system_command executes a command as if called from the command line, and sends the output to a buffer. The buffer identifier can name a new buffer that does not exist, name a buffer that does exist, or provide the id of a buffer that does exist.
If the buffer is not already in an open view and the view parameter is not NULL, If the buffer is not already in an open view and the view parameter is not NULL,
then the provided view will display the output buffer. then the provided view will display the output buffer.
@ -316,8 +315,8 @@ DOC_SEE(Command_Line_Interface_Flag)
command_string = make_string_terminated(part, command, command_len); command_string = make_string_terminated(part, command, command_len);
} }
if (vptr && bind_to_new_view){ if (vptr != 0 && bind_to_new_view){
view_set_file(vptr, file, models); view_set_file(system, vptr, file, models);
view_show_file(vptr); view_show_file(vptr);
} }
@ -342,7 +341,7 @@ DOC_SEE(Command_Line_Interface_Flag)
goto done; goto done;
} }
done: done:;
end_temp_memory(temp); end_temp_memory(temp);
return(result); return(result);
} }
@ -881,7 +880,7 @@ DOC_SEE(Buffer_Setting_ID)
//Font_Info *font_info = get_font_info(models->font_set, font_id); //Font_Info *font_info = get_font_info(models->font_set, font_id);
//Render_Font *font = font_info->font; //Render_Font *font = font_info->font;
Render_Font *font = 0; Render_Font *font = 0;
file_set_width(models, file, new_value, font); file_set_width(system, models, file, new_value, font);
} }
}break; }break;
@ -895,7 +894,7 @@ DOC_SEE(Buffer_Setting_ID)
//i16 font_id = file->settings.font_id; //i16 font_id = file->settings.font_id;
//Render_Font *font = get_font_info(models->font_set, font_id)->font; //Render_Font *font = get_font_info(models->font_set, font_id)->font;
Render_Font *font = 0; Render_Font *font = 0;
file_set_min_base_width(models, file, new_value, font); file_set_min_base_width(system, models, file, new_value, font);
} }
}break; }break;
@ -986,7 +985,7 @@ DOC_SEE(Buffer_Setting_ID)
file_allocate_character_starts_as_needed(&models->mem.general, file); file_allocate_character_starts_as_needed(&models->mem.general, file);
buffer_measure_character_starts(&file->state.buffer, file->state.character_starts, 0, file->settings.virtual_white); buffer_measure_character_starts(&file->state.buffer, file->state.character_starts, 0, file->settings.virtual_white);
file_measure_wraps(models, file, font); file_measure_wraps(models, file, font);
file_update_cursor_positions(models, file); file_update_cursor_positions(system, models, file);
} }
}break; }break;
@ -1307,25 +1306,25 @@ internal_get_view_first(Command_Data *cmd, View_Summary *view){
Panel *panel = layout->used_sentinel.next; Panel *panel = layout->used_sentinel.next;
Assert(panel != &layout->used_sentinel); Assert(panel != &layout->used_sentinel);
fill_view_summary(view, panel->view, cmd); System_Functions *system = cmd->system;
fill_view_summary(system, view, panel->view, cmd);
} }
internal void internal void
internal_get_view_next(Command_Data *cmd, View_Summary *view){ internal_get_view_next(Command_Data *cmd, View_Summary *view){
System_Functions *system = cmd->system;
Editing_Layout *layout = &cmd->models->layout; Editing_Layout *layout = &cmd->models->layout;
Live_Views *live_set = &cmd->vars->live_set; Live_Views *live_set = &cmd->vars->live_set;
int32_t index = view->view_id - 1; int32_t index = view->view_id - 1;
View *vptr = 0;
Panel *panel = 0;
if (index >= 0 && index < live_set->max){ if (index >= 0 && index < live_set->max){
vptr = live_set->views + index; View *vptr = live_set->views + index;
panel = vptr->panel; Panel *panel = vptr->panel;
if (panel){ if (panel){
panel = panel->next; panel = panel->next;
} }
if (panel && panel != &layout->used_sentinel){ if (panel && panel != &layout->used_sentinel){
fill_view_summary(view, panel->view, &cmd->vars->live_set, &cmd->models->working_set); fill_view_summary(system, view, panel->view, &cmd->vars->live_set, &cmd->models->working_set);
} }
else{ else{
*view = null_view_summary; *view = null_view_summary;
@ -1393,15 +1392,15 @@ DOC_RETURN(This call returns a summary that describes the indicated view if it i
DOC_SEE(Access_Flag) DOC_SEE(Access_Flag)
*/{ */{
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;
System_Functions *system = cmd->system;
View_Summary view = {0}; View_Summary view = {0};
Live_Views *live_set = cmd->live_set; Live_Views *live_set = cmd->live_set;
i32 max = live_set->max; i32 max = live_set->max;
View *vptr = 0;
view_id -= 1; view_id -= 1;
if (view_id >= 0 && view_id < max){ if (view_id >= 0 && view_id < max){
vptr = live_set->views + view_id; View *vptr = live_set->views + view_id;
fill_view_summary(&view, vptr, live_set, &cmd->models->working_set); fill_view_summary(system, &view, vptr, live_set, &cmd->models->working_set);
if (!access_test(view.lock_flags, access)){ if (!access_test(view.lock_flags, access)){
view = null_view_summary; view = null_view_summary;
} }
@ -1419,13 +1418,13 @@ DOC_SEE(set_active_view)
DOC_SEE(Access_Flag) DOC_SEE(Access_Flag)
*/{ */{
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;
System_Functions *system = cmd->system;
Panel *panel = cmd->models->layout.panels + cmd->models->layout.active_panel; Panel *panel = cmd->models->layout.panels + cmd->models->layout.active_panel;
Assert(panel->view != 0); Assert(panel->view != 0);
View_Summary view = {0}; View_Summary view = {0};
fill_view_summary(&view, panel->view, &cmd->vars->live_set, &cmd->models->working_set); fill_view_summary(system, &view, panel->view, &cmd->vars->live_set, &cmd->models->working_set);
if (!access_test(view.lock_flags, access)){ if (!access_test(view.lock_flags, access)){
view = null_view_summary; view = null_view_summary;
} }
@ -1486,7 +1485,7 @@ DOC_SEE(View_Split_Position)
models->layout.active_panel = (i32)(split.panel - models->layout.panels); models->layout.active_panel = (i32)(split.panel - models->layout.panels);
panel_make_empty(system, cmd->vars, split.panel); panel_make_empty(system, cmd->vars, split.panel);
fill_view_summary(&result, split.panel->view, cmd); fill_view_summary(system, &result, split.panel->view, cmd);
} }
return(result); return(result);
@ -1654,6 +1653,7 @@ DOC_RETURN(This call returns non-zero on success.)
DOC_SEE(View_Setting_ID) DOC_SEE(View_Setting_ID)
*/{ */{
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;
System_Functions *system = cmd->system;
View *vptr = imp_get_view(cmd, view); View *vptr = imp_get_view(cmd, view);
bool32 result = false; bool32 result = false;
@ -1676,7 +1676,7 @@ DOC_SEE(View_Setting_ID)
}break; }break;
} }
fill_view_summary(view, vptr, cmd); fill_view_summary(system, view, vptr, cmd);
} }
return(result); return(result);
@ -1727,16 +1727,16 @@ DOC_SEE(Buffer_Seek)
DOC_SEE(Full_Cursor) DOC_SEE(Full_Cursor)
*/{ */{
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;
System_Functions *system = cmd->system;
View *vptr = imp_get_view(cmd, view); View *vptr = imp_get_view(cmd, view);
Editing_File *file = 0;
bool32 result = false; bool32 result = false;
if (vptr){ if (vptr){
file = vptr->file_data.file; Editing_File *file = vptr->file_data.file;
if (file && !file->is_loading){ if (file != 0 && !file->is_loading){
result = true; result = true;
*cursor_out = view_compute_cursor(vptr, seek, 0); *cursor_out = view_compute_cursor(system, vptr, seek, 0);
fill_view_summary(view, vptr, cmd); fill_view_summary(system, view, vptr, cmd);
} }
} }
@ -1759,6 +1759,7 @@ cursor in the same column or x position.
DOC_SEE(Buffer_Seek) DOC_SEE(Buffer_Seek)
*/{ */{
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;
System_Functions *system = cmd->system;
View *vptr = imp_get_view(cmd, view); View *vptr = imp_get_view(cmd, view);
Editing_File *file = 0; Editing_File *file = 0;
bool32 result = false; bool32 result = false;
@ -1768,9 +1769,9 @@ DOC_SEE(Buffer_Seek)
Assert(file); Assert(file);
if (!file->is_loading){ if (!file->is_loading){
result = true; result = true;
Full_Cursor cursor = view_compute_cursor(vptr, seek, 0); Full_Cursor cursor = view_compute_cursor(system, vptr, seek, 0);
view_set_cursor(vptr, cursor, set_preferred_x, file->settings.unwrapped_lines); view_set_cursor(vptr, cursor, set_preferred_x, file->settings.unwrapped_lines);
fill_view_summary(view, vptr, cmd); fill_view_summary(system, view, vptr, cmd);
} }
} }
@ -1784,6 +1785,7 @@ DOC(TODO)
DOC_SEE(GUI_Scroll_Vars) DOC_SEE(GUI_Scroll_Vars)
*/{ */{
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;
System_Functions *system = cmd->system;
View *vptr = imp_get_view(cmd, view); View *vptr = imp_get_view(cmd, view);
Editing_File *file = 0; Editing_File *file = 0;
bool32 result = false; bool32 result = false;
@ -1792,8 +1794,8 @@ DOC_SEE(GUI_Scroll_Vars)
file = vptr->file_data.file; file = vptr->file_data.file;
if (file && !file->is_loading){ if (file && !file->is_loading){
result = true; result = true;
view_set_scroll(vptr, scroll); view_set_scroll(system, vptr, scroll);
fill_view_summary(view, vptr, cmd); fill_view_summary(system, view, vptr, cmd);
} }
} }
@ -1810,6 +1812,7 @@ DOC(This call sets the the view's mark position.)
DOC_SEE(Buffer_Seek) DOC_SEE(Buffer_Seek)
*/{ */{
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;
System_Functions *system = cmd->system;
View *vptr = imp_get_view(cmd, view); View *vptr = imp_get_view(cmd, view);
Editing_File *file = 0; Editing_File *file = 0;
Full_Cursor cursor = {0}; Full_Cursor cursor = {0};
@ -1820,14 +1823,14 @@ DOC_SEE(Buffer_Seek)
if (file && !file->is_loading){ if (file && !file->is_loading){
if (seek.type != buffer_seek_pos){ if (seek.type != buffer_seek_pos){
result = true; result = true;
cursor = view_compute_cursor(vptr, seek, 0); cursor = view_compute_cursor(system, vptr, seek, 0);
vptr->edit_pos->mark = cursor.pos; vptr->edit_pos->mark = cursor.pos;
} }
else{ else{
result = true; result = true;
vptr->edit_pos->mark = seek.pos; vptr->edit_pos->mark = seek.pos;
} }
fill_view_summary(view, vptr, cmd); fill_view_summary(system, view, vptr, cmd);
} }
} }
@ -1850,18 +1853,19 @@ and the turn_on set to false, will switch back to showing the cursor.
) )
*/{ */{
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;
System_Functions *system = cmd->system;
View *vptr = imp_get_view(cmd, view); View *vptr = imp_get_view(cmd, view);
bool32 result = false; bool32 result = false;
if (vptr){ if (vptr){
result = true; result = true;
if (turn_on){ if (turn_on){
view_set_temp_highlight(vptr, start, end); view_set_temp_highlight(system, vptr, start, end);
} }
else{ else{
vptr->file_data.show_temp_highlight = 0; vptr->file_data.show_temp_highlight = 0;
} }
fill_view_summary(view, vptr, cmd); fill_view_summary(system, view, vptr, cmd);
} }
return(result); return(result);
@ -1874,33 +1878,29 @@ DOC_PARAM(view, The view parameter specifies the view in which to display the bu
DOC_PARAM(buffer_id, The buffer_id parameter specifies which buffer to show in the view.) DOC_PARAM(buffer_id, The buffer_id parameter specifies which buffer to show in the view.)
DOC_PARAM(flags, The flags parameter specifies behaviors for setting the buffer.) DOC_PARAM(flags, The flags parameter specifies behaviors for setting the buffer.)
DOC_RETURN(This call returns non-zero on success.) DOC_RETURN(This call returns non-zero on success.)
DOC DOC(On success view_set_buffer sets the specified view's current buffer and cancels and dialogue shown in the view and displays the file.)
(
On success view_set_buffer sets the specified view's current buffer and
cancels and dialogue shown in the view and displays the file.
)
DOC_SEE(Set_Buffer_Flag) DOC_SEE(Set_Buffer_Flag)
*/{ */{
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;
System_Functions *system = cmd->system;
View *vptr = imp_get_view(cmd, view); View *vptr = imp_get_view(cmd, view);
Models *models = cmd->models; Models *models = cmd->models;
Editing_File *file = 0;
bool32 result = false; bool32 result = false;
if (vptr){ if (vptr){
file = working_set_get_active_file(&models->working_set, buffer_id); Editing_File *file = working_set_get_active_file(&models->working_set, buffer_id);
if (file){ if (file != 0){
result = true; result = true;
if (file != vptr->file_data.file){ if (file != vptr->file_data.file){
view_set_file(vptr, file, models); view_set_file(system, vptr, file, models);
if (!(flags & SetBuffer_KeepOriginalGUI)){ if (!(flags & SetBuffer_KeepOriginalGUI)){
view_show_file(vptr); view_show_file(vptr);
} }
} }
} }
fill_view_summary(view, vptr, cmd); fill_view_summary(system, view, vptr, cmd);
} }
return(result); return(result);

View File

@ -33,7 +33,6 @@
# include "4ed_debug_mem.h" # include "4ed_debug_mem.h"
#endif #endif
#include "font/4coder_font_data.h"
#include "4ed_rendering.h" #include "4ed_rendering.h"
#include "4ed.h" #include "4ed.h"
@ -62,5 +61,7 @@
#include "4ed_file_view.cpp" #include "4ed_file_view.cpp"
#include "4ed.cpp" #include "4ed.cpp"
#include "font/4coder_font_static_functions.cpp"
// BOTTOM // BOTTOM

View File

@ -186,11 +186,7 @@ struct Debug_Vars{
i32 mode; i32 mode;
i32 inspecting_view_id; i32 inspecting_view_id;
}; };
inline Debug_Vars global_const Debug_Vars null_debug_vars = {0};
debug_vars_zero(){
Debug_Vars vars = {0};
return(vars);
}
struct View{ struct View{
View_Persistent persistent; View_Persistent persistent;
@ -384,14 +380,11 @@ view_cursor_limits(View *view){
} }
internal Full_Cursor internal Full_Cursor
view_compute_cursor(View *view, Buffer_Seek seek, b32 return_hint){ view_compute_cursor(System_Functions *system, View *view, Buffer_Seek seek, b32 return_hint){
Editing_File *file = view->file_data.file; Editing_File *file = view->file_data.file;
#if 0 Render_Font *font = system->font.get_render_data_by_id(file->settings.font_id);
Models *models = view->persistent.models; Assert(font != 0);
Render_Font *font = get_font_info(models->font_set, file->settings.font_id)->font;
#endif
Render_Font *font = 0;
Full_Cursor result = {0}; Full_Cursor result = {0};
@ -461,7 +454,7 @@ view_compute_cursor(View *view, Buffer_Seek seek, b32 return_hint){
} }
inline Full_Cursor inline Full_Cursor
view_compute_cursor_from_xy(View *view, f32 seek_x, f32 seek_y){ view_compute_cursor_from_xy(System_Functions *system, View *view, f32 seek_x, f32 seek_y){
Buffer_Seek seek; Buffer_Seek seek;
if (view->file_data.file->settings.unwrapped_lines){ if (view->file_data.file->settings.unwrapped_lines){
seek = seek_unwrapped_xy(seek_x, seek_y, 0); seek = seek_unwrapped_xy(seek_x, seek_y, 0);
@ -470,7 +463,7 @@ view_compute_cursor_from_xy(View *view, f32 seek_x, f32 seek_y){
seek = seek_wrapped_xy(seek_x, seek_y, 0); seek = seek_wrapped_xy(seek_x, seek_y, 0);
} }
Full_Cursor result = view_compute_cursor(view, seek, 0); Full_Cursor result = view_compute_cursor(system, view, seek, 0);
return(result); return(result);
} }
@ -556,8 +549,7 @@ view_move_view_to_cursor(View *view, GUI_Scroll_Vars *scroll, b32 center_view){
} }
internal b32 internal b32
view_move_cursor_to_view(View *view, GUI_Scroll_Vars scroll, view_move_cursor_to_view(System_Functions *system, View *view, GUI_Scroll_Vars scroll, Full_Cursor *cursor, f32 preferred_x){
Full_Cursor *cursor, f32 preferred_x){
b32 result = 0; b32 result = 0;
if (view->edit_pos){ if (view->edit_pos){
@ -586,8 +578,7 @@ view_move_cursor_to_view(View *view, GUI_Scroll_Vars scroll,
cursor_y -= line_height; cursor_y -= line_height;
} }
*cursor = view_compute_cursor_from_xy( *cursor = view_compute_cursor_from_xy(system, view, preferred_x, cursor_y);
view, preferred_x, cursor_y);
result = 1; result = 1;
} }
@ -608,12 +599,11 @@ view_set_cursor(View *view, Full_Cursor cursor, b32 set_preferred_x, b32 unwrapp
} }
internal void internal void
view_set_scroll(View *view, GUI_Scroll_Vars scroll){ view_set_scroll(System_Functions *system, View *view, GUI_Scroll_Vars scroll){
if (edit_pos_move_to_front(view->file_data.file, view->edit_pos)){ if (edit_pos_move_to_front(view->file_data.file, view->edit_pos)){
edit_pos_set_scroll(view->edit_pos, scroll); edit_pos_set_scroll(view->edit_pos, scroll);
Full_Cursor cursor = view->edit_pos->cursor; Full_Cursor cursor = view->edit_pos->cursor;
if (view_move_cursor_to_view(view, view->edit_pos->scroll, if (view_move_cursor_to_view(system, view, view->edit_pos->scroll, &cursor, view->edit_pos->preferred_x)){
&cursor, view->edit_pos->preferred_x)){
view->edit_pos->cursor = cursor; view->edit_pos->cursor = cursor;
} }
} }
@ -630,13 +620,12 @@ view_set_cursor_and_scroll(View *view, Full_Cursor cursor, b32 set_preferred_x,
} }
inline void inline void
view_set_temp_highlight(View *view, i32 pos, i32 end_pos){ view_set_temp_highlight(System_Functions *system, View *view, i32 pos, i32 end_pos){
view->file_data.temp_highlight = view_compute_cursor(view, seek_pos(pos), 0); view->file_data.temp_highlight = view_compute_cursor(system, view, seek_pos(pos), 0);
view->file_data.temp_highlight_end_pos = end_pos; view->file_data.temp_highlight_end_pos = end_pos;
view->file_data.show_temp_highlight = 1; view->file_data.show_temp_highlight = 1;
view_set_cursor(view, view->file_data.temp_highlight, view_set_cursor(view, view->file_data.temp_highlight, 0, view->file_data.file->settings.unwrapped_lines);
0, view->file_data.file->settings.unwrapped_lines);
} }
struct View_And_ID{ struct View_And_ID{
@ -884,7 +873,7 @@ file_grow_starts_as_needed(General_Memory *general, Gap_Buffer *buffer, i32 addi
} }
internal void internal void
file_update_cursor_positions(Models *models, Editing_File *file){ file_update_cursor_positions(System_Functions *system, Models *models, Editing_File *file){
Editing_Layout *layout = &models->layout; Editing_Layout *layout = &models->layout;
for (View_Iter iter = file_view_iter_init(layout, file, 0); for (View_Iter iter = file_view_iter_init(layout, file, 0);
file_view_iter_good(iter); file_view_iter_good(iter);
@ -892,11 +881,11 @@ file_update_cursor_positions(Models *models, Editing_File *file){
i32 pos = view_get_cursor_pos(iter.view); i32 pos = view_get_cursor_pos(iter.view);
if (!iter.view->file_data.show_temp_highlight){ if (!iter.view->file_data.show_temp_highlight){
Full_Cursor cursor = view_compute_cursor(iter.view, seek_pos(pos), 0); Full_Cursor cursor = view_compute_cursor(system, iter.view, seek_pos(pos), 0);
view_set_cursor(iter.view, cursor, 1, iter.view->file_data.file->settings.unwrapped_lines); view_set_cursor(iter.view, cursor, 1, iter.view->file_data.file->settings.unwrapped_lines);
} }
else{ else{
view_set_temp_highlight(iter.view, pos, iter.view->file_data.temp_highlight_end_pos); view_set_temp_highlight(system, iter.view, pos, iter.view->file_data.temp_highlight_end_pos);
} }
} }
} }
@ -960,10 +949,10 @@ file_allocate_character_starts_as_needed(General_Memory *general, Editing_File *
} }
internal void internal void
file_measure_character_starts(Models *models, Editing_File *file){ file_measure_character_starts(System_Functions *system, Models *models, Editing_File *file){
file_allocate_character_starts_as_needed(&models->mem.general, file); file_allocate_character_starts_as_needed(&models->mem.general, file);
buffer_measure_character_starts(&file->state.buffer, file->state.character_starts, 0, file->settings.virtual_white); buffer_measure_character_starts(&file->state.buffer, file->state.character_starts, 0, file->settings.virtual_white);
file_update_cursor_positions(models, file); file_update_cursor_positions(system, models, file);
} }
internal void internal void
@ -1014,8 +1003,13 @@ struct Code_Wrap_State{
Render_Font *font; Render_Font *font;
f32 tab_indent_amount; f32 tab_indent_amount;
f32 byte_advance;
Buffer_Translating_State tran; Buffer_Translating_State tran;
Buffer_Translating_Emits emits;
u32 J;
Buffer_Model_Step step;
Buffer_Model_Behavior behavior;
}; };
internal void internal void
@ -1039,6 +1033,7 @@ wrap_state_init(Code_Wrap_State *state, Editing_File *file, Render_Font *font){
state->tab_indent_amount = get_codepoint_advance(font, '\t'); state->tab_indent_amount = get_codepoint_advance(font, '\t');
#endif #endif
state->tab_indent_amount = 2.f; state->tab_indent_amount = 2.f;
state->byte_advance = font_get_byte_advance(font);
state->tran = null_buffer_translating_state; state->tran = null_buffer_translating_state;
} }
@ -1137,19 +1132,19 @@ wrap_state_consume_token(Code_Wrap_State *state, i32 fixed_end_point){
u8 ch = (u8)state->stream.data[i]; u8 ch = (u8)state->stream.data[i];
translating_consume_byte(&state->tran, ch, i, state->size); translating_fully_process_byte(&state->tran, ch, i, state->size, &state->emits);
for (TRANSLATION_OUTPUT(&state->tran)){ for (TRANSLATION_OUTPUT(state->J, state->emits)){
TRANSLATION_GET_STEP(&state->tran); TRANSLATION_GET_STEP(state->step, state->behavior, state->J, state->emits);
if (state->tran.do_newline){ if (state->behavior.do_newline){
state->consume_newline = 1; state->consume_newline = 1;
goto doublebreak; goto doublebreak;
} }
else if(state->tran.do_number_advance || state->tran.do_codepoint_advance){ else if(state->behavior.do_number_advance || state->behavior.do_codepoint_advance){
u32 n = state->tran.step_current.value; u32 n = state->step.value;
f32 adv = 0; f32 adv = 0;
if (state->tran.do_codepoint_advance){ if (state->behavior.do_codepoint_advance){
#if 0 #if 0
adv = get_codepoint_advance(state->font, n); adv = get_codepoint_advance(state->font, n);
#endif #endif
@ -1160,7 +1155,7 @@ wrap_state_consume_token(Code_Wrap_State *state, i32 fixed_end_point){
} }
} }
else{ else{
adv = state->font->byte_advance; adv = state->byte_advance;
skipping_whitespace = false; skipping_whitespace = false;
} }
@ -1927,21 +1922,21 @@ file_measure_wraps(Models *models, Editing_File *file, Render_Font *font){
} }
internal void internal void
file_measure_wraps_and_fix_cursor(Models *models, Editing_File *file, Render_Font *font){ file_measure_wraps_and_fix_cursor(System_Functions *system, Models *models, Editing_File *file, Render_Font *font){
file_measure_wraps(models, file, font); file_measure_wraps(models, file, font);
file_update_cursor_positions(models, file); file_update_cursor_positions(system, models, file);
} }
internal void internal void
file_set_width(Models *models, Editing_File *file, i32 display_width, Render_Font *font){ file_set_width(System_Functions *system, Models *models, Editing_File *file, i32 display_width, Render_Font *font){
file->settings.display_width = display_width; file->settings.display_width = display_width;
file_measure_wraps_and_fix_cursor(models, file, font); file_measure_wraps_and_fix_cursor(system, models, file, font);
} }
internal void internal void
file_set_min_base_width(Models *models, Editing_File *file, i32 minimum_base_display_width, Render_Font *font){ file_set_min_base_width(System_Functions *system, Models *models, Editing_File *file, i32 minimum_base_display_width, Render_Font *font){
file->settings.minimum_base_display_width = minimum_base_display_width; file->settings.minimum_base_display_width = minimum_base_display_width;
file_measure_wraps_and_fix_cursor(models, file, font); file_measure_wraps_and_fix_cursor(system, models, file, font);
} }
// //
@ -2799,10 +2794,9 @@ file_view_nullify_file(View *view){
} }
internal void internal void
update_view_line_height(Models *models, View *view, Font_ID font_id){ update_view_line_height(System_Functions *system, Models *models, View *view, Font_ID font_id){
//Render_Font *font = get_font_info(models->font_set, font_id)->font; Render_Font *font = system->font.get_render_data_by_id(font_id);
Render_Font *font = 0; view->line_height = font_get_height(font);
view->line_height = font->height;
} }
inline void inline void
@ -2812,13 +2806,13 @@ view_cursor_move(View *view, Full_Cursor cursor){
} }
inline void inline void
view_cursor_move(View *view, i32 pos){ view_cursor_move(System_Functions *system, View *view, i32 pos){
Full_Cursor cursor = view_compute_cursor(view, seek_pos(pos), 0); Full_Cursor cursor = view_compute_cursor(system, view, seek_pos(pos), 0);
view_cursor_move(view, cursor); view_cursor_move(view, cursor);
} }
inline void inline void
view_cursor_move(View *view, f32 x, f32 y, b32 round_down = 0){ view_cursor_move(System_Functions *system, View *view, f32 x, f32 y, b32 round_down = 0){
Buffer_Seek seek; Buffer_Seek seek;
if (view->file_data.file->settings.unwrapped_lines){ if (view->file_data.file->settings.unwrapped_lines){
seek = seek_unwrapped_xy(x, y, round_down); seek = seek_unwrapped_xy(x, y, round_down);
@ -2827,13 +2821,13 @@ view_cursor_move(View *view, f32 x, f32 y, b32 round_down = 0){
seek = seek_wrapped_xy(x, y, round_down); seek = seek_wrapped_xy(x, y, round_down);
} }
Full_Cursor cursor = view_compute_cursor(view, seek, 0); Full_Cursor cursor = view_compute_cursor(system, view, seek, 0);
view_cursor_move(view, cursor); view_cursor_move(view, cursor);
} }
inline void inline void
view_cursor_move(View *view, i32 line, i32 character){ view_cursor_move(System_Functions *system, View *view, i32 line, i32 character){
Full_Cursor cursor = view_compute_cursor(view, seek_line_char(line, character), 0); Full_Cursor cursor = view_compute_cursor(system, view, seek_line_char(line, character), 0);
view_cursor_move(view, cursor); view_cursor_move(view, cursor);
} }
@ -2854,7 +2848,7 @@ view_show_file(View *view){
} }
internal void internal void
view_set_file(View *view, Editing_File *file, Models *models){ view_set_file(System_Functions *system, View *view, Editing_File *file, Models *models){
Assert(file); Assert(file);
if (view->file_data.file != 0){ if (view->file_data.file != 0){
@ -2874,10 +2868,10 @@ view_set_file(View *view, Editing_File *file, Models *models){
edit_pos = edit_pos_get_new(file, view->persistent.id); edit_pos = edit_pos_get_new(file, view->persistent.id);
view->edit_pos = edit_pos; view->edit_pos = edit_pos;
update_view_line_height(models, view, file->settings.font_id); update_view_line_height(system, models, view, file->settings.font_id);
if (edit_pos->cursor.line == 0){ if (edit_pos->cursor.line == 0){
view_cursor_move(view, 0); view_cursor_move(system, view, 0);
} }
if (view->showing_ui == VUI_None){ if (view->showing_ui == VUI_None){
@ -3180,7 +3174,7 @@ file_edit_cursor_fix(System_Functions *system, Models *models, Editing_File *fil
Assert(view->edit_pos); Assert(view->edit_pos);
i32 cursor_pos = cursors[cursor_count++].pos; i32 cursor_pos = cursors[cursor_count++].pos;
Full_Cursor new_cursor = view_compute_cursor(view, seek_pos(cursor_pos), 0); Full_Cursor new_cursor = view_compute_cursor(system, view, seek_pos(cursor_pos), 0);
GUI_Scroll_Vars scroll = view->edit_pos->scroll; GUI_Scroll_Vars scroll = view->edit_pos->scroll;
@ -3189,7 +3183,7 @@ file_edit_cursor_fix(System_Functions *system, Models *models, Editing_File *fil
if (view->edit_pos->scroll_i != new_scroll_i){ if (view->edit_pos->scroll_i != new_scroll_i){
view->edit_pos->scroll_i = new_scroll_i; view->edit_pos->scroll_i = new_scroll_i;
Full_Cursor temp_cursor = view_compute_cursor(view, seek_pos(view->edit_pos->scroll_i), 0); Full_Cursor temp_cursor = view_compute_cursor(system, view, seek_pos(view->edit_pos->scroll_i), 0);
f32 y_offset = MOD(view->edit_pos->scroll.scroll_y, view->line_height); f32 y_offset = MOD(view->edit_pos->scroll.scroll_y, view->line_height);
f32 y_position = temp_cursor.wrapped_y; f32 y_position = temp_cursor.wrapped_y;
@ -3475,7 +3469,7 @@ apply_history_edit(System_Functions *system, Models *models, Editing_File *file,
file_do_single_edit(system, models, file, spec, history_mode); file_do_single_edit(system, models, file, spec, history_mode);
if (view){ if (view){
view_cursor_move(view, step.edit.start + step.edit.len); view_cursor_move(system, view, step.edit.start + step.edit.len);
view->edit_pos->mark = view->edit_pos->cursor.pos; view->edit_pos->mark = view->edit_pos->cursor.pos;
Style *style = main_style(models); Style *style = main_style(models);
@ -3686,28 +3680,28 @@ style_get_color(Style *style, Cpp_Token token){
} }
internal void internal void
file_set_font(Models *models, Editing_File *file, Font_ID font_id){ file_set_font(System_Functions *system, Models *models, Editing_File *file, Font_ID font_id){
file->settings.font_id = font_id; file->settings.font_id = font_id;
//Font_Info *font_info = get_font_info(models->font_set, file->settings.font_id); //Font_Info *font_info = get_font_info(models->font_set, file->settings.font_id);
//Render_Font *font = font_info->font; //Render_Font *font = font_info->font;
Render_Font *font = 0; Render_Font *font = 0;
file_measure_wraps_and_fix_cursor(models, file, font); file_measure_wraps_and_fix_cursor(system, models, file, font);
Editing_Layout *layout = &models->layout; Editing_Layout *layout = &models->layout;
for (View_Iter iter = file_view_iter_init(layout, file, 0); for (View_Iter iter = file_view_iter_init(layout, file, 0);
file_view_iter_good(iter); file_view_iter_good(iter);
iter = file_view_iter_next(iter)){ iter = file_view_iter_next(iter)){
update_view_line_height(models, iter.view, font_id); update_view_line_height(system, models, iter.view, font_id);
} }
} }
internal void internal void
global_set_font(Models *models, Font_ID font_id){ global_set_font(System_Functions *system, Models *models, Font_ID font_id){
File_Node *node = 0; File_Node *node = 0;
File_Node *sentinel = &models->working_set.used_sentinel; File_Node *sentinel = &models->working_set.used_sentinel;
for (dll_items(node, sentinel)){ for (dll_items(node, sentinel)){
Editing_File *file = (Editing_File*)node; Editing_File *file = (Editing_File*)node;
file_set_font(models, file, font_id); file_set_font(system, models, file, font_id);
} }
models->global_font_id = font_id; models->global_font_id = font_id;
} }
@ -3845,7 +3839,7 @@ view_open_file(System_Functions *system, Models *models, View *view, String file
} }
if (file){ if (file){
view_set_file(view, file, models); view_set_file(system, view, file, models);
} }
} }
@ -3886,7 +3880,7 @@ view_interactive_new_file(System_Functions *system, Models *models, View *view,
} }
if (file){ if (file){
view_set_file(view, file, models); view_set_file(system, view, file, models);
} }
} }
@ -3909,12 +3903,12 @@ kill_file(System_Functions *system, Models *models, Editing_File *file){
iter = file_view_iter_next(iter)){ iter = file_view_iter_next(iter)){
if (node != used){ if (node != used){
iter.view->file_data.file = 0; iter.view->file_data.file = 0;
view_set_file(iter.view, (Editing_File*)node, models); view_set_file(system, iter.view, (Editing_File*)node, models);
node = node->next; node = node->next;
} }
else{ else{
iter.view->file_data.file = 0; iter.view->file_data.file = 0;
view_set_file(iter.view, 0, models); view_set_file(system, iter.view, 0, models);
} }
} }
} }
@ -4016,7 +4010,7 @@ interactive_view_complete(System_Functions *system, View *view, String dest, i32
{ {
Editing_File *file = working_set_name_contains(&models->working_set, dest); Editing_File *file = working_set_name_contains(&models->working_set, dest);
if (file){ if (file){
view_set_file(view, file, models); view_set_file(system, view, file, models);
} }
view_show_file(view); view_show_file(view);
}break; }break;
@ -4720,59 +4714,57 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
switch (view->color_mode){ switch (view->color_mode){
case CV_Mode_Library: case CV_Mode_Library:
message = make_lit_string("Current Theme - Click to Edit");
gui_do_text_field(target, message, empty_string);
id.id[0] = (u64)(main_style(models));
if (gui_do_style_preview(target, id, 0)){
view->color_mode = CV_Mode_Adjusting;
}
if (view->file_data.file){
message = make_lit_string("Set Font");
id.id[0] = (u64)(&view->file_data.file->settings.font_id);
if (gui_do_button(target, id, message)){
view->color_mode = CV_Mode_Font;
}
}
message = make_lit_string("Set Global Font");
id.id[0] = (u64)(&models->global_font_id);
if (gui_do_button(target, id, message)){
view->color_mode = CV_Mode_Global_Font;
}
message = make_lit_string("Theme Library - Click to Select");
gui_do_text_field(target, message, empty_string);
gui_begin_scrollable(target, scroll_context, view->gui_scroll,
9 * view->line_height, show_scrollbar);
{ {
i32 count = models->styles.count; message = make_lit_string("Current Theme - Click to Edit");
Style *style; gui_do_text_field(target, message, empty_string);
i32 i;
for (i = 1; i < count; ++i, ++style){ id.id[0] = (u64)(main_style(models));
style = get_style(models, i); if (gui_do_style_preview(target, id, 0)){
id.id[0] = (u64)(style); view->color_mode = CV_Mode_Adjusting;
if (gui_do_style_preview(target, id, i)){ }
style_copy(main_style(models), style);
if (view->file_data.file){
message = make_lit_string("Set Font");
id.id[0] = (u64)(&view->file_data.file->settings.font_id);
if (gui_do_button(target, id, message)){
view->color_mode = CV_Mode_Font;
} }
} }
message = make_lit_string("Set Global Font");
id.id[0] = (u64)(&models->global_font_id);
if (gui_do_button(target, id, message)){
view->color_mode = CV_Mode_Global_Font;
}
message = make_lit_string("Theme Library - Click to Select");
gui_do_text_field(target, message, empty_string);
gui_begin_scrollable(target, scroll_context, view->gui_scroll,
9 * view->line_height, show_scrollbar);
{
i32 count = models->styles.count;
for (i32 i = 1; i < count; ++i){
Style *style = get_style(models, i);
id.id[0] = (u64)(style);
if (gui_do_style_preview(target, id, i)){
style_copy(main_style(models), style);
}
}
}
gui_end_scrollable(target);
} }
gui_end_scrollable(target);
break; break;
case CV_Mode_Global_Font: case CV_Mode_Global_Font:
case CV_Mode_Font: case CV_Mode_Font:
{ {
Assert(view->file_data.file); Editing_File *file = view->file_data.file;
Assert(file != 0);
//Font_Set *font_set = models->font_set; //Font_Set *font_set = models->font_set;
//Font_Info *info = 0; //Font_Info *info = 0;
@ -4786,34 +4778,43 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
Font_ID font_id = models->global_font_id; Font_ID font_id = models->global_font_id;
if (view->color_mode == CV_Mode_Font){ if (view->color_mode == CV_Mode_Font){
font_id = view->file_data.file->settings.font_id; font_id = file->settings.font_id;
} }
// TODO(allen): paginate the display
Font_ID new_font_id = font_id; Font_ID new_font_id = font_id;
Font_ID count = 2; u32 total_count = system->font.get_count();
for (Font_ID i = 1; i < count; ++i){ u32 count = Min(total_count, 10);
String font_name = {0};
id.id[0] = (u64)i; for (u32 font_index = 1; font_index < count; ++font_index){
if (i != font_id){ Font_ID this_font_id = 0;
if (gui_do_font_button(target, id, i, font_name)){ system->font.get_ids_by_index(font_index, 1, &font_id);
new_font_id = i;
char name_space[256];
String name = make_fixed_width_string(name_space);
name.size = system->font.get_name_by_index(font_index, name.str, name.memory_size);
id.id[0] = (u64)this_font_id;
if (this_font_id != font_id){
if (gui_do_font_button(target, id, this_font_id, name)){
new_font_id = this_font_id;
} }
} }
else{ else{
char message_space[256]; char message_space[256];
message = make_fixed_width_string(message_space); message = make_fixed_width_string(message_space);
copy_ss(&message, make_lit_string("currently selected: ")); copy_ss(&message, make_lit_string("currently selected: "));
append_ss(&message, font_name); append_ss(&message, name);
gui_do_font_button(target, id, i, message); gui_do_font_button(target, id, this_font_id, message);
} }
} }
if (font_id != new_font_id){ if (font_id != new_font_id){
if (view->color_mode == CV_Mode_Font){ if (view->color_mode == CV_Mode_Font){
file_set_font(models, view->file_data.file, new_font_id); file_set_font(system, models, file, new_font_id);
} }
else{ else{
global_set_font(models, new_font_id); global_set_font(system, models, new_font_id);
} }
} }
}break; }break;
@ -5907,7 +5908,7 @@ do_step_file_view(System_Functions *system, View *view, i32_Rect rect, b32 is_ac
} }
internal i32 internal i32
draw_file_loaded(View *view, i32_Rect rect, b32 is_active, Render_Target *target){ draw_file_loaded(System_Functions *system, View *view, i32_Rect rect, b32 is_active, Render_Target *target){
Models *models = view->persistent.models; Models *models = view->persistent.models;
Editing_File *file = view->file_data.file; Editing_File *file = view->file_data.file;
Style *style = main_style(models); Style *style = main_style(models);
@ -5950,10 +5951,10 @@ draw_file_loaded(View *view, i32_Rect rect, b32 is_active, Render_Target *target
Full_Cursor render_cursor; Full_Cursor render_cursor;
if (!file->settings.unwrapped_lines){ if (!file->settings.unwrapped_lines){
render_cursor = view_compute_cursor(view, seek_wrapped_xy(0, scroll_y, 0), 1); render_cursor = view_compute_cursor(system, view, seek_wrapped_xy(0, scroll_y, 0), 1);
} }
else{ else{
render_cursor = view_compute_cursor(view, seek_unwrapped_xy(0, scroll_y, 0), 1); render_cursor = view_compute_cursor(system, view, seek_unwrapped_xy(0, scroll_y, 0), 1);
} }
view->edit_pos->scroll_i = render_cursor.pos; view->edit_pos->scroll_i = render_cursor.pos;
@ -6093,8 +6094,7 @@ draw_file_loaded(View *view, i32_Rect rect, b32 is_active, Render_Target *target
f32_Rect char_rect = f32R(item->x0, item->y0, item->x1, item->y1); f32_Rect char_rect = f32R(item->x0, item->y0, item->x1, item->y1);
if (view->file_data.show_whitespace && highlight_color == 0 && if (view->file_data.show_whitespace && highlight_color == 0 && codepoint_is_whitespace(item->codepoint)){
char_is_whitespace((char)item->glyphid)){
highlight_this_color = style->main.highlight_white_color; highlight_this_color = style->main.highlight_white_color;
} }
else{ else{
@ -6132,8 +6132,8 @@ draw_file_loaded(View *view, i32_Rect rect, b32 is_active, Render_Target *target
if (ind == view->edit_pos->mark && prev_ind != ind){ if (ind == view->edit_pos->mark && prev_ind != ind){
draw_rectangle_outline(target, char_rect, mark_color); draw_rectangle_outline(target, char_rect, mark_color);
} }
if (item->glyphid != 0){ if (item->codepoint != 0){
font_draw_glyph(target, font_id, (u8)item->glyphid, item->x0, item->y0, char_color); font_draw_glyph(target, font_id, item->codepoint, item->x0, item->y0, char_color);
} }
prev_ind = ind; prev_ind = ind;
} }
@ -6396,13 +6396,15 @@ draw_button(GUI_Target *gui_target, Render_Target *target, View *view, Font_ID f
} }
internal void internal void
draw_style_preview(GUI_Target *gui_target, Render_Target *target, View *view, Font_ID font_id, i32_Rect rect, GUI_id id, Style *style){ draw_style_preview(System_Functions *system, GUI_Target *gui_target, Render_Target *target, View *view, Font_ID font_id, i32_Rect rect, GUI_id id, Style *style){
Models *models = view->persistent.models; AllowLocal(models); Models *models = view->persistent.models; AllowLocal(models);
i32 active_level = gui_active_level(gui_target, id); i32 active_level = gui_active_level(gui_target, id);
//Font_Info *info = get_font_info(models->font_set, font_id); //Font_Info *info = get_font_info(models->font_set, font_id);
String font_name = {0}; char font_name_space[256];
Render_Font *font = 0; String font_name = make_fixed_width_string(font_name_space);
font_name.size = system->font.get_name_by_id(font_id, font_name.str, font_name.memory_size);
Render_Font *font = system->font.get_render_data_by_id(font_id);
i32_Rect inner = get_inner_rect(rect, 3); i32_Rect inner = get_inner_rect(rect, 3);
@ -6424,7 +6426,7 @@ draw_style_preview(GUI_Target *gui_target, Render_Target *target, View *view, Fo
draw_string(target, font_id, font_name, font_x, y, text_color); draw_string(target, font_id, font_name, font_x, y, text_color);
} }
i32 height = font->height; i32 height = font_get_height(font);
x = inner.x0; x = inner.x0;
y += height; y += height;
x = ceil32(draw_string(target, font_id, "if", x, y, keyword_color)); x = ceil32(draw_string(target, font_id, "if", x, y, keyword_color));
@ -6441,9 +6443,7 @@ draw_style_preview(GUI_Target *gui_target, Render_Target *target, View *view, Fo
} }
internal i32 internal i32
do_render_file_view(System_Functions *system, View *view, GUI_Scroll_Vars *scroll, do_render_file_view(System_Functions *system, View *view, GUI_Scroll_Vars *scroll, View *active, i32_Rect rect, b32 is_active, Render_Target *target, Input_Summary *user_input){
View *active, i32_Rect rect, b32 is_active,
Render_Target *target, Input_Summary *user_input){
Editing_File *file = view->file_data.file; Editing_File *file = view->file_data.file;
i32 result = 0; i32 result = 0;
@ -6488,7 +6488,7 @@ do_render_file_view(System_Functions *system, View *view, GUI_Scroll_Vars *scrol
case guicom_file: case guicom_file:
{ {
if (file_is_ready(file)){ if (file_is_ready(file)){
result = draw_file_loaded(view, gui_session.rect, is_active, target); result = draw_file_loaded(system, view, gui_session.rect, is_active, target);
} }
}break; }break;
@ -6551,7 +6551,7 @@ do_render_file_view(System_Functions *system, View *view, GUI_Scroll_Vars *scrol
i32 style_index = *(i32*)(b + 1); i32 style_index = *(i32*)(b + 1);
Style *style = get_style(view->persistent.models, style_index); Style *style = get_style(view->persistent.models, style_index);
draw_style_preview(gui_target, target, view, font_id, gui_session.rect, b->id, style); draw_style_preview(system, gui_target, target, view, font_id, gui_session.rect, b->id, style);
}break; }break;
case guicom_fixed_option: case guicom_fixed_option:

View File

@ -45,7 +45,7 @@ struct Render_Piece_Glyph{
Vec2 pos; Vec2 pos;
u32 color; u32 color;
Font_ID font_id; Font_ID font_id;
u8 character; u32 codepoint;
}; };
struct Render_Piece_Glyph_Advance{ struct Render_Piece_Glyph_Advance{
@ -53,7 +53,7 @@ struct Render_Piece_Glyph_Advance{
u32 color; u32 color;
f32 advance; f32 advance;
Font_ID font_id; Font_ID font_id;
u8 character; u32 codepoint;
}; };
struct Render_Piece_Change_Clip{ struct Render_Piece_Change_Clip{

View File

@ -113,25 +113,20 @@ font_predict_size(i32 pt_size){
} }
internal void internal void
font_draw_glyph(Render_Target *target, Font_ID font_id, i32 type, u8 character, f32 x, f32 y, u32 color){ font_draw_glyph(Render_Target *target, Font_ID font_id, i32 type, u32 codepoint, f32 x, f32 y, u32 color){
#if 0
Render_Piece_Combined piece; Render_Piece_Combined piece;
piece.header.type = type; piece.header.type = type;
piece.glyph.pos.x = x; piece.glyph.pos.x = x;
piece.glyph.pos.y = y; piece.glyph.pos.y = y;
piece.glyph.color = color; piece.glyph.color = color;
piece.glyph.font_id = font_id; piece.glyph.font_id = font_id;
piece.glyph.character = character; piece.glyph.codepoint = codepoint;
target->push_piece(target, piece); target->push_piece(target, piece);
font_set_use(&target->font_set, font_id);
#endif
} }
internal void internal void
font_draw_glyph(Render_Target *target, Font_ID font_id, u8 character, f32 x, f32 y, u32 color){ font_draw_glyph(Render_Target *target, Font_ID font_id, u32 codepoint, f32 x, f32 y, u32 color){
font_draw_glyph(target, font_id, piece_type_glyph, character, x, y, color); font_draw_glyph(target, font_id, piece_type_glyph, codepoint, x, y, color);
} }
internal f32 internal f32

View File

@ -9,15 +9,21 @@
// TOP // TOP
#if !defined(FCODER_SYSTEM_INTERFACE_H)
#define FCODER_SYSTEM_INTERFACE_H
#include "font/4coder_font_interface.h"
// types
struct Plat_Handle{ struct Plat_Handle{
u32 d[4]; u32 d[4];
}; };
static Plat_Handle null_plat_handle = {0}; static Plat_Handle null_plat_handle = {0};
inline int32_t inline b32
handle_equal(Plat_Handle a, Plat_Handle b){ handle_equal(Plat_Handle a, Plat_Handle b){
int32_t result = (memcmp(&a, &b, sizeof(a)) == 0); b32 result = (memcmp(&a, &b, sizeof(a)) == 0);
return(result); return(result);
} }
@ -233,6 +239,8 @@ typedef Sys_Send_Exit_Signal_Sig(System_Send_Exit_Signal);
typedef INTERNAL_Sys_Get_Thread_States_Sig(INTERNAL_System_Get_Thread_States); typedef INTERNAL_Sys_Get_Thread_States_Sig(INTERNAL_System_Get_Thread_States);
struct System_Functions{ struct System_Functions{
Font_Functions font;
// files (tracked api): 10 // files (tracked api): 10
System_Set_File_List *set_file_list; System_Set_File_List *set_file_list;
System_Get_Canonical *get_canonical; System_Get_Canonical *get_canonical;
@ -287,5 +295,7 @@ struct System_Functions{
INTERNAL_System_Get_Thread_States *internal_get_thread_states; INTERNAL_System_Get_Thread_States *internal_get_thread_states;
}; };
#endif
// BOTTOM // BOTTOM

View File

@ -9,6 +9,8 @@
// TOP // TOP
#include "font/4coder_font_data.h"
// //
// Standard implementation of file system stuff based on the file track layer. // Standard implementation of file system stuff based on the file track layer.
// //
@ -181,8 +183,7 @@ internal void
sysshared_partition_grow(Partition *part, i32 new_size){ sysshared_partition_grow(Partition *part, i32 new_size){
void *data = 0; void *data = 0;
if (new_size > part->max){ if (new_size > part->max){
// TODO(allen): attempt to grow in place by just // TODO(allen): attempt to grow in place by just acquiring next vpages?!
// acquiring next vpages?!
data = system_get_memory(new_size); data = system_get_memory(new_size);
memcpy(data, part->base, part->pos); memcpy(data, part->base, part->pos);
system_free_memory(part->base); system_free_memory(part->base);
@ -420,8 +421,7 @@ get_exact_render_quad(Glyph_Bounds *b, i32 pw, i32 ph, float xpos, float ypos){
} }
inline void inline void
private_draw_glyph(Render_Target *target, Render_Font *font, u32 character, f32 x, f32 y, u32 color){ private_draw_glyph(Render_Target *target, Render_Font *font, u32 codepoint, f32 x, f32 y, u32 color){
#if 0 #if 0
Glyph_Data glyph = {0}; Glyph_Data glyph = {0};
if (get_codepoint_glyph_data(font, character, &glyph)){ if (get_codepoint_glyph_data(font, character, &glyph)){
@ -439,12 +439,10 @@ private_draw_glyph(Render_Target *target, Render_Font *font, u32 character, f32
glEnd(); glEnd();
} }
#endif #endif
} }
inline void inline void
private_draw_glyph_mono(Render_Target *target, Render_Font *font, u8 character, f32 x, f32 y, f32 advance, u32 color){ private_draw_glyph_mono(Render_Target *target, Render_Font *font, u32 codepoint, f32 x, f32 y, f32 advance, u32 color){
#if 0 #if 0
Glyph_Data glyph = {0}; Glyph_Data glyph = {0};
if (get_codepoint_glyph_data(font, character, &glyph)){ if (get_codepoint_glyph_data(font, character, &glyph)){
@ -473,8 +471,9 @@ private_draw_glyph_mono(Render_Target *target, Render_Font *font, u8 character,
} }
inline void inline void
private_draw_glyph_mono(Render_Target *target, Render_Font *font, u8 character, f32 x, f32 y, u32 color){ private_draw_glyph_mono(Render_Target *target, Render_Font *font, u32 character, f32 x, f32 y, u32 color){
private_draw_glyph_mono(target, font, character, x, y, (f32)font->advance, color); f32 advance = (f32)font_get_advance(font);
private_draw_glyph_mono(target, font, character, x, y, advance, color);
} }
internal void internal void
@ -561,14 +560,16 @@ launch_rendering(Render_Target *target){
#define internal static #define internal static
internal void internal void
font_load_freetype_page_inner(Partition *part, Render_Font *font, FT_Library ft, FT_Face face, b32 use_hinting, Glyph_Page *page, u32 page_number, i32 tab_width){ font_load_freetype_page_inner(Partition *part, Render_Font *font, FT_Library ft, FT_Face face, b32 use_hinting, Layout_Page *layout_page, u32 page_number, i32 tab_width){
Temp_Memory temp = begin_temp_memory(part); Temp_Memory temp = begin_temp_memory(part);
Assert(page != 0); Assert(layout_page != 0);
page->page_number = page_number; layout_page->page_number = page_number;
Glyph_Page *glyph_page = (Glyph_Page*)(layout_page + 1);
// prepare to read glyphs into a temporary texture buffer // prepare to read glyphs into a temporary texture buffer
i32 max_glyph_w = face->size->metrics.x_ppem; i32 max_glyph_w = face->size->metrics.x_ppem;
i32 max_glyph_h = font->height; i32 max_glyph_h = font_get_height(font);
i32 tex_width = 64; i32 tex_width = 64;
i32 tex_height = 0; i32 tex_height = 0;
@ -599,10 +600,10 @@ font_load_freetype_page_inner(Partition *part, Render_Font *font, FT_Library ft,
// fill the texture // fill the texture
u32 base_codepoint = (page_number << 8); u32 base_codepoint = (page_number << 8);
Glyph_Bounds *glyphs = &page->glyphs[0]; Glyph_Bounds *glyphs = &glyph_page->glyphs[0];
Glyph_Bounds *glyph_ptr = glyphs; Glyph_Bounds *glyph_ptr = glyphs;
f32 *advances = &page->advance[0]; f32 *advances = &layout_page->advance[0];
f32 *advance_ptr = advances; f32 *advance_ptr = advances;
for(u32 i = 0; i < ITEM_PER_FONT_PAGE; ++i, ++glyph_ptr, ++advance_ptr){ for(u32 i = 0; i < ITEM_PER_FONT_PAGE; ++i, ++glyph_ptr, ++advance_ptr){
u32 codepoint = i + base_codepoint; u32 codepoint = i + base_codepoint;
@ -611,6 +612,8 @@ font_load_freetype_page_inner(Partition *part, Render_Font *font, FT_Library ft,
i32 w = face->glyph->bitmap.width; i32 w = face->glyph->bitmap.width;
i32 h = face->glyph->bitmap.rows; i32 h = face->glyph->bitmap.rows;
i32 ascent = font_get_ascent(font);
// move to next line if necessary // move to next line if necessary
if(pen_x + w >= tex_width){ if(pen_x + w >= tex_width){
pen_x = 0; pen_x = 0;
@ -624,7 +627,7 @@ font_load_freetype_page_inner(Partition *part, Render_Font *font, FT_Library ft,
glyph_ptr->y1 = (f32)(pen_y + h + 1); glyph_ptr->y1 = (f32)(pen_y + h + 1);
glyph_ptr->xoff = (f32)(face->glyph->bitmap_left); glyph_ptr->xoff = (f32)(face->glyph->bitmap_left);
glyph_ptr->yoff = (f32)(font->ascent - face->glyph->bitmap_top); glyph_ptr->yoff = (f32)(ascent - face->glyph->bitmap_top);
glyph_ptr->xoff2 = glyph_ptr->xoff + w; glyph_ptr->xoff2 = glyph_ptr->xoff + w;
glyph_ptr->yoff2 = glyph_ptr->yoff + h + 1; glyph_ptr->yoff2 = glyph_ptr->yoff + h + 1;
@ -649,8 +652,8 @@ font_load_freetype_page_inner(Partition *part, Render_Font *font, FT_Library ft,
// upload texture // upload texture
tex_height = round_up_pot_u32(pen_y + max_glyph_h + 2); tex_height = round_up_pot_u32(pen_y + max_glyph_h + 2);
page->tex_width = tex_width; glyph_page->tex_width = tex_width;
page->tex_height = tex_height; glyph_page->tex_height = tex_height;
u32 tex; u32 tex;
glGenTextures(1, &tex); glGenTextures(1, &tex);
@ -665,8 +668,7 @@ font_load_freetype_page_inner(Partition *part, Render_Font *font, FT_Library ft,
glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, tex_width, tex_height, 0, GL_ALPHA, GL_UNSIGNED_INT, pixels); glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, tex_width, tex_height, 0, GL_ALPHA, GL_UNSIGNED_INT, pixels);
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
page->tex = tex; glyph_page->tex = tex;
page->page_number = page_number;
end_temp_memory(temp); end_temp_memory(temp);

View File

@ -336,6 +336,12 @@ struct Buffer_Model_Step{
u32 byte_length; u32 byte_length;
}; };
struct Buffer_Model_Behavior{
b32 do_newline;
b32 do_codepoint_advance;
b32 do_number_advance;
};
enum{ enum{
BufferModelUnit_None, BufferModelUnit_None,
BufferModelUnit_Codepoint, BufferModelUnit_Codepoint,
@ -349,26 +355,23 @@ struct Buffer_Translating_State{
u32 fill_expected; u32 fill_expected;
u32 byte_class; u32 byte_class;
b32 emit_type; u32 emit_type;
b32 rebuffer_current; b32 rebuffer_current;
b32 emit_current_as_cp; b32 emit_current_as_cp;
Buffer_Model_Step steps[5];
Buffer_Model_Step step_current;
u32 step_count;
u32 step_j;
u32 codepoint; u32 codepoint;
u32 codepoint_length; u32 codepoint_length;
b32 do_codepoint; b32 do_codepoint;
b32 do_numbers; b32 do_numbers;
b32 do_newline;
b32 do_codepoint_advance;
b32 do_number_advance;
}; };
global_const Buffer_Translating_State null_buffer_translating_state = {0}; global_const Buffer_Translating_State null_buffer_translating_state = {0};
struct Buffer_Translating_Emits{
Buffer_Model_Step steps[5];
Buffer_Model_Step step_current;
u32 step_count;
};
internal void internal void
translating_consume_byte(Buffer_Translating_State *tran, u8 ch, u32 i, u32 size){ translating_consume_byte(Buffer_Translating_State *tran, u8 ch, u32 i, u32 size){
tran->byte_class = 0; tran->byte_class = 0;
@ -433,7 +436,10 @@ translating_consume_byte(Buffer_Translating_State *tran, u8 ch, u32 i, u32 size)
if (tran->emit_type == BufferModelUnit_None && i+1 == size){ if (tran->emit_type == BufferModelUnit_None && i+1 == size){
tran->emit_type = BufferModelUnit_Numbers; tran->emit_type = BufferModelUnit_Numbers;
} }
}
internal void
translating_select_emit_type(Buffer_Translating_State *tran){
tran->codepoint = 0; tran->codepoint = 0;
tran->codepoint_length = 0; tran->codepoint_length = 0;
tran->do_codepoint = false; tran->do_codepoint = false;
@ -452,23 +458,26 @@ translating_consume_byte(Buffer_Translating_State *tran, u8 ch, u32 i, u32 size)
} }
Assert((tran->do_codepoint + tran->do_numbers) <= 1); Assert((tran->do_codepoint + tran->do_numbers) <= 1);
}
tran->step_count = 0;
internal void
translating_generate_emits(Buffer_Translating_State *tran, u8 ch, u32 i, Buffer_Translating_Emits *emits_out){
emits_out->step_count = 0;
if (tran->do_codepoint){ if (tran->do_codepoint){
tran->steps[0].type = 1; emits_out->steps[0].type = 1;
tran->steps[0].value = tran->codepoint; emits_out->steps[0].value = tran->codepoint;
tran->steps[0].i = tran->fill_start_i; emits_out->steps[0].i = tran->fill_start_i;
tran->steps[0].byte_length = tran->codepoint_length; emits_out->steps[0].byte_length = tran->codepoint_length;
tran->step_count = 1; emits_out->step_count = 1;
} }
else if (tran->do_numbers){ else if (tran->do_numbers){
for (u32 j = 0; j < tran->fill_i; ++j){ for (u32 j = 0; j < tran->fill_i; ++j){
tran->steps[j].type = 0; emits_out->steps[j].type = 0;
tran->steps[j].value = tran->fill_buffer[j]; emits_out->steps[j].value = tran->fill_buffer[j];
tran->steps[j].i = tran->fill_start_i + j; emits_out->steps[j].i = tran->fill_start_i + j;
tran->steps[j].byte_length = 1; emits_out->steps[j].byte_length = 1;
} }
tran->step_count = tran->fill_i; emits_out->step_count = tran->fill_i;
} }
if (tran->do_codepoint || tran->do_numbers){ if (tran->do_codepoint || tran->do_numbers){
@ -488,39 +497,52 @@ translating_consume_byte(Buffer_Translating_State *tran, u8 ch, u32 i, u32 size)
else if (tran->emit_current_as_cp){ else if (tran->emit_current_as_cp){
Assert(tran->do_codepoint || tran->do_numbers); Assert(tran->do_codepoint || tran->do_numbers);
tran->steps[tran->step_count].type = 1; emits_out->steps[emits_out->step_count].type = 1;
tran->steps[tran->step_count].value = ch; emits_out->steps[emits_out->step_count].value = ch;
tran->steps[tran->step_count].i = i; emits_out->steps[emits_out->step_count].i = i;
tran->steps[tran->step_count].byte_length = 1; emits_out->steps[emits_out->step_count].byte_length = 1;
++tran->step_count; ++emits_out->step_count;
} }
} }
internal void internal void
translation_step_read(Buffer_Translating_State *tran){ translating_fully_process_byte(Buffer_Translating_State *tran, u8 ch, u32 i, u32 size, Buffer_Translating_Emits *emits_out){
tran->do_newline = false; translating_consume_byte(tran, ch, i, size);
tran->do_codepoint_advance = false; translating_select_emit_type(tran);
tran->do_number_advance = false; translating_generate_emits(tran, ch, i, emits_out);
if (tran->step_current.type == 1){ }
switch (tran->step_current.value){
internal void
translation_step_read(Buffer_Model_Step step, Buffer_Model_Behavior *behavior_out){
behavior_out->do_newline = false;
behavior_out->do_codepoint_advance = false;
behavior_out->do_number_advance = false;
if (step.type == 1){
switch (step.value){
case '\n': case '\n':
{ {
tran->do_newline = true; behavior_out->do_newline = true;
}break; }break;
default: default:
{ {
tran->do_codepoint_advance = true; behavior_out->do_codepoint_advance = true;
}break; }break;
} }
} }
else{ else{
tran->do_number_advance = true; behavior_out->do_number_advance = true;
} }
} }
#define TRANSLATION_OUTPUT(t) (t)->step_j = 0; (t)->step_j < (t)->step_count; ++(t)->step_j #define TRANSLATION_DECL_OUTPUT(_j,_emit) u32 _j = 0; _j < (_emit).step_count; ++_j
#define TRANSLATION_GET_STEP(t) (t)->step_current = (t)->steps[(t)->step_j]; translation_step_read(t) #define TRANSLATION_DECL_GET_STEP(_step,_behav,_j,_emit) \
Buffer_Model_Step _step = _emit.steps[_j]; Buffer_Model_Behavior _behav; \
translation_step_read(_step, &_behav)
#define TRANSLATION_OUTPUT(_j,_emit) _j = 0; _j < (_emit).step_count; ++_j
#define TRANSLATION_GET_STEP(_step,_behav,_j,_emit)\
(_step) = _emit.steps[_j]; translation_step_read((_step), &(_behav))
// //
// Implementation of the gap buffer // Implementation of the gap buffer
@ -935,6 +957,7 @@ buffer_measure_character_starts(Gap_Buffer *buffer, i32 *character_starts, i32 m
} }
Buffer_Translating_State tran = {0}; Buffer_Translating_State tran = {0};
Buffer_Translating_Emits emits = {0};
stream.use_termination_character = 1; stream.use_termination_character = 1;
stream.terminator = '\n'; stream.terminator = '\n';
@ -944,19 +967,19 @@ buffer_measure_character_starts(Gap_Buffer *buffer, i32 *character_starts, i32 m
for (; i < stream.end; ++i){ for (; i < stream.end; ++i){
u8 ch = (u8)stream.data[i]; u8 ch = (u8)stream.data[i];
translating_consume_byte(&tran, ch, i, size); translating_fully_process_byte(&tran, ch, i, size, &emits);
for (TRANSLATION_OUTPUT(&tran)){ for (TRANSLATION_DECL_OUTPUT(J, emits)){
TRANSLATION_GET_STEP(&tran); TRANSLATION_DECL_GET_STEP(step, behavior, J, emits);
if (tran.do_newline){ if (behavior.do_newline){
++character_index; ++character_index;
character_starts[line_index++] = character_index; character_starts[line_index++] = character_index;
if (virtual_white){ if (virtual_white){
skipping_whitespace = 1; skipping_whitespace = 1;
} }
} }
else if (tran.do_codepoint_advance || tran.do_number_advance){ else if (behavior.do_codepoint_advance || behavior.do_number_advance){
if (ch != ' ' && ch != '\t'){ if (ch != ' ' && ch != '\t'){
skipping_whitespace = 0; skipping_whitespace = 0;
} }
@ -1014,9 +1037,11 @@ struct Buffer_Measure_Wrap_State{
b32 did_wrap; b32 did_wrap;
b32 first_of_the_line; b32 first_of_the_line;
u8 ch;
Buffer_Translating_State tran; Buffer_Translating_State tran;
Buffer_Translating_Emits emits;
u32 J;
Buffer_Model_Step step;
Buffer_Model_Behavior behavior;
i32 __pc__; i32 __pc__;
}; };
@ -1060,18 +1085,20 @@ buffer_measure_wrap_y(Buffer_Measure_Wrap_State *S_ptr, Buffer_Measure_Wrap_Para
S.still_looping = 0; S.still_looping = 0;
do{ do{
for (; S.i < S.stream.end; ++S.i){ for (; S.i < S.stream.end; ++S.i){
S.ch = (u8)S.stream.data[S.i]; {
u8 ch = (u8)S.stream.data[S.i];
if (S.ch != ' ' && S.ch != '\t'){
S.skipping_whitespace = false; if (ch != ' ' && ch != '\t'){
S.skipping_whitespace = false;
}
translating_fully_process_byte(&S.tran, ch, S.i, S.size, &S.emits);
} }
translating_consume_byte(&S.tran, S.ch, S.i, S.size); for (TRANSLATION_OUTPUT(S.J, S.emits)){
TRANSLATION_GET_STEP(S.step, S.behavior, S.J, S.emits);
for (TRANSLATION_OUTPUT(&S.tran)){
TRANSLATION_GET_STEP(&S.tran);
if (S.tran.do_newline){ if (S.behavior.do_newline){
++S.current_wrap_index; ++S.current_wrap_index;
params.wrap_line_index[S.line_index++] = S.current_wrap_index; params.wrap_line_index[S.line_index++] = S.current_wrap_index;
@ -1090,13 +1117,13 @@ buffer_measure_wrap_y(Buffer_Measure_Wrap_State *S_ptr, Buffer_Measure_Wrap_Para
} }
S.first_of_the_line = 1; S.first_of_the_line = 1;
} }
else if (S.tran.do_number_advance || S.tran.do_codepoint_advance){ else if (S.behavior.do_number_advance || S.behavior.do_codepoint_advance){
if (!S.skipping_whitespace){ if (!S.skipping_whitespace){
S.current_adv = 2.f; S.current_adv = 2.f;
#if 0 #if 0
if (S.tran.do_codepoint_advance){ if (S.behavior.do_codepoint_advance){
S.current_adv = get_codepoint_advance(params.font, S.tran.step_current.value); S.current_adv = get_codepoint_advance(params.font, S.tran.step_current.value);
} }
else{ else{
@ -1271,6 +1298,7 @@ buffer_remeasure_character_starts(Gap_Buffer *buffer, i32 line_start, i32 line_e
// Translation // Translation
Buffer_Translating_State tran = {0}; Buffer_Translating_State tran = {0};
Buffer_Translating_Emits emits = {0};
stream.use_termination_character = 1; stream.use_termination_character = 1;
stream.terminator = '\n'; stream.terminator = '\n';
@ -1279,12 +1307,12 @@ buffer_remeasure_character_starts(Gap_Buffer *buffer, i32 line_start, i32 line_e
do{ do{
for (; char_i < stream.end; ++char_i){ for (; char_i < stream.end; ++char_i){
u8 ch = (u8)stream.data[char_i]; u8 ch = (u8)stream.data[char_i];
translating_consume_byte(&tran, ch, char_i, size); translating_fully_process_byte(&tran, ch, char_i, size, &emits);
for (TRANSLATION_OUTPUT(&tran)){ for (TRANSLATION_DECL_OUTPUT(J, emits)){
TRANSLATION_GET_STEP(&tran); TRANSLATION_DECL_GET_STEP(step, behavior, J, emits);
if (tran.do_newline){ if (behavior.do_newline){
character_starts[line_i++] = last_char_start; character_starts[line_i++] = last_char_start;
++current_char_start; ++current_char_start;
last_char_start = current_char_start; last_char_start = current_char_start;
@ -1296,7 +1324,7 @@ buffer_remeasure_character_starts(Gap_Buffer *buffer, i32 line_start, i32 line_e
goto buffer_remeasure_character_starts_end; goto buffer_remeasure_character_starts_end;
} }
} }
else if (tran.do_codepoint_advance || tran.do_number_advance){ else if (behavior.do_codepoint_advance || behavior.do_number_advance){
if (ch != ' ' && ch != '\t'){ if (ch != ' ' && ch != '\t'){
skipping_whitespace = 0; skipping_whitespace = 0;
} }
@ -1565,9 +1593,15 @@ struct Buffer_Cursor_Seek_State{
b32 first_of_the_line; b32 first_of_the_line;
b32 xy_seek; b32 xy_seek;
f32 ch_width; f32 ch_width;
u8 ch;
i32 font_height;
Buffer_Translating_State tran; Buffer_Translating_State tran;
Buffer_Translating_Emits emits;
u32 J;
Buffer_Model_Step step;
Buffer_Model_Behavior behavior;
i32 __pc__; i32 __pc__;
}; };
@ -1589,6 +1623,8 @@ buffer_cursor_seek(Buffer_Cursor_Seek_State *S_ptr, Buffer_Cursor_Seek_Params pa
DrCase(4); DrCase(4);
} }
S.font_height = font_get_height(params.font);
S.xy_seek = (params.seek.type == buffer_seek_wrapped_xy || params.seek.type == buffer_seek_unwrapped_xy); S.xy_seek = (params.seek.type == buffer_seek_wrapped_xy || params.seek.type == buffer_seek_unwrapped_xy);
S.size = buffer_size(params.buffer); S.size = buffer_size(params.buffer);
@ -1630,7 +1666,7 @@ buffer_cursor_seek(Buffer_Cursor_Seek_State *S_ptr, Buffer_Cursor_Seek_Params pa
case buffer_seek_unwrapped_xy: case buffer_seek_unwrapped_xy:
{ {
line_index = (i32)(params.seek.y / params.font->height); line_index = (i32)(params.seek.y / S.font_height);
if (line_index >= params.buffer->line_count){ if (line_index >= params.buffer->line_count){
line_index = params.buffer->line_count - 1; line_index = params.buffer->line_count - 1;
} }
@ -1641,7 +1677,7 @@ buffer_cursor_seek(Buffer_Cursor_Seek_State *S_ptr, Buffer_Cursor_Seek_Params pa
case buffer_seek_wrapped_xy: case buffer_seek_wrapped_xy:
{ {
line_index = buffer_get_line_index_from_wrapped_y(params.wrap_line_index, params.seek.y, params.font->height, 0, params.buffer->line_count); line_index = buffer_get_line_index_from_wrapped_y(params.wrap_line_index, params.seek.y, S.font_height, 0, params.buffer->line_count);
}break; }break;
default: InvalidCodePath; default: InvalidCodePath;
@ -1653,9 +1689,9 @@ buffer_cursor_seek(Buffer_Cursor_Seek_State *S_ptr, Buffer_Cursor_Seek_Params pa
S.next_cursor.line = line_index + 1; S.next_cursor.line = line_index + 1;
S.next_cursor.character = 1; S.next_cursor.character = 1;
S.next_cursor.wrap_line = params.wrap_line_index[line_index] + 1; S.next_cursor.wrap_line = params.wrap_line_index[line_index] + 1;
S.next_cursor.unwrapped_y = (f32)(line_index * params.font->height); S.next_cursor.unwrapped_y = (f32)(line_index * S.font_height);
S.next_cursor.unwrapped_x = 0; S.next_cursor.unwrapped_x = 0;
S.next_cursor.wrapped_y = (f32)(params.wrap_line_index[line_index] * params.font->height); S.next_cursor.wrapped_y = (f32)(params.wrap_line_index[line_index] * S.font_height);
S.next_cursor.wrapped_x = 0; S.next_cursor.wrapped_x = 0;
} }
@ -1676,9 +1712,9 @@ buffer_cursor_seek(Buffer_Cursor_Seek_State *S_ptr, Buffer_Cursor_Seek_Params pa
if (buffer_stringify_loop(&S.stream, params.buffer, S.next_cursor.pos, S.size)){ if (buffer_stringify_loop(&S.stream, params.buffer, S.next_cursor.pos, S.size)){
do{ do{
for (; S.next_cursor.pos < S.stream.end; ++S.next_cursor.pos){ for (; S.next_cursor.pos < S.stream.end; ++S.next_cursor.pos){
S.ch = (u8)S.stream.data[S.next_cursor.pos]; u8 ch = (u8)S.stream.data[S.next_cursor.pos];
if (S.ch != ' ' && S.ch != '\t'){ if (ch != ' ' && ch != '\t'){
goto double_break_vwhite; goto double_break_vwhite;
} }
else{ else{
@ -1752,22 +1788,23 @@ buffer_cursor_seek(Buffer_Cursor_Seek_State *S_ptr, Buffer_Cursor_Seek_Params pa
S.still_looping = 0; S.still_looping = 0;
do{ do{
for (; S.i < S.stream.end; ++S.i){ for (; S.i < S.stream.end; ++S.i){
S.ch = (u8)S.stream.data[S.i]; {
u8 ch = (u8)S.stream.data[S.i];
translating_fully_process_byte(&S.tran, ch, S.i, S.size, &S.emits);
}
translating_consume_byte(&S.tran, S.ch, S.i, S.size); for (TRANSLATION_OUTPUT(S.J, S.emits)){
TRANSLATION_GET_STEP(S.step, S.behavior, S.J, S.emits);
for (TRANSLATION_OUTPUT(&S.tran)){
TRANSLATION_GET_STEP(&S.tran);
S.prev_cursor = S.this_cursor; S.prev_cursor = S.this_cursor;
S.this_cursor = S.next_cursor; S.this_cursor = S.next_cursor;
if (S.tran.do_newline){ if (S.behavior.do_newline){
++S.next_cursor.character_pos; ++S.next_cursor.character_pos;
++S.next_cursor.line; ++S.next_cursor.line;
++S.next_cursor.wrap_line; ++S.next_cursor.wrap_line;
S.next_cursor.unwrapped_y += params.font->height; S.next_cursor.unwrapped_y += S.font_height;
S.next_cursor.wrapped_y += params.font->height; S.next_cursor.wrapped_y += S.font_height;
S.next_cursor.character = 1; S.next_cursor.character = 1;
S.next_cursor.unwrapped_x = 0; S.next_cursor.unwrapped_x = 0;
@ -1781,7 +1818,7 @@ buffer_cursor_seek(Buffer_Cursor_Seek_State *S_ptr, Buffer_Cursor_Seek_Params pa
S.next_cursor.wrapped_x = line_shift; S.next_cursor.wrapped_x = line_shift;
S.first_of_the_line = 1; S.first_of_the_line = 1;
} }
else if (S.tran.do_number_advance || S.tran.do_codepoint_advance){ else if (S.behavior.do_number_advance || S.behavior.do_codepoint_advance){
S.ch_width = 2.f; S.ch_width = 2.f;
@ -1794,18 +1831,18 @@ buffer_cursor_seek(Buffer_Cursor_Seek_State *S_ptr, Buffer_Cursor_Seek_Params pa
} }
#endif #endif
if (S.tran.step_current.i >= S.wrap_unit_end){ if (S.step.i >= S.wrap_unit_end){
S_stop.status = BLStatus_NeedWrapDetermination; S_stop.status = BLStatus_NeedWrapDetermination;
S_stop.line_index = S.next_cursor.line-1; S_stop.line_index = S.next_cursor.line-1;
S_stop.wrap_line_index = S.next_cursor.wrap_line-1; S_stop.wrap_line_index = S.next_cursor.wrap_line-1;
S_stop.pos = S.tran.step_current.i; S_stop.pos = S.step.i;
S_stop.x = S.next_cursor.wrapped_x; S_stop.x = S.next_cursor.wrapped_x;
DrYield(4, S_stop); DrYield(4, S_stop);
S.wrap_unit_end = wrap_unit_end; S.wrap_unit_end = wrap_unit_end;
if (do_wrap && !S.first_of_the_line){ if (do_wrap && !S.first_of_the_line){
S.next_cursor.wrapped_y += params.font->height; S.next_cursor.wrapped_y += S.font_height;
++S.next_cursor.wrap_line; ++S.next_cursor.wrap_line;
if (params.virtual_white){ if (params.virtual_white){
@ -1828,7 +1865,7 @@ buffer_cursor_seek(Buffer_Cursor_Seek_State *S_ptr, Buffer_Cursor_Seek_Params pa
S.first_of_the_line = 0; S.first_of_the_line = 0;
} }
S.next_cursor.pos += S.tran.step_current.byte_length; S.next_cursor.pos += S.step.byte_length;
f32 x = 0, px = 0, y = 0, py = 0; f32 x = 0, px = 0, y = 0, py = 0;
switch (params.seek.type){ switch (params.seek.type){
@ -1874,9 +1911,9 @@ buffer_cursor_seek(Buffer_Cursor_Seek_State *S_ptr, Buffer_Cursor_Seek_Params pa
goto buffer_cursor_seek_end; goto buffer_cursor_seek_end;
} }
if (y > params.seek.y - params.font->height && x >= params.seek.x){ if (y > params.seek.y - S.font_height && x >= params.seek.x){
if (!params.seek.round_down){ if (!params.seek.round_down){
if (py >= y && S.ch != '\n' && (params.seek.x - px) < (x - params.seek.x)){ if (py >= y && !S.behavior.do_newline && (params.seek.x - px) < (x - params.seek.x)){
S.this_cursor = S.prev_cursor; S.this_cursor = S.prev_cursor;
} }
goto buffer_cursor_seek_end; goto buffer_cursor_seek_end;
@ -1971,7 +2008,7 @@ enum Buffer_Render_Flag{
typedef struct Buffer_Render_Item{ typedef struct Buffer_Render_Item{
i32 index; i32 index;
u32 glyphid; u32 codepoint;
u32 flags; u32 flags;
f32 x0, y0; f32 x0, y0;
f32 x1, y1; f32 x1, y1;
@ -1981,27 +2018,28 @@ typedef struct Render_Item_Write{
Buffer_Render_Item *item; Buffer_Render_Item *item;
f32 x, y; f32 x, y;
Render_Font *font; Render_Font *font;
i32 font_height;
f32 x_min; f32 x_min;
f32 x_max; f32 x_max;
} Render_Item_Write; } Render_Item_Write;
inline Render_Item_Write inline Render_Item_Write
write_render_item(Render_Item_Write write, i32 index, u32 glyphid, u32 flags){ write_render_item(Render_Item_Write write, i32 index, u32 codepoint, u32 flags){
#if 0 #if 0
f32 ch_width = get_codepoint_advance(write.font, glyphid); f32 ch_width = get_codepoint_advance(write.font, codepoint);
#endif #endif
f32 ch_width = 2.f; f32 ch_width = 2.f;
if (write.x <= write.x_max && write.x + ch_width >= write.x_min){ if (write.x <= write.x_max && write.x + ch_width >= write.x_min){
write.item->index = index; write.item->index = index;
write.item->glyphid = glyphid; write.item->codepoint = codepoint;
write.item->flags = flags; write.item->flags = flags;
write.item->x0 = write.x; write.item->x0 = write.x;
write.item->y0 = write.y; write.item->y0 = write.y;
write.item->x1 = write.x + ch_width; write.item->x1 = write.x + ch_width;
write.item->y1 = write.y + write.font->height; write.item->y1 = write.y + write.font_height;
++write.item; ++write.item;
} }
@ -2041,9 +2079,9 @@ struct Buffer_Render_State{
f32 shift_y; f32 shift_y;
f32 ch_width; f32 ch_width;
u8 ch;
Render_Item_Write write; Render_Item_Write write;
f32 byte_advance;
i32 line; i32 line;
i32 wrap_line; i32 wrap_line;
@ -2052,6 +2090,10 @@ struct Buffer_Render_State{
i32 wrap_unit_end; i32 wrap_unit_end;
Buffer_Translating_State tran; Buffer_Translating_State tran;
Buffer_Translating_Emits emits;
u32 J;
Buffer_Model_Step step;
Buffer_Model_Behavior behavior;
i32 __pc__; i32 __pc__;
}; };
@ -2100,9 +2142,12 @@ buffer_render_data(Buffer_Render_State *S_ptr, Buffer_Render_Params params, f32
S.write.x = S.shift_x + line_shift; S.write.x = S.shift_x + line_shift;
S.write.y = S.shift_y; S.write.y = S.shift_y;
S.write.font = params.font; S.write.font = params.font;
S.write.font_height = font_get_height(params.font);
S.write.x_min = params.port_x; S.write.x_min = params.port_x;
S.write.x_max = params.port_x + params.clip_w; S.write.x_max = params.port_x + params.clip_w;
S.byte_advance = font_get_byte_advance(params.font);
if (params.virtual_white){ if (params.virtual_white){
S.skipping_whitespace = 1; S.skipping_whitespace = 1;
} }
@ -2112,17 +2157,19 @@ buffer_render_data(Buffer_Render_State *S_ptr, Buffer_Render_Params params, f32
if (buffer_stringify_loop(&S.stream, params.buffer, S.i, S.size)){ if (buffer_stringify_loop(&S.stream, params.buffer, S.i, S.size)){
do{ do{
for (; S.i < S.stream.end; ++S.i){ for (; S.i < S.stream.end; ++S.i){
S.ch = (u8)S.stream.data[S.i]; {
translating_consume_byte(&S.tran, S.ch, S.i, S.size); u8 ch = (u8)S.stream.data[S.i];
translating_fully_process_byte(&S.tran, ch, S.i, S.size, &S.emits);
}
for (TRANSLATION_OUTPUT(&S.tran)){ for (TRANSLATION_OUTPUT(S.J, S.emits)){
TRANSLATION_GET_STEP(&S.tran); TRANSLATION_GET_STEP(S.step, S.behavior, S.J, S.emits);
if (!S.tran.do_newline && S.tran.step_current.i >= S.wrap_unit_end){ if (!S.behavior.do_newline && S.step.i >= S.wrap_unit_end){
S_stop.status = BLStatus_NeedWrapDetermination; S_stop.status = BLStatus_NeedWrapDetermination;
S_stop.line_index = S.line; S_stop.line_index = S.line;
S_stop.wrap_line_index = S.wrap_line; S_stop.wrap_line_index = S.wrap_line;
S_stop.pos = S.tran.step_current.i; S_stop.pos = S.step.i;
S_stop.x = S.write.x - S.shift_x; S_stop.x = S.write.x - S.shift_x;
DrYield(4, S_stop); DrYield(4, S_stop);
@ -2142,7 +2189,7 @@ buffer_render_data(Buffer_Render_State *S_ptr, Buffer_Render_Params params, f32
switch (params.wrap_slashes){ switch (params.wrap_slashes){
case WrapIndicator_Show_After_Line: case WrapIndicator_Show_After_Line:
{ {
S.write = write_render_item(S.write, S.tran.step_current.i-1, '\\', BRFlag_Ghost_Character); S.write = write_render_item(S.write, S.step.i-1, '\\', BRFlag_Ghost_Character);
}break; }break;
case WrapIndicator_Show_At_Wrap_Edge: case WrapIndicator_Show_At_Wrap_Edge:
@ -2150,12 +2197,12 @@ buffer_render_data(Buffer_Render_State *S_ptr, Buffer_Render_Params params, f32
if (S.write.x < S.shift_x + params.width){ if (S.write.x < S.shift_x + params.width){
S.write.x = S.shift_x + params.width; S.write.x = S.shift_x + params.width;
} }
S.write = write_render_item(S.write, S.tran.step_current.i-1, '\\', BRFlag_Ghost_Character); S.write = write_render_item(S.write, S.step.i-1, '\\', BRFlag_Ghost_Character);
}break; }break;
} }
S.write.x = S.shift_x + line_shift; S.write.x = S.shift_x + line_shift;
S.write.y += params.font->height; S.write.y += S.write.font_height;
} }
} }
} }
@ -2165,8 +2212,8 @@ buffer_render_data(Buffer_Render_State *S_ptr, Buffer_Render_Params params, f32
} }
S.first_of_the_line = false; S.first_of_the_line = false;
if (S.tran.do_newline){ if (S.behavior.do_newline){
S.write = write_render_item(S.write, S.tran.step_current.i, ' ', 0); S.write = write_render_item(S.write, S.step.i, ' ', 0);
if (params.virtual_white){ if (params.virtual_white){
S_stop.status = BLStatus_NeedLineShift; S_stop.status = BLStatus_NeedLineShift;
@ -2181,18 +2228,18 @@ buffer_render_data(Buffer_Render_State *S_ptr, Buffer_Render_Params params, f32
++S.wrap_line; ++S.wrap_line;
S.write.x = S.shift_x + line_shift; S.write.x = S.shift_x + line_shift;
S.write.y += params.font->height; S.write.y += S.write.font_height;
S.first_of_the_line = true; S.first_of_the_line = true;
} }
else if (S.tran.do_codepoint_advance){ else if (S.behavior.do_codepoint_advance){
u32 n = S.tran.step_current.value; u32 n = S.step.value;
if (n != ' ' && n != '\t'){ if (n != ' ' && n != '\t'){
S.skipping_whitespace = false; S.skipping_whitespace = false;
} }
if (!S.skipping_whitespace){ if (!S.skipping_whitespace){
u32 I = S.tran.step_current.i; u32 I = S.step.i;
switch (n){ switch (n){
case '\r': case '\r':
{ {
@ -2204,7 +2251,6 @@ buffer_render_data(Buffer_Render_State *S_ptr, Buffer_Render_Params params, f32
case '\t': case '\t':
{ {
#if 0 #if 0
S.ch_width = get_codepoint_advance(params.font, '\t'); S.ch_width = get_codepoint_advance(params.font, '\t');
#endif #endif
@ -2222,12 +2268,12 @@ buffer_render_data(Buffer_Render_State *S_ptr, Buffer_Render_Params params, f32
} }
} }
} }
else if (S.tran.do_number_advance){ else if (S.behavior.do_number_advance){
u8 n = (u8)S.tran.step_current.value; u8 n = (u8)S.step.value;
u32 I = S.tran.step_current.i; u32 I = S.step.i;
S.skipping_whitespace = false; S.skipping_whitespace = false;
S.ch_width = params.font->byte_advance; S.ch_width = S.byte_advance;
f32 new_x = S.write.x + S.ch_width; f32 new_x = S.write.x + S.ch_width;
u8 cs[3]; u8 cs[3];
@ -2247,7 +2293,7 @@ buffer_render_data(Buffer_Render_State *S_ptr, Buffer_Render_Params params, f32
S.write.x = new_x; S.write.x = new_x;
} }
if (!S.skipping_whitespace && !S.tran.do_newline){ if (!S.skipping_whitespace && !S.behavior.do_newline){
S.first_of_the_line = false; S.first_of_the_line = false;
} }
} }

View File

@ -12,10 +12,20 @@
#if !defined(FCODER_FONT_DATA_H) #if !defined(FCODER_FONT_DATA_H)
#define FCODER_FONT_DATA_H #define FCODER_FONT_DATA_H
typedef u32 Font_ID;
#define ITEM_PER_FONT_PAGE 256 #define ITEM_PER_FONT_PAGE 256
struct Layout_Page{
u32 page_number;
f32 advance[ITEM_PER_FONT_PAGE];
};
struct Render_Font{
Layout_Page **_layout_pages;
u32 page_count, page_max;
f32 byte_advance;
i32 height, ascent, descent, line_skip, advance;
};
struct Glyph_Bounds{ struct Glyph_Bounds{
f32 x0, x1; f32 x0, x1;
f32 y0, y1; f32 y0, y1;
@ -31,24 +41,9 @@ struct Glyph_Data{
}; };
struct Glyph_Page{ struct Glyph_Page{
u32 page_number;
u32 tex; u32 tex;
i32 tex_width, tex_height; i32 tex_width, tex_height;
Glyph_Bounds glyphs[ITEM_PER_FONT_PAGE]; Glyph_Bounds glyphs[ITEM_PER_FONT_PAGE];
f32 advance[ITEM_PER_FONT_PAGE];
};
struct Render_Font{
char name_[24];
String name;
b32 loaded;
Glyph_Page **pages;
u32 page_count, page_max;
f32 byte_advance;
i32 height, ascent, descent, line_skip;
i32 advance;
}; };
#endif #endif

View File

@ -0,0 +1,53 @@
/*
* Mr. 4th Dimention - Allen Webster
*
* 11.03.2017
*
* Font system interface.
*
*/
// TOP
#if !defined(FCODER_FONT_INTERFACE_H)
#define FCODER_FONT_INTERFACE_H
typedef u32 Font_ID;
struct Render_Font;
#define Sys_Font_Get_Count_Sig(name_) u32 (name_)(void)
typedef Sys_Font_Get_Count_Sig(Font_Get_Count_Function);
#define Sys_Font_Get_IDs_By_Index_Sig(name_) b32 (name_)(u32 first_index, u32 index_count, u32 *id_out)
typedef Sys_Font_Get_IDs_By_Index_Sig(Font_Get_IDs_By_Index_Function);
#define Sys_Font_Get_Name_By_Index_Sig(name_) u32 (name_)(u32 font_index, char *str_out, u32 str_out_cap)
typedef Sys_Font_Get_Name_By_Index_Sig(Font_Get_Name_By_Index_Function);
#define Sys_Font_Get_Name_By_ID_Sig(name_) u32 (name_)(u32 font_index, char *str_out, u32 str_out_cap)
typedef Sys_Font_Get_Name_By_ID_Sig(Font_Get_Name_By_ID_Function);
#define Sys_Font_Get_Render_Data_By_ID_Sig(name_) Render_Font* (name_)(u32 font_id)
typedef Sys_Font_Get_Render_Data_By_ID_Sig(Font_Get_Render_Data_By_ID_Function);
struct Font_Functions{
Font_Get_Count_Function *get_count;
Font_Get_IDs_By_Index_Function *get_ids_by_index;
Font_Get_Name_By_Index_Function *get_name_by_index;
Font_Get_Name_By_ID_Function *get_name_by_id;
Font_Get_Render_Data_By_ID_Function *get_render_data_by_id;
};
internal f32 font_get_byte_advance(Render_Font *font);
internal i32 font_get_height(Render_Font *font);
internal i32 font_get_ascent(Render_Font *font);
internal i32 font_get_descent(Render_Font *font);
internal i32 font_get_line_skip(Render_Font *font);
internal i32 font_get_advance(Render_Font *font);
#endif
// BOTTOM

View File

@ -0,0 +1,47 @@
/*
* Mr. 4th Dimention - Allen Webster
*
* 11.03.2017
*
* Implements some basic getters for fonts set up to make the font type opaque.
*
*/
// TOP
#include "4coder_font_data.h"
internal f32
font_get_byte_advance(Render_Font *font){
return(font->byte_advance);
}
internal i32
font_get_height(Render_Font *font){
return(font->height);
}
internal i32
font_get_ascent(Render_Font *font){
return(font->ascent);
}
internal i32
font_get_descent(Render_Font *font){
return(font->descent);
}
internal i32
font_get_line_skip(Render_Font *font){
return(font->line_skip);
}
internal i32
font_get_advance(Render_Font *font){
return(font->advance);
}
// BOTTOM

View File

@ -54,7 +54,6 @@
#include "4ed_math.h" #include "4ed_math.h"
#include "4ed_system.h" #include "4ed_system.h"
#include "font/4coder_font_data.h"
#include "4ed_rendering.h" #include "4ed_rendering.h"
#include "4ed.h" #include "4ed.h"
@ -2514,13 +2513,15 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
return(0); return(0);
} }
#include "font/4coder_font_static_functions.cpp"
#if 0 #if 0
// NOTE(allen): In case I want to switch back to a console // NOTE(allen): In case I want to switch back to a console
// application at some point. // application at some point.
int main(int argc, char **argv){ int main(int argc, char **argv){
HINSTANCE hInstance = GetModuleHandle(0); HINSTANCE hInstance = GetModuleHandle(0);
}
#endif #endif
// BOTTOM // BOTTOM