From e6b8162bfa52701590589f3a4d38bd6fb59c0fb8 Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Thu, 22 Aug 2024 11:59:41 +0300 Subject: [PATCH] examples: add examples/ttf_font/draw_static_text.v, to make it easier to test x.ttf with different fonts, and texts --- examples/ttf_font/draw_static_text.txt | 7 ++ examples/ttf_font/draw_static_text.v | 113 +++++++++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 examples/ttf_font/draw_static_text.txt create mode 100644 examples/ttf_font/draw_static_text.v diff --git a/examples/ttf_font/draw_static_text.txt b/examples/ttf_font/draw_static_text.txt new file mode 100644 index 000000000..50116dee4 --- /dev/null +++ b/examples/ttf_font/draw_static_text.txt @@ -0,0 +1,7 @@ +Hello +òàèì@ò!£$%& +满满登登博物馆 +༺ɮʟʊɛ ɛƈֆȶǟֆʏ༻ +尺乇爪丨丨乃ㄖ丨丨 +5 Пятёрочка Russian +まろの港町 -Port town- diff --git a/examples/ttf_font/draw_static_text.v b/examples/ttf_font/draw_static_text.v new file mode 100644 index 000000000..65db6f4af --- /dev/null +++ b/examples/ttf_font/draw_static_text.v @@ -0,0 +1,113 @@ +import gg +import gx +import sokol.sapp +import sokol.sgl +import x.ttf +import os + +const custom_font_path = os.args[1] or { + os.resource_abs_path(os.join_path('..', 'assets', 'fonts', 'Imprima-Regular.ttf')) +} +const custom_txt_path = os.args[2] or { os.resource_abs_path('draw_static_text.txt') } + +const custom_text_start_y = 80 + +const win_width = 400 +const win_height = 400 +const bg_color = gx.Color{50, 255, 50, 255} + +const block_txt = os.read_file(custom_txt_path) or { '' } +const font_paths = [ + os.resource_abs_path(os.join_path('..', 'assets', 'fonts', 'RobotoMono-Regular.ttf')), + custom_font_path, +] + +// UI +struct App_data { +pub mut: + gg &gg.Context = unsafe { nil } + init_flag bool + tf []ttf.TTF_File + ttf_render []ttf.TTF_render_Sokol + text_ready_flag bool +} + +fn my_init(mut app App_data) { + app.init_flag = true + texts := ['Hello', block_txt]! + for i in 0 .. 2 { + mut txt := unsafe { &app.ttf_render[i] } + txt.destroy_texture() + txt.create_text_block(texts[i], 600, 600, 24 + (1 - i) * 24) + txt.create_texture() + } +} + +fn draw_frame(mut app App_data) { + app.gg.begin() + sgl.defaults() + sgl.matrix_mode_projection() + sgl.ortho(0.0, f32(sapp.width()), f32(sapp.height()), 0.0, -1.0, 1.0) + sgl.c4b(0, 0, 0, 255) // black + // draw text only if the app is already initialized + if app.init_flag != true { + app.gg.end() + } + + // draw hello + mut txt1 := unsafe { &app.ttf_render[0] } + txt1.draw_text_bmp(app.gg, 5, 5) + + // draw the custom text + txt2 := unsafe { &app.ttf_render[1] } + txt2.draw_text_bmp(app.gg, 30, custom_text_start_y) + app.gg.end() +} + +fn main() { + println('Use `v run draw_static_text.v [FONT_PATH] [TEXT_FILE_PATH]`') + println('> Current command: os.args[0] ${custom_font_path} ${custom_txt_path}') + mut app := &App_data{} + app.gg = gg.new_context( + width: win_width + height: win_height + window_title: 'Draw custom text, with custom font' + user_data: app + bg_color: bg_color + frame_fn: draw_frame + init_fn: my_init + ) + + // load the TTF fonts: + for font_path in font_paths { + mut tf := ttf.TTF_File{} + tf.buf = os.read_bytes(font_path) or { panic(err) } + println('Read TrueTypeFont file [${font_path}], len: ${tf.buf.len}') + tf.init() + println('Unit per EM: ${tf.units_per_em}') + app.tf << tf + } + + // TTF hello render + app.ttf_render << &ttf.TTF_render_Sokol{ + bmp: &ttf.BitMap{ + tf: &app.tf[0] + buf: unsafe { malloc_noscan(32000000) } + buf_size: (32000000) + color: 0xFF0000FF + } + } + + // TTF custom text render + app.ttf_render << &ttf.TTF_render_Sokol{ + bmp: &ttf.BitMap{ + tf: &app.tf[1] + buf: unsafe { malloc_noscan(32000000) } + buf_size: (32000000) + color: 0x2020EEFF + } + } + + // setup sokol_gfx + app.gg.run() +} -- 2.39.5