Last active
October 3, 2021 18:12
-
-
Save thykka/6fba27b1eafa36c8ecda9cd529a0bf37 to your computer and use it in GitHub Desktop.
Line Fonts for PICO-8
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--[[ | |
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