aboutsummaryrefslogtreecommitdiff
path: root/signs/font.lua
diff options
context:
space:
mode:
Diffstat (limited to 'signs/font.lua')
-rw-r--r--signs/font.lua63
1 files changed, 63 insertions, 0 deletions
diff --git a/signs/font.lua b/signs/font.lua
new file mode 100644
index 0000000..2da6611
--- /dev/null
+++ b/signs/font.lua
@@ -0,0 +1,63 @@
+
+local font = {}
+signs.font_height = 10
+
+-- Get png width, suposing png width is less than 256 (it is the case for all font textures)
+local function get_png_width(filename)
+ local file=assert(io.open(filename,"rb"))
+ -- All font png are smaller than 256x256 --> read only last byte
+ file:seek("set",19)
+ local w = file:read(1)
+ file:close()
+ return w:byte()
+end
+
+-- Computes line width for a given font height and text
+function signs.get_line_width(text)
+ local char
+ local width = 0
+
+ for p=1,#text
+ do
+ char = text:sub(p,p):byte()
+ if font[char] then
+ width = width + font[char].width
+ end
+ end
+
+ return width
+end
+
+--- Builds texture part for a text line
+-- @param text Text to be rendered
+-- @param x Starting x position in texture
+-- @param width Width of the texture (extra text is not rendered)
+-- @param y Vertical position of the line in texture
+-- @return Texture string
+function signs.make_line_texture(text, x, width, y)
+ local char
+
+ local texture = ""
+
+ for p=1,#text
+ do
+ char = text:sub(p,p):byte()
+ if font[char] then
+ -- Add image only if it is visible (at least partly)
+ if x + font[char].width >= 0 and x <= width then
+ texture = texture..string.format(":%d,%d=%s", x, y, font[char].filename)
+ end
+ x = x + font[char].width
+ end
+ end
+ return texture
+end
+
+-- Populate fonts table
+local w, filename
+for charnum=32,126 do
+ filename = string.format("signs_%02x.png", charnum)
+ w = get_png_width(signs.path.."/textures/"..filename)
+ font[charnum] = {filename=filename, width=w}
+end
+