From fbe5c3ff4fccf8c8d255f5e825a51eaaf489e846 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Fri, 24 Mar 2017 19:41:10 -0400 Subject: [PATCH] Got unicode text files working, need to revist code wrapping --- 4coder_lib/4coder_utf8.h | 12 ++--- 4ed_buffer.cpp | 8 +-- 4ed_file_view.cpp | 66 +++++++++++++---------- 4tech_defines.h | 2 +- meta/build.cpp | 4 ++ string/4coder_string_build_num.txt | 2 +- string/_4coder_string.ctm | Bin 2724 -> 2740 bytes win32_4ed_fonts.cpp | 84 ++++++++++++++++++++++------- 8 files changed, 118 insertions(+), 60 deletions(-) diff --git a/4coder_lib/4coder_utf8.h b/4coder_lib/4coder_utf8.h index 7d20a7e6..22454d63 100644 --- a/4coder_lib/4coder_utf8.h +++ b/4coder_lib/4coder_utf8.h @@ -53,16 +53,16 @@ static u32_4tech utf8_to_u32_length_unchecked(u8_4tech *buffer, u32_4tech *length_out){ u32_4tech result = 0; - if (buffer[0] <= 0x7F){ + if (buffer[0] < 0x80){ result = (u32_4tech)buffer[0]; *length_out = 1; } - else if (buffer[0] <= 0xE0){ + else if (buffer[0] < 0xE0){ result = ((u32_4tech)((buffer[0])&0x1F)) << 6; result |= ((u32_4tech)((buffer[1])&0x3F)); *length_out = 2; } - else if (buffer[0] <= 0xF0){ + else if (buffer[0] < 0xF0){ result = ((u32_4tech)((buffer[0])&0x0F)) << 12; result |= ((u32_4tech)((buffer[1])&0x3F)) << 6; result |= ((u32_4tech)((buffer[2])&0x3F)); @@ -198,11 +198,11 @@ utf8_to_utf16_minimal_checking(u16_4tech *dst, umem_4tech max_wchars, u8_4tech * u32_4tech codepoint = 0; u32_4tech utf8_size = 0; - if (s[0] <= 0x7F){ + if (s[0] < 0x80){ codepoint = (u32_4tech)s[0]; utf8_size = 1; } - else if (s[0] <= 0xE0){ + else if (s[0] < 0xE0){ if (limit <= 1){ *error = true; break; @@ -212,7 +212,7 @@ utf8_to_utf16_minimal_checking(u16_4tech *dst, umem_4tech max_wchars, u8_4tech * codepoint |= ((u32_4tech)((s[1])&0x3F)); utf8_size = 2; } - else if (s[0] <= 0xF0){ + else if (s[0] < 0xF0){ if (limit <= 2){ *error = true; break; diff --git a/4ed_buffer.cpp b/4ed_buffer.cpp index 87e228f2..75163296 100644 --- a/4ed_buffer.cpp +++ b/4ed_buffer.cpp @@ -858,11 +858,11 @@ buffer_measure_wrap_y(Buffer_Measure_Wrap_State *S_ptr, Buffer_Measure_Wrap_Para } S.did_wrap = false; - if (S.i >= S.wrap_unit_end){ + if (S.step.i >= S.wrap_unit_end){ S_stop.status = BLStatus_NeedWrapDetermination; S_stop.line_index = S.line_index - 1; S_stop.wrap_line_index = S.current_wrap_index; - S_stop.pos = S.i; + S_stop.pos = S.step.i; S_stop.x = S.x; DrYield(4, S_stop); @@ -876,7 +876,7 @@ buffer_measure_wrap_y(Buffer_Measure_Wrap_State *S_ptr, Buffer_Measure_Wrap_Para S_stop.status = BLStatus_NeedWrapLineShift; S_stop.line_index = S.line_index - 1; S_stop.wrap_line_index = S.current_wrap_index; - S_stop.pos = S.i; + S_stop.pos = S.step.i; DrYield(3, S_stop); } @@ -1403,7 +1403,7 @@ buffer_cursor_seek(Buffer_Cursor_Seek_State *S_ptr, Buffer_Cursor_Seek_Params pa // Build the cursor hint 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.line = safe_line_index + 1; S.next_cursor.character = 1; 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); diff --git a/4ed_file_view.cpp b/4ed_file_view.cpp index 0ab0ab0c..b0943d97 100644 --- a/4ed_file_view.cpp +++ b/4ed_file_view.cpp @@ -1476,9 +1476,7 @@ file_measure_wraps(System_Functions *system, Models *models, Editing_File *file, Buffer_Layout_Stop stop = {0}; f32 edge_tolerance = 50.f; - if (edge_tolerance > width){ - edge_tolerance = width; - } + edge_tolerance = clamp_top(edge_tolerance, 50.f); f32 current_line_shift = 0.f; b32 do_wrap = 0; @@ -1509,6 +1507,9 @@ file_measure_wraps(System_Functions *system, Models *models, Editing_File *file, i32 potential_count = 0; i32 stage = 0; + Translation_State tran = {0}; + Translation_Emits emits = {0}; + do{ stop = buffer_measure_wrap_y(&state, params, current_line_shift, do_wrap, wrap_unit_end); @@ -1535,35 +1536,46 @@ file_measure_wraps(System_Functions *system, Models *models, Editing_File *file, i32 i = stop.pos; f32 x = stop.x; f32 self_x = 0; + i32 wrap_end_result = size; if (buffer_stringify_loop(&stream, params.buffer, i, size)){ b32 still_looping = 0; do{ for (; i < stream.end; ++i){ - u8 ch = stream.data[i]; + { + u8 ch = stream.data[i]; + translating_fully_process_byte(system, font, &tran, ch, i, size, &emits); + } - switch (word_stage){ - case 0: - { - if (char_is_whitespace(ch)){ - word_stage = 1; - } - else{ - f32 adv = font_get_glyph_advance(params.system, params.font, ch); - - x += adv; - self_x += adv; - if (self_x > width){ + for (TRANSLATION_DECL_EMIT_LOOP(J, emits)){ + TRANSLATION_DECL_GET_STEP(step, behavior, J, emits); + + u32 codepoint = step.value; + switch (word_stage){ + case 0: + { + if (codepoint_is_whitespace(codepoint)){ + word_stage = 1; + } + else{ + f32 adv = font_get_glyph_advance(params.system, params.font, codepoint); + + x += adv; + self_x += adv; + if (self_x > width){ + wrap_end_result = step.i; + goto doublebreak; + } + } + }break; + + case 1: + { + if (!codepoint_is_whitespace(codepoint)){ + wrap_end_result = step.i; goto doublebreak; } - } - }break; - - case 1: - { - if (!char_is_whitespace(ch)){ - goto doublebreak; - } - }break; + }break; + } } } still_looping = buffer_stringify_next(&stream); @@ -1571,7 +1583,7 @@ file_measure_wraps(System_Functions *system, Models *models, Editing_File *file, } doublebreak:; - wrap_unit_end = i; + wrap_unit_end = wrap_end_result; if (x > width){ do_wrap = 1; file_allocate_wrap_positions_as_needed(general, file, wrap_position_index); @@ -1608,7 +1620,6 @@ file_measure_wraps(System_Functions *system, Models *models, Editing_File *file, Wrap_Current_Shift current_shift = get_current_shift(&wrap_state, next_line_start); - if (current_shift.adjust_top_to_this){ wrap_state_set_top(&wrap_state, current_shift.shift); } @@ -1702,7 +1713,6 @@ file_measure_wraps(System_Functions *system, Models *models, Editing_File *file, goto doublebreak_stage2; } - f32 adv = font_get_glyph_advance(params.system, params.font, ch); x += adv; diff --git a/4tech_defines.h b/4tech_defines.h index 93ae61da..2365626c 100644 --- a/4tech_defines.h +++ b/4tech_defines.h @@ -8,6 +8,7 @@ Created 21.01.2017 (dd.mm.yyyy) #if !defined(FTECH_DEFINES) #define FTECH_DEFINES + #include typedef int8_t i8; @@ -23,7 +24,6 @@ typedef uint64_t u64; typedef i8 b8; typedef i32 b32; -// TODO(allen): Find a real way to detect 32 bit ness. #if defined(FTECH_32_BIT) typedef u32 umem; typedef i32 imem; diff --git a/meta/build.cpp b/meta/build.cpp index 9da7a61c..9a25bc92 100644 --- a/meta/build.cpp +++ b/meta/build.cpp @@ -164,6 +164,10 @@ build_cl(u32 flags, char *code_path, char *code_file, char *out_path, char *out_ build_ap(line, CL_OPTS); } + if (flags & X86){ + build_ap(line, "/DFTECH_32_BIT"); + } + if (flags & INCLUDES){ build_ap(line, CL_INCLUDES); } diff --git a/string/4coder_string_build_num.txt b/string/4coder_string_build_num.txt index 3c4899bf..f89e02d7 100644 --- a/string/4coder_string_build_num.txt +++ b/string/4coder_string_build_num.txt @@ -1,5 +1,5 @@ 1 0 -68 +69 diff --git a/string/_4coder_string.ctm b/string/_4coder_string.ctm index 77f6a7439b2cd0374f3dd2bf75e5d201915439c8..459c3affe802d9725e7d63685fabce04300195f8 100644 GIT binary patch delta 24 dcmZ1?xd`2EG6Q delta 7 OcmdlYxget_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; @@ -98,36 +101,77 @@ Sys_Font_Init_Sig(system_font_init){ font_size = clamp_bottom(8, font_size); - struct Font_Setup{ + struct TEST_DATA{ 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}, + TEST_DATA TEST_SETUP[] = { + {literal("fonts/LiberationSans-Regular.ttf"), literal("Liberation Sans"), }, + {literal("fonts/liberation-mono.ttf"), literal("Liberation Mono"), }, + {literal("fonts/Hack-Regular.ttf"), literal("Hack"), }, + {literal("fonts/CutiveMono-Regular.ttf"), literal("Cutive Mono"), }, + {literal("fonts/Inconsolata-Regular.ttf"), literal("Inconsolata"), }, }; - 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]; + struct Font_Setup{ + Font_Setup *next_font; + char *c_filename; + char *c_name; + i32 filename_len; + i32 name_len; + }; + + Font_Setup *first_setup = 0; + Font_Setup *head_setup = 0; + + u32 TEST_COUNT = ArrayCount(TEST_SETUP); + for (u32 i = 0; i < TEST_COUNT; ++i){ + if (first_setup == 0){ + head_setup = push_struct(scratch, Font_Setup); + first_setup = head_setup; + } + else{ + head_setup->next_font = push_struct(scratch, Font_Setup); + head_setup = head_setup->next_font; + } - char full_filename_space[256]; - String full_filename = make_fixed_width_string(full_filename_space); - sysshared_to_binary_path(&full_filename, filename.str); + TEST_DATA *TEST = &TEST_SETUP[i]; - system_set_font(&win32vars.system, &win32_fonts.part, render_font, full_filename, name, pt_size, use_hinting); + head_setup->c_filename = push_array(scratch, char, TEST->filename_len+1); + memcpy(head_setup->c_filename, TEST->c_filename, TEST->filename_len+1); + head_setup->filename_len = TEST->filename_len; + + head_setup->c_name = push_array(scratch, char, TEST->name_len+1); + memcpy(head_setup->c_name, TEST->c_name, TEST->name_len+1); + head_setup->name_len = TEST->name_len; + + partition_align(scratch, 8); } - win32_fonts.font_count = font_count; + u32 font_count_max = ArrayCount(win32_fonts.fonts); + u32 font_count = 0; + u32 i = 0; + for (Font_Setup *ptr = first_setup; ptr != 0; ptr = ptr->next_font, ++i){ + if (i < font_count_max){ + String filename = make_string(ptr->c_filename, ptr->filename_len); + String name = make_string(ptr->c_name, ptr->name_len); + 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, font_size, use_hinting); + } + + ++font_count; + } + + win32_fonts.font_count = clamp_top(font_count, font_count_max); + + end_temp_memory(temp); } // BOTTOM