setup the page loading on request, setup the rendering with the new system, still fixing bugs
This commit is contained in:
parent
b4409c9cf5
commit
12c8b920d2
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
4coder_string.h - Version 1.0.59
|
||||
4coder_string.h - Version 1.0.66
|
||||
no warranty implied; use at your own risk
|
||||
|
||||
This software is in the public domain. Where that dedication is not
|
||||
|
@ -142,8 +142,10 @@ FSTRING_INLINE b32_4tech has_substr_insensitive_s(String s, String see
|
|||
FSTRING_LINK i32_4tech copy_fast_unsafe_cc(char *dest, char *src);
|
||||
FSTRING_LINK i32_4tech copy_fast_unsafe_cs(char *dest, String src);
|
||||
FSTRING_LINK b32_4tech copy_checked_ss(String *dest, String src);
|
||||
FSTRING_LINK b32_4tech copy_checked_cs(char *dest, i32_4tech dest_cap, String src);
|
||||
FSTRING_LINK b32_4tech copy_partial_sc(String *dest, char *src);
|
||||
FSTRING_LINK b32_4tech copy_partial_ss(String *dest, String src);
|
||||
FSTRING_LINK b32_4tech copy_partial_cs(char *dest, i32_4tech dest_cap, String src);
|
||||
FSTRING_INLINE i32_4tech copy_cc(char *dest, char *src);
|
||||
FSTRING_INLINE void copy_ss(String *dest, String src);
|
||||
FSTRING_INLINE void copy_sc(String *dest, char *src);
|
||||
|
@ -246,8 +248,10 @@ FSTRING_INLINE b32_4tech has_substr_insensitive(String s, String seek)
|
|||
FSTRING_LINK i32_4tech copy_fast_unsafe(char *dest, char *src){return(copy_fast_unsafe_cc(dest,src));}
|
||||
FSTRING_LINK i32_4tech copy_fast_unsafe(char *dest, String src){return(copy_fast_unsafe_cs(dest,src));}
|
||||
FSTRING_LINK b32_4tech copy_checked(String *dest, String src){return(copy_checked_ss(dest,src));}
|
||||
FSTRING_LINK b32_4tech copy_checked(char *dest, i32_4tech dest_cap, String src){return(copy_checked_cs(dest,dest_cap,src));}
|
||||
FSTRING_LINK b32_4tech copy_partial(String *dest, char *src){return(copy_partial_sc(dest,src));}
|
||||
FSTRING_LINK b32_4tech copy_partial(String *dest, String src){return(copy_partial_ss(dest,src));}
|
||||
FSTRING_LINK b32_4tech copy_partial(char *dest, i32_4tech dest_cap, String src){return(copy_partial_cs(dest,dest_cap,src));}
|
||||
FSTRING_INLINE i32_4tech copy(char *dest, char *src){return(copy_cc(dest,src));}
|
||||
FSTRING_INLINE void copy(String *dest, String src){return(copy_ss(dest,src));}
|
||||
FSTRING_INLINE void copy(String *dest, char *src){return(copy_sc(dest,src));}
|
||||
|
@ -1033,12 +1037,15 @@ find_substr_insensitive_c(char *str, i32_4tech start, String seek){
|
|||
i32_4tech i, j, k;
|
||||
b32_4tech hit;
|
||||
char a_upper, b_upper;
|
||||
char first_test_char;
|
||||
|
||||
if (seek.size == 0){
|
||||
return str_size(str);
|
||||
}
|
||||
first_test_char = char_to_upper(seek.str[0]);
|
||||
for (i = start; str[i]; ++i){
|
||||
if (str[i] == seek.str[0]){
|
||||
a_upper = char_to_upper(str[i]);
|
||||
if (a_upper == first_test_char){
|
||||
hit = 1;
|
||||
for (j = 1, k = i+1; j < seek.size; ++j, ++k){
|
||||
a_upper = char_to_upper(str[k]);
|
||||
|
@ -1065,13 +1072,16 @@ find_substr_insensitive_s(String str, i32_4tech start, String seek){
|
|||
i32_4tech stop_at;
|
||||
b32_4tech hit;
|
||||
char a_upper, b_upper;
|
||||
char first_test_char;
|
||||
|
||||
if (seek.size == 0){
|
||||
return str.size;
|
||||
}
|
||||
stop_at = str.size - seek.size + 1;
|
||||
first_test_char = char_to_upper(seek.str[0]);
|
||||
for (i = start; i < stop_at; ++i){
|
||||
if (str.str[i] == seek.str[0]){
|
||||
a_upper = char_to_upper(str.str[i]);
|
||||
if (a_upper == first_test_char){
|
||||
hit = 1;
|
||||
for (j = 1, k = i+1; j < seek.size; ++j, ++k){
|
||||
a_upper = char_to_upper(str.str[k]);
|
||||
|
@ -1172,6 +1182,21 @@ copy_checked_ss(String *dest, String src){
|
|||
#endif
|
||||
|
||||
|
||||
#if defined(FSTRING_IMPLEMENTATION)
|
||||
FSTRING_LINK b32_4tech
|
||||
copy_checked_cs(char *dest, i32_4tech dest_cap, String src){
|
||||
i32_4tech i;
|
||||
if (dest_cap < src.size){
|
||||
return 0;
|
||||
}
|
||||
for (i = 0; i < src.size; ++i){
|
||||
dest[i] = src.str[i];
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(FSTRING_IMPLEMENTATION)
|
||||
FSTRING_LINK b32_4tech
|
||||
copy_partial_sc(String *dest, char *src){
|
||||
|
@ -1205,7 +1230,25 @@ copy_partial_ss(String *dest, String src){
|
|||
dest_str[i] = src.str[i];
|
||||
}
|
||||
dest->size = memory_size;
|
||||
return result;
|
||||
return(result);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(FSTRING_IMPLEMENTATION)
|
||||
FSTRING_LINK b32_4tech
|
||||
copy_partial_cs(char *dest, i32_4tech dest_cap, String src){
|
||||
b32_4tech result = 0;
|
||||
i32_4tech copy_size = dest_cap;
|
||||
i32_4tech i;
|
||||
if (dest_cap >= src.size){
|
||||
result = 1;
|
||||
copy_size = src.size;
|
||||
}
|
||||
for (i = 0; i < copy_size; ++i){
|
||||
dest[i] = src.str[i];
|
||||
}
|
||||
return(result);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
68
4ed.cpp
68
4ed.cpp
|
@ -962,7 +962,6 @@ enum Command_Line_Action{
|
|||
CLAct_WindowStreamMode,
|
||||
CLAct_FontSize,
|
||||
CLAct_FontStartHinting,
|
||||
CLAct_FontCustom,
|
||||
CLAct_Count
|
||||
};
|
||||
|
||||
|
@ -1010,8 +1009,6 @@ init_command_line_settings(App_Settings *settings, Plat_Settings *plat_settings,
|
|||
case 'u': action = CLAct_UserFile; strict = 0; break;
|
||||
case 'U': action = CLAct_UserFile; strict = 1; break;
|
||||
|
||||
case 'c': action = CLAct_FontCustom; break;
|
||||
|
||||
case 'd': action = CLAct_CustomDLL; strict = 0; break;
|
||||
case 'D': action = CLAct_CustomDLL; strict = 1; break;
|
||||
|
||||
|
@ -1115,16 +1112,6 @@ init_command_line_settings(App_Settings *settings, Plat_Settings *plat_settings,
|
|||
action = CLAct_Nothing;
|
||||
}break;
|
||||
|
||||
case CLAct_FontCustom:
|
||||
{
|
||||
if ((i + 3) <= clparams.argc){
|
||||
settings->custom_font_file = clparams.argv[i++];
|
||||
settings->custom_font_name = clparams.argv[i++];
|
||||
settings->custom_font_size = str_to_int_c(clparams.argv[i]);
|
||||
}
|
||||
action = CLAct_Nothing;
|
||||
}break;
|
||||
|
||||
case CLAct_FontStartHinting:
|
||||
{
|
||||
plat_settings->use_hinting = 1;
|
||||
|
@ -1158,8 +1145,6 @@ app_setup_memory(System_Functions *system, Application_Memory *memory){
|
|||
return(vars);
|
||||
}
|
||||
|
||||
static App_Settings null_app_settings = {0};
|
||||
|
||||
App_Read_Command_Line_Sig(app_read_command_line){
|
||||
i32 out_size = 0;
|
||||
App_Vars *vars = app_setup_memory(system, memory);
|
||||
|
@ -1452,59 +1437,6 @@ App_Init_Sig(app_init){
|
|||
setup_ui_commands(&models->map_ui, &models->mem.part, global_map);
|
||||
}
|
||||
|
||||
#if 0
|
||||
// NOTE(allen): font setup
|
||||
{
|
||||
models->font_set = &target->font_set;
|
||||
|
||||
struct Font_Setup{
|
||||
char *c_file_name;
|
||||
i32 file_name_len;
|
||||
char *c_name;
|
||||
i32 name_len;
|
||||
i32 pt_size;
|
||||
};
|
||||
|
||||
i32 font_size = models->settings.font_size;
|
||||
|
||||
char *custom_font_file = models->settings.custom_font_file;
|
||||
char *custom_font_name = models->settings.custom_font_name;
|
||||
i32 custom_font_size = models->settings.custom_font_size;
|
||||
b32 use_custom_font = true;
|
||||
if (custom_font_file == 0){
|
||||
use_custom_font = false;
|
||||
custom_font_file = "";
|
||||
custom_font_name = "";
|
||||
}
|
||||
|
||||
font_size = clamp_bottom(8, font_size);
|
||||
|
||||
Font_Setup font_setup[] = {
|
||||
{literal("LiberationSans-Regular.ttf"), literal("Liberation Sans"), font_size},
|
||||
{literal("liberation-mono.ttf"), literal("Liberation Mono"), font_size},
|
||||
{literal("Hack-Regular.ttf"), literal("Hack"), font_size},
|
||||
{literal("CutiveMono-Regular.ttf"), literal("Cutive Mono"), font_size},
|
||||
{literal("Inconsolata-Regular.ttf"), literal("Inconsolata"), font_size},
|
||||
{custom_font_file, str_size(custom_font_file),
|
||||
custom_font_name, str_size(custom_font_name),
|
||||
custom_font_size},
|
||||
};
|
||||
i32 font_count = ArrayCount(font_setup);
|
||||
if (!use_custom_font){
|
||||
--font_count;
|
||||
}
|
||||
|
||||
font_set_init(models->font_set, partition, 16, 6);
|
||||
|
||||
for (i32 i = 0; i < font_count; ++i){
|
||||
String file_name = make_string(font_setup[i].c_file_name, font_setup[i].file_name_len);
|
||||
String name = make_string(font_setup[i].c_name, font_setup[i].name_len);
|
||||
i32 pt_size = font_setup[i].pt_size;
|
||||
font_set_add(models->font_set, file_name, name, pt_size);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// NOTE(allen): file setup
|
||||
working_set_init(&models->working_set, partition, &vars->models.mem.general);
|
||||
models->working_set.default_display_width = DEFAULT_DISPLAY_WIDTH;
|
||||
|
|
7
4ed.h
7
4ed.h
|
@ -64,12 +64,7 @@ typedef struct Plat_Settings{
|
|||
} Plat_Settings;
|
||||
|
||||
#define App_Read_Command_Line_Sig(name) \
|
||||
i32 name(System_Functions *system, \
|
||||
Application_Memory *memory, \
|
||||
String current_directory, \
|
||||
Plat_Settings *plat_settings, \
|
||||
char ***files, i32 **file_count, \
|
||||
Command_Line_Parameters clparams)
|
||||
i32 name(System_Functions *system, Application_Memory *memory, String current_directory, Plat_Settings *plat_settings, char ***files, i32 **file_count, Command_Line_Parameters clparams)
|
||||
|
||||
typedef App_Read_Command_Line_Sig(App_Read_Command_Line);
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@ struct App_Settings{
|
|||
i32 custom_arg_start;
|
||||
i32 custom_arg_end;
|
||||
};
|
||||
global_const App_Settings null_app_settings = {0};
|
||||
|
||||
struct Debug_Input_Event{
|
||||
Key_Code key;
|
||||
|
|
|
@ -1015,7 +1015,7 @@ struct Code_Wrap_State{
|
|||
};
|
||||
|
||||
internal void
|
||||
wrap_state_init(Code_Wrap_State *state, Editing_File *file, Render_Font *font){
|
||||
wrap_state_init(System_Functions *system, Code_Wrap_State *state, Editing_File *file, Render_Font *font){
|
||||
state->token_array = file->state.token_array;
|
||||
state->token_ptr = state->token_array.tokens;
|
||||
state->end_token = state->token_ptr + state->token_array.count;
|
||||
|
@ -1031,10 +1031,7 @@ wrap_state_init(Code_Wrap_State *state, Editing_File *file, Render_Font *font){
|
|||
|
||||
state->font = font;
|
||||
|
||||
#if 0
|
||||
state->tab_indent_amount = get_codepoint_advance(font, '\t');
|
||||
#endif
|
||||
state->tab_indent_amount = 2.f;
|
||||
state->tab_indent_amount = font_get_glyph_advance(system, font, '\t');
|
||||
state->byte_advance = font_get_byte_advance(font);
|
||||
|
||||
state->tran = null_buffer_translating_state;
|
||||
|
@ -1146,10 +1143,7 @@ wrap_state_consume_token(System_Functions *system, Render_Font *font, Code_Wrap_
|
|||
u32 n = state->step.value;
|
||||
f32 adv = 0;
|
||||
if (state->behavior.do_codepoint_advance){
|
||||
#if 0
|
||||
adv = get_codepoint_advance(state->font, n);
|
||||
#endif
|
||||
adv = 2.f;
|
||||
adv = font_get_glyph_advance(system, state->font, n);
|
||||
|
||||
if (n != ' ' && n != '\t'){
|
||||
skipping_whitespace = false;
|
||||
|
@ -1406,14 +1400,12 @@ get_current_shift(Code_Wrap_State *wrap_state, i32 next_line_start, b32 *adjust_
|
|||
|
||||
if (wrap_state->wrap_x.paren_safe_top != 0 && prev_token.type == CPP_TOKEN_PARENTHESE_OPEN){
|
||||
current_shift = wrap_state->wrap_x.paren_nesting[wrap_state->wrap_x.paren_safe_top-1] + wrap_state->tab_indent_amount;
|
||||
|
||||
*adjust_top_to_this = 1;
|
||||
}
|
||||
|
||||
f32 statement_continuation_indent = 0.f;
|
||||
if (current_shift != 0.f && wrap_state->wrap_x.paren_safe_top == 0){
|
||||
if (!(prev_token.flags & CPP_TFLAG_PP_BODY) && !(prev_token.flags & CPP_TFLAG_PP_DIRECTIVE)){
|
||||
|
||||
if (!(prev_token.flags & (CPP_TFLAG_PP_DIRECTIVE|CPP_TFLAG_PP_BODY))){
|
||||
switch (prev_token.type){
|
||||
case CPP_TOKEN_BRACKET_OPEN:
|
||||
case CPP_TOKEN_BRACE_OPEN:
|
||||
|
@ -1499,7 +1491,7 @@ file_measure_wraps(System_Functions *system, Models *models, Editing_File *file,
|
|||
i32 max_wrap_indent_mark = 0;
|
||||
|
||||
if (params.virtual_white && file->state.tokens_complete && !file->state.still_lexing){
|
||||
wrap_state_init(&wrap_state, file, font);
|
||||
wrap_state_init(system, &wrap_state, file, font);
|
||||
use_tokens = 1;
|
||||
|
||||
potential_marks = push_array(part, Potential_Wrap_Indent_Pair, floor32(width));
|
||||
|
@ -1551,10 +1543,7 @@ file_measure_wraps(System_Functions *system, Models *models, Editing_File *file,
|
|||
word_stage = 1;
|
||||
}
|
||||
else{
|
||||
#if 0
|
||||
f32 adv = get_codepoint_advance(params.font, ch);
|
||||
#endif
|
||||
f32 adv = 2.f;
|
||||
f32 adv = font_get_glyph_advance(params.system, params.font, ch);
|
||||
|
||||
x += adv;
|
||||
self_x += adv;
|
||||
|
@ -1682,11 +1671,7 @@ file_measure_wraps(System_Functions *system, Models *models, Editing_File *file,
|
|||
goto doublebreak_stage1;
|
||||
}
|
||||
|
||||
#if 0
|
||||
f32 adv = get_codepoint_advance(params.font, ch);
|
||||
#endif
|
||||
f32 adv = 2.f;
|
||||
|
||||
f32 adv = font_get_glyph_advance(params.system, params.font, ch);
|
||||
x += adv;
|
||||
if (!first_word && x > current_width){
|
||||
emit_comment_position = 1;
|
||||
|
@ -1713,10 +1698,7 @@ file_measure_wraps(System_Functions *system, Models *models, Editing_File *file,
|
|||
}
|
||||
|
||||
|
||||
#if 0
|
||||
f32 adv = get_codepoint_advance(params.font, ch);
|
||||
#endif
|
||||
f32 adv = 2.f;
|
||||
f32 adv = font_get_glyph_advance(params.system, params.font, ch);
|
||||
|
||||
x += adv;
|
||||
}
|
||||
|
@ -1978,7 +1960,7 @@ file_create_from_string(System_Functions *system, Models *models, Editing_File *
|
|||
|
||||
Font_ID font_id = models->global_font_id;
|
||||
file->settings.font_id = font_id;
|
||||
Render_Font *font = 0;
|
||||
Render_Font *font = system->font.get_render_data_by_id(font_id);
|
||||
|
||||
file_measure_starts(general, &file->state.buffer);
|
||||
|
||||
|
@ -3243,8 +3225,7 @@ file_do_single_edit(System_Functions *system, Models *models, Editing_File *file
|
|||
Assert(scratch_size > 0);
|
||||
i32 request_amount = 0;
|
||||
Assert(end <= buffer_size(&file->state.buffer));
|
||||
while (buffer_replace_range(&file->state.buffer, start, end, str, str_len, &shift_amount,
|
||||
part->base + part->pos, scratch_size, &request_amount)){
|
||||
while (buffer_replace_range(&file->state.buffer, start, end, str, str_len, &shift_amount, part->base + part->pos, scratch_size, &request_amount)){
|
||||
void *new_data = 0;
|
||||
if (request_amount > 0){
|
||||
new_data = general_memory_allocate(general, request_amount);
|
||||
|
@ -3273,8 +3254,7 @@ file_do_single_edit(System_Functions *system, Models *models, Editing_File *file
|
|||
i32 new_line_count = buffer_count_newlines(&file->state.buffer, start, start+str_len);
|
||||
i32 line_shift = new_line_count - replaced_line_count;
|
||||
|
||||
//Render_Font *font = get_font_info(models->font_set, file->settings.font_id)->font;
|
||||
Render_Font *font = 0;
|
||||
Render_Font *font = system->font.get_render_data_by_id(file->settings.font_id);
|
||||
file_grow_starts_as_needed(general, buffer, line_shift);
|
||||
buffer_remeasure_starts(buffer, line_start, line_end, line_shift, shift_amount);
|
||||
|
||||
|
@ -3396,8 +3376,7 @@ file_do_batch_edit(System_Functions *system, Models *models, Editing_File *file,
|
|||
Buffer_Measure_Starts measure_state = {};
|
||||
buffer_measure_starts(&measure_state, &file->state.buffer);
|
||||
|
||||
//Render_Font *font = get_font_info(models->font_set, file->settings.font_id)->font;
|
||||
Render_Font *font = 0;
|
||||
Render_Font *font = system->font.get_render_data_by_id(file->settings.font_id);
|
||||
|
||||
// TODO(allen): write the remeasurement version
|
||||
file_allocate_character_starts_as_needed(&models->mem.general, file);
|
||||
|
@ -3682,9 +3661,7 @@ style_get_color(Style *style, Cpp_Token token){
|
|||
internal void
|
||||
file_set_font(System_Functions *system, Models *models, Editing_File *file, Font_ID font_id){
|
||||
file->settings.font_id = 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 = 0;
|
||||
Render_Font *font = system->font.get_render_data_by_id(font_id);
|
||||
file_measure_wraps_and_fix_cursor(system, models, file, font);
|
||||
|
||||
Editing_Layout *layout = &models->layout;
|
||||
|
@ -4148,9 +4125,9 @@ struct File_Bar{
|
|||
};
|
||||
|
||||
internal void
|
||||
intbar_draw_string(Render_Target *target, File_Bar *bar, String str, u32 char_color){
|
||||
draw_string(target, bar->font_id, str, (i32)(bar->pos_x + bar->text_shift_x), (i32)(bar->pos_y + bar->text_shift_y), char_color);
|
||||
bar->pos_x += font_string_width(target, bar->font_id, str);
|
||||
intbar_draw_string(System_Functions *system, Render_Target *target, File_Bar *bar, String str, u32 char_color){
|
||||
draw_string(system, target, bar->font_id, str, (i32)(bar->pos_x + bar->text_shift_x), (i32)(bar->pos_y + bar->text_shift_y), char_color);
|
||||
bar->pos_x += font_string_width(system, target, bar->font_id, str);
|
||||
}
|
||||
|
||||
internal GUI_Scroll_Vars
|
||||
|
@ -5938,8 +5915,7 @@ draw_file_loaded(System_Functions *system, View *view, i32_Rect rect, b32 is_act
|
|||
Buffer_Render_Item *items = push_array(part, Buffer_Render_Item, max);
|
||||
|
||||
Font_ID font_id = file->settings.font_id;
|
||||
//Render_Font *font = get_font_info(models->font_set, font_id)->font;
|
||||
Render_Font *font = 0;
|
||||
Render_Font *font = system->font.get_render_data_by_id(font_id);
|
||||
|
||||
f32 scroll_x = view->edit_pos->scroll.scroll_x;
|
||||
f32 scroll_y = view->edit_pos->scroll.scroll_y;
|
||||
|
@ -6145,7 +6121,7 @@ draw_file_loaded(System_Functions *system, View *view, i32_Rect rect, b32 is_act
|
|||
}
|
||||
|
||||
internal void
|
||||
draw_text_field(Render_Target *target, View *view, Font_ID font_id, i32_Rect rect, String p, String t){
|
||||
draw_text_field(System_Functions *system, Render_Target *target, View *view, Font_ID font_id, i32_Rect rect, String p, String t){
|
||||
Models *models = view->persistent.models;
|
||||
Style *style = main_style(models);
|
||||
|
||||
|
@ -6158,13 +6134,13 @@ draw_text_field(Render_Target *target, View *view, Font_ID font_id, i32_Rect rec
|
|||
|
||||
if (target){
|
||||
draw_rectangle(target, rect, back_color);
|
||||
x = ceil32(draw_string(target, font_id, p, x, y, text2_color));
|
||||
draw_string(target, font_id, t, x, y, text1_color);
|
||||
x = ceil32(draw_string(system, target, font_id, p, x, y, text2_color));
|
||||
draw_string(system, target, font_id, t, x, y, text1_color);
|
||||
}
|
||||
}
|
||||
|
||||
internal void
|
||||
draw_text_with_cursor(Render_Target *target, View *view, Font_ID font_id, i32_Rect rect, String s, i32 pos){
|
||||
draw_text_with_cursor(System_Functions *system, Render_Target *target, View *view, Font_ID font_id, i32_Rect rect, String s, i32 pos){
|
||||
Models *models = view->persistent.models;
|
||||
Style *style = main_style(models);
|
||||
|
||||
|
@ -6180,35 +6156,33 @@ draw_text_with_cursor(Render_Target *target, View *view, Font_ID font_id, i32_Re
|
|||
draw_rectangle(target, rect, back_color);
|
||||
|
||||
if (pos >= 0 && pos < s.size){
|
||||
//Render_Font *font = get_font_info(models->font_set, font_id)->font;
|
||||
Render_Font *font = 0; AllowLocal(font);
|
||||
Render_Font *font = system->font.get_render_data_by_id(font_id);
|
||||
|
||||
String part1 = substr(s, 0, pos);
|
||||
String part2 = substr(s, pos, 1);
|
||||
String part3 = substr(s, pos+1, s.size-pos-1);
|
||||
|
||||
x = draw_string(target, font_id, part1, floor32(x), y, text_color);
|
||||
x = draw_string(system, target, font_id, part1, floor32(x), y, text_color);
|
||||
|
||||
//f32 adv = get_codepoint_advance(font, s.str[pos]);
|
||||
f32 adv = 2.f;
|
||||
f32 adv = font_get_glyph_advance(system, font, s.str[pos]);
|
||||
i32_Rect cursor_rect;
|
||||
cursor_rect.x0 = floor32(x);
|
||||
cursor_rect.x1 = floor32(x) + ceil32(adv);
|
||||
cursor_rect.y0 = y;
|
||||
cursor_rect.y1 = y + view->line_height;
|
||||
draw_rectangle(target, cursor_rect, cursor_color);
|
||||
x = draw_string(target, font_id, part2, floor32(x), y, at_cursor_color);
|
||||
x = draw_string(system, target, font_id, part2, floor32(x), y, at_cursor_color);
|
||||
|
||||
draw_string(target, font_id, part3, floor32(x), y, text_color);
|
||||
draw_string(system, target, font_id, part3, floor32(x), y, text_color);
|
||||
}
|
||||
else{
|
||||
draw_string(target, font_id, s, floor32(x), y, text_color);
|
||||
draw_string(system, target, font_id, s, floor32(x), y, text_color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal void
|
||||
draw_file_bar(Render_Target *target, View *view, Editing_File *file, i32_Rect rect){
|
||||
draw_file_bar(System_Functions *system, Render_Target *target, View *view, Editing_File *file, i32_Rect rect){
|
||||
File_Bar bar;
|
||||
Models *models = view->persistent.models;
|
||||
Style *style = main_style(models);
|
||||
|
@ -6232,11 +6206,11 @@ draw_file_bar(Render_Target *target, View *view, Editing_File *file, i32_Rect re
|
|||
|
||||
Assert(file);
|
||||
|
||||
intbar_draw_string(target, &bar, file->name.live_name, base_color);
|
||||
intbar_draw_string(target, &bar, make_lit_string(" -"), base_color);
|
||||
intbar_draw_string(system, target, &bar, file->name.live_name, base_color);
|
||||
intbar_draw_string(system, target, &bar, make_lit_string(" -"), base_color);
|
||||
|
||||
if (file->is_loading){
|
||||
intbar_draw_string(target, &bar, make_lit_string(" loading"), base_color);
|
||||
intbar_draw_string(system, target, &bar, make_lit_string(" loading"), base_color);
|
||||
}
|
||||
else{
|
||||
char bar_space[526];
|
||||
|
@ -6255,11 +6229,11 @@ draw_file_bar(Render_Target *target, View *view, Editing_File *file, i32_Rect re
|
|||
append_ss(&bar_text, make_lit_string(" nix"));
|
||||
}
|
||||
|
||||
intbar_draw_string(target, &bar, bar_text, base_color);
|
||||
intbar_draw_string(system, target, &bar, bar_text, base_color);
|
||||
|
||||
|
||||
if (file->state.still_lexing){
|
||||
intbar_draw_string(target, &bar, make_lit_string(" parsing"), pop1_color);
|
||||
intbar_draw_string(system, target, &bar, make_lit_string(" parsing"), pop1_color);
|
||||
}
|
||||
|
||||
if (!file->settings.unimportant){
|
||||
|
@ -6267,13 +6241,13 @@ draw_file_bar(Render_Target *target, View *view, Editing_File *file, i32_Rect re
|
|||
case DirtyState_UnloadedChanges:
|
||||
{
|
||||
local_persist String out_of_sync = make_lit_string(" !");
|
||||
intbar_draw_string(target, &bar, out_of_sync, pop2_color);
|
||||
intbar_draw_string(system, target, &bar, out_of_sync, pop2_color);
|
||||
}break;
|
||||
|
||||
case DirtyState_UnsavedChanges:
|
||||
{
|
||||
local_persist String out_of_sync = make_lit_string(" *");
|
||||
intbar_draw_string(target, &bar, out_of_sync, pop2_color);
|
||||
intbar_draw_string(system, target, &bar, out_of_sync, pop2_color);
|
||||
}break;
|
||||
}
|
||||
}
|
||||
|
@ -6303,7 +6277,7 @@ get_margin_color(i32 active_level, Style *style){
|
|||
}
|
||||
|
||||
internal void
|
||||
draw_color_button(GUI_Target *gui_target, Render_Target *target, View *view, Font_ID font_id, i32_Rect rect, GUI_id id, u32 fore, u32 back, String text){
|
||||
draw_color_button(System_Functions *system, GUI_Target *gui_target, Render_Target *target, View *view, Font_ID font_id, i32_Rect rect, GUI_id id, u32 fore, u32 back, String text){
|
||||
i32 active_level = gui_active_level(gui_target, id);
|
||||
|
||||
if (active_level > 0){
|
||||
|
@ -6311,11 +6285,11 @@ draw_color_button(GUI_Target *gui_target, Render_Target *target, View *view, Fon
|
|||
}
|
||||
|
||||
draw_rectangle(target, rect, back);
|
||||
draw_string(target, font_id, text, rect.x0, rect.y0 + 1, fore);
|
||||
draw_string(system, target, font_id, text, rect.x0, rect.y0 + 1, fore);
|
||||
}
|
||||
|
||||
internal void
|
||||
draw_font_button(GUI_Target *gui_target, Render_Target *target, View *view, i32_Rect rect, GUI_id id, Font_ID font_id, String text){
|
||||
draw_font_button(System_Functions *system, GUI_Target *gui_target, Render_Target *target, View *view, i32_Rect rect, GUI_id id, Font_ID font_id, String text){
|
||||
Models *models = view->persistent.models;
|
||||
Style *style = main_style(models);
|
||||
|
||||
|
@ -6327,12 +6301,11 @@ draw_font_button(GUI_Target *gui_target, Render_Target *target, View *view, i32_
|
|||
|
||||
draw_rectangle(target, rect, back_color);
|
||||
draw_rectangle_outline(target, rect, margin_color);
|
||||
draw_string(target, font_id, text, rect.x0, rect.y0 + 1, text_color);
|
||||
draw_string(system, target, font_id, text, rect.x0, rect.y0 + 1, text_color);
|
||||
}
|
||||
|
||||
internal void
|
||||
draw_fat_option_block(GUI_Target *gui_target, Render_Target *target, View *view, Font_ID font_id, i32_Rect rect, GUI_id id,
|
||||
String text, String pop, i8 checkbox = -1){
|
||||
draw_fat_option_block(System_Functions *system, GUI_Target *gui_target, Render_Target *target, View *view, Font_ID font_id, i32_Rect rect, GUI_id id, String text, String pop, i8 checkbox = -1){
|
||||
Models *models = view->persistent.models;
|
||||
Style *style = main_style(models);
|
||||
|
||||
|
@ -6367,12 +6340,12 @@ draw_fat_option_block(GUI_Target *gui_target, Render_Target *target, View *view,
|
|||
x = checkbox_rect.x1 + 3;
|
||||
}
|
||||
|
||||
x = ceil32(draw_string(target, font_id, text, x, y, text_color));
|
||||
draw_string(target, font_id, pop, x, y, pop_color);
|
||||
x = ceil32(draw_string(system, target, font_id, text, x, y, text_color));
|
||||
draw_string(system, target, font_id, pop, x, y, pop_color);
|
||||
}
|
||||
|
||||
internal void
|
||||
draw_button(GUI_Target *gui_target, Render_Target *target, View *view, Font_ID font_id, i32_Rect rect, GUI_id id, String text){
|
||||
draw_button(System_Functions *system, GUI_Target *gui_target, Render_Target *target, View *view, Font_ID font_id, i32_Rect rect, GUI_id id, String text){
|
||||
Models *models = view->persistent.models;
|
||||
Style *style = main_style(models);
|
||||
|
||||
|
@ -6387,13 +6360,13 @@ draw_button(GUI_Target *gui_target, Render_Target *target, View *view, Font_ID f
|
|||
i32 h = view->line_height;
|
||||
i32 y = inner.y0 + h/2 - 1;
|
||||
|
||||
i32 w = (i32)font_string_width(target, font_id, text);
|
||||
i32 w = (i32)font_string_width(system, target, font_id, text);
|
||||
i32 x = (inner.x1 + inner.x0 - w)/2;
|
||||
|
||||
draw_rectangle(target, inner, back);
|
||||
draw_rectangle_outline(target, inner, margin);
|
||||
|
||||
draw_string(target, font_id, text, x, y, text_color);
|
||||
draw_string(system, target, font_id, text, x, y, text_color);
|
||||
}
|
||||
|
||||
internal void
|
||||
|
@ -6401,7 +6374,6 @@ draw_style_preview(System_Functions *system, GUI_Target *gui_target, Render_Targ
|
|||
Models *models = view->persistent.models; AllowLocal(models);
|
||||
|
||||
i32 active_level = gui_active_level(gui_target, id);
|
||||
//Font_Info *info = get_font_info(models->font_set, font_id);
|
||||
char font_name_space[256];
|
||||
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);
|
||||
|
@ -6421,26 +6393,26 @@ draw_style_preview(System_Functions *system, GUI_Target *gui_target, Render_Targ
|
|||
|
||||
i32 y = inner.y0;
|
||||
i32 x = inner.x0;
|
||||
x = ceil32(draw_string(target, font_id, style->name.str, x, y, text_color));
|
||||
i32 font_x = (i32)(inner.x1 - font_string_width(target, font_id, font_name));
|
||||
x = ceil32(draw_string(system, target, font_id, style->name.str, x, y, text_color));
|
||||
i32 font_x = (i32)(inner.x1 - font_string_width(system, target, font_id, font_name));
|
||||
if (font_x > x + 10){
|
||||
draw_string(target, font_id, font_name, font_x, y, text_color);
|
||||
draw_string(system, target, font_id, font_name, font_x, y, text_color);
|
||||
}
|
||||
|
||||
i32 height = font_get_height(font);
|
||||
x = inner.x0;
|
||||
y += height;
|
||||
x = ceil32(draw_string(target, font_id, "if", x, y, keyword_color));
|
||||
x = ceil32(draw_string(target, font_id, "(x < ", x, y, text_color));
|
||||
x = ceil32(draw_string(target, font_id, "0", x, y, int_constant_color));
|
||||
x = ceil32(draw_string(target, font_id, ") { x = ", x, y, text_color));
|
||||
x = ceil32(draw_string(target, font_id, "0", x, y, int_constant_color));
|
||||
x = ceil32(draw_string(target, font_id, "; } ", x, y, text_color));
|
||||
x = ceil32(draw_string(target, font_id, "// comment", x, y, comment_color));
|
||||
x = ceil32(draw_string(system, target, font_id, "if", x, y, keyword_color));
|
||||
x = ceil32(draw_string(system, target, font_id, "(x < ", x, y, text_color));
|
||||
x = ceil32(draw_string(system, target, font_id, "0", x, y, int_constant_color));
|
||||
x = ceil32(draw_string(system, target, font_id, ") { x = ", x, y, text_color));
|
||||
x = ceil32(draw_string(system, target, font_id, "0", x, y, int_constant_color));
|
||||
x = ceil32(draw_string(system, target, font_id, "; } ", x, y, text_color));
|
||||
x = ceil32(draw_string(system, target, font_id, "// comment", x, y, comment_color));
|
||||
|
||||
x = inner.x0;
|
||||
y += height;
|
||||
draw_string(target, font_id, "[] () {}; * -> +-/ <>= ! && || % ^", x, y, text_color);
|
||||
draw_string(system, target, font_id, "[] () {}; * -> +-/ <>= ! && || % ^", x, y, text_color);
|
||||
}
|
||||
|
||||
internal i32
|
||||
|
@ -6483,7 +6455,7 @@ do_render_file_view(System_Functions *system, View *view, GUI_Scroll_Vars *scrol
|
|||
switch (h->type){
|
||||
case guicom_top_bar:
|
||||
{
|
||||
draw_file_bar(target, view, file, gui_session.rect);
|
||||
draw_file_bar(system, target, view, file, gui_session.rect);
|
||||
}break;
|
||||
|
||||
case guicom_file:
|
||||
|
@ -6498,7 +6470,7 @@ do_render_file_view(System_Functions *system, View *view, GUI_Scroll_Vars *scrol
|
|||
void *ptr = (h+1);
|
||||
String p = gui_read_string(&ptr);
|
||||
String t = gui_read_string(&ptr);
|
||||
draw_text_field(target, view, font_id, gui_session.rect, p, t);
|
||||
draw_text_field(system, target, view, font_id, gui_session.rect, p, t);
|
||||
}break;
|
||||
|
||||
case guicom_text_with_cursor:
|
||||
|
@ -6507,7 +6479,7 @@ do_render_file_view(System_Functions *system, View *view, GUI_Scroll_Vars *scrol
|
|||
String s = gui_read_string(&ptr);
|
||||
i32 pos = gui_read_integer(&ptr);
|
||||
|
||||
draw_text_with_cursor(target, view, font_id, gui_session.rect, s, pos);
|
||||
draw_text_with_cursor(system, target, view, font_id, gui_session.rect, s, pos);
|
||||
}break;
|
||||
|
||||
case guicom_color_button:
|
||||
|
@ -6518,7 +6490,7 @@ do_render_file_view(System_Functions *system, View *view, GUI_Scroll_Vars *scrol
|
|||
u32 back = (u32)gui_read_integer(&ptr);
|
||||
String t = gui_read_string(&ptr);
|
||||
|
||||
draw_color_button(gui_target, target, view, font_id, gui_session.rect, b->id, fore, back, t);
|
||||
draw_color_button(system, gui_target, target, view, font_id, gui_session.rect, b->id, fore, back, t);
|
||||
}break;
|
||||
|
||||
case guicom_font_button:
|
||||
|
@ -6528,7 +6500,7 @@ do_render_file_view(System_Functions *system, View *view, GUI_Scroll_Vars *scrol
|
|||
Font_ID font_id = (Font_ID)gui_read_integer(&ptr);
|
||||
String t = gui_read_string(&ptr);
|
||||
|
||||
draw_font_button(gui_target, target, view, gui_session.rect, b->id, font_id, t);
|
||||
draw_font_button(system, gui_target, target, view, gui_session.rect, b->id, font_id, t);
|
||||
}break;
|
||||
|
||||
case guicom_file_option:
|
||||
|
@ -6543,7 +6515,7 @@ do_render_file_view(System_Functions *system, View *view, GUI_Scroll_Vars *scrol
|
|||
append_s_char(&f, '/');
|
||||
}
|
||||
|
||||
draw_fat_option_block(gui_target, target, view, font_id, gui_session.rect, b->id, f, m);
|
||||
draw_fat_option_block(system, gui_target, target, view, font_id, gui_session.rect, b->id, f, m);
|
||||
}break;
|
||||
|
||||
case guicom_style_preview:
|
||||
|
@ -6568,7 +6540,7 @@ do_render_file_view(System_Functions *system, View *view, GUI_Scroll_Vars *scrol
|
|||
status = (i8)gui_read_byte(&ptr);
|
||||
}
|
||||
|
||||
draw_fat_option_block(gui_target, target, view, font_id, gui_session.rect, b->id, f, m, status);
|
||||
draw_fat_option_block(system, gui_target, target, view, font_id, gui_session.rect, b->id, f, m, status);
|
||||
}break;
|
||||
|
||||
case guicom_button:
|
||||
|
@ -6577,7 +6549,7 @@ do_render_file_view(System_Functions *system, View *view, GUI_Scroll_Vars *scrol
|
|||
void *ptr = (b + 1);
|
||||
String t = gui_read_string(&ptr);
|
||||
|
||||
draw_button(gui_target, target, view, font_id, gui_session.rect, b->id, t);
|
||||
draw_button(system, gui_target, target, view, font_id, gui_session.rect, b->id, t);
|
||||
}break;
|
||||
|
||||
case guicom_scrollable_bar:
|
||||
|
|
51
4ed_math.h
51
4ed_math.h
|
@ -431,18 +431,6 @@ unlerp(f32 a, f32 x, f32 b){
|
|||
return(r);
|
||||
}
|
||||
|
||||
inline f32
|
||||
clamp_bottom(f32 a, f32 n){
|
||||
if (n < a) n = a;
|
||||
return (n);
|
||||
}
|
||||
|
||||
inline f32
|
||||
clamp_top(f32 n, f32 z){
|
||||
if (n > z) n = z;
|
||||
return (n);
|
||||
}
|
||||
|
||||
inline f32
|
||||
clamp(f32 a, f32 n, f32 z){
|
||||
if (n < a) n = a;
|
||||
|
@ -450,18 +438,6 @@ clamp(f32 a, f32 n, f32 z){
|
|||
return (n);
|
||||
}
|
||||
|
||||
inline i32
|
||||
clamp_bottom(i32 a, i32 n){
|
||||
if (n < a) n = a;
|
||||
return (n);
|
||||
}
|
||||
|
||||
inline i32
|
||||
clamp_top(i32 n, i32 z){
|
||||
if (n > z) n = z;
|
||||
return (n);
|
||||
}
|
||||
|
||||
inline i32
|
||||
clamp(i32 a, i32 n, i32 z){
|
||||
if (n < a) n = a;
|
||||
|
@ -469,30 +445,6 @@ clamp(i32 a, i32 n, i32 z){
|
|||
return (n);
|
||||
}
|
||||
|
||||
inline u32
|
||||
clamp_bottom(u32 a, u32 n){
|
||||
if (n < a) n = a;
|
||||
return (n);
|
||||
}
|
||||
|
||||
inline u64
|
||||
clamp_bottom(u64 a, u64 n){
|
||||
if (n < a) n = a;
|
||||
return (n);
|
||||
}
|
||||
|
||||
inline u32
|
||||
clamp_top(u32 n, u32 z){
|
||||
if (n > z) n = z;
|
||||
return (n);
|
||||
}
|
||||
|
||||
inline u64
|
||||
clamp_top(u64 n, u64 z){
|
||||
if (n > z) n = z;
|
||||
return (n);
|
||||
}
|
||||
|
||||
inline u32
|
||||
clamp(u32 a, u32 n, u32 z){
|
||||
if (n < a) n = a;
|
||||
|
@ -500,6 +452,9 @@ clamp(u32 a, u32 n, u32 z){
|
|||
return (n);
|
||||
}
|
||||
|
||||
#define clamp_top(a,b) Min(a,b)
|
||||
#define clamp_bottom(a,b) Max(a,b)
|
||||
|
||||
/*
|
||||
* Color
|
||||
*/
|
||||
|
|
|
@ -130,19 +130,15 @@ font_draw_glyph(Render_Target *target, Font_ID font_id, u32 codepoint, f32 x, f3
|
|||
}
|
||||
|
||||
internal f32
|
||||
draw_string_base(Render_Target *target, Font_ID font_id, i32 type, String str_, i32 x_, i32 y_, u32 color){
|
||||
|
||||
draw_string_base(System_Functions *system, Render_Target *target, Font_ID font_id, i32 type, String str_, i32 x_, i32 y_, u32 color){
|
||||
f32 x = 0;
|
||||
|
||||
#if 0
|
||||
Font_Info *font_info = get_font_info(&target->font_set, font_id);
|
||||
Render_Font *font = font_info->font;
|
||||
|
||||
if (font){
|
||||
Render_Font *font = system->font.get_render_data_by_id(font_id);
|
||||
if (font != 0){
|
||||
f32 y = (f32)y_;
|
||||
x = (f32)x_;
|
||||
|
||||
f32 byte_advance = font->byte_advance;
|
||||
f32 byte_advance = font_get_byte_advance(font);
|
||||
|
||||
u8 *str = (u8*)str_.str;
|
||||
u8 *str_end = str + str_.size;
|
||||
|
@ -169,7 +165,7 @@ draw_string_base(Render_Target *target, Font_ID font_id, i32 type, String str_,
|
|||
if (color != 0){
|
||||
font_draw_glyph(target, font_id, type, (u8)codepoint, x, y, color);
|
||||
}
|
||||
x += get_codepoint_advance(font, codepoint);
|
||||
x += font_get_glyph_advance(system, font, codepoint);
|
||||
}
|
||||
else if (do_numbers){
|
||||
for (;byte < str; ++byte){
|
||||
|
@ -179,10 +175,12 @@ draw_string_base(Render_Target *target, Font_ID font_id, i32 type, String str_,
|
|||
cs[0] = '\\';
|
||||
byte_to_ascii(n, cs+1);
|
||||
|
||||
f32 *advances = font_get_byte_sub_advances(font);
|
||||
|
||||
f32 xx = x;
|
||||
for (u32 j = 0; j < 3; ++j){
|
||||
font_draw_glyph(target, font_id, type, cs[j], xx, y, color);
|
||||
xx += byte_advance;
|
||||
xx += advances[j];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -191,47 +189,46 @@ draw_string_base(Render_Target *target, Font_ID font_id, i32 type, String str_,
|
|||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return(x);
|
||||
}
|
||||
|
||||
internal f32
|
||||
draw_string(Render_Target *target, Font_ID font_id, String str, i32 x, i32 y, u32 color){
|
||||
f32 w = draw_string_base(target, font_id, piece_type_glyph, str, x, y, color);
|
||||
draw_string(System_Functions *system, Render_Target *target, Font_ID font_id, String str, i32 x, i32 y, u32 color){
|
||||
f32 w = draw_string_base(system, target, font_id, piece_type_glyph, str, x, y, color);
|
||||
return(w);
|
||||
}
|
||||
|
||||
internal f32
|
||||
draw_string(Render_Target *target, Font_ID font_id, char *str, i32 x, i32 y, u32 color){
|
||||
draw_string(System_Functions *system, Render_Target *target, Font_ID font_id, char *str, i32 x, i32 y, u32 color){
|
||||
String string = make_string_slowly(str);
|
||||
f32 w = draw_string_base(target, font_id, piece_type_glyph, string, x, y, color);
|
||||
f32 w = draw_string_base(system, target, font_id, piece_type_glyph, string, x, y, color);
|
||||
return(w);
|
||||
}
|
||||
|
||||
internal f32
|
||||
draw_string_mono(Render_Target *target, Font_ID font_id, String str, i32 x, i32 y, f32 advance, u32 color){
|
||||
f32 w = draw_string_base(target, font_id, piece_type_mono_glyph, str, x, y, color);
|
||||
draw_string_mono(System_Functions *system, Render_Target *target, Font_ID font_id, String str, i32 x, i32 y, f32 advance, u32 color){
|
||||
f32 w = draw_string_base(system, target, font_id, piece_type_mono_glyph, str, x, y, color);
|
||||
return(w);
|
||||
}
|
||||
|
||||
internal f32
|
||||
draw_string_mono(Render_Target *target, Font_ID font_id, char *str, i32 x, i32 y, f32 advance, u32 color){
|
||||
draw_string_mono(System_Functions *system, Render_Target *target, Font_ID font_id, char *str, i32 x, i32 y, f32 advance, u32 color){
|
||||
String string = make_string_slowly(str);
|
||||
f32 w = draw_string_base(target, font_id, piece_type_mono_glyph, string, x, y, color);
|
||||
f32 w = draw_string_base(system, target, font_id, piece_type_mono_glyph, string, x, y, color);
|
||||
return(w);
|
||||
}
|
||||
|
||||
internal f32
|
||||
font_string_width(Render_Target *target, Font_ID font_id, String str){
|
||||
f32 w = draw_string_base(target, font_id, piece_type_glyph, str, 0, 0, 0);
|
||||
font_string_width(System_Functions *system, Render_Target *target, Font_ID font_id, String str){
|
||||
f32 w = draw_string_base(system, target, font_id, piece_type_glyph, str, 0, 0, 0);
|
||||
return(w);
|
||||
}
|
||||
|
||||
internal f32
|
||||
font_string_width(Render_Target *target, Font_ID font_id, char *str){
|
||||
font_string_width(System_Functions *system, Render_Target *target, Font_ID font_id, char *str){
|
||||
String string = make_string_slowly(str);
|
||||
f32 w = draw_string_base(target, font_id, piece_type_glyph, string, 0, 0, 0);
|
||||
f32 w = draw_string_base(system, target, font_id, piece_type_glyph, string, 0, 0, 0);
|
||||
return(w);
|
||||
}
|
||||
|
||||
|
|
|
@ -424,10 +424,9 @@ get_exact_render_quad(Glyph_Bounds *b, i32 pw, i32 ph, float xpos, float ypos){
|
|||
}
|
||||
|
||||
inline void
|
||||
private_draw_glyph(Render_Target *target, Render_Font *font, u32 codepoint, f32 x, f32 y, u32 color){
|
||||
#if 0
|
||||
Glyph_Data glyph = {0};
|
||||
if (get_codepoint_glyph_data(font, character, &glyph)){
|
||||
private_draw_glyph(System_Functions *system, Render_Target *target, Render_Font *font, u32 codepoint, f32 x, f32 y, u32 color){
|
||||
Glyph_Data glyph = font_get_glyph(system, font, codepoint);
|
||||
if (glyph.tex != 0){
|
||||
Render_Quad q = get_render_quad(&glyph.bounds, glyph.tex_width, glyph.tex_height, x, y);
|
||||
|
||||
draw_set_color(target, color);
|
||||
|
@ -441,14 +440,12 @@ private_draw_glyph(Render_Target *target, Render_Font *font, u32 codepoint, f32
|
|||
}
|
||||
glEnd();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
inline void
|
||||
private_draw_glyph_mono(Render_Target *target, Render_Font *font, u32 codepoint, f32 x, f32 y, f32 advance, u32 color){
|
||||
#if 0
|
||||
Glyph_Data glyph = {0};
|
||||
if (get_codepoint_glyph_data(font, character, &glyph)){
|
||||
private_draw_glyph_mono(System_Functions *system, Render_Target *target, Render_Font *font, u32 codepoint, f32 x, f32 y, f32 advance, u32 color){
|
||||
Glyph_Data glyph = font_get_glyph(system, font, codepoint);
|
||||
if (glyph.tex != 0){
|
||||
f32 left = glyph.bounds.x0;
|
||||
f32 right = glyph.bounds.x1;
|
||||
f32 width = (right - left);
|
||||
|
@ -469,18 +466,16 @@ private_draw_glyph_mono(Render_Target *target, Render_Font *font, u32 codepoint,
|
|||
}
|
||||
glEnd();
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
inline void
|
||||
private_draw_glyph_mono(Render_Target *target, Render_Font *font, u32 character, f32 x, f32 y, u32 color){
|
||||
private_draw_glyph_mono(System_Functions *system, Render_Target *target, Render_Font *font, u32 character, f32 x, f32 y, u32 color){
|
||||
f32 advance = (f32)font_get_advance(font);
|
||||
private_draw_glyph_mono(target, font, character, x, y, advance, color);
|
||||
private_draw_glyph_mono(system, target, font, character, x, y, advance, color);
|
||||
}
|
||||
|
||||
internal void
|
||||
launch_rendering(Render_Target *target){
|
||||
launch_rendering(System_Functions *system, Render_Target *target){
|
||||
char *cursor = target->push_buffer;
|
||||
char *cursor_end = cursor + target->size;
|
||||
|
||||
|
@ -509,44 +504,34 @@ launch_rendering(Render_Target *target){
|
|||
|
||||
case piece_type_glyph:
|
||||
{
|
||||
#if 0
|
||||
Render_Piece_Glyph *glyph = ExtractStruct(Render_Piece_Glyph);
|
||||
|
||||
Render_Font *font = get_font_info(&target->font_set, glyph->font_id)->font;
|
||||
if (font){
|
||||
private_draw_glyph(target, font, glyph->character, glyph->pos.x, glyph->pos.y, glyph->color);
|
||||
}
|
||||
#endif
|
||||
Render_Font *font = system->font.get_render_data_by_id(glyph->font_id);
|
||||
Assert(font != 0);
|
||||
private_draw_glyph(system, target, font, glyph->codepoint, glyph->pos.x, glyph->pos.y, glyph->color);
|
||||
}break;
|
||||
|
||||
case piece_type_mono_glyph:
|
||||
{
|
||||
#if 0
|
||||
Render_Piece_Glyph *glyph = ExtractStruct(Render_Piece_Glyph);
|
||||
|
||||
Render_Font *font = get_font_info(&target->font_set, glyph->font_id)->font;
|
||||
if (font){
|
||||
private_draw_glyph_mono(target, font, glyph->character, glyph->pos.x, glyph->pos.y, glyph->color);
|
||||
}
|
||||
#endif
|
||||
Render_Font *font = system->font.get_render_data_by_id(glyph->font_id);
|
||||
Assert(font != 0);
|
||||
private_draw_glyph_mono(system, target, font, glyph->codepoint, glyph->pos.x, glyph->pos.y, glyph->color);
|
||||
}break;
|
||||
|
||||
case piece_type_mono_glyph_advance:
|
||||
{
|
||||
#if 0
|
||||
Render_Piece_Glyph_Advance *glyph = ExtractStruct(Render_Piece_Glyph_Advance);
|
||||
|
||||
Render_Font *font = get_font_info(&target->font_set, glyph->font_id)->font;
|
||||
if (font){
|
||||
private_draw_glyph_mono(target, font, glyph->character, glyph->pos.x, glyph->pos.y, glyph->advance, glyph->color);
|
||||
}
|
||||
#endif
|
||||
Render_Font *font = system->font.get_render_data_by_id(glyph->font_id);
|
||||
Assert(font != 0);
|
||||
private_draw_glyph_mono(system, target, font, glyph->codepoint, glyph->pos.x, glyph->pos.y, glyph->advance, glyph->color);
|
||||
}break;
|
||||
|
||||
case piece_type_change_clip:
|
||||
{
|
||||
Render_Piece_Change_Clip *clip =
|
||||
ExtractStruct(Render_Piece_Change_Clip);
|
||||
Render_Piece_Change_Clip *clip = ExtractStruct(Render_Piece_Change_Clip);
|
||||
draw_set_clip(target, clip->box);
|
||||
}break;
|
||||
}
|
||||
|
@ -684,7 +669,9 @@ font_load_page_inner(Partition *part, Render_Font *font, FT_Library ft, FT_Face
|
|||
}
|
||||
|
||||
internal b32
|
||||
font_load_page(System_Functions *system, Partition *part, Render_Font *font, char *filename, i32 pt_size, i32 tab_width, b32 use_hinting, u32 page_number){
|
||||
font_load_page(System_Functions *system, Partition *part, Render_Font *font, Glyph_Page *page, u32 page_number, u32 pt_size, b32 use_hinting){
|
||||
|
||||
char *filename = font->filename;
|
||||
|
||||
// TODO(allen): Stop redoing all this init for each call.
|
||||
FT_Library ft;
|
||||
|
@ -694,8 +681,7 @@ font_load_page(System_Functions *system, Partition *part, Render_Font *font, cha
|
|||
FT_New_Face(ft, filename, 0, &face);
|
||||
|
||||
// NOTE(allen): set texture and glyph data.
|
||||
Glyph_Page *page = font_get_or_make_page(system, font, page_number);
|
||||
font_load_page_inner(part, font, ft, face, use_hinting, page, page_number, tab_width);
|
||||
font_load_page_inner(part, font, ft, face, use_hinting, page, page_number, 4);
|
||||
|
||||
FT_Done_FreeType(ft);
|
||||
|
||||
|
@ -703,9 +689,9 @@ font_load_page(System_Functions *system, Partition *part, Render_Font *font, cha
|
|||
}
|
||||
|
||||
internal b32
|
||||
font_load(System_Functions *system, Partition *part, Render_Font *font, char *filename, i32 pt_size, i32 tab_width, b32 use_hinting){
|
||||
font_load(System_Functions *system, Partition *part, Render_Font *font, i32 pt_size, b32 use_hinting){
|
||||
|
||||
memset(font, 0, sizeof(*font));
|
||||
char *filename = font->filename;
|
||||
|
||||
// TODO(allen): Stop redoing all this init for each call.
|
||||
FT_Library ft;
|
||||
|
@ -731,7 +717,6 @@ font_load(System_Functions *system, Partition *part, Render_Font *font, char *fi
|
|||
|
||||
// NOTE(allen): set texture and glyph data.
|
||||
Glyph_Page *page = font_get_or_make_page(system, font, 0);
|
||||
font_load_page_inner(part, font, ft, face, use_hinting, page, 0, tab_width);
|
||||
|
||||
// NOTE(allen): Setup some basic spacing stuff.
|
||||
f32 backslash_adv = page->advance['\\'];
|
||||
|
@ -750,12 +735,63 @@ font_load(System_Functions *system, Partition *part, Render_Font *font, char *fi
|
|||
}
|
||||
|
||||
font->byte_advance = backslash_adv + max_hex_advance*2;
|
||||
font->byte_sub_advances[0] = backslash_adv;
|
||||
font->byte_sub_advances[1] = max_hex_advance;
|
||||
font->byte_sub_advances[2] = max_hex_advance;
|
||||
|
||||
FT_Done_FreeType(ft);
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
internal void
|
||||
system_set_page(System_Functions *system, Partition *part, Render_Font *font, Glyph_Page *page, u32 page_number, u32 pt_size, b32 use_hinting){
|
||||
memset(page, 0, sizeof(*page));
|
||||
|
||||
if (part->base == 0){
|
||||
*part = sysshared_scratch_partition(MB(8));
|
||||
}
|
||||
|
||||
b32 success = false;
|
||||
for (u32 R = 0; R < 3; ++R){
|
||||
success = font_load_page(system, part, font, page, page_number, pt_size, use_hinting);
|
||||
if (success){
|
||||
break;
|
||||
}
|
||||
else{
|
||||
sysshared_partition_double(part);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal void
|
||||
system_set_font(System_Functions *system, Partition *part, Render_Font *font, String filename, String name, u32 pt_size, b32 use_hinting){
|
||||
memset(font, 0, sizeof(*font));
|
||||
|
||||
copy_partial_cs(font->filename, sizeof(font->filename)-1, filename);
|
||||
font->filename_len = filename.size;
|
||||
font->filename[font->filename_len] = 0;
|
||||
copy_partial_cs(font->name, sizeof(font->name)-1, name);
|
||||
font->name_len = name.size;
|
||||
font->name[font->name_len] = 0;
|
||||
|
||||
if (part->base == 0){
|
||||
*part = sysshared_scratch_partition(MB(8));
|
||||
}
|
||||
|
||||
b32 success = false;
|
||||
for (u32 R = 0; R < 3; ++R){
|
||||
success = font_load(system, part, font, pt_size, use_hinting);
|
||||
if (success){
|
||||
break;
|
||||
}
|
||||
else{
|
||||
sysshared_partition_double(part);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
// BOTTOM
|
||||
|
|
|
@ -922,17 +922,12 @@ buffer_measure_wrap_y(Buffer_Measure_Wrap_State *S_ptr, Buffer_Measure_Wrap_Para
|
|||
}
|
||||
else if (S.behavior.do_number_advance || S.behavior.do_codepoint_advance){
|
||||
if (!S.skipping_whitespace){
|
||||
|
||||
S.current_adv = 2.f;
|
||||
|
||||
#if 0
|
||||
if (S.behavior.do_codepoint_advance){
|
||||
S.current_adv = get_codepoint_advance(params.font, S.tran.step_current.value);
|
||||
S.current_adv = font_get_glyph_advance(params.system, params.font, S.step.value);
|
||||
}
|
||||
else{
|
||||
S.current_adv = params.font->byte_advance;
|
||||
S.current_adv = font_get_byte_advance(params.font);
|
||||
}
|
||||
#endif
|
||||
|
||||
S.did_wrap = false;
|
||||
if (S.i >= S.wrap_unit_end){
|
||||
|
@ -1438,9 +1433,7 @@ buffer_cursor_seek(Buffer_Cursor_Seek_State *S_ptr, Buffer_Cursor_Seek_Params pa
|
|||
switch (params.seek.type){
|
||||
case buffer_seek_pos:
|
||||
{
|
||||
if (params.seek.pos > S.size){
|
||||
params.seek.pos = S.size;
|
||||
}
|
||||
params.seek.pos = clamp(0, params.seek.pos, S.size);
|
||||
|
||||
line_index = buffer_get_line_index(params.buffer, params.seek.pos);
|
||||
}break;
|
||||
|
@ -1449,34 +1442,21 @@ buffer_cursor_seek(Buffer_Cursor_Seek_State *S_ptr, Buffer_Cursor_Seek_Params pa
|
|||
{
|
||||
i32 line_count = params.buffer->line_count;
|
||||
i32 max_character = params.character_starts[line_count] - 1;
|
||||
if (params.seek.pos > max_character){
|
||||
params.seek.pos = max_character;
|
||||
}
|
||||
params.seek.pos = clamp(0, params.seek.pos, max_character);
|
||||
|
||||
line_index = buffer_get_line_index_from_character_pos(params.character_starts, params.seek.pos,
|
||||
0, params.buffer->line_count);
|
||||
line_index = buffer_get_line_index_from_character_pos(params.character_starts, params.seek.pos, 0, params.buffer->line_count);
|
||||
}break;
|
||||
|
||||
case buffer_seek_line_char:
|
||||
{
|
||||
line_index = params.seek.line - 1;
|
||||
if (line_index >= params.buffer->line_count){
|
||||
line_index = params.buffer->line_count - 1;
|
||||
}
|
||||
if (line_index < 0){
|
||||
line_index = 0;
|
||||
}
|
||||
line_index = clamp_bottom(0, line_index);
|
||||
}break;
|
||||
|
||||
case buffer_seek_unwrapped_xy:
|
||||
{
|
||||
line_index = (i32)(params.seek.y / S.font_height);
|
||||
if (line_index >= params.buffer->line_count){
|
||||
line_index = params.buffer->line_count - 1;
|
||||
}
|
||||
if (line_index < 0){
|
||||
line_index = 0;
|
||||
}
|
||||
line_index = clamp_bottom(0, line_index);
|
||||
}break;
|
||||
|
||||
case buffer_seek_wrapped_xy:
|
||||
|
@ -1487,15 +1467,20 @@ buffer_cursor_seek(Buffer_Cursor_Seek_State *S_ptr, Buffer_Cursor_Seek_Params pa
|
|||
default: InvalidCodePath;
|
||||
}
|
||||
|
||||
i32 safe_line_index = line_index;
|
||||
if (line_index >= params.buffer->line_count){
|
||||
safe_line_index = params.buffer->line_count-1;
|
||||
}
|
||||
|
||||
// Build the cursor hint
|
||||
S.next_cursor.pos = params.buffer->line_starts[line_index];
|
||||
S.next_cursor.character_pos = params.character_starts[line_index];
|
||||
S.next_cursor.pos = params.buffer->line_starts[safe_line_index];
|
||||
S.next_cursor.character_pos = params.character_starts[safe_line_index];
|
||||
S.next_cursor.line = line_index + 1;
|
||||
S.next_cursor.character = 1;
|
||||
S.next_cursor.wrap_line = params.wrap_line_index[line_index] + 1;
|
||||
S.next_cursor.unwrapped_y = (f32)(line_index * S.font_height);
|
||||
S.next_cursor.wrap_line = params.wrap_line_index[safe_line_index] + 1;
|
||||
S.next_cursor.unwrapped_y = (f32)(safe_line_index * S.font_height);
|
||||
S.next_cursor.unwrapped_x = 0;
|
||||
S.next_cursor.wrapped_y = (f32)(params.wrap_line_index[line_index] * S.font_height);
|
||||
S.next_cursor.wrapped_y = (f32)(params.wrap_line_index[safe_line_index] * S.font_height);
|
||||
S.next_cursor.wrapped_x = 0;
|
||||
}
|
||||
|
||||
|
@ -1624,16 +1609,12 @@ buffer_cursor_seek(Buffer_Cursor_Seek_State *S_ptr, Buffer_Cursor_Seek_Params pa
|
|||
}
|
||||
else if (S.behavior.do_number_advance || S.behavior.do_codepoint_advance){
|
||||
|
||||
S.ch_width = 2.f;
|
||||
|
||||
#if 0
|
||||
if (S.tran.do_codepoint_advance){
|
||||
S.ch_width = get_codepoint_advance(params.font, S.tran.step_current.value);
|
||||
if (S.behavior.do_codepoint_advance){
|
||||
S.ch_width = font_get_glyph_advance(params.system, params.font, S.step.value);
|
||||
}
|
||||
else{
|
||||
S.ch_width = params.font->byte_advance;
|
||||
S.ch_width = font_get_byte_advance(params.font);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (S.step.i >= S.wrap_unit_end){
|
||||
S_stop.status = BLStatus_NeedWrapDetermination;
|
||||
|
@ -1821,6 +1802,7 @@ typedef struct Buffer_Render_Item{
|
|||
typedef struct Render_Item_Write{
|
||||
Buffer_Render_Item *item;
|
||||
f32 x, y;
|
||||
System_Functions *system;
|
||||
Render_Font *font;
|
||||
i32 font_height;
|
||||
f32 x_min;
|
||||
|
@ -1830,11 +1812,7 @@ typedef struct Render_Item_Write{
|
|||
inline Render_Item_Write
|
||||
write_render_item(Render_Item_Write write, i32 index, u32 codepoint, u32 flags){
|
||||
|
||||
#if 0
|
||||
f32 ch_width = get_codepoint_advance(write.font, codepoint);
|
||||
#endif
|
||||
|
||||
f32 ch_width = 2.f;
|
||||
f32 ch_width = font_get_glyph_advance(write.system, write.font, codepoint);
|
||||
|
||||
if (write.x <= write.x_max && write.x + ch_width >= write.x_min){
|
||||
write.item->index = index;
|
||||
|
@ -1945,6 +1923,7 @@ buffer_render_data(Buffer_Render_State *S_ptr, Buffer_Render_Params params, f32
|
|||
S.write.item = params.items;
|
||||
S.write.x = S.shift_x + line_shift;
|
||||
S.write.y = S.shift_y;
|
||||
S.write.system = params.system;
|
||||
S.write.font = params.font;
|
||||
S.write.font_height = font_get_height(params.font);
|
||||
S.write.x_min = params.port_x;
|
||||
|
@ -2055,10 +2034,7 @@ buffer_render_data(Buffer_Render_State *S_ptr, Buffer_Render_Params params, f32
|
|||
|
||||
case '\t':
|
||||
{
|
||||
#if 0
|
||||
S.ch_width = get_codepoint_advance(params.font, '\t');
|
||||
#endif
|
||||
S.ch_width = 2.f;
|
||||
S.ch_width = font_get_glyph_advance(params.system, params.font, '\t');
|
||||
|
||||
f32 new_x = S.write.x + S.ch_width;
|
||||
S.write = write_render_item(S.write, I, ' ', 0);
|
||||
|
|
|
@ -18,6 +18,7 @@ struct Translation_State{
|
|||
global_const Translation_State null_buffer_translating_state = {0};
|
||||
|
||||
enum{
|
||||
TranLBH_None,
|
||||
TranLBH_Rebuffer,
|
||||
TranLBH_EmitAsCP,
|
||||
};
|
||||
|
@ -41,6 +42,8 @@ struct Translation_Emits{
|
|||
u32 step_count;
|
||||
};
|
||||
|
||||
#define SINGLE_BYTE_ERROR_CLASS max_u8
|
||||
|
||||
internal void
|
||||
translating_consume_byte(Translation_State *tran, u8 ch, u32 i, u32 size, Translation_Byte_Description *desc_out){
|
||||
desc_out->byte_class = 0;
|
||||
|
@ -48,7 +51,7 @@ translating_consume_byte(Translation_State *tran, u8 ch, u32 i, u32 size, Transl
|
|||
desc_out->byte_class = 1;
|
||||
}
|
||||
else if (ch < 0xC0){
|
||||
desc_out->byte_class = max_u8;
|
||||
desc_out->byte_class = SINGLE_BYTE_ERROR_CLASS;
|
||||
}
|
||||
else if (ch < 0xE0){
|
||||
desc_out->byte_class = 2;
|
||||
|
@ -61,7 +64,7 @@ translating_consume_byte(Translation_State *tran, u8 ch, u32 i, u32 size, Transl
|
|||
}
|
||||
|
||||
desc_out->prelim_emit_type = BufferModelUnit_None;
|
||||
desc_out->last_byte_handler = 0;
|
||||
desc_out->last_byte_handler = TranLBH_None;
|
||||
if (tran->fill_expected == 0){
|
||||
tran->fill_buffer[0] = ch;
|
||||
tran->fill_start_i = i;
|
||||
|
@ -70,7 +73,7 @@ translating_consume_byte(Translation_State *tran, u8 ch, u32 i, u32 size, Transl
|
|||
if (desc_out->byte_class == 1){
|
||||
desc_out->prelim_emit_type = BufferModelUnit_Codepoint;
|
||||
}
|
||||
else if (desc_out->byte_class == 0 || desc_out->byte_class == 1000){
|
||||
else if (desc_out->byte_class == 0 || desc_out->byte_class == SINGLE_BYTE_ERROR_CLASS){
|
||||
desc_out->prelim_emit_type = BufferModelUnit_Numbers;
|
||||
}
|
||||
else{
|
||||
|
@ -78,7 +81,7 @@ translating_consume_byte(Translation_State *tran, u8 ch, u32 i, u32 size, Transl
|
|||
}
|
||||
}
|
||||
else{
|
||||
if (desc_out->byte_class == 1000){
|
||||
if (desc_out->byte_class == SINGLE_BYTE_ERROR_CLASS){
|
||||
tran->fill_buffer[tran->fill_i] = ch;
|
||||
++tran->fill_i;
|
||||
|
||||
|
|
|
@ -38,12 +38,13 @@ struct Render_Font{
|
|||
Glyph_Page **pages;
|
||||
u32 page_count, page_max;
|
||||
f32 byte_advance;
|
||||
f32 byte_sub_advances[3];
|
||||
i32 height, ascent, descent, line_skip, advance;
|
||||
|
||||
char filename[256];
|
||||
char name[256];
|
||||
u32 filename_len;
|
||||
u32 name_len;
|
||||
char filename[256];
|
||||
char name[256];
|
||||
};
|
||||
|
||||
struct Glyph_Data{
|
||||
|
@ -56,4 +57,3 @@ struct Glyph_Data{
|
|||
|
||||
// BOTTOM
|
||||
|
||||
|
||||
|
|
|
@ -26,13 +26,16 @@ 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)
|
||||
#define Sys_Font_Get_Name_By_ID_Sig(name_) u32 (name_)(u32 font_id, 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);
|
||||
|
||||
#define Sys_Font_Allocate_Sig(name_) void* (name_)(umem size)
|
||||
#define Sys_Font_Load_Page_Sig(name_) void (name_)(Render_Font *font, Glyph_Page *page, u32 page_number)
|
||||
typedef Sys_Font_Load_Page_Sig(Font_Load_Page_Function);
|
||||
|
||||
#define Sys_Font_Allocate_Sig(name_) void* (name_)(i32 size)
|
||||
typedef Sys_Font_Allocate_Sig(Font_Allocate_Function);
|
||||
|
||||
#define Sys_Font_Free_Sig(name_) void (name_)(void *ptr)
|
||||
|
@ -44,12 +47,14 @@ struct Font_Functions{
|
|||
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;
|
||||
Font_Load_Page_Function *load_page;
|
||||
|
||||
Font_Allocate_Function *allocate;
|
||||
Font_Free_Function *free;
|
||||
};
|
||||
|
||||
internal f32 font_get_byte_advance(Render_Font *font);
|
||||
internal f32*font_get_byte_sub_advances(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);
|
||||
|
@ -57,6 +62,10 @@ internal i32 font_get_line_skip(Render_Font *font);
|
|||
internal i32 font_get_advance(Render_Font *font);
|
||||
|
||||
internal b32 font_can_render(struct System_Functions *system, Render_Font *font, u32 codepoint);
|
||||
internal f32 font_get_glyph_advance(struct System_Functions *system, Render_Font *font, u32 codepoint);
|
||||
|
||||
struct Glyph_Data;
|
||||
internal Glyph_Data font_get_glyph(System_Functions *system, Render_Font *font, u32 codepoint);
|
||||
|
||||
internal Glyph_Page *font_get_or_make_page(struct System_Functions *system, Render_Font *font, u32 page_number);
|
||||
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
* Mr. 4th Dimention - Allen Webster
|
||||
*
|
||||
* 13.03.2017
|
||||
*
|
||||
* Font system interface to the OS layer.
|
||||
*
|
||||
*/
|
||||
|
||||
// TOP
|
||||
|
||||
#if !defined(FCODER_FONT_INTERFACE_TO_OS_H)
|
||||
#define FCODER_FONT_INTERFACE_TO_OS_H
|
||||
|
||||
#define Sys_Font_Init_Sig(name_) void (name_)(Font_Functions *font, void *memory, umem memory_size, u32 font_size, b32 use_hinting)
|
||||
internal Sys_Font_Init_Sig(system_font_init);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
// BOTTOM
|
||||
|
||||
|
||||
|
|
@ -16,6 +16,11 @@ font_get_byte_advance(Render_Font *font){
|
|||
return(font->byte_advance);
|
||||
}
|
||||
|
||||
internal f32*
|
||||
font_get_byte_sub_advances(Render_Font *font){
|
||||
return(font->byte_sub_advances);
|
||||
}
|
||||
|
||||
internal i32
|
||||
font_get_height(Render_Font *font){
|
||||
return(font->height);
|
||||
|
@ -46,12 +51,37 @@ font_can_render(System_Functions *system, Render_Font *font, u32 codepoint){
|
|||
b32 result = false;
|
||||
u32 page_number = (codepoint >> 8);
|
||||
u32 glyph_index = codepoint & 0xFF;
|
||||
|
||||
Glyph_Page *page = font_get_or_make_page(system, font, page_number);
|
||||
if (page != 0 && page->advance[glyph_index] > 0.f){
|
||||
result = true;
|
||||
}
|
||||
return(result);
|
||||
}
|
||||
|
||||
internal f32
|
||||
font_get_glyph_advance(System_Functions *system, Render_Font *font, u32 codepoint){
|
||||
f32 result = 0.f;
|
||||
u32 page_number = (codepoint >> 8);
|
||||
u32 glyph_index = codepoint & 0xFF;
|
||||
Glyph_Page *page = font_get_or_make_page(system, font, page_number);
|
||||
if (page != 0 && page->advance[glyph_index] > 0.f){
|
||||
result = page->advance[glyph_index];
|
||||
}
|
||||
return(result);
|
||||
}
|
||||
|
||||
internal Glyph_Data
|
||||
font_get_glyph(System_Functions *system, Render_Font *font, u32 codepoint){
|
||||
Glyph_Data result = {0};
|
||||
u32 page_number = (codepoint >> 8);
|
||||
u32 glyph_index = codepoint & 0xFF;
|
||||
Glyph_Page *page = font_get_or_make_page(system, font, page_number);
|
||||
if (page != 0 && page->advance[glyph_index] > 0.f){
|
||||
result.bounds = page->glyphs[glyph_index];
|
||||
result.tex = page->tex;
|
||||
result.tex_width = page->tex_width;
|
||||
result.tex_height = page->tex_height;
|
||||
}
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
@ -153,14 +183,16 @@ font_get_or_make_page(System_Functions *system, Render_Font *font, u32 page_numb
|
|||
*dest = new_page;
|
||||
font->page_count += new_page_count;
|
||||
result = new_page;
|
||||
system->font.load_page(font, new_page, page_number);
|
||||
}
|
||||
}
|
||||
}
|
||||
else{
|
||||
result = *page_get_result;
|
||||
}
|
||||
}
|
||||
return(result);
|
||||
}
|
||||
|
||||
// BOTTOM
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -2424,10 +2424,6 @@ LinuxGetXSettingsDPI(Display* dpy, int screen)
|
|||
internal b32
|
||||
LinuxX11WindowInit(int argc, char** argv, int* WinWidth, int* WinHeight)
|
||||
{
|
||||
// NOTE(allen): Here begins the linux screen setup stuff.
|
||||
// Behold the true nature of this wonderful OS:
|
||||
// (thanks again to Casey for providing this stuff)
|
||||
|
||||
#define BASE_W 800
|
||||
#define BASE_H 600
|
||||
|
||||
|
@ -2454,17 +2450,10 @@ LinuxX11WindowInit(int argc, char** argv, int* WinWidth, int* WinHeight)
|
|||
swa.backing_store = WhenMapped;
|
||||
swa.event_mask = StructureNotifyMask;
|
||||
swa.bit_gravity = NorthWestGravity;
|
||||
swa.colormap = XCreateColormap(linuxvars.XDisplay,
|
||||
RootWindow(linuxvars.XDisplay, Config.BestInfo.screen),
|
||||
Config.BestInfo.visual, AllocNone);
|
||||
swa.colormap = XCreateColormap(linuxvars.XDisplay, RootWindow(linuxvars.XDisplay, Config.BestInfo.screen), Config.BestInfo.visual, AllocNone);
|
||||
|
||||
linuxvars.XWindow =
|
||||
XCreateWindow(linuxvars.XDisplay,
|
||||
RootWindow(linuxvars.XDisplay, Config.BestInfo.screen),
|
||||
0, 0, *WinWidth, *WinHeight,
|
||||
0, Config.BestInfo.depth, InputOutput,
|
||||
Config.BestInfo.visual,
|
||||
CWBackingStore|CWBitGravity|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &swa);
|
||||
linuxvars.XWindow = XCreateWindow(linuxvars.XDisplay, RootWindow(linuxvars.XDisplay, Config.BestInfo.screen),
|
||||
0, 0, *WinWidth, *WinHeight, 0, Config.BestInfo.depth, InputOutput, Config.BestInfo.visual, CWBackingStore|CWBitGravity|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &swa);
|
||||
|
||||
if (!linuxvars.XWindow){
|
||||
LinuxFatalErrorMsg("XCreateWindow failed. Make sure your display is set up correctly.");
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
1
|
||||
0
|
||||
63
|
||||
68
|
||||
|
||||
|
||||
|
|
Binary file not shown.
|
@ -970,6 +970,23 @@ This call returns non-zero on a successful copy.) */{
|
|||
return 1;
|
||||
}
|
||||
|
||||
CPP_NAME(copy_checked)
|
||||
API_EXPORT FSTRING_LINK b32_4tech
|
||||
copy_checked_cs(char *dest, i32_4tech dest_cap, String src)/*
|
||||
DOC(This call performs a copy from the src string to the dest string.
|
||||
The value dest_cap is checked before any coppying is done.
|
||||
This call returns non-zero on a successful copy.)
|
||||
*/{
|
||||
i32_4tech i;
|
||||
if (dest_cap < src.size){
|
||||
return 0;
|
||||
}
|
||||
for (i = 0; i < src.size; ++i){
|
||||
dest[i] = src.str[i];
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
CPP_NAME(copy_partial)
|
||||
API_EXPORT FSTRING_LINK b32_4tech
|
||||
copy_partial_sc(String *dest, char *src)/*
|
||||
|
@ -995,9 +1012,9 @@ CPP_NAME(copy_partial)
|
|||
API_EXPORT FSTRING_LINK b32_4tech
|
||||
copy_partial_ss(String *dest, String src)/*
|
||||
DOC(This call performs a copy from the src string to the dest string.
|
||||
The memory_size of dest is checked if the entire copy cannot be performed,
|
||||
as many bytes as possible are coppied to dest. This call returns non-zero
|
||||
if the entire string is coppied to dest.) */{
|
||||
The memory_size of dest is checked. If the entire copy cannot be performed,
|
||||
as many bytes as possible are coppied to dest.
|
||||
This call returns non-zero if the entire string is coppied to dest.) */{
|
||||
char *dest_str = dest->str;
|
||||
i32_4tech memory_size = dest->memory_size;
|
||||
b32_4tech result = 0;
|
||||
|
@ -1009,7 +1026,28 @@ if the entire string is coppied to dest.) */{
|
|||
dest_str[i] = src.str[i];
|
||||
}
|
||||
dest->size = memory_size;
|
||||
return result;
|
||||
return(result);
|
||||
}
|
||||
|
||||
CPP_NAME(copy_partial)
|
||||
API_EXPORT FSTRING_LINK b32_4tech
|
||||
copy_partial_cs(char *dest, i32_4tech dest_cap, String src)/*
|
||||
DOC(This call performs a copy from the src string to the dest string.
|
||||
The value dest_cap is checked. If the entire copy cannot be performed,
|
||||
as many bytes as possible are coppied to dest.
|
||||
This call returns non-zero if the entire string is coppied to dest.)
|
||||
*/{
|
||||
b32_4tech result = 0;
|
||||
i32_4tech copy_size = dest_cap;
|
||||
i32_4tech i;
|
||||
if (dest_cap >= src.size){
|
||||
result = 1;
|
||||
copy_size = src.size;
|
||||
}
|
||||
for (i = 0; i < copy_size; ++i){
|
||||
dest[i] = src.str[i];
|
||||
}
|
||||
return(result);
|
||||
}
|
||||
|
||||
CPP_NAME(copy)
|
||||
|
|
|
@ -184,10 +184,8 @@ typedef struct Win32_Vars{
|
|||
b32 next_clipboard_is_self;
|
||||
DWORD clipboard_sequence;
|
||||
|
||||
|
||||
HWND window_handle;
|
||||
Render_Target target;
|
||||
Partition font_part;
|
||||
#if SUPPORT_DPI
|
||||
i32 dpi_x, dpi_y;
|
||||
#endif
|
||||
|
@ -332,9 +330,7 @@ Sys_Release_Lock_Sig(system_release_lock){
|
|||
|
||||
internal void
|
||||
system_wait_cv(i32 crit_id, i32 cv_id){
|
||||
SleepConditionVariableCS(win32vars.condition_vars + cv_id,
|
||||
win32vars.locks + crit_id,
|
||||
INFINITE);
|
||||
SleepConditionVariableCS(win32vars.condition_vars + cv_id, win32vars.locks + crit_id, INFINITE);
|
||||
}
|
||||
|
||||
internal void
|
||||
|
@ -371,9 +367,7 @@ JobThreadProc(LPVOID lpParameter){
|
|||
// wrapping by the queue wrap. That was super stupid what was that?
|
||||
// Now it just wraps by the queue wrap.
|
||||
u32 next_read_index = (read_index + 1) % QUEUE_WRAP;
|
||||
u32 safe_read_index =
|
||||
InterlockedCompareExchange(&queue->read_position,
|
||||
next_read_index, read_index);
|
||||
u32 safe_read_index = InterlockedCompareExchange(&queue->read_position, next_read_index, read_index);
|
||||
|
||||
if (safe_read_index == read_index){
|
||||
Full_Job_Data *full_job = queue->jobs + safe_read_index;
|
||||
|
@ -381,16 +375,13 @@ JobThreadProc(LPVOID lpParameter){
|
|||
// with the cancel job routine, which may try to cancel this job
|
||||
// at the same time that we try to run it
|
||||
|
||||
i32 safe_running_thread =
|
||||
InterlockedCompareExchange(&full_job->running_thread,
|
||||
thread->id, THREAD_NOT_ASSIGNED);
|
||||
i32 safe_running_thread =InterlockedCompareExchange(&full_job->running_thread, thread->id, THREAD_NOT_ASSIGNED);
|
||||
|
||||
if (safe_running_thread == THREAD_NOT_ASSIGNED){
|
||||
thread->job_id = full_job->id;
|
||||
thread->running = 1;
|
||||
|
||||
full_job->job.callback(&win32vars.system,
|
||||
thread, thread_memory, full_job->job.data);
|
||||
full_job->job.callback(&win32vars.system, thread, thread_memory, full_job->job.data);
|
||||
PostMessage(win32vars.window_handle, WM_4coder_ANIMATE, 0, 0);
|
||||
//full_job->running_thread = 0;
|
||||
thread->running = 0;
|
||||
|
@ -1391,6 +1382,8 @@ Sys_Send_Exit_Signal_Sig(system_send_exit_signal){
|
|||
|
||||
#include "4ed_system_shared.cpp"
|
||||
|
||||
#include "win32_4ed_fonts.cpp"
|
||||
|
||||
//
|
||||
// Linkage to Custom and Application
|
||||
//
|
||||
|
@ -1458,7 +1451,6 @@ Win32LoadSystemCode(){
|
|||
win32vars.system.is_fullscreen = system_is_fullscreen;win32vars.system.show_mouse_cursor = system_show_mouse_cursor;
|
||||
win32vars.system.send_exit_signal = system_send_exit_signal;
|
||||
|
||||
|
||||
#if FRED_INTERNAL
|
||||
win32vars.system.internal_get_thread_states = INTERNAL_get_thread_states;
|
||||
#endif
|
||||
|
@ -1469,11 +1461,6 @@ Win32LoadRenderCode(){
|
|||
win32vars.target.push_clip = draw_push_clip;
|
||||
win32vars.target.pop_clip = draw_pop_clip;
|
||||
win32vars.target.push_piece = draw_push_piece;
|
||||
|
||||
#if 0
|
||||
win32vars.target.font_set.font_load = font_load;
|
||||
win32vars.target.font_set.release_font = draw_release_font;
|
||||
#endif
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -1518,7 +1505,7 @@ Win32KeycodeInit(){
|
|||
|
||||
internal void
|
||||
Win32RedrawScreen(HDC hdc){
|
||||
launch_rendering(&win32vars.target);
|
||||
launch_rendering(&win32vars.system, &win32vars.target);
|
||||
glFlush();
|
||||
SwapBuffers(hdc);
|
||||
}
|
||||
|
@ -2034,11 +2021,10 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
|
|||
win32vars.target.max = MB(1);
|
||||
win32vars.target.push_buffer = (char*)system_get_memory(win32vars.target.max);
|
||||
|
||||
if (!memory_vars.vars_memory || !memory_vars.target_memory || !memory_vars.user_memory || !win32vars.target.push_buffer){
|
||||
if (memory_vars.vars_memory == 0 || memory_vars.target_memory == 0 || memory_vars.user_memory == 0 || win32vars.target.push_buffer == 0){
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// System and Application Layer Linkage
|
||||
//
|
||||
|
@ -2048,17 +2034,14 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
|
|||
}
|
||||
|
||||
Win32LoadSystemCode();
|
||||
|
||||
Win32LoadRenderCode();
|
||||
|
||||
|
||||
//
|
||||
// Shared Systems Init
|
||||
//
|
||||
|
||||
init_shared_vars();
|
||||
|
||||
|
||||
//
|
||||
// Read Command Line
|
||||
//
|
||||
|
@ -2082,7 +2065,6 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
|
|||
|
||||
sysshared_filter_real_files(files, file_count);
|
||||
|
||||
|
||||
//
|
||||
// Custom Layer Linkage
|
||||
//
|
||||
|
@ -2192,6 +2174,11 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
|
|||
Win32InitGL();
|
||||
Win32Resize(window_rect.right - window_rect.left, window_rect.bottom - window_rect.top);
|
||||
|
||||
//
|
||||
// Font System Init
|
||||
//
|
||||
|
||||
system_font_init(&win32vars.system.font, 0, 0, 16, true);
|
||||
|
||||
//
|
||||
// Misc System Initializations
|
||||
|
|
|
@ -11,43 +11,124 @@
|
|||
|
||||
#include "4ed_system_shared.cpp"
|
||||
#include "font/4coder_font_interface.h"
|
||||
#include "font/4coder_font_interface_to_os.h"
|
||||
#include "font/4coder_font_data.h"
|
||||
|
||||
struct Win32_Fonts{
|
||||
Partition part;
|
||||
Render_Font fonts[5];
|
||||
u32 font_count;
|
||||
};
|
||||
|
||||
global Win32_Fonts win32_fonts = {0};
|
||||
|
||||
internal
|
||||
Sys_Font_Get_Count_Sig(system_font_get_count){
|
||||
|
||||
return(5);
|
||||
}
|
||||
|
||||
internal
|
||||
Sys_Font_Get_IDs_By_Index_Sig(system_font_get_ids_by_index){
|
||||
|
||||
b32 result = false;
|
||||
u32 stop_index = first_index + index_count;
|
||||
if (stop_index < win32_fonts.font_count){
|
||||
result = true;
|
||||
for (u32 i = first_index; i < stop_index; ++i){
|
||||
id_out[i] = i;
|
||||
}
|
||||
}
|
||||
return(result);
|
||||
}
|
||||
|
||||
internal
|
||||
Sys_Font_Get_Name_By_Index_Sig(system_font_get_name_by_index){
|
||||
|
||||
u32 length = 0;
|
||||
if (font_index < win32_fonts.font_count){
|
||||
Render_Font *font = &win32_fonts.fonts[font_index];
|
||||
char *name = font->name;
|
||||
u32 name_len = font->name_len;
|
||||
copy_partial_cs(str_out, str_out_cap, make_string(name, name_len));
|
||||
}
|
||||
return(length);
|
||||
}
|
||||
|
||||
internal
|
||||
Sys_Font_Get_Name_By_ID_Sig(system_font_get_name_by_id){
|
||||
|
||||
u32 font_index = font_id;
|
||||
u32 result = system_font_get_name_by_index(font_index, str_out, str_out_cap);
|
||||
return(result);
|
||||
}
|
||||
|
||||
internal
|
||||
Sys_Font_Get_Render_Data_By_ID_Sig(system_font_get_render_data_by_id){
|
||||
Render_Font *result = 0;
|
||||
u32 font_index = font_id;
|
||||
if (font_index < win32_fonts.font_count){
|
||||
result = &win32_fonts.fonts[font_index];
|
||||
}
|
||||
return(result);
|
||||
}
|
||||
|
||||
internal
|
||||
Sys_Font_Load_Page_Sig(system_font_load_page){
|
||||
system_set_page(&win32vars.system, &win32_fonts.part, font, page, page_number, 16, true);
|
||||
}
|
||||
|
||||
internal
|
||||
Sys_Font_Allocate_Sig(system_font_allocate){
|
||||
|
||||
void *result = system_memory_allocate(size);
|
||||
return(result);
|
||||
}
|
||||
|
||||
internal
|
||||
Sys_Font_Free_Sig(system_font_free){
|
||||
system_memory_free(ptr, 0);
|
||||
}
|
||||
|
||||
internal
|
||||
Sys_Font_Init_Sig(system_font_init){
|
||||
font->get_count = system_font_get_count;
|
||||
font->get_ids_by_index = system_font_get_ids_by_index;
|
||||
font->get_name_by_index = system_font_get_name_by_index;
|
||||
font->get_name_by_id = system_font_get_name_by_id;
|
||||
font->get_render_data_by_id = system_font_get_render_data_by_id;
|
||||
font->load_page = system_font_load_page;
|
||||
font->allocate = system_font_allocate;
|
||||
font->free = system_font_free;
|
||||
|
||||
font_size = clamp_bottom(8, font_size);
|
||||
|
||||
struct Font_Setup{
|
||||
char *c_filename;
|
||||
i32 filename_len;
|
||||
char *c_name;
|
||||
i32 name_len;
|
||||
u32 pt_size;
|
||||
};
|
||||
Font_Setup font_setup[] = {
|
||||
{literal("LiberationSans-Regular.ttf"), literal("Liberation Sans"), font_size},
|
||||
{literal("liberation-mono.ttf"), literal("Liberation Mono"), font_size},
|
||||
{literal("Hack-Regular.ttf"), literal("Hack"), font_size},
|
||||
{literal("CutiveMono-Regular.ttf"), literal("Cutive Mono"), font_size},
|
||||
{literal("Inconsolata-Regular.ttf"), literal("Inconsolata"), font_size},
|
||||
};
|
||||
|
||||
u32 font_count = Min(ArrayCount(win32_fonts.fonts), ArrayCount(font_setup));
|
||||
for (u32 i = 0; i < font_count; ++i){
|
||||
String filename = make_string(font_setup[i].c_filename, font_setup[i].filename_len);
|
||||
String name = make_string(font_setup[i].c_name, font_setup[i].name_len);
|
||||
u32 pt_size = font_setup[i].pt_size;
|
||||
Render_Font *render_font = &win32_fonts.fonts[i];
|
||||
|
||||
char full_filename_space[256];
|
||||
String full_filename = make_fixed_width_string(full_filename_space);
|
||||
sysshared_to_binary_path(&full_filename, filename.str);
|
||||
|
||||
system_set_font(&win32vars.system, &win32_fonts.part, render_font, full_filename, name, pt_size, use_hinting);
|
||||
}
|
||||
|
||||
win32_fonts.font_count = font_count;
|
||||
}
|
||||
|
||||
// BOTTOM
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -79,6 +79,7 @@ wglGetExtensionsStringARB_Function(HDC hdc);
|
|||
typedef void CALL_CONVENTION
|
||||
GLDEBUGPROC_TYPE(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const char * message, const GLvoid * userParam);
|
||||
|
||||
// TODO(allen): these don't belong here, but the organizational stuff is not fully in place yet.
|
||||
typedef GLDEBUGPROC_TYPE * GLDEBUGPROC;
|
||||
typedef void CALL_CONVENTION
|
||||
glDebugMessageControl_type(GLenum source, GLenum type, GLenum severity, GLsizei count, GLuint * ids, GLboolean enabled);
|
||||
|
|
Loading…
Reference in New Issue