Added accentuated letters support and textures
@ -17,62 +17,29 @@
|
|||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
--]]
|
--]]
|
||||||
|
|
||||||
|
-- Global variables
|
||||||
|
|
||||||
font_lib = {}
|
font_lib = {}
|
||||||
font_lib.path = minetest.get_modpath("font_lib")
|
font_lib.path = minetest.get_modpath("font_lib")
|
||||||
font_lib.font_height = 10
|
font_lib.font_height = 12
|
||||||
font_lib.font = {}
|
font_lib.font = {}
|
||||||
|
|
||||||
-- Get png width, suposing png width is less than 256 (it is the case for all font textures)
|
-- Local functions
|
||||||
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
|
local function get_next_char(text, pos)
|
||||||
-- @param text Text to be rendered
|
pos = pos + 1
|
||||||
-- @return Rendered text width
|
local char = text:sub(pos, pos):byte()
|
||||||
function font_lib.get_line_width(text)
|
if char >= 0x80 then
|
||||||
local char
|
if char == 0xc2 or char == 0xc3 then
|
||||||
local width = 0
|
pos = pos + 1
|
||||||
|
char = (char - 0xc2) * 0x40 + text:sub(pos, pos):byte()
|
||||||
for p=1,#text
|
else
|
||||||
do
|
char = 0
|
||||||
char = text:sub(p,p):byte()
|
|
||||||
if font_lib.font[char] then
|
|
||||||
width = width + font_lib.font[char].width
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
if font_lib.font[char] == nil then char=0 end
|
||||||
|
|
||||||
return width
|
return char, pos
|
||||||
end
|
|
||||||
|
|
||||||
--- Builds texture part for a text line
|
|
||||||
-- @param text Text to be rendered
|
|
||||||
-- @param texturew Width of the texture (extra text is not rendered)
|
|
||||||
-- @param x Starting x position in texture
|
|
||||||
-- @param y Vertical position of the line in texture
|
|
||||||
-- @return Texture string
|
|
||||||
function font_lib.make_line_texture(text, texturew, x, y)
|
|
||||||
local char
|
|
||||||
|
|
||||||
local texture = ""
|
|
||||||
|
|
||||||
for p=1,#text
|
|
||||||
do
|
|
||||||
char = text:sub(p,p):byte()
|
|
||||||
if font_lib.font[char] then
|
|
||||||
-- Add image only if it is visible (at least partly)
|
|
||||||
if x + font_lib.font[char].width >= 0 and x <= texturew then
|
|
||||||
texture = texture..string.format(":%d,%d=%s", x, y, font_lib.font[char].filename)
|
|
||||||
end
|
|
||||||
x = x + font_lib.font[char].width
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return texture
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local function split_lines(text, maxlines)
|
local function split_lines(text, maxlines)
|
||||||
@ -88,6 +55,51 @@ local function split_lines(text, maxlines)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Computes line width for a given font height and text
|
||||||
|
-- @param text Text to be rendered
|
||||||
|
-- @return Rendered text width
|
||||||
|
|
||||||
|
function font_lib.get_line_width(text)
|
||||||
|
local char
|
||||||
|
local width = 0
|
||||||
|
|
||||||
|
p=0
|
||||||
|
|
||||||
|
while p < #text do
|
||||||
|
char, p = get_next_char(text, p)
|
||||||
|
width = width + font_lib.font[char].width
|
||||||
|
end
|
||||||
|
|
||||||
|
return width
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Builds texture part for a text line
|
||||||
|
-- @param text Text to be rendered
|
||||||
|
-- @param texturew Width of the texture (extra text is not rendered)
|
||||||
|
-- @param x Starting x position in texture
|
||||||
|
-- @param y Vertical position of the line in texture
|
||||||
|
-- @return Texture string
|
||||||
|
|
||||||
|
function font_lib.make_line_texture(text, texturew, x, y)
|
||||||
|
local char
|
||||||
|
|
||||||
|
local texture = ""
|
||||||
|
|
||||||
|
p=0
|
||||||
|
|
||||||
|
while p < #text do
|
||||||
|
char, p = get_next_char(text, p)
|
||||||
|
|
||||||
|
-- Add image only if it is visible (at least partly)
|
||||||
|
if x + font_lib.font[char].width >= 0 and x <= texturew then
|
||||||
|
texture = texture..string.format(":%d,%d=%s", x, y, font_lib.font[char].filename)
|
||||||
|
end
|
||||||
|
x = x + font_lib.font[char].width
|
||||||
|
|
||||||
|
end
|
||||||
|
return texture
|
||||||
|
end
|
||||||
|
|
||||||
--- Builds texture for a multiline colored text
|
--- Builds texture for a multiline colored text
|
||||||
-- @param text Text to be rendered
|
-- @param text Text to be rendered
|
||||||
-- @param texturew Width of the texture (extra text will be truncated)
|
-- @param texturew Width of the texture (extra text will be truncated)
|
||||||
@ -96,15 +108,16 @@ end
|
|||||||
-- @param valign Vertical text align ("top" or "center")
|
-- @param valign Vertical text align ("top" or "center")
|
||||||
-- @param color Color of the text
|
-- @param color Color of the text
|
||||||
-- @return Texture string
|
-- @return Texture string
|
||||||
|
|
||||||
function font_lib.make_multiline_texture(text, texturew, textureh, maxlines, valign, color)
|
function font_lib.make_multiline_texture(text, texturew, textureh, maxlines, valign, color)
|
||||||
local texture = ""
|
local texture = ""
|
||||||
local lines = split_lines(text, maxlines)
|
local lines = split_lines(text, maxlines)
|
||||||
local y
|
local y
|
||||||
|
|
||||||
if valign == "top" then
|
if valign == "top" then
|
||||||
y = font_lib.font_height / 2
|
y = font_lib.font_height / 2 - 1
|
||||||
else
|
else
|
||||||
y = (textureh - font_lib.font_height * #lines) / 2 + 1
|
y = (textureh - font_lib.font_height * #lines) / 2
|
||||||
end
|
end
|
||||||
|
|
||||||
for _, line in pairs(lines) do
|
for _, line in pairs(lines) do
|
||||||
@ -128,7 +141,6 @@ end
|
|||||||
function font_lib.on_display_update(pos, objref)
|
function font_lib.on_display_update(pos, objref)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local text = meta:get_string("display_text")
|
local text = meta:get_string("display_text")
|
||||||
|
|
||||||
local ndef = minetest.registered_nodes[minetest.get_node(pos).name]
|
local ndef = minetest.registered_nodes[minetest.get_node(pos).name]
|
||||||
local entity = objref:get_luaentity()
|
local entity = objref:get_luaentity()
|
||||||
|
|
||||||
@ -145,10 +157,18 @@ function font_lib.on_display_update(pos, objref)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Populate fonts table
|
-- Populate fonts table
|
||||||
local w, filename
|
|
||||||
for charnum=32,126 do
|
local filename
|
||||||
filename = string.format("font_lib_%02x.png", charnum)
|
for char = 0,255 do
|
||||||
w = get_png_width(font_lib.path.."/textures/"..filename)
|
filename = string.format("font_lib_%02x.png", char)
|
||||||
font_lib.font[charnum] = {filename=filename, width=w}
|
local file=io.open(font_lib.path.."/textures/"..filename,"rb")
|
||||||
|
if file~=nil then
|
||||||
|
-- Get png width, suposing png width is less than 256 (it is the case for all font textures)
|
||||||
|
-- All font png are smaller than 256x256 --> read only last byte
|
||||||
|
file:seek("set",19)
|
||||||
|
local w = file:read(1)
|
||||||
|
file:close()
|
||||||
|
font_lib.font[char] = {filename=filename, width=w:byte()}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
BIN
font_lib/textures/font_lib_00.png
Normal file
After Width: | Height: | Size: 145 B |
Before Width: | Height: | Size: 232 B After Width: | Height: | Size: 281 B |
Before Width: | Height: | Size: 241 B After Width: | Height: | Size: 299 B |
Before Width: | Height: | Size: 235 B After Width: | Height: | Size: 290 B |
Before Width: | Height: | Size: 244 B After Width: | Height: | Size: 304 B |
Before Width: | Height: | Size: 247 B After Width: | Height: | Size: 314 B |
Before Width: | Height: | Size: 247 B After Width: | Height: | Size: 312 B |
Before Width: | Height: | Size: 246 B After Width: | Height: | Size: 319 B |
Before Width: | Height: | Size: 238 B After Width: | Height: | Size: 290 B |
Before Width: | Height: | Size: 242 B After Width: | Height: | Size: 303 B |
Before Width: | Height: | Size: 241 B After Width: | Height: | Size: 301 B |
Before Width: | Height: | Size: 238 B After Width: | Height: | Size: 289 B |
Before Width: | Height: | Size: 241 B After Width: | Height: | Size: 297 B |
Before Width: | Height: | Size: 238 B After Width: | Height: | Size: 290 B |
Before Width: | Height: | Size: 237 B After Width: | Height: | Size: 287 B |
Before Width: | Height: | Size: 236 B After Width: | Height: | Size: 289 B |
Before Width: | Height: | Size: 244 B After Width: | Height: | Size: 299 B |
Before Width: | Height: | Size: 239 B After Width: | Height: | Size: 302 B |
Before Width: | Height: | Size: 239 B After Width: | Height: | Size: 300 B |
Before Width: | Height: | Size: 247 B After Width: | Height: | Size: 312 B |
Before Width: | Height: | Size: 246 B After Width: | Height: | Size: 313 B |
Before Width: | Height: | Size: 247 B After Width: | Height: | Size: 314 B |
Before Width: | Height: | Size: 247 B After Width: | Height: | Size: 317 B |
Before Width: | Height: | Size: 244 B After Width: | Height: | Size: 312 B |
Before Width: | Height: | Size: 242 B After Width: | Height: | Size: 308 B |
Before Width: | Height: | Size: 240 B After Width: | Height: | Size: 300 B |
Before Width: | Height: | Size: 243 B After Width: | Height: | Size: 315 B |
Before Width: | Height: | Size: 237 B After Width: | Height: | Size: 289 B |
Before Width: | Height: | Size: 240 B After Width: | Height: | Size: 292 B |
Before Width: | Height: | Size: 245 B After Width: | Height: | Size: 290 B |
Before Width: | Height: | Size: 236 B After Width: | Height: | Size: 290 B |
Before Width: | Height: | Size: 245 B After Width: | Height: | Size: 289 B |
Before Width: | Height: | Size: 243 B After Width: | Height: | Size: 310 B |
Before Width: | Height: | Size: 259 B After Width: | Height: | Size: 323 B |
Before Width: | Height: | Size: 243 B After Width: | Height: | Size: 313 B |
Before Width: | Height: | Size: 240 B After Width: | Height: | Size: 302 B |
Before Width: | Height: | Size: 246 B After Width: | Height: | Size: 320 B |
Before Width: | Height: | Size: 242 B After Width: | Height: | Size: 308 B |
Before Width: | Height: | Size: 240 B After Width: | Height: | Size: 302 B |
Before Width: | Height: | Size: 241 B After Width: | Height: | Size: 305 B |
Before Width: | Height: | Size: 247 B After Width: | Height: | Size: 327 B |
Before Width: | Height: | Size: 240 B After Width: | Height: | Size: 304 B |
Before Width: | Height: | Size: 236 B After Width: | Height: | Size: 292 B |
Before Width: | Height: | Size: 240 B After Width: | Height: | Size: 304 B |
Before Width: | Height: | Size: 246 B After Width: | Height: | Size: 320 B |
Before Width: | Height: | Size: 238 B After Width: | Height: | Size: 298 B |
Before Width: | Height: | Size: 249 B After Width: | Height: | Size: 317 B |
Before Width: | Height: | Size: 243 B After Width: | Height: | Size: 315 B |
Before Width: | Height: | Size: 243 B After Width: | Height: | Size: 314 B |
Before Width: | Height: | Size: 241 B After Width: | Height: | Size: 309 B |
Before Width: | Height: | Size: 244 B After Width: | Height: | Size: 322 B |
Before Width: | Height: | Size: 238 B After Width: | Height: | Size: 303 B |
Before Width: | Height: | Size: 247 B After Width: | Height: | Size: 316 B |
Before Width: | Height: | Size: 237 B After Width: | Height: | Size: 301 B |
Before Width: | Height: | Size: 238 B After Width: | Height: | Size: 299 B |
Before Width: | Height: | Size: 243 B After Width: | Height: | Size: 306 B |
Before Width: | Height: | Size: 246 B After Width: | Height: | Size: 313 B |
Before Width: | Height: | Size: 245 B After Width: | Height: | Size: 308 B |
Before Width: | Height: | Size: 244 B After Width: | Height: | Size: 306 B |
Before Width: | Height: | Size: 248 B After Width: | Height: | Size: 307 B |
Before Width: | Height: | Size: 234 B After Width: | Height: | Size: 297 B |
Before Width: | Height: | Size: 244 B After Width: | Height: | Size: 297 B |
Before Width: | Height: | Size: 234 B After Width: | Height: | Size: 298 B |
Before Width: | Height: | Size: 238 B After Width: | Height: | Size: 303 B |
Before Width: | Height: | Size: 233 B After Width: | Height: | Size: 286 B |
Before Width: | Height: | Size: 234 B After Width: | Height: | Size: 284 B |
Before Width: | Height: | Size: 245 B After Width: | Height: | Size: 316 B |
Before Width: | Height: | Size: 242 B After Width: | Height: | Size: 307 B |
Before Width: | Height: | Size: 244 B After Width: | Height: | Size: 307 B |
Before Width: | Height: | Size: 243 B After Width: | Height: | Size: 314 B |
Before Width: | Height: | Size: 245 B After Width: | Height: | Size: 313 B |
Before Width: | Height: | Size: 240 B After Width: | Height: | Size: 306 B |
Before Width: | Height: | Size: 243 B After Width: | Height: | Size: 314 B |
Before Width: | Height: | Size: 240 B After Width: | Height: | Size: 305 B |
Before Width: | Height: | Size: 239 B After Width: | Height: | Size: 292 B |
Before Width: | Height: | Size: 236 B After Width: | Height: | Size: 293 B |
Before Width: | Height: | Size: 246 B After Width: | Height: | Size: 311 B |
Before Width: | Height: | Size: 236 B After Width: | Height: | Size: 292 B |
Before Width: | Height: | Size: 241 B After Width: | Height: | Size: 306 B |
Before Width: | Height: | Size: 239 B After Width: | Height: | Size: 308 B |
Before Width: | Height: | Size: 241 B After Width: | Height: | Size: 302 B |
Before Width: | Height: | Size: 242 B After Width: | Height: | Size: 315 B |
Before Width: | Height: | Size: 243 B After Width: | Height: | Size: 314 B |
Before Width: | Height: | Size: 241 B After Width: | Height: | Size: 303 B |
Before Width: | Height: | Size: 242 B After Width: | Height: | Size: 306 B |
Before Width: | Height: | Size: 243 B After Width: | Height: | Size: 304 B |
Before Width: | Height: | Size: 239 B After Width: | Height: | Size: 295 B |
Before Width: | Height: | Size: 244 B After Width: | Height: | Size: 300 B |
Before Width: | Height: | Size: 240 B After Width: | Height: | Size: 304 B |
Before Width: | Height: | Size: 244 B After Width: | Height: | Size: 302 B |
Before Width: | Height: | Size: 241 B After Width: | Height: | Size: 306 B |
Before Width: | Height: | Size: 246 B After Width: | Height: | Size: 296 B |
Before Width: | Height: | Size: 239 B After Width: | Height: | Size: 297 B |
Before Width: | Height: | Size: 232 B After Width: | Height: | Size: 134 B |
Before Width: | Height: | Size: 239 B After Width: | Height: | Size: 297 B |
Before Width: | Height: | Size: 239 B After Width: | Height: | Size: 294 B |
BIN
font_lib/textures/font_lib_8a.png
Normal file
After Width: | Height: | Size: 316 B |
BIN
font_lib/textures/font_lib_8d.png
Normal file
After Width: | Height: | Size: 302 B |
BIN
font_lib/textures/font_lib_a1.png
Normal file
After Width: | Height: | Size: 139 B |