I have noticed that the license doesn't allow you to use the TTFs in open-source software, which is something to keep in mind.
> Licensed Content may not be distributed to third parties as standalone
files or in a way that unreasonably permits the recipient to extract
the Licensed Content for use separately and apart from the Work for
Distribution.
> Licensee may not distribute the Licensed Content in any library or
reusable template, including but not limited to game templates, website
templates intended to allow reproduction by third parties on electronic
or printed products.
> Licensee may not distribute Licensed Content in a manner meant to enable
third parties to create derivative works incorporating Licensed Content.
To me, a non-lawyer, the last clause reads like it unambiguously forbids it.
Hmm, it definitely doesn't allow you to distribute them as open source (or CC or whatever) but I don't know that I'd agree that it forbids you from shipping them with something that's otherwise open source.
Though clearly the intent is that these be used more in the final product stage of the kinds of things that are more rarely open source, games vs. engines or templates.
I found myself thinking about a different copyright corner-case when reading the post and this question: the fact that typefaces aren't copyrightable in the US. Fonts are, as computer programs, but typefaces (and so also fonts that are simple bitmaps) aren't. So this workflow goes from a non-copyrighted source, (the original tilesheet) to a copyrighted output (the TTFs) and also back to a non-copyrighted output too (the output tilesheet/atlas).
Impressive indeed. Making a complete font set can easily take as long as a year. The tasks include to go from 'A' to 'Z', upper and lower case, plus all the glyphs (brackets, ampersand, exclamation marks etc). Optionally the variations (bold, italic etc) without which a font is of limited use. The thing that separates the men from the boys is the kerning (spacing between the characters) which can absorb as much obsessive compulsion as you can throw at it. From TFA:
> My new fonts were going to support 176 characters, meaning I might have to enter as many as 176² = 37,976 kerning pairs... yeah not going to happen. So this time, since I was (spoiler alert) writing my own tool to generate the fonts, I decided to semi-automate this process to take care of a huge majority of the kerning, and do manual entry when algorithm didn't suffice.
> Making a complete font set can easily take as long as a year. The tasks include to go from 'A' to 'Z', upper and lower case, plus all the glyphs (brackets, ampersand, exclamation marks etc).
That's when you're limiting the font to purely English usage. If you want to support any other language you have to add more characters, even for languages that also use the latin alphabet (e.g., French, Spanish, Italian, Portuguese, etc). Then you may want to support Greek and Cyrillic, Japanese, Chinese, …
For example, “Noto fonts cover over 77,000 characters, which is around half of the 149,186 characters defined in Unicode 15.0” according to the font's Wikipedia entry.
>Making a complete font set can easily take as long as a year.
I'm sorry I just don't buy this. Its possible to endlessly obsess over anything. I've noticed things like language/writing/music/calligraphy tend to have high draw to people that are prone to obsessing.
It sounds like gatekeeping to me is my point. Discouraging people from entering a field always makes me a bit triggered.
Very nice! One question: I was curious why you chose this subset of Scandinavian special characters.
There are three extended chars in Swedish (äöå) and Norwegian/Danish (æøå), but your fonts have æ, but not ø, which means you could drop the æ and still support Swedish, or add an ø to also support Norwegian and Danish. Was this an oversight or is there some locale that has just æ and not ø? (and before anyone asks I did not confuse æ with the oe-ligature œ, which is a different glyph used in French, and which the fonts also do support)
This was just an oversight. I actually got very far into the project before I realized that ø was missing from my set.
It’s something that I could definitely go through and patch into all the fonts, but I was waiting to see if there was enough demand for the effort. I think supporting two more languages would be very cool though.
Fascinating, I didn't previously realise you were converting pixel fonts to vectors when encoding them to TTF. I guess that gives some ability to seamlessly scale them for folks who load them into a competent text renderer as well (i.e. not a game engine that mostly just uses pixel fonts 1:1)
This is neat! And cool to hear this made a financial difference for them. Gah, I remember the name Chevy Ray from indie games, but I cannot put my finger on what this person made… would have been like 2010 to 2012?
In the same vein as VVVVVV or nidhogg or canabalt as I recall
Da Vinci types like the author here always remind me that there was a time when being an artist and an engineer were one and the same, with no clear distinction between the two.
Interesting how easy it is to make an operation like this run on multiple cores in Rust. Inserting a single call into a chain of functions can be enough.
This is really excellent work, and a great write-up. I think it would definitely be possible to speed up a lot of the algorithms with some tricks. Replacing hashmaps with bitmaps and byte-index arrays for character painting and ascii-to-variants seems like a lead, based on what I've read. Of course, that doesn't really matter for this code since it's already fast enough.
Glad you brought this up, because it's absolutely true! All the code is not on the site, but I actually allocate and clone a lot of strings and data structures as well. I did optimal code where it was obvious (bitmap copying, easily parallelizable things), and it was SO instant that I didn't even bother trying to optimize the other things. But it could be done!
It's easy to forget how fast on-the-ground languages like Rust and C++ and Go are, not to mention when you use their multi-threading primitives and worker queues/etc.
Btw anyone who's into fonts should check out https://tomorrow.type.today/ they're a typography studio that does fantastic original and experimental fonts. One of our team is super into typography and has been building a collection of their work at https://play.soot.com/tomorrowtypetoday
I find typography resists my attempts to wrap my head around it, because even though I can do basic analysis like serif vs sans serif, I get a sort of brain fog when it comes to telling fonts apart or intuiting which fonts to use in different situations.
It's really hard to wrap my head around the idea that one person could make 175 fonts and that they would each be meaningfully different from each other. Like, how does one not accidentally recreate the same font?
Sometimes I would get pretty far into a new font only to realize it was almost a total copy of another. It happened, I just managed to notice before releasing them lol
Actually it is impossible to recreate the same font from memory. Even if you tried the font would be in some ways different. With pixel fonts where the grid is very coarse its much easier to do but normal fonts with curves you wont make it. Even if you are using same image of a font as a reference.
Awesome read! I've never designed a font but often daydreamed about it, and this was a great primer to the process.
Question: Did you find that your automated kerning generator was always satisfactory? Or did you ever catch letter pairings that technically satisfied the criteria but that tripped your subjective kerning radar?
I'm wondering if you had to hard-code kerning exceptions, or if your system even allowed for that.
I absolutely did find examples where I needed to specify. I kind of allude to that in the post, but yeah whenever I add the ability to automate something like this, I almost always make sure to include the ability for me to manually override them. Experience has taught me that no matter how fancy or super special your algorithm is, there's always situations where the naked eye just sees what the robot can't.
In the "mixed-case kerning pairs" quality testing image, I notice that the letter "j" sometimes reaches under the previous letter, like in "Fdj". Sometimes it creates a lot of space, like in "Fjo". Is there a stylistic reason for this? The Fjo spacing is the only thing that stood out to me.
Nice catch. That's a culprit of the `auto_kerning_min` property that you'll see on a lot of the fonts. this tells the auto kerner not to exceed that.
I added this parameter because I fouund that for a lot of fonts, squeezing letters together over a certain distance would just look bad, so I would set -1 or -2 as a cap.
It looks like that's just one that snuck past my notice. The word "Fjord" would look strange because of this. This is a good example of how even with the quality testing, things can get through, because I still have to visually glance over hundreds of kerning tests.
One thing that might be a nice adjustment is to have an algorithm that detects the "area" between two letters, so basically how many pixels can volumetrically fit between them, and flag ones that go over a certain threshold. I could then color those tuples as red in the sample text, basically the system marking them as "potential problems" that required an author's look.
A combination of word of mouth and itch.io's search system. I have a decent amount of social media followers, many who have used my fonts in the past, so the initial flood of wishlisters put it on the front page for a bit.
After that wave, they get used in various projects here and there, and those projects eventually release or post screenshots. Because it's indie, lots of people also attribute the fonts directly when they post screenshots of their games, posters, videos, and stream overlays where they use them. I am very supportive of people using them, and repost their work, and so it's very casually symbiotic.
They're not lucrative on the scale that you might expect from a company or a popular vector font, but as supplementary income for a solo developer what they bring in helps put food on my table and also helps indie games get made which I think is great.
Impressive and a nice site. Regarding font generation, let's not forget Donald Knuth and his https://en.wikipedia.org/wiki/Metafont software which generates raster fonts.
Not a bad suggestion at all. Lots of fonts even provide ligatures for certain letter pairs so they can touch, but tweak them so they look a bit better.
That kind of thing is another level of polish that I could definitely do, or even just providing more spaced variations.
Awesome work! It's a wonder how much hasn't been done in a world of 8 billion people. A single skilled individual with some free time filling in a gap can be HUGE. Gets me looking for gaps.
8 Billion people seems like a lot, but it cuts down fast. When 1/10 people have the freedom and, 1/100 the resources and time, 1/100 the training and experience, and 1/100 have the drive, and with hundreds of domains each with hubdreds of major unfilled niches...
That's 800 people split among tens of thousands of gaps. It pretty quickly gets down to you, the reader, to pick up that keyboard and start tapping away!
These are obviously wild-a* numbers. Constraints may be overstated or understated & they're not fully independent. I'm missing others. The point stands: you need only to cut 8 billion by 100 a few times to get <1.
These look absolutely delightful! A quick question: I'm working on retro consoles, and so I need fonts where each glyph is a multiple of 8px wide for easy display on tile-based backgrounds. Are the sizes (in pixels) of your font packs listed anywhere?
I also took a look and couldn't find any info. If you want to take a leap of faith, once you buy the assets there's metadata files including individual glyph sizes and kerning info so you could find all the ones that fit your project
Check out The Ultimate Oldschool PC Font Pack (https://int10h.org/oldschool-pc-fonts/). Each font description includes glyph dimensions and aspect ratios
The example tile sheet in the article appears to be 8 pixels wide by my count. Count the width in pixels on the "m" and if it's 7 the font will likely work for you.
[+] [-] networked|1 year ago|reply
I have noticed that the license doesn't allow you to use the TTFs in open-source software, which is something to keep in mind.
> Licensed Content may not be distributed to third parties as standalone files or in a way that unreasonably permits the recipient to extract the Licensed Content for use separately and apart from the Work for Distribution.
> Licensee may not distribute the Licensed Content in any library or reusable template, including but not limited to game templates, website templates intended to allow reproduction by third parties on electronic or printed products.
> Licensee may not distribute Licensed Content in a manner meant to enable third parties to create derivative works incorporating Licensed Content.
To me, a non-lawyer, the last clause reads like it unambiguously forbids it.
https://github.com/ChevyRay/pixel_font_megapack_license/blob...
[+] [-] BHSPitMonkey|1 year ago|reply
[+] [-] zerocrates|1 year ago|reply
Though clearly the intent is that these be used more in the final product stage of the kinds of things that are more rarely open source, games vs. engines or templates.
I found myself thinking about a different copyright corner-case when reading the post and this question: the fact that typefaces aren't copyrightable in the US. Fonts are, as computer programs, but typefaces (and so also fonts that are simple bitmaps) aren't. So this workflow goes from a non-copyrighted source, (the original tilesheet) to a copyrighted output (the TTFs) and also back to a non-copyrighted output too (the output tilesheet/atlas).
[+] [-] networked|1 year ago|reply
This was supposed to be "in open-source software projects".
[+] [-] Daub|1 year ago|reply
> My new fonts were going to support 176 characters, meaning I might have to enter as many as 176² = 37,976 kerning pairs... yeah not going to happen. So this time, since I was (spoiler alert) writing my own tool to generate the fonts, I decided to semi-automate this process to take care of a huge majority of the kerning, and do manual entry when algorithm didn't suffice.
[+] [-] p4bl0|1 year ago|reply
That's when you're limiting the font to purely English usage. If you want to support any other language you have to add more characters, even for languages that also use the latin alphabet (e.g., French, Spanish, Italian, Portuguese, etc). Then you may want to support Greek and Cyrillic, Japanese, Chinese, …
For example, “Noto fonts cover over 77,000 characters, which is around half of the 149,186 characters defined in Unicode 15.0” according to the font's Wikipedia entry.
[+] [-] inferiorhuman|1 year ago|reply
[+] [-] citizenpaul|1 year ago|reply
I'm sorry I just don't buy this. Its possible to endlessly obsess over anything. I've noticed things like language/writing/music/calligraphy tend to have high draw to people that are prone to obsessing.
It sounds like gatekeeping to me is my point. Discouraging people from entering a field always makes me a bit triggered.
[+] [-] czarit|1 year ago|reply
There are three extended chars in Swedish (äöå) and Norwegian/Danish (æøå), but your fonts have æ, but not ø, which means you could drop the æ and still support Swedish, or add an ø to also support Norwegian and Danish. Was this an oversight or is there some locale that has just æ and not ø? (and before anyone asks I did not confuse æ with the oe-ligature œ, which is a different glyph used in French, and which the fonts also do support)
[+] [-] kd5bjo|1 year ago|reply
Well, Icelandic uses ö in place of ø, but also requires ð and ý which are not included.
Æ is sometimes used in older English texts, though, in words like “encyclopædia” or in plurals of latin-derived words: https://en.wiktionary.org/wiki/Category:English_plurals_in_-...
[+] [-] chevyray|1 year ago|reply
It’s something that I could definitely go through and patch into all the fonts, but I was waiting to see if there was enough demand for the effort. I think supporting two more languages would be very cool though.
[+] [-] nitinreddy88|1 year ago|reply
[+] [-] swiftcoder|1 year ago|reply
[+] [-] waldothedog|1 year ago|reply
In the same vein as VVVVVV or nidhogg or canabalt as I recall
[+] [-] waldothedog|1 year ago|reply
[+] [-] chevyray|1 year ago|reply
[+] [-] bitvoid|1 year ago|reply
[+] [-] wrsh07|1 year ago|reply
[+] [-] TeaDude|1 year ago|reply
[+] [-] unknown|1 year ago|reply
[deleted]
[+] [-] musha68k|1 year ago|reply
Da Vinci types like the author here always remind me that there was a time when being an artist and an engineer were one and the same, with no clear distinction between the two.
[+] [-] Vecr|1 year ago|reply
[+] [-] MontagFTB|1 year ago|reply
Amdahl’s Law still gets a vote, but at least your app won’t blow up in your face.
[+] [-] vips7L|1 year ago|reply
[+] [-] claytonwramsey|1 year ago|reply
[+] [-] chevyray|1 year ago|reply
It's easy to forget how fast on-the-ground languages like Rust and C++ and Go are, not to mention when you use their multi-threading primitives and worker queues/etc.
[+] [-] theahura|1 year ago|reply
[+] [-] vindex10|1 year ago|reply
[+] [-] peteforde|1 year ago|reply
I find typography resists my attempts to wrap my head around it, because even though I can do basic analysis like serif vs sans serif, I get a sort of brain fog when it comes to telling fonts apart or intuiting which fonts to use in different situations.
It's really hard to wrap my head around the idea that one person could make 175 fonts and that they would each be meaningfully different from each other. Like, how does one not accidentally recreate the same font?
[+] [-] chevyray|1 year ago|reply
[+] [-] omnimus|1 year ago|reply
[+] [-] RatParadise|1 year ago|reply
Question: Did you find that your automated kerning generator was always satisfactory? Or did you ever catch letter pairings that technically satisfied the criteria but that tripped your subjective kerning radar? I'm wondering if you had to hard-code kerning exceptions, or if your system even allowed for that.
[+] [-] chevyray|1 year ago|reply
[+] [-] patal|1 year ago|reply
In the "mixed-case kerning pairs" quality testing image, I notice that the letter "j" sometimes reaches under the previous letter, like in "Fdj". Sometimes it creates a lot of space, like in "Fjo". Is there a stylistic reason for this? The Fjo spacing is the only thing that stood out to me.
Kudos
[+] [-] chevyray|1 year ago|reply
I added this parameter because I fouund that for a lot of fonts, squeezing letters together over a certain distance would just look bad, so I would set -1 or -2 as a cap.
It looks like that's just one that snuck past my notice. The word "Fjord" would look strange because of this. This is a good example of how even with the quality testing, things can get through, because I still have to visually glance over hundreds of kerning tests.
One thing that might be a nice adjustment is to have an algorithm that detects the "area" between two letters, so basically how many pixels can volumetrically fit between them, and flag ones that go over a certain threshold. I could then color those tuples as red in the sample text, basically the system marking them as "potential problems" that required an author's look.
[+] [-] bravura|1 year ago|reply
Where do the people who use them become of aware of them and how?
[+] [-] chevyray|1 year ago|reply
After that wave, they get used in various projects here and there, and those projects eventually release or post screenshots. Because it's indie, lots of people also attribute the fonts directly when they post screenshots of their games, posters, videos, and stream overlays where they use them. I am very supportive of people using them, and repost their work, and so it's very casually symbiotic.
They're not lucrative on the scale that you might expect from a company or a popular vector font, but as supplementary income for a solo developer what they bring in helps put food on my table and also helps indie games get made which I think is great.
[+] [-] jcynix|1 year ago|reply
[+] [-] euroderf|1 year ago|reply
It also creates a tendency to use quite light font weights for all-uppercase text, so that whitespace is not so prominent.
[+] [-] chevyray|1 year ago|reply
That kind of thing is another level of polish that I could definitely do, or even just providing more spaced variations.
[+] [-] worik|1 year ago|reply
I would like microns on the vowles, as we type a lot of Māori words....
[+] [-] meindnoch|1 year ago|reply
Sigh. No ő and ű.
[+] [-] kmacdough|1 year ago|reply
8 Billion people seems like a lot, but it cuts down fast. When 1/10 people have the freedom and, 1/100 the resources and time, 1/100 the training and experience, and 1/100 have the drive, and with hundreds of domains each with hubdreds of major unfilled niches...
That's 800 people split among tens of thousands of gaps. It pretty quickly gets down to you, the reader, to pick up that keyboard and start tapping away!
These are obviously wild-a* numbers. Constraints may be overstated or understated & they're not fully independent. I'm missing others. The point stands: you need only to cut 8 billion by 100 a few times to get <1.
[+] [-] zeta0134|1 year ago|reply
[+] [-] damieng|1 year ago|reply
Looking forward to trying this exciting rust tool in my chain as well to see what additional formats I can include.
(Update: Seems the PIFO tool is not open-source :( I guess I'll stick to using scripts + FontLab Studio 5)
[+] [-] frenchie14|1 year ago|reply
[+] [-] jacksonrya|1 year ago|reply
[+] [-] bryanlarsen|1 year ago|reply
[+] [-] kelnos|1 year ago|reply
These look to be variable-width fonts. I believe the heights are multiples of 16, but the width will vary by character.
[+] [-] Vecr|1 year ago|reply
Edit: that's the height, the width is not fixed/I think it varies with the exact font and the kerning. It's probably too big for you anyways.