Lots of progress towards new font face system

master
Allen Webster 2017-11-19 19:47:55 -05:00
parent cee8ce18cb
commit f15c59c621
15 changed files with 298 additions and 26 deletions

View File

@ -33,8 +33,8 @@
# include "4ed_debug_mem.h" # include "4ed_debug_mem.h"
#endif #endif
#include "4ed_render_format.h"
#include "4ed_render_target.h" #include "4ed_render_target.h"
#include "4ed_render_format.h"
#include "4ed.h" #include "4ed.h"
#include "4ed_buffer_model.h" #include "4ed_buffer_model.h"

View File

@ -3537,8 +3537,8 @@ style_get_color(Style *style, Cpp_Token token){
} }
internal void internal void
file_set_font(System_Functions *system, Models *models, Editing_File *file, Font_ID font_id){ file_full_remeasure(System_Functions *system, Models *models, Editing_File *file){
file->settings.font_id = font_id; Font_ID font_id = file->settings.font_id;
Font_Pointers font = system->font.get_pointers_by_id(font_id); Font_Pointers font = system->font.get_pointers_by_id(font_id);
file_measure_wraps_and_fix_cursor(system, models, file, font); file_measure_wraps_and_fix_cursor(system, models, file, font);
@ -3550,6 +3550,12 @@ file_set_font(System_Functions *system, Models *models, Editing_File *file, Font
} }
} }
internal void
file_set_font(System_Functions *system, Models *models, Editing_File *file, Font_ID font_id){
file->settings.font_id = font_id;
file_full_remeasure(system, models, file);
}
internal void internal void
global_set_font(System_Functions *system, 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;
@ -3561,6 +3567,20 @@ global_set_font(System_Functions *system, Models *models, Font_ID font_id){
models->global_font_id = font_id; models->global_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)){
File_Node *node = 0;
File_Node *sentinel = &models->working_set.used_sentinel;
for (dll_items(node, sentinel)){
Editing_File *file = (Editing_File*)node;
if (file->settings.font_id == font_id){
file_full_remeasure(system, models, file);
}
}
}
}
inline void inline void
view_show_GUI(View *view, Models *models, View_UI ui){ view_show_GUI(View *view, Models *models, View_UI ui){
view->map = mapid_ui; view->map = mapid_ui;
@ -4511,18 +4531,83 @@ step_file_view(System_Functions *system, View *view, Models *models, View *activ
Editing_File *file = view->file_data.file; Editing_File *file = view->file_data.file;
Assert(file != 0); Assert(file != 0);
message = make_lit_string("Back");
id.id[0] = 0; id.id[0] = 0;
if (gui_do_button(target, id, message)){ if (gui_do_button(target, id, make_lit_string("Back"))){
view->color_mode = CV_Mode_Library; view->color_mode = CV_Mode_Library;
} }
gui_begin_scrollable(target, scroll_context, view->gui_scroll, 9*view->line_height, show_scrollbar); gui_begin_scrollable(target, scroll_context, view->gui_scroll, 9*view->line_height, show_scrollbar);
Font_ID font_id = file->settings.font_id; Font_ID font_id = file->settings.font_id;
Font_ID new_font_id = 0; 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);
if (font.valid){
Font_Settings *settings = font.settings;
Font_Metrics *metrics = font.metrics;
char space[512];
String m = make_fixed_width_string(space);
if (i == font_id){
append(&m, "* ");
}
append(&m, "family:\"");
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, (settings->use_hinting)?"ON ":"OFF");
if (i == font_id){
append(&m, " *");
}
id.id[0] = i;
id.id[1] = 0;
if (gui_do_button(target, id, m)){
if (new_font_id == 0){
new_font_id = i;
}
}
id.id[0] = i;
id.id[1] = 1;
if (gui_do_button(target, id, make_lit_string("edit"))){
view->font_edit_id = i;
if (view->color_mode == CV_Mode_Font){
view->color_mode = CV_Mode_Font_Editing;
}
else{
view->color_mode = CV_Mode_Global_Font_Editing;
}
}
}
}
id.id[0] = 0;
id.id[1] = 2;
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);
if (view->color_mode == CV_Mode_Font){
view->color_mode = CV_Mode_Font_Editing;
}
else{
view->color_mode = CV_Mode_Global_Font_Editing;
}
}
}
#else
// OLD
i32 total_count = system->font.get_loadable_count(); i32 total_count = system->font.get_loadable_count();
for (i32 i = 0; i < total_count; ++i){ for (i32 i = 0; i < total_count; ++i){
Font_Loadable_Description loadable = {0}; Font_Loadable_Description loadable = {0};
@ -4542,11 +4627,13 @@ step_file_view(System_Functions *system, View *view, Models *models, View *activ
} }
} }
if (new_font_id != 0 && new_font_id != font_id){ #endif
if (view->color_mode == CV_Mode_Font){
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); file_set_font(system, models, file, new_font_id);
} }
else{ else if (new_font_id != font_id || new_font_id != models->global_font_id){
global_set_font(system, models, new_font_id); global_set_font(system, models, new_font_id);
} }
} }
@ -4554,6 +4641,89 @@ step_file_view(System_Functions *system, View *view, Models *models, View *activ
gui_end_scrollable(target); gui_end_scrollable(target);
}break; }break;
case CV_Mode_Font_Editing:
case CV_Mode_Global_Font_Editing:
{
id.id[0] = 0;
if (gui_do_button(target, id, make_lit_string("Back"))){
if (view->color_mode == CV_Mode_Font_Editing){
view->color_mode = CV_Mode_Font;
}
else{
view->color_mode = CV_Mode_Global_Font;
}
}
Font_ID font_edit_id = view->font_edit_id;
Font_Pointers font = system->font.get_pointers_by_id(font_edit_id);
Font_Settings *settings = font.settings;
Font_Metrics *metrics = font.metrics;
Font_Settings new_settings = *settings;
b32 has_new_settings = false;
char space[128];
String m = make_fixed_width_string(space);
copy(&m, "Size Up (");
append_int_to_str(&m, settings->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;
}
}
copy(&m, "Size Down (");
append_int_to_str(&m, settings->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;
}
}
copy(&m, "Turn Hinting ");
append(&m, settings->use_hinting?"Off":"On");
append(&m, " (it is currently ");
append(&m, settings->use_hinting?"On":"Off");
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;
}
}
copy(&m, "Current Family: ");
append(&m, make_string(metrics->name, metrics->name_len));
++id.id[0];
gui_do_button(target, id, m);
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);
if (loadable.valid){
String name = make_string(loadable.display_name, loadable.display_len);
if (gui_do_button(target, id, name)){
if (!has_new_settings){
has_new_settings = true;
memcpy(&new_settings.stub, &loadable.stub, sizeof(loadable.stub));
}
}
}
}
if (has_new_settings){
alter_font(system, models, font_edit_id, &new_settings);
}
}break;
case CV_Mode_Adjusting: case CV_Mode_Adjusting:
{ {
Style *style = main_style(models); Style *style = main_style(models);

View File

@ -109,13 +109,19 @@ 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) #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); typedef Sys_Font_Load_New_Font_Sig(Font_Load_New_Font_Function, stub);
#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_Get_Largest_ID_Sig(n) Font_ID (n)(void)
typedef Sys_Font_Get_Largest_ID_Sig(Font_Get_Largest_ID_Function);
#define Sys_Font_Get_Count_Sig(n) i32 (n)(void) #define Sys_Font_Get_Count_Sig(n) i32 (n)(void)
typedef Sys_Font_Get_Count_Sig(Font_Get_Count_Function); typedef Sys_Font_Get_Count_Sig(Font_Get_Count_Function);
#define Sys_Font_Get_Name_By_ID_Sig(n, font_id, out, cap) i32 (n)(Font_ID font_id, char *out, u32 cap) #define Sys_Font_Get_Name_By_ID_Sig(n, font_id, out, cap) i32 (n)(Font_ID font_id, char *out, u32 cap)
typedef Sys_Font_Get_Name_By_ID_Sig(Font_Get_Name_By_ID_Function, font_id, out, cap); typedef Sys_Font_Get_Name_By_ID_Sig(Font_Get_Name_By_ID_Function, font_id, out, cap);
#define Sys_Font_Get_Pointers_By_ID_Sig(n,font_id) Font_Pointers (n)(Font_ID font_id) #define Sys_Font_Get_Pointers_By_ID_Sig(n, font_id) Font_Pointers (n)(Font_ID font_id)
typedef Sys_Font_Get_Pointers_By_ID_Sig(Font_Get_Pointers_By_ID_Function, font_id); typedef Sys_Font_Get_Pointers_By_ID_Sig(Font_Get_Pointers_By_ID_Function, font_id);
#define Sys_Font_Load_Page_Sig(n,s,m,p,pn) void (n)(Font_Settings *s, Font_Metrics *m, Glyph_Page *p, u32 pn) #define Sys_Font_Load_Page_Sig(n,s,m,p,pn) void (n)(Font_Settings *s, Font_Metrics *m, Glyph_Page *p, u32 pn)
@ -131,6 +137,8 @@ struct Font_Functions{
Font_Get_Loadable_Count_Function *get_loadable_count; Font_Get_Loadable_Count_Function *get_loadable_count;
Font_Get_Loadable_Function *get_loadable; Font_Get_Loadable_Function *get_loadable;
Font_Load_New_Font_Function *load_new_font; Font_Load_New_Font_Function *load_new_font;
Font_Change_Settings_Function *change_settings;
Font_Get_Largest_ID_Function *get_largest_id;
Font_Get_Count_Function *get_count; Font_Get_Count_Function *get_count;
Font_Get_Name_By_ID_Function *get_name_by_id; Font_Get_Name_By_ID_Function *get_name_by_id;
Font_Get_Pointers_By_ID_Function *get_pointers_by_id; Font_Get_Pointers_By_ID_Function *get_pointers_by_id;

View File

@ -261,6 +261,28 @@ font_load_page_pixels(Partition *part, Font_Settings *settings, Glyph_Page *page
return(pixels); return(pixels);
} }
internal void
font_release_pages(System_Functions *system, Font_Page_Storage *storage){
u32 old_max = storage->page_max;
Glyph_Page **old_pages = storage->pages;
for (u32 i = 0; i < old_max; ++i){
Glyph_Page *this_page = old_pages[i];
if (this_page != FONT_PAGE_EMPTY && this_page != FONT_PAGE_DELETED){
if (this_page->has_gpu_setup){
Assert(sizeof(Render_Pseudo_Command_Free_Texture)%8 == 0);
Render_Pseudo_Command_Free_Texture *c = push_array(&target.buffer, Render_Pseudo_Command_Free_Texture, 1);
c->header.size = sizeof(*c);
c->free_texture_node.tex_id = this_page->gpu_tex;
sll_push(target.free_texture_first, target.free_texture_last, &c->free_texture_node);
}
system->font.free(this_page);
}
}
system->font.free(old_pages);
}
internal b32 internal b32
font_load(System_Functions *system, Font_Settings *settings, Font_Metrics *metrics, Font_Page_Storage *pages){ 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->pt_size;
@ -519,9 +541,18 @@ Sys_Font_Load_New_Font_Sig(system_font_load_new_font, stub){
new_id = 0; new_id = 0;
} }
if (new_id > fontvars.largest_font_id){
fontvars.largest_font_id = new_id;
}
return(new_id); return(new_id);
} }
internal
Sys_Font_Get_Largest_ID_Sig(system_font_get_largest_id){
return(fontvars.largest_font_id);
}
internal internal
Sys_Font_Get_Count_Sig(system_font_get_count){ Sys_Font_Get_Count_Sig(system_font_get_count){
return(fontvars.used_slot_count); return(fontvars.used_slot_count);
@ -548,6 +579,40 @@ system_font_get_active_location(Font_ID font_id){
return(result); return(result);
} }
internal
Sys_Font_Change_Settings_Sig(system_font_change_settings, font_id, new_settings){
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_Settings *old_settings = &page_and_index.page->settings[page_and_index.index];
if (memcmp(new_settings, old_settings, sizeof(*new_settings)) == 0){
return(false);
}
b32 made_change = false;
Font_Metrics temp_metrics = {0};
Font_Page_Storage temp_pages = {0};
if (font_load(&sysfunc, new_settings, &temp_metrics, &temp_pages)){
Font_Metrics *metrics_ptr = &page_and_index.page->metrics[page_and_index.index];
Font_Page_Storage *pages_ptr = &page_and_index.page->pages[page_and_index.index];
font_release_pages(&sysfunc, pages_ptr);
memcpy(old_settings, new_settings, sizeof(*old_settings));
memcpy(metrics_ptr, &temp_metrics, sizeof(*metrics_ptr));
memcpy(pages_ptr, &temp_pages, sizeof(*pages_ptr));
made_change = true;
}
return(made_change);
}
internal internal
Sys_Font_Get_Name_By_ID_Sig(system_font_get_name_by_id, font_id, str_out, capacity){ Sys_Font_Get_Name_By_ID_Sig(system_font_get_name_by_id, font_id, str_out, capacity){
i32 length = 0; i32 length = 0;
@ -643,6 +708,8 @@ system_font_init(Font_Functions *font_links, u32 pt_size, b32 use_hinting, Font_
font_links->get_loadable_count = system_font_get_loadable_count; font_links->get_loadable_count = system_font_get_loadable_count;
font_links->get_loadable = system_font_get_loadable; font_links->get_loadable = system_font_get_loadable;
font_links->load_new_font = system_font_load_new_font; 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_count = system_font_get_count;
font_links->get_name_by_id = system_font_get_name_by_id; 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->get_pointers_by_id = system_font_get_pointers_by_id;

View File

@ -48,7 +48,10 @@ struct Font_Vars{
Font_Slot_Page slot_pages_sentinel; Font_Slot_Page slot_pages_sentinel;
i32 used_slot_count; i32 used_slot_count;
i32 max_slot_count; i32 max_slot_count;
Font_ID largest_font_id;
// HACK(allen): // HACK(allen): // HACK(allen):
// TODO(allen): Upgrade this to have "unlimited" resizable memory.
Font_Loadable_Description loadables[4096]; Font_Loadable_Description loadables[4096];
i32 loadable_count; i32 loadable_count;

View File

@ -25,6 +25,7 @@
// NOTE(allen): These macros work on structs with a next // NOTE(allen): These macros work on structs with a next
// pointer to the saem type as the containing struct. // pointer to the saem type as the containing struct.
#define sll_clear(f,l) (f)=(l)=0
#define sll_push(f,l,n) if((f)==0&&(l)==0){(f)=(l)=(n);}else{(l)->next=(n);(l)=(n);}(l)->next=0 #define sll_push(f,l,n) if((f)==0&&(l)==0){(f)=(l)=(n);}else{(l)->next=(n);(l)=(n);}(l)->next=0
#define sll_pop(f,l) if((f)!=(l)){(f)=(f)->next;}else{(f)=(l)=0;} #define sll_pop(f,l) if((f)!=(l)){(f)=(f)->next;}else{(f)=(l)=0;}

View File

@ -27,7 +27,6 @@ draw_change_clip(Render_Target *target, i32_Rect clip_box){
internal void internal void
begin_render_section(Render_Target *target, System_Functions *system){ begin_render_section(Render_Target *target, System_Functions *system){
target->buffer.pos = 0;
target->clip_top = -1; target->clip_top = -1;
i32_Rect clip; i32_Rect clip;

View File

@ -13,12 +13,17 @@ enum Render_Command_Type{
RenCom_Rectangle, RenCom_Rectangle,
RenCom_Outline, RenCom_Outline,
RenCom_Glyph, RenCom_Glyph,
RenCom_ChangeClip RenCom_ChangeClip,
}; };
struct Render_Command_Header{ struct Render_Command_Header{
i32 size; union{
i32 type; struct{
i32 size;
i32 type;
};
u64 force_8_byte_align_;
};
}; };
struct Render_Command_Rectangle{ struct Render_Command_Rectangle{
@ -47,5 +52,10 @@ struct Render_Command_Change_Clip{
i32_Rect box; i32_Rect box;
}; };
struct Render_Pseudo_Command_Free_Texture{
Render_Command_Header header;
Render_Free_Texture free_texture_node;
};
// BOTTOM // BOTTOM

View File

@ -23,13 +23,6 @@ Render_Begin_Push_Sig(render_internal_begin_push, t, ptr, size){
if (out != 0){ if (out != 0){
memcpy(out, ptr, size); memcpy(out, ptr, size);
} }
// TODO(allen): Application side logging.
#if 0
else{
LOG("Render command buffer out of memory!\n");
}
#endif
return(out); return(out);
} }

View File

@ -12,6 +12,11 @@
#if !defined(FRED_RENDER_TARGET_H) #if !defined(FRED_RENDER_TARGET_H)
#define FRED_RENDER_TARGET_H #define FRED_RENDER_TARGET_H
struct Render_Free_Texture{
Render_Free_Texture *next;
u32 tex_id;
};
struct Render_Target{ struct Render_Target{
i32_Rect clip_boxes[5]; i32_Rect clip_boxes[5];
i32 clip_top; i32 clip_top;
@ -20,6 +25,9 @@ struct Render_Target{
i32 bound_texture; i32 bound_texture;
u32 color; u32 color;
Render_Free_Texture *free_texture_first;
Render_Free_Texture *free_texture_last;
Partition buffer; Partition buffer;
}; };

View File

@ -65,7 +65,9 @@ enum Color_View_Mode{
CV_Mode_Library, CV_Mode_Library,
CV_Mode_Font, CV_Mode_Font,
CV_Mode_Global_Font, CV_Mode_Global_Font,
CV_Mode_Adjusting CV_Mode_Font_Editing,
CV_Mode_Global_Font_Editing,
CV_Mode_Adjusting,
}; };
struct Scroll_Context{ struct Scroll_Context{
@ -132,6 +134,7 @@ struct View{
View *hot_file_view; View *hot_file_view;
u32 *palette; u32 *palette;
Color_View_Mode color_mode; Color_View_Mode color_mode;
Font_ID font_edit_id;
Super_Color color; Super_Color color;
b32 p4c_only; b32 p4c_only;
Style_Library inspecting_styles; Style_Library inspecting_styles;

View File

@ -105,6 +105,13 @@ interpret_render_buffer(Render_Target *t){
glColor4f(0.f, 0.f, 0.f, 0.f); glColor4f(0.f, 0.f, 0.f, 0.f);
t->color = 0; t->color = 0;
for (Render_Free_Texture *free_texture = t->free_texture_first;
free_texture != 0;
free_texture = free_texture->next){
glDeleteTextures(1, &free_texture->tex_id);
}
sll_clear(t->free_texture_first, t->free_texture_last);
u8 *start = (u8*)t->buffer.base; u8 *start = (u8*)t->buffer.base;
u8 *end = (u8*)t->buffer.base + t->buffer.pos; u8 *end = (u8*)t->buffer.base + t->buffer.pos;
Render_Command_Header *header = 0; Render_Command_Header *header = 0;

View File

@ -39,8 +39,8 @@
#include "4ed_font.h" #include "4ed_font.h"
#include "4ed_system.h" #include "4ed_system.h"
#include "4ed_log.h" #include "4ed_log.h"
#include "4ed_render_format.h"
#include "4ed_render_target.h" #include "4ed_render_target.h"
#include "4ed_render_format.h"
#include "4ed.h" #include "4ed.h"
#include "4ed_linked_node_macros.h" #include "4ed_linked_node_macros.h"
@ -1809,6 +1809,7 @@ main(int argc, char **argv){
b32 keep_running = linuxvars.keep_running; b32 keep_running = linuxvars.keep_running;
// NOTE(allen): Application Core Update // NOTE(allen): Application Core Update
target.buffer.pos = 0;
if (app.step != 0){ if (app.step != 0){
app.step(&sysfunc, &target, &memory_vars, &linuxvars.input, &result); app.step(&sysfunc, &target, &memory_vars, &linuxvars.input, &result);
} }

View File

@ -38,8 +38,8 @@
#include "4ed_font.h" #include "4ed_font.h"
#include "4ed_system.h" #include "4ed_system.h"
#include "4ed_log.h" #include "4ed_log.h"
#include "4ed_render_format.h"
#include "4ed_render_target.h" #include "4ed_render_target.h"
#include "4ed_render_format.h"
#include "4ed.h" #include "4ed.h"
#include "4ed_linked_node_macros.h" #include "4ed_linked_node_macros.h"
@ -588,6 +588,7 @@ osx_step(void){
b32 keep_running = osxvars.keep_running; b32 keep_running = osxvars.keep_running;
// NOTE(allen): Application Core Update // NOTE(allen): Application Core Update
target.buffer.pos = 0;
if (app.step != 0){ if (app.step != 0){
app.step(&sysfunc, &target, &memory_vars, &frame_input, &result); app.step(&sysfunc, &target, &memory_vars, &frame_input, &result);
} }

View File

@ -49,8 +49,8 @@
#include "4ed_font.h" #include "4ed_font.h"
#include "4ed_system.h" #include "4ed_system.h"
#include "4ed_log.h" #include "4ed_log.h"
#include "4ed_render_format.h"
#include "4ed_render_target.h" #include "4ed_render_target.h"
#include "4ed_render_format.h"
#include "4ed.h" #include "4ed.h"
#include "4ed_linked_node_macros.h" #include "4ed_linked_node_macros.h"
@ -1518,6 +1518,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
} }
// NOTE(allen): Application Core Update // NOTE(allen): Application Core Update
target.buffer.pos = 0;
if (app.step != 0){ if (app.step != 0){
app.step(&sysfunc, &target, &memory_vars, &input, &result); app.step(&sysfunc, &target, &memory_vars, &input, &result);
} }