From e7d8aae42e379bfc98529f288a1bfc00c9e57609 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Mon, 20 Nov 2017 11:56:21 -0500 Subject: [PATCH] Finished font organization, began adding italics, bold, underline. --- 4ed_file_view.cpp | 99 ++++++++++++++++++---------------- 4ed_font.h | 27 +++++++--- 4ed_font_provider_freetype.cpp | 74 ++++++++++++++++--------- 3 files changed, 120 insertions(+), 80 deletions(-) diff --git a/4ed_file_view.cpp b/4ed_file_view.cpp index f2f4ee35..dc3feaee 100644 --- a/4ed_file_view.cpp +++ b/4ed_file_view.cpp @@ -3569,7 +3569,7 @@ global_set_font(System_Functions *system, Models *models, Font_ID font_id){ internal void alter_font(System_Functions *system, Models *models, Font_ID font_id, Font_Settings *new_settings){ - if (system->font.change_settings(font_id, new_settings)){ + if (system->font.face_change_settings(font_id, new_settings)){ File_Node *node = 0; File_Node *sentinel = &models->working_set.used_sentinel; for (dll_items(node, sentinel)){ @@ -4541,9 +4541,6 @@ step_file_view(System_Functions *system, View *view, Models *models, View *activ Font_ID font_id = file->settings.font_id; Font_ID new_font_id = 0; -#if 1 - - // NEW Font_ID largest_id = system->font.get_largest_id(); for (Font_ID i = 1; i <= largest_id; ++i){ Font_Pointers font = system->font.get_pointers_by_id(i); @@ -4554,18 +4551,21 @@ step_file_view(System_Functions *system, View *view, Models *models, View *activ char space[512]; String m = make_fixed_width_string(space); if (i == font_id){ - append(&m, "* "); + append(&m, "*"); } - append(&m, "family:\""); + append(&m, " \""); append(&m, make_string(metrics->name, metrics->name_len)); - append(&m, "\" size:"); - append_int_to_str(&m, settings->pt_size); - append(&m, " hint:"); - append(&m, (char*)(settings->use_hinting?"ON ":"OFF")); + append(&m, "\" "); + append_int_to_str(&m, settings->parameters.pt_size); + append(&m, " "); + append(&m, (char*)(settings->parameters.italics?"italics ":"")); + append(&m, (char*)(settings->parameters.bold?"bold ":"")); + append(&m, (char*)(settings->parameters.underline?"underline ":"")); + append(&m, (char*)(settings->parameters.use_hinting?"hinting ":"")); if (i == font_id){ - append(&m, " *"); + append(&m, "*"); } id.id[0] = i*2 + 0; @@ -4592,7 +4592,7 @@ step_file_view(System_Functions *system, View *view, Models *models, View *activ if (gui_do_button(target, id, make_lit_string("new face"))){ if (new_font_id == 0){ Font_Pointers font = system->font.get_pointers_by_id(font_id); - view->font_edit_id = system->font.load_new_font(&font.settings->stub); + view->font_edit_id = system->font.face_allocate_and_init(font.settings); if (view->color_mode == CV_Mode_Font){ view->color_mode = CV_Mode_Font_Editing; } @@ -4602,30 +4602,6 @@ step_file_view(System_Functions *system, View *view, Models *models, View *activ } } -#else - - // OLD - i32 total_count = system->font.get_loadable_count(); - for (i32 i = 0; i < total_count; ++i){ - Font_Loadable_Description loadable = {0}; - system->font.get_loadable(i, &loadable); - - id.id[0] = (u64)i + 1; - if (loadable.valid){ - String name = make_string(loadable.display_name, loadable.display_len); - if (gui_do_button(target, id, name)){ - if (new_font_id == 0){ - new_font_id = font_get_id_by_name(system, name); - if (new_font_id == 0){ - new_font_id = system->font.load_new_font(&loadable.stub); - } - } - } - } - } - -#endif - if (new_font_id != 0){ if (view->color_mode == CV_Mode_Font && new_font_id != font_id){ file_set_font(system, models, file, new_font_id); @@ -4663,37 +4639,68 @@ step_file_view(System_Functions *system, View *view, Models *models, View *activ char space[128]; String m = make_fixed_width_string(space); copy(&m, "Size Up ("); - append_int_to_str(&m, settings->pt_size); + append_int_to_str(&m, settings->parameters.pt_size); append(&m, ")"); ++id.id[0]; if (gui_do_button(target, id, m)){ if (!has_new_settings){ has_new_settings = true; - ++new_settings.pt_size; + ++new_settings.parameters.pt_size; } } copy(&m, "Size Down ("); - append_int_to_str(&m, settings->pt_size); + append_int_to_str(&m, settings->parameters.pt_size); append(&m, ")"); ++id.id[0]; if (gui_do_button(target, id, m)){ if (!has_new_settings){ has_new_settings = true; - --new_settings.pt_size; + --new_settings.parameters.pt_size; } } - copy(&m, "Turn Hinting "); - append(&m, (char*)(settings->use_hinting?"Off":"On")); - append(&m, " (it is currently "); - append(&m, (char*)(settings->use_hinting?"On":"Off")); - append(&m, ")"); + copy(&m, "Italics ["); + append(&m, (char*)(settings->parameters.italics?"+":" ")); + append(&m, "]"); ++id.id[0]; if (gui_do_button(target, id, m)){ if (!has_new_settings){ has_new_settings = true; - new_settings.use_hinting = !new_settings.use_hinting; + new_settings.parameters.italics = !new_settings.parameters.italics; + } + } + + copy(&m, "Bold ["); + append(&m, (char*)(settings->parameters.bold?"+":" ")); + append(&m, "]"); + ++id.id[0]; + if (gui_do_button(target, id, m)){ + if (!has_new_settings){ + has_new_settings = true; + new_settings.parameters.bold = !new_settings.parameters.bold; + } + } + + copy(&m, "Underline ["); + append(&m, (char*)(settings->parameters.underline?"+":" ")); + append(&m, "]"); + ++id.id[0]; + if (gui_do_button(target, id, m)){ + if (!has_new_settings){ + has_new_settings = true; + new_settings.parameters.underline = !new_settings.parameters.underline; + } + } + + copy(&m, "Hinting ["); + append(&m, (char*)(settings->parameters.use_hinting?"+":" ")); + append(&m, "]"); + ++id.id[0]; + if (gui_do_button(target, id, m)){ + if (!has_new_settings){ + has_new_settings = true; + new_settings.parameters.use_hinting = !new_settings.parameters.use_hinting; } } diff --git a/4ed_font.h b/4ed_font.h index 2b21baee..c863a0e4 100644 --- a/4ed_font.h +++ b/4ed_font.h @@ -27,10 +27,17 @@ struct Font_Loadable_Description{ }; // NOTE(allen): Settings that the are specified that determine how a font should be loaded and rendered. +struct Font_Parameters{ + i32 pt_size; + b32 italics; + b32 bold; + b32 underline; + b32 use_hinting; +}; + struct Font_Settings{ Font_Loadable_Stub stub; - i32 pt_size; - b32 use_hinting; + Font_Parameters parameters; }; // NOTE(allen): Results about the font true for the entire font as a whole. @@ -106,11 +113,14 @@ typedef Sys_Font_Get_Loadable_Count_Sig(Font_Get_Loadable_Count_Function); #define Sys_Font_Get_Loadable_Sig(n,i,o) void (n)(i32 i, Font_Loadable_Description *o) typedef Sys_Font_Get_Loadable_Sig(Font_Get_Loadable_Function, index, out); -#define Sys_Font_Load_New_Font_Sig(n,s) Font_ID (n)(Font_Loadable_Stub *s) -typedef Sys_Font_Load_New_Font_Sig(Font_Load_New_Font_Function, stub); +#define Sys_Font_Face_Allocate_And_Init_Sig(n,s) Font_ID (n)(Font_Settings *s) +typedef Sys_Font_Face_Allocate_And_Init_Sig(Font_Face_Allocate_And_Init_Function, settings); -#define Sys_Font_Change_Settings_Sig(n,id,s) b32 (n)(Font_ID id, Font_Settings *s) -typedef Sys_Font_Change_Settings_Sig(Font_Change_Settings_Function, font_id, new_settings); +#define Sys_Font_Face_Change_Settings_Sig(n,id,s) b32 (n)(Font_ID id, Font_Settings *s) +typedef Sys_Font_Face_Change_Settings_Sig(Font_Face_Change_Settings_Function, font_id, new_settings); + +#define Sys_Font_Face_Release_Sig(n,id) b32 (n)(Font_ID id) +typedef Sys_Font_Face_Release_Sig(Font_Face_Release_Function, font_id); #define Sys_Font_Get_Largest_ID_Sig(n) Font_ID (n)(void) typedef Sys_Font_Get_Largest_ID_Sig(Font_Get_Largest_ID_Function); @@ -136,8 +146,9 @@ typedef Sys_Font_Free_Sig(Font_Free_Function,ptr); struct Font_Functions{ Font_Get_Loadable_Count_Function *get_loadable_count; Font_Get_Loadable_Function *get_loadable; - Font_Load_New_Font_Function *load_new_font; - Font_Change_Settings_Function *change_settings; + Font_Face_Allocate_And_Init_Function *face_allocate_and_init; + Font_Face_Change_Settings_Function *face_change_settings; + Font_Face_Release_Function *face_release; Font_Get_Largest_ID_Function *get_largest_id; Font_Get_Count_Function *get_count; Font_Get_Name_By_ID_Function *get_name_by_id; diff --git a/4ed_font_provider_freetype.cpp b/4ed_font_provider_freetype.cpp index d28bf815..51163893 100644 --- a/4ed_font_provider_freetype.cpp +++ b/4ed_font_provider_freetype.cpp @@ -83,8 +83,8 @@ font_load_page_layout(Font_Settings *settings, Font_Metrics *metrics, Glyph_Page page->page_number = page_number; page->has_layout = true; - u32 pt_size = settings->pt_size; - b32 use_hinting = settings->use_hinting; + u32 pt_size = settings->parameters.pt_size; + b32 use_hinting = settings->parameters.use_hinting; // TODO(allen): Stop redoing all this init for each call. FT_Library ft; @@ -176,8 +176,8 @@ font_load_page_pixels(Partition *part, Font_Settings *settings, Glyph_Page *page Assert(page->has_layout); Assert(page->page_number == page_number); - i32 pt_size = settings->pt_size; - b32 use_hinting = settings->use_hinting; + i32 pt_size = settings->parameters.pt_size; + b32 use_hinting = settings->parameters.use_hinting; // TODO(allen): Stop redoing all this init for each call. FT_Library ft; @@ -285,7 +285,7 @@ font_release_pages(System_Functions *system, Font_Page_Storage *storage){ internal b32 font_load(System_Functions *system, Font_Settings *settings, Font_Metrics *metrics, Font_Page_Storage *pages){ - i32 pt_size = settings->pt_size; + i32 pt_size = settings->parameters.pt_size; // TODO(allen): Stop redoing all this init for each call. FT_Library ft; @@ -405,7 +405,7 @@ Sys_Font_Get_Loadable_Sig(system_font_get_loadable, i, out){ } internal -Sys_Font_Load_New_Font_Sig(system_font_load_new_font, stub){ +Sys_Font_Face_Allocate_And_Init_Sig(system_font_face_allocate_and_init, new_settings){ i32 slot_max = fontvars.max_slot_count; Font_Slot_Page *page_with_slot = 0; @@ -515,16 +515,12 @@ Sys_Font_Load_New_Font_Sig(system_font_load_new_font, stub){ Assert(((*is_active_flags) & is_active_mask) == 0); - char *filename = stub->name; + char *filename = new_settings->stub.name; i32 filename_len = 0; for (;filename[filename_len];++filename_len); - // Initialize Font Parameters - Assert(filename_len <= sizeof(settings->stub.name) - 1); - memset(settings, 0, sizeof(*settings)); - memcpy(&settings->stub, stub, sizeof(*stub)); - settings->pt_size = fontvars.pt_size; - settings->use_hinting = fontvars.use_hinting; + // Initialize font settings. + memcpy(settings, new_settings, sizeof(*new_settings)); memset(metrics, 0, sizeof(*metrics)); memset(pages, 0, sizeof(*pages)); @@ -580,7 +576,7 @@ system_font_get_active_location(Font_ID font_id){ } internal -Sys_Font_Change_Settings_Sig(system_font_change_settings, font_id, new_settings){ +Sys_Font_Face_Change_Settings_Sig(system_font_face_change_settings, font_id, new_settings){ if (font_id == 0){ return(false); } @@ -613,6 +609,26 @@ Sys_Font_Change_Settings_Sig(system_font_change_settings, font_id, new_settings) return(made_change); } +internal +Sys_Font_Face_Release_Sig(system_font_face_release, font_id){ + if (font_id == 0){ + return(false); + } + + Font_Slot_Page_And_Index page_and_index = system_font_get_active_location(font_id); + if (page_and_index.page == 0){ + return(false); + } + + Font_Page_Storage *pages_ptr = &page_and_index.page->pages[page_and_index.index]; + font_release_pages(&sysfunc, pages_ptr); + + u64 *is_active_ptr = &page_and_index.page->is_active[page_and_index.index/64]; + (*is_active_ptr) &= (~(1 << (page_and_index.index%64))); + + return(true); +} + internal Sys_Font_Get_Name_By_ID_Sig(system_font_get_name_by_id, font_id, str_out, capacity){ i32 length = 0; @@ -705,21 +721,23 @@ system_font_get_local_stubs(Partition *part){ internal void system_font_init(Font_Functions *font_links, u32 pt_size, b32 use_hinting, Font_Setup_List list){ // Linking - font_links->get_loadable_count = system_font_get_loadable_count; - font_links->get_loadable = system_font_get_loadable; - font_links->load_new_font = system_font_load_new_font; - font_links->change_settings = system_font_change_settings; - font_links->get_largest_id = system_font_get_largest_id; - font_links->get_count = system_font_get_count; - font_links->get_name_by_id = system_font_get_name_by_id; - font_links->get_pointers_by_id = system_font_get_pointers_by_id; - font_links->load_page = system_font_load_page; - font_links->allocate = system_font_allocate; - font_links->free = system_font_free; + font_links->get_loadable_count = system_font_get_loadable_count; + font_links->get_loadable = system_font_get_loadable; + font_links->face_allocate_and_init = system_font_face_allocate_and_init; + font_links->face_change_settings = system_font_face_change_settings; + font_links->get_largest_id = system_font_get_largest_id; + font_links->get_count = system_font_get_count; + font_links->get_name_by_id = system_font_get_name_by_id; + font_links->get_pointers_by_id = system_font_get_pointers_by_id; + font_links->load_page = system_font_load_page; + font_links->allocate = system_font_allocate; + font_links->free = system_font_free; // Initialize fontvars memset(&fontvars, 0, sizeof(fontvars)); dll_init_sentinel(&fontvars.slot_pages_sentinel); + + // TODO(allen): Eliminate from fontvars. fontvars.pt_size = pt_size; fontvars.use_hinting = use_hinting; @@ -766,7 +784,11 @@ system_font_init(Font_Functions *font_links, u32 pt_size, b32 use_hinting, Font_ // Force load one font. Font_Setup *first_setup = list.first; - system_font_load_new_font(&first_setup->stub); + Font_Settings first_settings = {0}; + memcpy(&first_settings.stub, &first_setup->stub, sizeof(first_setup->stub)); + first_settings.parameters.pt_size = pt_size; + first_settings.parameters.use_hinting = use_hinting; + system_font_face_allocate_and_init(&first_settings); } // BOTTOM