diff options
Diffstat (limited to 'v_windows/v/vlib/x/ttf/render_sokol_cpu.v')
-rw-r--r-- | v_windows/v/vlib/x/ttf/render_sokol_cpu.v | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/v_windows/v/vlib/x/ttf/render_sokol_cpu.v b/v_windows/v/vlib/x/ttf/render_sokol_cpu.v new file mode 100644 index 0000000..f0e60eb --- /dev/null +++ b/v_windows/v/vlib/x/ttf/render_sokol_cpu.v @@ -0,0 +1,210 @@ +module ttf + +/********************************************************************** +* +* BMP render module utility functions +* +* Copyright (c) 2021 Dario Deledda. All rights reserved. +* Use of this source code is governed by an MIT license +* that can be found in the LICENSE file. +* +* Note: +* +* TODO: +**********************************************************************/ +import math +import gg +import sokol.sgl + +pub struct TTF_render_Sokol { +pub mut: + bmp &BitMap // Base bitmap render + // rendering fields + sg_img C.sg_image // sokol image + scale_reduct f32 = 2.0 // scale of the cpu texture for filtering + device_dpi int = 72 // device DPI +} + +/****************************************************************************** +* +* Render functions +* +******************************************************************************/ +pub fn (mut tf_skl TTF_render_Sokol) format_texture() { + tf_skl.bmp.format_texture() +} + +pub fn (mut tf_skl TTF_render_Sokol) create_text(in_txt string, in_font_size f32) { + scale_reduct := tf_skl.scale_reduct + device_dpi := tf_skl.device_dpi + font_size := in_font_size //* scale_reduct + + // Formula: (font_size * device dpi) / (72dpi * em_unit) + // scale := ((1.0 * devide_dpi )/ f32(72 * tf_skl.bmp.tf.units_per_em))* font_size + scale := f32(font_size * device_dpi) / f32(72 * tf_skl.bmp.tf.units_per_em) + // dprintln("Scale: $scale") + + tf_skl.bmp.scale = scale * scale_reduct + w, h := tf_skl.bmp.get_bbox(in_txt) + tf_skl.bmp.width = int(w) + tf_skl.bmp.height = int((h + 8)) + sz := tf_skl.bmp.width * tf_skl.bmp.height * tf_skl.bmp.bp + + // RAM buffer + if sz > tf_skl.bmp.buf_size { + if sz > 0 { + unsafe { free(tf_skl.bmp.buf) } + } + dprintln('create_text Alloc: $sz bytes') + tf_skl.bmp.buf = unsafe { malloc_noscan(sz) } + tf_skl.bmp.buf_size = sz + } + + tf_skl.bmp.init_filler() + + // draw the text + mut y_base := int((tf_skl.bmp.tf.y_max - tf_skl.bmp.tf.y_min) * tf_skl.bmp.scale) + tf_skl.bmp.set_pos(0, y_base) + tf_skl.bmp.clear() + tf_skl.bmp.draw_text(in_txt) + tf_skl.format_texture() +} + +pub fn (mut tf_skl TTF_render_Sokol) create_text_block(in_txt string, in_w int, in_h int, in_font_size f32) { + scale_reduct := tf_skl.scale_reduct + device_dpi := tf_skl.device_dpi + font_size := in_font_size //* scale_reduct + // Formula: (font_size * device dpi) / (72dpi * em_unit) + // scale := ((1.0 * devide_dpi )/ f32(72 * tf_skl.bmp.tf.units_per_em))* font_size + scale := f32(font_size * device_dpi) / f32(72 * tf_skl.bmp.tf.units_per_em) + // dprintln("Scale: $scale") + + tf_skl.bmp.scale = scale * scale_reduct + w := in_w + h := in_h + tf_skl.bmp.width = int(w * scale_reduct + 0.5) + tf_skl.bmp.height = int((h + 2) * scale_reduct + 0.5) + sz := tf_skl.bmp.width * tf_skl.bmp.height * tf_skl.bmp.bp + + // if true { return } + + // RAM buffer + if sz > tf_skl.bmp.buf_size { + if sz > 0 { + unsafe { free(tf_skl.bmp.buf) } + } + dprintln('Alloc: $sz bytes') + tf_skl.bmp.buf = unsafe { malloc_noscan(sz) } + tf_skl.bmp.buf_size = sz + } + + tf_skl.bmp.init_filler() + + // draw the text + mut y_base := int((tf_skl.bmp.tf.y_max - tf_skl.bmp.tf.y_min) * tf_skl.bmp.scale) + tf_skl.bmp.set_pos(0, y_base) + tf_skl.bmp.clear() + + tf_skl.bmp.draw_text_block(in_txt, x: 0, y: 0, w: w, h: h) + tf_skl.format_texture() +} + +/****************************************************************************** +* +* Sokol Render functions +* +******************************************************************************/ +pub fn (mut tf_skl TTF_render_Sokol) create_texture() { + w := tf_skl.bmp.width + h := tf_skl.bmp.height + sz := tf_skl.bmp.width * tf_skl.bmp.height * tf_skl.bmp.bp + mut img_desc := C.sg_image_desc{ + width: w + height: h + num_mipmaps: 0 + min_filter: .linear + mag_filter: .linear + // usage: .dynamic + wrap_u: .clamp_to_edge + wrap_v: .clamp_to_edge + label: &char(0) + d3d11_texture: 0 + } + // comment for dynamic + img_desc.data.subimage[0][0] = C.sg_range{ + ptr: tf_skl.bmp.buf + size: size_t(sz) + } + + simg := C.sg_make_image(&img_desc) + // free(tf_skl.bmp.buf) // DONT FREE IF Dynamic + tf_skl.sg_img = simg +} + +pub fn (tf_skl TTF_render_Sokol) destroy_texture() { + C.sg_destroy_image(tf_skl.sg_img) +} + +// Use only if usage: .dynamic +pub fn (mut tf_skl TTF_render_Sokol) update_text_texture() { + sz := tf_skl.bmp.width * tf_skl.bmp.height * tf_skl.bmp.bp + mut tmp_sbc := C.sg_image_data{} + tmp_sbc.subimage[0][0] = C.sg_range{ + ptr: tf_skl.bmp.buf + size: size_t(sz) + } + C.sg_update_image(tf_skl.sg_img, &tmp_sbc) +} + +pub fn (tf_skl TTF_render_Sokol) draw_text_bmp(ctx &gg.Context, x f32, y f32) { + // width := tf_skl.bmp.width >> 1 + // height := tf_skl.bmp.height >> 1 + sgl.push_matrix() + + width := tf_skl.bmp.width / (tf_skl.scale_reduct) + height := tf_skl.bmp.height / (tf_skl.scale_reduct) + + u0 := f32(0.0) + v0 := f32(0.0) + u1 := f32(1.0) + v1 := f32(1.0) + x0 := f32(0) + y0 := f32(0) + x1 := f32(width) * ctx.scale + y1 := f32(height) * ctx.scale + + ca := f32(math.cos(tf_skl.bmp.angle)) + sa := f32(math.sin(tf_skl.bmp.angle)) + m := [ + f32(ca), + -sa, + 0, + 0, + sa, + ca, + 0, + 0, + 0, + 0, + 1, + 0, + x * ctx.scale, + y * ctx.scale, + 0, + 1, + ] + sgl.mult_matrix(m) + // + sgl.load_pipeline(ctx.timage_pip) + sgl.enable_texture() + sgl.texture(tf_skl.sg_img) + sgl.begin_quads() + sgl.c4b(255, 255, 255, 255) + sgl.v2f_t2f(x0, y0, u0, v0) + sgl.v2f_t2f(x1, y0, u1, v0) + sgl.v2f_t2f(x1, y1, u1, v1) + sgl.v2f_t2f(x0, y1, u0, v1) + sgl.end() + sgl.disable_texture() + sgl.pop_matrix() +} |