aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/vlib/x/ttf/text_block.v
diff options
context:
space:
mode:
authorIndrajith K L2022-12-03 17:00:20 +0530
committerIndrajith K L2022-12-03 17:00:20 +0530
commitf5c4671bfbad96bf346bd7e9a21fc4317b4959df (patch)
tree2764fc62da58f2ba8da7ed341643fc359873142f /v_windows/v/vlib/x/ttf/text_block.v
downloadcli-tools-windows-master.tar.gz
cli-tools-windows-master.tar.bz2
cli-tools-windows-master.zip
Adds most of the toolsHEADmaster
Diffstat (limited to 'v_windows/v/vlib/x/ttf/text_block.v')
-rw-r--r--v_windows/v/vlib/x/ttf/text_block.v120
1 files changed, 120 insertions, 0 deletions
diff --git a/v_windows/v/vlib/x/ttf/text_block.v b/v_windows/v/vlib/x/ttf/text_block.v
new file mode 100644
index 0000000..58e909d
--- /dev/null
+++ b/v_windows/v/vlib/x/ttf/text_block.v
@@ -0,0 +1,120 @@
+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:
+**********************************************************************/
+pub struct Text_block {
+ x int // x postion of the left high corner
+ y int // y postion of the left high corner
+ w int // width of the text block
+ h int // heigth of the text block
+ cut_lines bool = true // force to cut the line if the length is over the text block width
+}
+
+fn (mut dev BitMap) get_justify_space_cw(txt string, w int, block_w int, space_cw int) f32 {
+ num_spaces := txt.count(' ')
+ if num_spaces < 1 {
+ return 0
+ }
+ delta := block_w - w
+ // println("num spc: $num_spaces")
+ // println("delta: ${txt} w:$w bw:$block_w space_cw:$space_cw")
+ res := f32(delta) / f32(num_spaces) / f32(space_cw)
+ // println("res: $res")
+ return res
+}
+
+// write out a text
+pub fn (mut bmp BitMap) draw_text_block(text string, block Text_block) {
+ mut x := block.x
+ mut y := block.y
+ mut y_base := int((bmp.tf.y_max - bmp.tf.y_min) * bmp.scale)
+
+ // bmp.box(x, y, x + block.w, y + block.h, u32(0xFF00_0000))
+
+ // spaces data
+ mut space_cw, _ := bmp.tf.get_horizontal_metrics(u16(` `))
+ space_cw = int(space_cw * bmp.scale)
+
+ old_space_cw := bmp.space_cw
+
+ mut offset_flag := f32(0) // default .left align
+ if bmp.align == .right {
+ offset_flag = 1
+ } else if bmp.align == .center {
+ offset_flag = 0.5
+ }
+
+ for txt in text.split_into_lines() {
+ bmp.space_cw = old_space_cw
+ mut w, _ := bmp.get_bbox(txt)
+ if w <= block.w || block.cut_lines == false {
+ // println("Solid block!")
+ left_offset := int((block.w - w) * offset_flag)
+ if bmp.justify && (f32(w) / f32(block.w)) >= bmp.justify_fill_ratio {
+ bmp.space_cw = old_space_cw + bmp.get_justify_space_cw(txt, w, block.w, space_cw)
+ }
+ bmp.set_pos(x + left_offset, y + y_base)
+ bmp.draw_text(txt)
+ //---- DEBUG ----
+ // mut txt_w , mut txt_h := bmp.draw_text(txt)
+ // bmp.box(x + left_offset,y+y_base - int((bmp.tf.y_min)*bmp.scale), x + txt_w + left_offset, y + y_base - int((bmp.tf.y_max) * bmp.scale), u32(0x00ff_0000) )
+ //---------------
+ y += y_base
+ } else {
+ // println("to cut: ${txt}")
+ mut txt1 := txt.split(' ')
+ mut c := txt1.len
+ // mut done := false
+ for c > 0 {
+ tmp_str := txt1[0..c].join(' ')
+ // println("tmp_str: ${tmp_str}")
+ if tmp_str.len < 1 {
+ break
+ }
+
+ bmp.space_cw = old_space_cw
+ w, _ = bmp.get_bbox(tmp_str)
+ if w <= block.w {
+ mut left_offset := int((block.w - w) * offset_flag)
+ if bmp.justify && (f32(w) / f32(block.w)) >= bmp.justify_fill_ratio {
+ // println("cut phase!")
+ bmp.space_cw = 0.0
+ w, _ = bmp.get_bbox(tmp_str)
+ left_offset = int((block.w - w) * offset_flag)
+ bmp.space_cw = bmp.get_justify_space_cw(tmp_str, w, block.w, space_cw)
+ } else {
+ bmp.space_cw = old_space_cw
+ }
+ bmp.set_pos(x + left_offset, y + y_base)
+ bmp.draw_text(tmp_str)
+ //---- DEBUG ----
+ // txt_w , txt_h := bmp.draw_text(tmp_str)
+ // println("printing [${x},${y}] => '${tmp_str}' space_cw: $bmp.space_cw")
+ // bmp.box(x + left_offset,y + y_base - int((bmp.tf.y_min)*bmp.scale), x + txt_w + left_offset, y + y_base - int((bmp.tf.y_max) * bmp.scale), u32(0x00ff_0000) )
+ //---------------
+ y += y_base
+ txt1 = txt1[c..]
+ c = txt1.len
+ //---- DEBUG ----
+ // txt2 := txt1.join(' ')
+ // println("new string: ${txt2} len: ${c}")
+ //---------------
+ } else {
+ c--
+ }
+ }
+ }
+ }
+
+ bmp.space_cw = old_space_cw
+}