diff options
-rw-r--r-- | .makepp/.done.mk | 13 | ||||
-rw-r--r-- | .makepp/log | 39 | ||||
-rw-r--r-- | Makefile | 17 | ||||
-rw-r--r-- | README | 107 | ||||
-rw-r--r-- | conv.sh | 55 | ||||
-rw-r--r-- | fonts | 3 | ||||
-rw-r--r-- | ttf2psfu.sh | 29 |
7 files changed, 263 insertions, 0 deletions
diff --git a/.makepp/.done.mk b/.makepp/.done.mk new file mode 100644 index 0000000..13b01b0 --- /dev/null +++ b/.makepp/.done.mk @@ -0,0 +1,13 @@ +IMPLICIT_DEPS= +SIGNATURE=1491194155,0 +META_DEPS=/usr/bin/touchconv.sh +SORTED_DEPS=conv.shfonts/usr/bin/touchttf2psfu +INCLUDE_SFXS= +BUILD_SIGNATURE=1491194155,0 +COMMAND=sh conv.shtouch .done +CWD=. +DEP_SIGS=1491193945,13651491164712,811460917587,643521490771151,908 +IMPLICIT_TARGETS= +INCLUDE_PATHS= +ARCH=x86_64-linux-thread-multi +END=
\ No newline at end of file diff --git a/.makepp/log b/.makepp/log new file mode 100644 index 0000000..bca8776 --- /dev/null +++ b/.makepp/log @@ -0,0 +1,39 @@ +3/usr/bin/makepp +VERSION2.05.22.2x86_64-linux-thread-multi +LOAD43273760Makefile34441736/export/home/urchlay/ttf-console-fonts34441736 +TRY43273760 +USEdefault rule +DEPEND43273760 +UP_TO_DATE43273760 +LOAD_INCL43040136makepp_builtin_rules.mk43030384/usr/share/makepp43273760 +LOAD_END43273760 +TRY43275680all34441736 +USEdefault rule +DEPEND4327568043040760.done34441736 +TRY43040760 +USE/export/home/urchlay/ttf-console-fonts/Makefile:6 +SCAN_INFO43040760 +LEX_RULE43040760info not cached +TRY43351016conv.sh34441736 +USEdefault rule +DEPEND43351016 +UP_TO_DATE43351016 +PARSEtouch .done34441736/export/home/urchlay/ttf-console-fonts/Makefile:6 +TRY43480512touch43480296/usr/bin +USEdefault rule +DEPEND43480512 +UP_TO_DATE43480512 +DEPEND430407604335101643351160fonts344417364348051243351304ttf2psfu34441736 +TRY43351160 +USEdefault rule +DEPEND43351160 +UP_TO_DATE43351160 +TRY43351304 +USEdefault rule +DEPEND43351304 +UP_TO_DATE43351304 +BUILD_NONE43040760 +SUCCESS/export/home/urchlay/ttf-console-fonts/Makefile:643040760 +BUILD_PHONY43275680 +SUCCESSdefault rule43275680 +N_FILES110 diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..64840e1 --- /dev/null +++ b/Makefile @@ -0,0 +1,17 @@ + +PSFDIR=/usr/share/kbd/consolefonts + +.PHONY: all clean install + +all: .done + +.done: conv.sh fonts ttf2psfu.sh + sh conv.sh + touch .done + +clean: + rm -f *.psfu *.psfu.gz *.log *.bdf .done + +install: all + mkdir -p $(DESTDIR)$(PSFDIR) + install -m0644 *.psfu.gz $(DESTDIR)$(PSFDIR) @@ -0,0 +1,107 @@ +ttf-console-fonts, by B. Watson <yalhcru@gmail.com>. + +Licensed under the WTFPL. See http://www.wtfpl.net/txt/copying/ for details. + +ttf-console-fonts is a collection of Linux console fonts, converted from +various TrueType fonts found in a typical Linux install. + +No TTF fonts are included here. Instead, the ones installed on your system +(usually in /usr/share/fonts/TTF) are used. Also, I don't include prebuilt +console fonts because I'm not so sure the licensing allows it (dammit, +I'm a doc... uh, programmer, not a lawyer). + +The name is slightly misleading: obviously the console doesn't support +TTF, only bitmap fonts in PSF format. What this package does is convert +various TTFs into the PSF (aka .psfu) bitmapped font format used by +the kernel. + +Notice that these are framebuffer fonts. Pretty much everyone these +days is likely to be using the framebuffer console (thanks to kernel +modesetting and Xorg's requirement for it). If you're somehow still using +a VGA textmode console, only fonts 8 or 9 pixels wide are supported. +For this package, that means the ones with "8x" in their filenames. + +If the converted fonts don't look the same to you on the console as the +original fonts do in X, that's because X and most modern X applications +do subpixel rendering for antialiasing. The Linux console doesn't support +this at all. + +Another difference between TTF and console fonts: only 512 glyphs are +allowed per console font. This means Unicode support will be limited. +The generated fonts include the full ASCII set, plus Latin-1 (aka +ISO-8859-1) and at least partial support for Latin-2. If your requirements +are different, change SETS in conv.sh (read the bdf2psf documentation, +and possibly the source code, to understand how this stuff works). One +useful piece of information: the same glyph can represent more than one +Unicode codepoint (if they have the same appearance, e.g. C in Latin +and Cyrillic). + +Requirements: + - bdf2psf + - otf2bdf + - psftools + +For Slackware, the above are available on SlackBuilds.org. For Debian +or Ubuntu, try apt-getting them. + +"Core system" requirements (included in Slackware, may need installing +if you're on Debian/etc): + + - fontconfig + - freetype2 + - perl + - stuff like coreutils and bash + - whatever fonts are listed in the file 'fonts', of course. + +To build the fonts, simply run "make". If you get errors, especially +"command not found" or "no such file or directory", you're missing a +requirement (see above). + +After they're built, the fonts will have filenames like: + +dejavusansmono-8x12.psfu.gz + +The "8x12" is the pixel size (NOT the point size). + +If you're running in the console, you can test out the fonts by loading +them with "setfont". If the results look OK, you can install the fonts via +"make install" (if you're making a distro package, DESTDIR is supported). + +On Slackware, you can edit /etc/rc.d/rc.font to set the default system +font to whichever one you like best. Don't forget to make rc.font +executable. I have no idea how to set the default console font on other +distributions (sorry). + +If you want to try converting other fonts, edit the file "fonts". The font +names there are whatever "fc-list" calls the font. You can probably use +wildcards or inexact matches (fc-list is pretty user-friendly). Whatever +fonts you choose *must* be TrueType or OpenType (.ttf or .otf). They +also *must* be "monospace" or "fixed width". Trying to convert +proportional/variable-width fonts will "work", but the result won't be +very pleasing to look at. + +If you don't like the sizes I picked, you can set SIZES in the +environment. It's a space-separated list of point sizes. Example: + +SIZES="6 9 12 15" make + +Don't get too crazy with the cheez-wiz: the kernel (or at least the +setfont command) has a font height limit of 32 rows. And in my testing, I +found that fonts 31 or 32 rows tall would load, but displayed incorrectly. +The practical limit (for my system at least) seems to be 30. + +The point sizes might be a bit different than they are in X. This is +because Xorg's Xrandr extension is smart enough to know your monitor's +actual DPI, and will scale TTFs to the correct size. The otf2bdf utility +used here could theoretically do the same thing, but it doesn't: it +just assumes 100x100 DPI. If your monitor doesn't have square pixels, +this will be even more noticeable. + +If you're wondering how many rows/columns of text each font will give you, +the calculation is simple enough: find out your framebuffer resolution +(e.g. by running 'fbset' with no arguments), and divide the width of +the fb by the width of the font (e.g. 1920/15 = 128, throw away any +remainder). Do the same calculation for the height (e.g. 1080/27 = 40). +Or, you could just load the font, then: + +kill -WINCH $$; echo $COLUMNS $LINES @@ -0,0 +1,55 @@ +#!/bin/bash + +# 20170403 bkw: + +# convert TTF (or OTF) fonts to *.psfu.gz fonts that can be used +# on the Linux console. + +# conversion isn't done directly. instead, the TTF is rendered as a +# BDF (via otf2bdf), then converted to a psfu via bdf2psf. + +# these are supposedly in points. yeah, right. +SIZES=${SIZES:-8 12 15 19} + +warn() { + echo "$@" 1>&2 +} + +die() { + warn "$@" + exit 1 +} + +convfont() { + font="$1" + file="$( fc-list "$font" | head -n1 | cut -d: -f1 )" + + psfname="$( basename "$( echo $file | cut -d. -f1 | tr A-Z a-z | tr -d " " )" )" + echo -n "$file => $psfname: " + + if [ ! -e "$file" ]; then + warn "Font '$font' not found, skipping" + return 1 + fi + + for size in $SIZES; do + echo -n "$size" + sh ./ttf2psfu.sh -p $size "$file" &> $psfname.$size.log + + # bug in file? if the width is double-digit, file prints HxW, but if + # width is single-digit it prints WxH, WTF? + #pxsize=$( file test.psfu | sed 's|.*, \(.*\)x\(.*\)$|\2x\1|' ) + + w="$( psf2txt test.psfu | sed -n '/^Width/s,.* ,,p' )" + h="$( psf2txt test.psfu | sed -n '/^Height/s,.* ,,p' )" + pxsize=${w}x${h} + gzip -9c < test.psfu > $psfname-$pxsize.psfu.gz + rm -f test.psfu + echo -n ":$pxsize " + done + echo +} + +cat fonts | while read font; do + convfont "$font" +done @@ -0,0 +1,3 @@ +DejaVu Sans Mono:style=Book +FreeMono:style=Regular +Liberation Mono:style=Regular diff --git a/ttf2psfu.sh b/ttf2psfu.sh new file mode 100644 index 0000000..ef5a55a --- /dev/null +++ b/ttf2psfu.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +# uses otf2bdf and bdf2psf to turn a ttf/otf font into a console font. +# all args are passed through to otf2bdf, please don't pass -o file.bdf. + +# right now, output is to test.psfu. This will change in the future. + +otf2bdf "$@" -c C -o tmp.bdf + +# lie to bdf2psf, dirty hack alert! bdf2psf needs the AVERAGE_WIDTH +# to be a multiple of 10. And it messes up the kerning if we don't +# add a fudge factor (the 30, below). +AV=$( sed -n 's,AVERAGE_WIDTH ,,p' tmp.bdf ) +AV=$(( ( AV + 30 ) / 10 * 10 )) +sed -i "/AVERAGE_WIDTH/s, .*, $AV," tmp.bdf + +SETDIR=/usr/share/bdf2psf + +# bdf2psf wants all this crap passed as a single argument with no +# spaces. I need to be able to read and maybe modify the list, so: +SETS="\ +$SETDIR/ascii.set+\ +$SETDIR/linux.set+\ +$SETDIR/fontsets/Lat2.256+\ +$SETDIR/fontsets/Uni1.512+\ +$SETDIR/useful.set\ +" + +bdf2psf --fb tmp.bdf $SETDIR/standard.equivalents $SETS 512 test.psfu |