v/examples/ttf_font/example_ttf.v
Eliyaan (Nopana) bbb61ab368
Some checks failed
Graphics CI / gg-regressions (push) Waiting to run
vlib modules CI / build-module-docs (push) Waiting to run
native backend CI / native-backend-ubuntu (push) Waiting to run
vab CI / v-compiles-os-android (push) Waiting to run
native backend CI / native-backend-windows (push) Waiting to run
Shy and PV CI / v-compiles-puzzle-vibes (push) Waiting to run
Sanitized CI / sanitize-undefined-clang (push) Waiting to run
Sanitized CI / sanitize-undefined-gcc (push) Waiting to run
Sanitized CI / tests-sanitize-address-clang (push) Waiting to run
Sanitized CI / sanitize-address-msvc (push) Waiting to run
Sanitized CI / sanitize-address-gcc (push) Waiting to run
Sanitized CI / sanitize-memory-clang (push) Waiting to run
sdl CI / v-compiles-sdl-examples (push) Waiting to run
Time CI / time-linux (push) Waiting to run
Time CI / time-macos (push) Waiting to run
Time CI / time-windows (push) Waiting to run
toml CI / toml-module-pass-external-test-suites (push) Waiting to run
Tools CI / tools-linux (clang) (push) Waiting to run
Tools CI / tools-linux (gcc) (push) Waiting to run
Tools CI / tools-linux (tcc) (push) Waiting to run
Tools CI / tools-macos (clang) (push) Waiting to run
Tools CI / tools-windows (gcc) (push) Waiting to run
Tools CI / tools-windows (msvc) (push) Waiting to run
Tools CI / tools-windows (tcc) (push) Waiting to run
Tools CI / tools-docker-ubuntu-musl (push) Waiting to run
vab CI / vab-compiles-v-examples (push) Waiting to run
wasm backend CI / wasm-backend (ubuntu-22.04) (push) Waiting to run
wasm backend CI / wasm-backend (windows-2022) (push) Waiting to run
Workflow Lint / lint-yml-workflows (push) Has been cancelled
gg, gx: deprecate gx and replace all occurences with gg (which now contains all the functionality of gx) (#24966)
2025-08-14 19:53:56 +03:00

166 lines
4.1 KiB
V

import gg
import sokol.sapp
import sokol.sgl
import sokol.gfx
import x.ttf
import os
// import math
const win_width = 600
const win_height = 700
const bg_color = gg.white
const font_paths = [
os.resource_abs_path(os.join_path('..', 'assets', 'fonts', 'Imprima-Regular.ttf')),
os.resource_abs_path(os.join_path('..', 'assets', 'fonts', 'Graduate-Regular.ttf')),
]
// UI
struct App_data {
pub mut:
gg &gg.Context = unsafe { nil }
sg_img gfx.Image
init_flag bool
frame_c int
tf []ttf.TTF_File
ttf_render []ttf.TTF_render_Sokol
text_ready_flag bool
mouse_x int = -1
mouse_y int = -1
}
fn my_init(mut app App_data) {
app.init_flag = true
}
fn draw_frame(mut app App_data) {
cframe_txt := 'Current Frame: ${app.frame_c}'
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 a line as background
sgl.begin_line_strip()
sgl.v2f(10, 10)
sgl.v2f(100, 100)
sgl.end()
// draw text only if the app is already initialized
if app.init_flag == true {
sgl.begin_line_strip()
sgl.v2f(410, 400)
sgl.v2f(510, 400)
sgl.end()
// update the text
mut txt1 := unsafe { &app.ttf_render[0] }
if app.frame_c % 2 == 0 {
txt1.destroy_texture()
txt1.create_text(cframe_txt, 43)
txt1.create_texture()
}
// ----- decomment if you want text rotation ----
// txt1.bmp.angle = 3.141592 / 180 * f32(app.frame_c % 360)
// txt1.draw_text_bmp(app.gg, 300, 350)
// txt1.bmp.angle = 0
txt1.draw_text_bmp(app.gg, 30, 60)
// block test
block_txt := "Today it is a good day!
Tomorrow I'm not so sure :(
Frame: ${app.frame_c}
But Vwill prevail for sure, V is the way!!
òàèì@ò!£$%&
"
txt1 = unsafe { &app.ttf_render[1] }
if app.frame_c % 2 == 0 {
txt1.bmp.justify = false
if (app.frame_c >> 6) % 2 == 0 {
// txt1.align = .left
txt1.bmp.justify = true
}
txt1.bmp.align = .left
if (app.frame_c >> 6) % 3 == 0 {
txt1.bmp.align = .right
}
txt1.destroy_texture()
txt1.create_text_block(block_txt, 500, 500, 32)
txt1.create_texture()
}
// decomment if want block color change
// txt1.bmp.color = ttf.color_multiply(0xFF00FFFF, f32(app.frame_c % 255)/255.0)
// decomment if want block rotation wanted
// txt1.bmp.angle = 3.141592/180 * f32(app.frame_c % 45)
txt1.draw_text_bmp(app.gg, 30 + (app.frame_c >> 1) & 0xFF, 200)
// draw mouse position
if app.mouse_x >= 0 {
txt1 = unsafe { &app.ttf_render[2] }
txt1.destroy_texture()
txt1.create_text('${app.mouse_x},${app.mouse_y}', 25)
txt1.create_texture()
r := app.mouse_x % 255
g := app.mouse_y % 255
color := u32(r) << 24 | u32(g) << 16 | 0xFF
txt1.bmp.color = color
txt1.draw_text_bmp(app.gg, app.mouse_x, app.mouse_y)
}
app.frame_c++
}
app.gg.end()
}
fn my_event_manager(mut ev gg.Event, mut app App_data) {
if ev.typ == .mouse_move {
app.mouse_x = int(ev.mouse_x)
app.mouse_y = int(ev.mouse_y)
}
}
fn main() {
mut app := &App_data{}
app.gg = gg.new_context(
width: win_width
height: win_height
create_window: true
window_title: 'Test TTF module'
user_data: app
bg_color: bg_color
frame_fn: draw_frame
event_fn: my_event_manager
init_fn: my_init
)
// load TTF fonts
for font_path in font_paths {
mut tf := ttf.TTF_File{}
tf.buf = os.read_bytes(font_path) or { panic(err) }
println('TrueTypeFont file [${font_path}] len: ${tf.buf.len}')
tf.init()
println('Unit per EM: ${tf.units_per_em}')
app.tf << tf
}
// TTF render 0 Frame counter
app.ttf_render << &ttf.TTF_render_Sokol{
bmp: &ttf.BitMap{
tf: &app.tf[0]
buf: unsafe { malloc_noscan(32000000) }
buf_size: (32000000)
color: 0xFF0000FF
// style: .raw
// use_font_metrics: true
}
}
// TTF render 1 Text Block
app.ttf_render << &ttf.TTF_render_Sokol{
bmp: &ttf.BitMap{
tf: &app.tf[1]
// color : 0xFF0000_10
// style: .raw
// use_font_metrics: true
}
}
// TTF mouse position render
app.ttf_render << &ttf.TTF_render_Sokol{
bmp: &ttf.BitMap{
tf: &app.tf[0]
}
}
// setup sokol_gfx
app.gg.run()
}