Compare commits

...
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

1 Commits

Author SHA1 Message Date
Ronald 7840545990 Working on text wrapping bugs 7 months ago

@ -545,11 +545,43 @@ render_text :: proc(text: string, x, y: i32, color: sdl.Color) {
sdl.RenderCopy(app.renderer, texture, nil, &dst_rect)
}
render_wrapped_line :: proc(line: string, x, y: i32, max_width: i32) {
if len(line) == 0 do return
render_wrapped_line :: proc(line: string, x, y: i32, max_width: i32) -> i32 {
wrap_text :: proc(text: string, max_line_length: int) -> (lines: [dynamic]string, ok: bool) {
if len(text) < max_line_length {
line := strings.clone(text)
append(&lines, line)
return lines, true
}
number_of_lines := math.ceil(f64(len(text)) / f64(max_line_length))
builder := strings.builder_make()
for i := 0; i < int(number_of_lines); i += 1 {
start_of_line := max_line_length * i
end_of_line := max_line_length + (max_line_length * i)
if end_of_line > len(text) do end_of_line = len(text)
for char in text[start_of_line:end_of_line] {
strings.write_rune(&builder, char)
}
temp := strings.to_string(builder)
strings.builder_reset(&builder)
line := strings.clone(temp)
append(&lines, line)
}
strings.builder_destroy(&builder)
ok = true
return
}
if len(line) == 0 do return 0
chars_per_line := int(max_width / app.char_width)
if chars_per_line <= 0 do return
if chars_per_line <= 0 do return 0
// Simple word wrapping - break at word boundaries when possible
words := strings.split(line, " ")
@ -559,6 +591,19 @@ render_wrapped_line :: proc(line: string, x, y: i32, max_width: i32) {
line_y := y
for word in words {
// current_line = word
// new method
if len(word) > chars_per_line {
lines, ok := wrap_text(word, chars_per_line)
for line in lines {
render_text(line, x, line_y, app.config.colours.text)
line_y += app.char_height
}
continue
}
// old method
test_line := current_line
if len(current_line) > 0 {
test_line = strings.concatenate({current_line, " ", word})
@ -581,6 +626,10 @@ render_wrapped_line :: proc(line: string, x, y: i32, max_width: i32) {
// Render final line
if len(current_line) > 0 {
render_text(current_line, x, line_y, app.config.colours.text)
line_y += app.char_height
}
return line_y
}