--[[ font_api mod for Minetest - Library creating textures with fonts and text (c) Pierre-Yves Rollo This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . --]] -- Global variables ------------------- font_api.registered_fonts = {} font_api.registered_fonts_number = 0 -- Local variables ------------------ local default_font = false -- Local functions ------------------ -- Gets a default (settings or fist font) local function get_default_font() -- First call if default_font == false then default_font = nil -- First, try with settings local settings_font = minetest.settings:get("default_font") if settings_font ~= nil and settings_font ~= "" then default_font = font_api.registered_fonts[settings_font] if default_font == nil then minetest.log("warning", "Default font in settings (\"".. settings_font.."\") is not registered.") end end -- If failed, choose first font without default = false if default_font == nil then for _, font in pairs(font_api.registered_fonts) do if font.default then default_font = font break end end end -- If failed, chose first font if default_font == nil then for _, font in pairs(font_api.registered_fonts) do default_font = font break end end -- Error, no font registered if default_font == nil then minetest.log("error", "No font registred, unable to choose a default font.") end end return default_font end --- Returns font object to be used according to font_name -- @param font_name: Name of the font -- @return Font object if font found (or default font) function font_api.get_font(font_name) local font = font_api.registered_fonts[font_name] if font == nil then local message if font_name == nil then message = "No font given" else message = "Font \""..font_name.."\" unregistered" end font = get_default_font() if font ~= nil then minetest.log("info", message..", using font \""..font.name.."\".") end end return font end -- API functions ---------------- --- Returns de default font name -- @return Default font name function font_api.get_default_font_name() return get_default_font().name end --- Register a new font -- Textures corresponding to the font should be named after following patern : -- font__.png -- : name of the font -- : 4 digit hexadecimal unicode of the char -- @param font_name Name of the font to register -- If registering different sizes of the same font, add size in the font name -- (e.g. times_10, times_12...). -- @param def font definition. A associative array with following keys : -- @key default True (by default) if this font may be used as default font -- @key height (mandatory) Height in pixels of all font textures -- @key widths (mandatory) Array of character widths in pixels, indexed by -- UTF codepoints -- @key margintop (optional) Margin (in texture pixels) added on top of each -- char texture. -- @key marginbottom (optional) Margin (in texture pixels) added at bottom of -- each char texture. -- @key linespacing (optional) Spacing (in texture pixels) between each lines. -- @key getglyph (optional, advanced usage) Function that takes a Unicode -- codepoint (number) and returns a custom texture string for the glyph instead -- of the default `font_{name}_{codepoint}.png`. The texture string can contain -- filters like `^[sheet` and will be properly escaped when combined. -- -- margintop, marginbottom and linespacing can be negative numbers (default 0) -- and are to be used to adjust various font styles to each other. -- TODO: Add something to remove common accent if not defined in font function font_api.register_font(font_name, font_def) if font_api.registered_fonts[font_name] ~= nil then minetest.log("error", "Font \""..font_name.."\" already registered.") return end local font = font_api.Font:new(font_def) if font == nil then minetest.log("error", "Unable to register font \""..font_name.."\".") return end font.name = font_name font_api.registered_fonts[font_name] = font font_api.registered_fonts_number = font_api.registered_fonts_number + 1 -- Force to choose again default font -- (allows use of fonts registered after start) default_font = false minetest.log("action", "New font registered in font_api: "..font_name..".") end