Skip to content

Instantly share code, notes, and snippets.

@thykka
Last active October 3, 2021 18:12
Show Gist options
  • Save thykka/6fba27b1eafa36c8ecda9cd529a0bf37 to your computer and use it in GitHub Desktop.
Save thykka/6fba27b1eafa36c8ecda9cd529a0bf37 to your computer and use it in GitHub Desktop.
Line Fonts for PICO-8
--[[
line fonts v0.1 - thykka 2021
==usage==
printl(
text,
x, y,
color,
font_size,
char_spacing,
line_spacing,
wrap_width
)
==customizing the font==
glyphs are defined as a list of lines,
where each line consists of a list of
alternating x and y coordinates.
e.g. the letter A could be drawn like:
____2
_____
__4_5
_____
1___3
where 1-2 and 2-3 represent coordinate
pairs for the first two lines, and 4-5
are coords for the third line.
]]
line_font_glyphs={
[' ']={{1/4,0/1}},
['!']={{1/4,0/1, 1/4,2/3},
{1/4,1/1, 1/4,1/1}},
['"']={{1/3,0/1, 0/1,1/4},
{2/3,0/1, 2/5,1/4}},
['#']={{1/4,0/1, 1/4,1/1},
{3/4,0/1, 3/4,1/1},
{0/1,1/4, 1/1,1/4},
{0/1,3/4, 1/1,3/4}},
['$']={{1/2,0/1, 1/4,1/1},
{3/4,0/1, 1/4,0/1, 0/1,1/4, 1/4,1/2, 1/2,1/2, 3/4,3/4, 1/2,1/1, 0/0,1/1}},
['%']={{0/1,1/1, 2/3,0/1},{0/1,0/1, 0/1,0/1}, {5/8,1/1, 5/8,1/1}},
['&']={{1/2,0/1, 1/4,0/1, 0/1,1/4, 1/4,1/2, 0/1,3/4, 1/4,1/1, 1/2,1/1, 3/4,3/4, 3/4,1/2},{1/4,1/2, 1/1,1/2}},
['\'']={{1/4,0/1, 0/1,1/4}},
['(']={{1/4,0/1, 0/1,1/4, 0/1,3/4, 1/4,1/1}},
[')']={{0/1,0/1, 1/4,1/4, 1/4,3/4, 0/1,1/1}},
['*']={{0/1,1/2, 1/1,1/2}, {1/3,0/1, 3/4,1/1}, {3/4,0/1, 1/4,1/1}},
['+']={{0/1,1/2, 1/1,1/2},{1/2,0/1, 1/2,1/1}},
[',']={{0/1,1/1, -1/8,5/4}},
['-']={{0/1,1/2, 3/4,1/2}},
['.']={{0/1,1/1, 0/1,1/1}},
['/']={{0/1,1/1, 2/3,0/1}},
[0]={{3/4,1/4, 1/2,0/1, 1/4,0/1, 0/1,1/4, 0/1,3/4, 1/4,1/1, 1/2,1/1, 3/4,3/4, 3/4,1/4},
{1/4,3/4, 3/4,1/4}},
[1]={{0/1,1/6, 1/6,0/1, 1/6,1/1}},
[2]={{0/1,1/4, 1/4,0/1, 1/2,0/1, 3/4,1/4, 3/4,1/3, 0/1,1/1, 3/4,1/1}},
[3]={{0/1,1/4, 1/4,0/1, 1/2,0/1, 3/4,1/4, 1/2,1/2, 3/4,3/4, 1/2,1/1, 1/4,1/1, 0/1,3/4}},
[4]={{1/2,0/1, 0/1,3/4, 1/1,3/4},
{4/6,0/1, 4/6,1/1}},
[5]={{3/4,0/1, 0/1,0/1, 0/1,1/2, 1/2,1/2, 3/4,3/4, 1/2,1/1, 0/1,1/1}},
[6]={{0/1,1/2, 1/2,1/2, 3/4,3/4, 1/2,1/1, 1/4,1/1, 0/1,3/4, 0/1,1/4, 1/4,0/1, 1/2,0/1, 5/8,1/8}},
[7]={{0/1,0/1, 3/4,0/1, 3/4,1/4, 3/8,5/8, 3/8,1/1}},
[8]={{1/4,1/2, 0/1,1/4, 1/4,0/1, 1/2,0/1, 3/4,1/4, 1/2,1/2, 3/4,3/4, 1/2,1/1, 1/4,1/1, 0/1,3/4, 1/4,1/2, 1/2,1/2}},
[9]={{3/4,1/2, 1/4,1/2, 0/1,1/4, 1/4,0/1, 1/2,0/1, 3/4,1/4, 3/4,3/4, 1/2,1/1, 1/8,1/1}},
[':']={{0/1,1/3, 0/1,1/3},{0/1,1/1, 0/1,1/1}},
[';']={{0/1,1/3, 0/1,1/3},{0/1,1/1, -1/8,5/4}},
['<']={{1/2,0/1, 0/1,1/2, 1/2,1/1}},
['=']={{0/1,1/3, 2/3,1/3}, {0/1,3/4, 2/3,3/4}},
['>']={{0/1,0/1, 1/2,1/2, 0/1,1/1}},
['?']={{0/1,0/1, 1/2,0/1, 3/4,1/4, 1/2,1/2, 1/4,1/2, 1/4,2/3}, {1/4,1/1, 1/4,1/1}},
['@']={{3/4,1/1, 1/4,1/1, 0/1,3/4, 0/1,1/4, 1/4,0/1, 3/4,0/1, 1/1,1/4, 1/1,1/2, 1/2,1/2, 3/4,1/4, 3/4,1/2}},
--[[
]]
['[']={{1/4,0/1, 0/1,0/1, 0/1,1/1, 1/4,1/1}},
['\\']={{2/3,1/1, 0/1,0/1}},
[']']={{0/1,0/1, 1/4,0/1, 1/4,1/1, 0/1,1/1}},
['^']={{0/1,1/4, 1/4,0/1, 1/2,1/4}},
['_']={{0/1,1/1, 1/1,1/1}},
['`']={{0/1,0/1, 1/4,1/4}},
['a']={{0/1,1/1, 1/2,0/1, 1/1,1/1},
{1/4,2/3, 3/4,2/3}},
['b']={{0/1,0/1, 0/1,1/1, 2/3,1/1, 3/4,3/4, 2/3,1/2, 0/1,1/2},
{0/1,0/1, 2/3,0/1, 3/4,1/4, 2/3,1/2}},
['c']={{3/4,1/4, 1/2,0/1, 1/4,0/1, 0/1,1/4, 0/1,3/4, 1/4,1/1, 1/2,1/1, 3/4,3/4}},
['d']={{0/1,0/1, 0/1,1/1, 1/2,1/1, 3/4,3/4, 3/4,1/4, 1/2,0/1, 0/1,0/1}},
['e']={{3/4,0/1, 0/1,0/1, 0/1,1/2, 2/3,1/2},
{0/1,1/2, 0/1,1/1, 3/4,1/1}},
['f']={{3/4,0/1, 0/1,0/1, 0/1,1/1},
{0/1,1/2, 2/3,1/2}},
['g']={{3/4,1/4, 1/2,0/1, 1/4,0/1, 0/1,1/4, 0/1,3/4, 1/4,1/1, 1/2,1/1, 3/4,3/4, 3/4,1/2, 1/2,1/2}},
['h']={{0/1,0/1, 0/1,1/1},
{0/1,1/2, 3/4,1/2},
{3/4,0/1, 3/4,1/1}},
['i']={{0/1,0/1, 1/2,0/1},
{1/4,0/1, 1/4,1/1},
{0/1,1/1, 1/2,1/1}},
['j']={{1/2,0/1, 1/2,3/4, 1/4,1/1, 0/1,1/1}},
['k']={{0/1,0/1, 0/1,1/2, 1/4,1/2},
{3/4,0/1, 1/4,1/2, 3/4,1/1},
{0/1,1/2, 0/1,1/1}},
['l']={{0/1,0/1, 0/1,1/1, 1/2,1/1}},
['m']={{0/1,1/1, 0/1,0/1, 1/2,1/2, 1/1,0/1, 1/1,1/1}},
['n']={{0/1,1/1, 0/1,0/1, 1/1,1/1, 1/1,0/1}},
['o']={{3/4,1/4, 1/2,0/1, 1/4,0/1, 0/1,1/4, 0/1,3/4, 1/4,1/1, 1/2,1/1, 3/4,3/4, 3/4,1/4}},
['p']={{0/1,1/1, 0/1,0/1, 2/3,0/1, 3/4,1/4, 2/3,1/2, 0/1,1/2}},
['q']={{3/4,1/4, 1/2,0/1, 1/4,0/1, 0/1,1/4, 0/1,3/4, 1/4,1/1, 1/2,1/1, 3/4,3/4, 3/4,1/4},
{1/2,3/4, 3/4,1/1}},
['r']={{0/1,1/1, 0/1,0/1, 2/3,0/1, 3/4,1/4, 2/3,1/2, 0/1,1/2},
{1/2,1/2, 3/4,1/1}},
['s']={{0/1,1/1, 2/3,1/1, 3/4,3/4, 2/3,1/2, 1/6,1/2, 0/1,1/4, 1/6,0/1, 3/4,0/1}},
['t']={{0/1,0/1, 1/1,0/1},
{1/2,0/1, 1/2,1/1}},
['u']={{0/1,0/1, 0/1,3/4, 1/4,1/1, 1/2,1/1, 3/4,3/4, 3/4,0/1}},
['v']={{0/1,0/1, 1/2,1/1, 1/1,0/1}},
['w']={{0/1,0/1, 1/4,1/1, 1/2,0/1, 3/4,1/1, 1/1,0/1}},
['x']={{0/1,0/1, 3/4,1/1},
{0/1,1/1, 3/4,0/1}},
['y']={{0/1,0/1, 1/2,1/2, 1/1,0/1},
{1/2,1/2, 1/2,1/1}},
['z']={{0/1,0/1, 3/4,0/1, 0/1,1/1, 3/4,1/1}},
['{']={{1/2,0/1, 1/4,0/1, 1/4,1/1, 1/2,1/1},
{0/1,1/2, 1/4,1/2}},
['|']={{0/1,0/1, 0/1,1/1}},
['}']={{0/1,0/1, 1/4,0/1, 1/4,1/1, 0/1,1/1},
{1/4,1/2, 1/2,1/2}},
['~']={{0/1,1/2, 1/4,1/4, 1/2,1/2, 3/4,1/4}},
['○']={{1/4,0/1, 0/1,1/4, 1/4,1/2, 1/2,1/4, 1/4,0/1}}
}
linefont_last_y=0
function printl(message,x,y,color,scale,cspc,lspc,width)
scale=scale or 4
cspc=cspc or 1
lspc=lspc or 4
x,y=x or 0,y or linefont_last_y
ox=x
width=width or 127
for i,letter in ipairs(split(message,'')) do
if x > width-scale then
x=ox
y+=scale+1+lspc
end
x+=draw_letter(letter,x,y,scale,cspc,color)
end
linefont_last_y=y+scale+1+lspc
end
function draw_letter(letter,x,y,scale,spacing,color)
local glyph=line_font_glyphs[letter]
local max_w=0
if not glyph and scale==4 then
print(letter,x,y,2)
return 4
end
for i,points in ipairs(glyph) do
local lx,ly
for p=1,#points,2 do
local xp=x+scale*points[p]
local yp=y+scale*points[p+1]
if lx and ly then
line(lx,ly,xp,yp,color or 8-i)
end
lx,ly=xp,yp
max_w=max(max_w,lx-x+1)
end
end
if max_w > 0 then max_w += spacing end
return max_w --letter width
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment