1
0
mirror of https://github.com/pyrollo/display_modpack.git synced 2025-10-14 16:25:20 +02:00
This commit is contained in:
Pierre-Yves Rollo
2025-10-08 21:36:16 +02:00
parent e592b52b18
commit 9bd40bd31f
3 changed files with 51 additions and 40 deletions

View File

@@ -126,6 +126,10 @@ function Font:new(def)
return nil return nil
end end
if self.charspacing == nil then
self.charspacing = 0
end
setmetatable(font, self) setmetatable(font, self)
return font return font
@@ -172,7 +176,7 @@ end
function Font:get_char_width(codepoint) function Font:get_char_width(codepoint)
-- [1] is char width -- [1] is char width
return (self.glyphs[codepoint] or self.glyphs[0])[1] return (self.glyphs[codepoint] or self.glyphs[0])[1] + self.charspacing
end end
--- Returns texture for a given glyph --- Returns texture for a given glyph
@@ -303,13 +307,13 @@ function Font:render(text, width, height, style)
local glyph = self.glyphs[codepoint] local glyph = self.glyphs[codepoint]
-- Add image only if it is visible (at least partly) -- Add image only if it is visible (at least partly)
if x + glyph[1] >= 0 and x <= width then if x + glyph[1] + self.charspacing >= 0 and x <= width then
local glyph_texture = self:get_glyph_texture(glyph):gsub("[\\^:]", "\\%0") local glyph_texture = self:get_glyph_texture(glyph):gsub("[\\^:]", "\\%0")
if glyph_texture ~= '' then if glyph_texture ~= '' then
texture = string.format("%s:%d,%d=%s", texture, x, y, glyph_texture) texture = string.format("%s:%d,%d=%s", texture, x, y, glyph_texture)
end end
end end
x = x + glyph[1] x = x + glyph[1] + self.charspacing
end end
y = y + self:get_height() + (self.linespacing or 0) y = y + self:get_height() + (self.linespacing or 0)

View File

@@ -113,7 +113,7 @@ local function show_font_formspec(playername)
) )
fs = string.format( fs = string.format(
"%simage[0.1,%s;4.5,0.8;%s]button_exit[0,%s;4,1;font_%s;]", "%simage[0.1,%s;4.5,0.8;%s]button_exit[0,%s;4,1;font_%s;]",
fs, line - 0.9, texture, line - 1, font.name) fs, line - 0.9, texture:gsub("[\\^]", "\\%0"), line - 1, font.name)
end end
minetest.show_formspec(context.playername, modname..':font_list', fs) minetest.show_formspec(context.playername, modname..':font_list', fs)
end end

View File

@@ -6,6 +6,32 @@
-- TODO : detect and manage fixed width fonts -- TODO : detect and manage fixed width fonts
-- TODO: HAVE A PARAM FILE FOR EACH FONT WITH WANTED SETTINGS
-- Par exemple:
-- activation du trim
-- valeur de linespacing / charspacing ..
--
-- Dependancies check
--
local function check(cmd, msg)
if os.execute(cmd .. " > /dev/null 2>&1") then
return true
else
print(msg)
end
end
if
not check("convert --version", "Error: This program requires convert from ImageMagick!") or
not check("identify --version", "Error: This program requires identify from ImageMagick!") or
not check("ttx --version", "Error: This program requires ttx from FontTools!")
then
print("Please fix above problem and retry.")
os.exit(1)
end
-- --
-- Argument management -- Argument management
@@ -29,27 +55,6 @@ local fontsize=arg[3]
local modname = fontname local modname = fontname
--
-- Dependancies check
--
local function check(cmd, msg)
if os.execute(cmd .. " > /dev/null 2>&1") then
return true
else
print(msg)
end
end
if
not check("convert --version", "Error: This program requires convert from ImageMagick!") or
not check("identify --version", "Error: This program requires identify from ImageMagick!") or
not check("ttx --version", "Error: This program requires ttx from FontTools!")
then
print("Please fix above problem and retry.")
os.exit(1)
end
-- --
-- Prepare output directory -- Prepare output directory
-- --
@@ -124,11 +129,12 @@ local function measure(codepoint)
local char = utf8.char(codepoint) local char = utf8.char(codepoint)
local cmd = string.format( local cmd = string.format(
"convert -font \"%s\" -pointsize %d label:\"%s\" -identify NULL:", "convert -font \"%s\" -pointsize %d label:\"%s\" -define trim:edges=east,west -trim info:",
fontfile, fontsize, escape(char) fontfile, fontsize, escape(char)
) )
local _, _, w, h = string.find(command(cmd), "([0-9]+)x([0-9]+)" )
_, _, w, h = string.find(command(cmd), "([0-9]+)x([0-9]+)" )
return tonumber(w), tonumber(h) return tonumber(w), tonumber(h)
end end
@@ -191,7 +197,7 @@ local function make_final_texture(filename)
-- Compute positions -- Compute positions
for _, tile_width in ipairs(tile_widths) do for _, tile_width in ipairs(tile_widths) do
for _, codepoint in ipairs(by_width[tile_width]) do for _, codepoint in ipairs(by_width[tile_width]) do
local glyph_x = x // tile_width local glyph_x = math.ceil(x / tile_width)
x = glyph_x * tile_width x = glyph_x * tile_width
if x + tile_width > texture_width then -- no space left on current line if x + tile_width > texture_width then -- no space left on current line
x = 0 x = 0
@@ -201,7 +207,7 @@ local function make_final_texture(filename)
end end
glyph_xs[codepoint] = glyph_x glyph_xs[codepoint] = glyph_x
glyph_ys[codepoint] = glyph_y glyph_ys[codepoint] = glyph_y
glyph_ns[codepoint] = texture_width // tile_width glyph_ns[codepoint] = math.floor(texture_width / tile_width)
x = x + tile_width x = x + tile_width
end end
end end
@@ -213,7 +219,7 @@ local function make_final_texture(filename)
)) ))
for codepoint, n in pairs(glyph_ns) do for codepoint, n in pairs(glyph_ns) do
local w = texture_width // n local w = math.floor(texture_width / n)
local x = w * glyph_xs[codepoint] local x = w * glyph_xs[codepoint]
local y = font_height * glyph_ys[codepoint] local y = font_height * glyph_ys[codepoint]
@@ -223,11 +229,11 @@ local function make_final_texture(filename)
if codepoint == 0 then if codepoint == 0 then
-- The "unknown" char -- The "unknown" char
cmd = string.format("xc:transparent[%dx%d] -background none -colorspace gray -stroke black -fill transparent -strokewidth 1 -draw \"rectangle 0,0 %d,%d\"", cmd = string.format("xc:transparent[%dx%d] -background none -colorspace gray -stroke black -fill transparent -strokewidth 1 -draw \"rectangle 0,0 %d,%d\"",
w, font_height, w - 1, font_height - 1 w, font_height - 1, w - 1, font_height - 2
) )
else else
-- Other glyhp chars -- Other glyhp chars
cmd = string.format("-channel alpha -background none -colorspace gray -fill black -font \"%s\" -pointsize %d label:\"%s\"", cmd = string.format("-channel alpha -background none -colorspace gray -fill black -font \"%s\" -pointsize %d label:\"%s\" -define trim:edges=east,west -trim",
fontfile, fontsize, escape(utf8.char(codepoint)) fontfile, fontsize, escape(utf8.char(codepoint))
) )
end end
@@ -264,22 +270,22 @@ add_codepoints(0x0021, 0x007f)
add_codepoints(0x00a0, 0x00ff) add_codepoints(0x00a0, 0x00ff)
-- 0100-017f Latin Extended-A (full) -- 0100-017f Latin Extended-A (full)
--add_codepoints(0x0100, 0x017f) add_codepoints(0x0100, 0x017f)
-- 0370-03ff Greek (full) -- 0370-03ff Greek (full)
--add_codepoints(0x0370, 0x03ff) add_codepoints(0x0370, 0x03ff)
-- 0400-04ff Cyrilic (full) -- 0400-04ff Cyrilic (full)
--add_codepoints(0x0400, 0x04ff) add_codepoints(0x0400, 0x04ff)
-- 2000-206f General Punctuation (Limited to Dashes) -- 2000-206f General Punctuation (Limited to Dashes)
--add_codepoints(0x2010, 0x2015) add_codepoints(0x2010, 0x2015)
-- 2000-206f General Punctuation (Limited to Quotes) -- 2000-206f General Punctuation (Limited to Quotes)
--add_codepoints(0x2018, 0x201F) add_codepoints(0x2018, 0x201F)
-- 20a0-20cf Currency Symbols (Limited to Euro symbol) -- 20a0-20cf Currency Symbols (Limited to Euro symbol)
--add_codepoints(0x20ac, 0x20ac) add_codepoints(0x20ac, 0x20ac)
print("Prepare final texture") print("Prepare final texture")
@@ -311,6 +317,7 @@ font_api.register_font(
default = true, default = true,
margintop = 3, margintop = 3,
linespacing = -2, linespacing = -2,
charspacing = 2,
texture_height = %d, texture_height = %d,
glyphs_height = %d, glyphs_height = %d,
glyphs = { glyphs = {