v / examples / sokol / fonts.v
156 lines · 149 sloc · 4.1 KB · e2e5cf8db56f3562c7baa735061690be936bdf3e
Raw
1// vtest build: !solaris
2import sokol.sapp
3import sokol.gfx
4import sokol.sgl
5import fontstash
6import sokol.sfons
7import os
8
9struct AppState {
10mut:
11 pass_action gfx.PassAction
12 font_context &fontstash.Context
13 font_normal int
14}
15
16fn main() {
17 state := &AppState{
18 pass_action: gfx.create_clear_pass_action(0.3, 0.3, 0.32, 1.0)
19 font_context: unsafe { nil } // &fontstash.Context(0)
20 }
21 title := 'V Metal/GL Text Rendering'
22 desc := sapp.Desc{
23 user_data: state
24 init_userdata_cb: init
25 frame_userdata_cb: frame
26 window_title: &char(title.str)
27 }
28 sapp.run(&desc)
29}
30
31fn init(mut state AppState) {
32 desc := sapp.create_desc()
33 gfx.setup(&desc)
34 s := &sgl.Desc{}
35 sgl.setup(s)
36 state.font_context = sfons.create(512, 512, 1)
37 // or use DroidSerif-Regular.ttf
38 if bytes := os.read_bytes(os.resource_abs_path(os.join_path('..', 'assets', 'fonts',
39 'RobotoMono-Regular.ttf')))
40 {
41 println('loaded font: ${bytes.len}')
42 state.font_normal = state.font_context.add_font_mem('sans', bytes.clone(), true)
43 }
44}
45
46fn frame(mut state AppState) {
47 state.render_font()
48 pass := sapp.create_default_pass(state.pass_action)
49 gfx.begin_pass(&pass)
50 sgl.draw()
51 gfx.end_pass()
52 gfx.commit()
53}
54
55fn (state &AppState) render_font() {
56 mut sx := f32(0.0)
57 mut sy := f32(0.0)
58 mut dx := f32(0.0)
59 mut dy := f32(0.0)
60 lh := f32(0.0)
61 white := sfons.rgba(255, 255, 255, 255)
62 black := sfons.rgba(0, 0, 0, 255)
63 brown := sfons.rgba(192, 128, 0, 128)
64 blue := sfons.rgba(0, 192, 255, 255)
65
66 font_context := state.font_context
67 font_context.clear_state()
68 sgl.defaults()
69 sgl.matrix_mode_projection()
70 sgl.ortho(0.0, f32(sapp.width()), f32(sapp.height()), 0.0, -1.0, 1.0)
71 sx = 0
72 sy = 50
73 dx = sx
74 dy = sy
75 font_context.set_font(state.font_normal)
76 font_context.set_size(100.0)
77 ascender := f32(0.0)
78 descender := f32(0.0)
79 font_context.vert_metrics(&ascender, &descender, &lh)
80 dx = sx
81 dy += lh
82 font_context.set_color(white)
83 dx = font_context.draw_text(dx, dy, 'The quick ')
84 font_context.set_font(state.font_normal)
85 font_context.set_size(48.0)
86 font_context.set_color(brown)
87 dx = font_context.draw_text(dx, dy, 'brown ')
88 font_context.set_font(state.font_normal)
89 font_context.set_size(24.0)
90 font_context.set_color(white)
91 dx = font_context.draw_text(dx, dy, 'fox ')
92 dx = sx
93 dy += lh * 1.2
94 font_context.set_size(20.0)
95 font_context.set_font(state.font_normal)
96 font_context.set_color(blue)
97 font_context.draw_text(dx, dy,
98 'Now is the time for all good men to come to the aid of the party.')
99 dx = 300
100 dy = 350
101 font_context.set_alignment(.left | .baseline)
102 font_context.set_size(60.0)
103 font_context.set_font(state.font_normal)
104 font_context.set_color(white)
105 font_context.set_spacing(5.0)
106 font_context.set_blur(6.0)
107 font_context.draw_text(dx, dy, 'Blurry...')
108 dx = 300
109 dy += 50.0
110 font_context.set_size(28.0)
111 font_context.set_font(state.font_normal)
112 font_context.set_color(white)
113 font_context.set_spacing(0.0)
114 font_context.set_blur(3.0)
115 font_context.draw_text(dx, dy + 2, 'DROP SHADOW')
116 font_context.set_color(black)
117 font_context.set_blur(0)
118 font_context.draw_text(dx, dy, 'DROP SHADOW')
119 font_context.set_size(18.0)
120 font_context.set_font(state.font_normal)
121 font_context.set_color(white)
122 dx = 50
123 dy = 350
124 line(f32(dx - 10), f32(dy), f32(dx + 250), f32(dy))
125 font_context.set_alignment(.left | .top)
126 dx = font_context.draw_text(dx, dy, 'Top')
127 dx += 10
128 font_context.set_alignment(.left | .middle)
129 dx = font_context.draw_text(dx, dy, 'Middle')
130 dx += 10
131 font_context.set_alignment(.left | .baseline)
132 dx = font_context.draw_text(dx, dy, 'Baseline')
133 dx += 10
134 font_context.set_alignment(.left | .bottom)
135 font_context.draw_text(dx, dy, 'Bottom')
136 dx = 150
137 dy = 400
138 line(f32(dx), f32(dy - 30), f32(dx), f32(dy + 80.0))
139 font_context.set_alignment(.left | .baseline)
140 font_context.draw_text(dx, dy, 'Left')
141 dy += 30
142 font_context.set_alignment(.center | .baseline)
143 font_context.draw_text(dx, dy, 'Center')
144 dy += 30
145 font_context.set_alignment(.right | .baseline)
146 font_context.draw_text(dx, dy, 'Right')
147 sfons.flush(font_context)
148}
149
150fn line(sx f32, sy f32, ex f32, ey f32) {
151 sgl.begin_lines()
152 sgl.c4b(255, 255, 0, 128)
153 sgl.v2f(sx, sy)
154 sgl.v2f(ex, ey)
155 sgl.end()
156}
157