Got unicode text files working, need to revist code wrapping
This commit is contained in:
parent
4d46aa8e97
commit
fbe5c3ff4f
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -8,6 +8,7 @@ Created 21.01.2017 (dd.mm.yyyy)
|
|||
|
||||
#if !defined(FTECH_DEFINES)
|
||||
#define FTECH_DEFINES
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
1
|
||||
0
|
||||
68
|
||||
69
|
||||
|
||||
|
||||
|
|
Binary file not shown.
|
@ -16,7 +16,7 @@
|
|||
|
||||
struct Win32_Fonts{
|
||||
Partition part;
|
||||
Render_Font fonts[5];
|
||||
Render_Font fonts[32];
|
||||
u32 font_count;
|
||||
};
|
||||
|
||||
|
@ -87,6 +87,9 @@ Sys_Font_Free_Sig(system_font_free){
|
|||
|
||||
internal
|
||||
Sys_Font_Init_Sig(system_font_init){
|
||||
Partition *scratch = &shared_vars.scratch;
|
||||
Temp_Memory temp = begin_temp_memory(scratch);
|
||||
|
||||
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;
|
||||
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue