Initial commit.
61
mods/firefly_font/fonts/change_atlas_cell_size.py
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
from PIL import Image
|
||||
|
||||
def adjust_font_atlas(input_path, output_path, current_width, current_height, new_width, new_height):
|
||||
"""
|
||||
Adjusts the cell dimensions of a pixel font atlas sprite sheet by creating larger cells
|
||||
and placing the original sprites in the top-left corner of each new cell, filling
|
||||
the extra space with the background color detected from the top-left pixel of the
|
||||
original image. This allows for manual extension of sprites without repositioning them.
|
||||
|
||||
Args:
|
||||
input_path (str): Path to the input atlas image.
|
||||
output_path (str): Path to save the output atlas image.
|
||||
current_width (int): Current width of each cell (in pixels).
|
||||
current_height (int): Current height of each cell (in pixels).
|
||||
new_width (int): New larger width for each cell (in pixels).
|
||||
new_height (int): New larger height for each cell (in pixels).
|
||||
"""
|
||||
if new_width < current_width or new_height < current_height:
|
||||
raise ValueError("New dimensions must be larger than the current dimensions.")
|
||||
|
||||
img = Image.open(input_path)
|
||||
width, height = img.size
|
||||
|
||||
if width % current_width != 0 or height % current_height != 0:
|
||||
raise ValueError("Image dimensions are not multiples of the current cell dimensions.")
|
||||
|
||||
cols = width // current_width
|
||||
rows = height // current_height
|
||||
|
||||
# Create a new image with the same mode
|
||||
new_img = Image.new(img.mode, (cols * new_width, rows * new_height))
|
||||
|
||||
# Detect background color from top-left pixel (assuming it's background)
|
||||
bg_color = img.getpixel((0, 0))
|
||||
|
||||
# Fill the new image with the background color
|
||||
new_img.paste(bg_color, (0, 0, new_img.width, new_img.height))
|
||||
|
||||
# Copy each original sprite into the top-left of its new larger cell
|
||||
for r in range(rows):
|
||||
for c in range(cols):
|
||||
# Crop the original sprite
|
||||
left = c * current_width
|
||||
top = r * current_height
|
||||
right = left + current_width
|
||||
bottom = top + current_height
|
||||
sprite = img.crop((left, top, right, bottom))
|
||||
|
||||
# Paste into new position
|
||||
new_left = c * new_width
|
||||
new_top = r * new_height
|
||||
new_img.paste(sprite, (new_left, new_top))
|
||||
|
||||
# Save the new atlas
|
||||
new_img.save(output_path)
|
||||
|
||||
|
||||
# Example usage:
|
||||
base_path = "/Users/iboettcher/eclipse-workspace/firefly/mods/firefly_font/fonts/"
|
||||
adjust_font_atlas(f'{base_path}firefly_normal.png',
|
||||
f'{base_path}firefly_wide.png', 8, 17, 17, 17)
|
||||
20
mods/firefly_font/fonts/firefly_normal.json
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
{
|
||||
"A": {
|
||||
"width": 7,
|
||||
"height": 10,
|
||||
"base": 0,
|
||||
"advance": 2
|
||||
},
|
||||
"B": {
|
||||
"width": 7,
|
||||
"height": 10,
|
||||
"base": 0,
|
||||
"advance": 2
|
||||
},
|
||||
"C": {
|
||||
"width": 7,
|
||||
"height": 10,
|
||||
"base": 0,
|
||||
"advance": 2
|
||||
}
|
||||
}
|
||||
BIN
mods/firefly_font/fonts/firefly_normal.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
mods/firefly_font/fonts/firefly_normal/firefly_char_65.png
Normal file
|
After Width: | Height: | Size: 121 B |
BIN
mods/firefly_font/fonts/firefly_normal/firefly_char_66.png
Normal file
|
After Width: | Height: | Size: 123 B |
BIN
mods/firefly_font/fonts/firefly_normal/firefly_char_67.png
Normal file
|
After Width: | Height: | Size: 119 B |
BIN
mods/firefly_font/fonts/firefly_normal/firefly_char_68.png
Normal file
|
After Width: | Height: | Size: 118 B |
BIN
mods/firefly_font/fonts/firefly_normal/firefly_char_69.png
Normal file
|
After Width: | Height: | Size: 120 B |
BIN
mods/firefly_font/fonts/firefly_normal/firefly_char_70.png
Normal file
|
After Width: | Height: | Size: 118 B |
BIN
mods/firefly_font/fonts/firefly_normal/firefly_char_71.png
Normal file
|
After Width: | Height: | Size: 123 B |
BIN
mods/firefly_font/fonts/firefly_normal/firefly_char_72.png
Normal file
|
After Width: | Height: | Size: 115 B |
BIN
mods/firefly_font/fonts/firefly_wide.png
Normal file
|
After Width: | Height: | Size: 2 KiB |
BIN
mods/firefly_font/fonts/regular.ttf
Normal file
46
mods/firefly_font/init.lua
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
local ns = firefly
|
||||
local modname = minetest.get_current_modname()
|
||||
|
||||
ns.fonts = {}
|
||||
|
||||
function ns.rasterize(str, font, max_width)
|
||||
if not font then font = "firefly_normal" end
|
||||
local atlas = ns.fonts[font] or minetest.parse_json(ns.read_file(minetest.get_modpath(modname).."/fonts/"..font..".json"))
|
||||
if not ns.fonts[font] then
|
||||
ns.fonts[font] = atlas
|
||||
end
|
||||
|
||||
local newline = string.byte("\n", 1)
|
||||
|
||||
local out = {}
|
||||
local width = 0
|
||||
local height = 0
|
||||
local x = 0
|
||||
local y = 0
|
||||
for i = 0, #str do
|
||||
local char = str:byte(i)
|
||||
if not char then goto continue end
|
||||
if char == newline then
|
||||
goto continue
|
||||
end
|
||||
local glyph = atlas[string.char(char)]
|
||||
|
||||
local num = #out
|
||||
out[num +1] = ":"
|
||||
out[num +2] = x
|
||||
out[num +3] = ","
|
||||
out[num +4] = y
|
||||
out[num +5] = "="
|
||||
out[num +6] = font
|
||||
out[num +7] = "/firefly_char_"
|
||||
out[num +8] = char
|
||||
out[num +9] = ".png"
|
||||
|
||||
x = x +glyph.width +glyph.advance
|
||||
if x > width then
|
||||
width = x
|
||||
end
|
||||
::continue::
|
||||
end
|
||||
return "[combine:"..width.."x"..height..table.concat(out)
|
||||
end
|
||||
2
mods/firefly_font/mod.conf
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
name = firefly_font
|
||||
depends = firefly_base
|
||||