csdvrx / rw-psf Goto Github PK
View Code? Open in Web Editor NEWThis project forked from talamus/rw-psf
Convert Linux console font to either Plain Text or BMP image – and back!
License: Other
This project forked from talamus/rw-psf
Convert Linux console font to either Plain Text or BMP image – and back!
License: Other
# About ################################################################ ## Read and Write PSF (Linux Console Font) Files This package provides two perl programs for reading and writing PSF font files. It is not a font editor per-se – but when combined with powerful text editor or paint software it pretty much is the best one available! ### Design Principle * Be simple. (Just two perl files: `readpsf` and `writepsf`) * Absolutely no dependencies. (Plain vanilla perl 5 is enough.) * Support both plain text files and bitmap images. * Allow changing the font geometry. (E.g. making the font taller or wider.) ### File Formats The plain text format is same that [NAFE](http://nafe.sourceforge.net/) uses. It is very simple and flexible. The bitmap format is [24-bit BMP](http://en.wikipedia.org/wiki/BMP_file_format). The rationale is that 99% of graphics software can read and write BMP files natively. Also, reading and writing uncompressed 24-bit BMP images from perl is very easy and requires no external libraries. # Basic Usage ########################################################## ### ① Find console font files on your Linux distribution: $ find /usr/ -name '*.psf*' | less ### ② Copy one of those files to your local directory and unzip it: $ cd ~ # or some other directory you have read/write permissions $ cp /usr/share/consolefonts/LatGrkCyr-12x22.psfu.gz . $ gunzip LatGrkCyr-12x22.psfu.gz ### ③ Convert the PSF-font into a BMP image: $ readpsf LatGrkCyr-12x22.psfu bmp Reading 'LatGrkCyr-12x22.psfu'... Version 2 PSF file. Font has an unicode table. Use 'psfgettable' command to extract it. PSF file suggests 512 glyphs of size 12 x 22. 512 glyphs found. Creating an image. 'LatGrkCyr-12x22.12x22.bmp' written. All Ok. ### ④ Extract the embedded Unicode character table from the console font: $ psfgettable LatGrkCyr-12x22.psfu LatGrkCyr-12x22.table ### ⑤ Edit the BMP image with your favourite bitmap editing program: E.g. draw an infinity symbol (U+221E) at unused character position 29 (0x01d). ### ⑥ Convert the BMP image back to a PSF-font: $ write-psf LatGrkCyr-12x22.12x22.bmp LatGrkCyr-12x22-inf.psf Reading 'LatGrkCyr-12x22.12x22.bmp'... Were are assuming 16 characters per row. Override this with '-br'. Were are assuming total of 512 characters. Override this with '-c'. BMP file suggests 512 glyphs of size 12 x 22. 512 glyphs found. Writing 'LatGrkCyr-12x22-inf.psf'... 512 glyphs written. 'LatGrkCyr-12x22-inf.psf' written. All Ok. ### ⑦ Now we can test our new font: $ setfont LatGrkCyr-12x22-inf.psf $ showconsolefont ## Adding Unicode Mappings The new font contains an infinity symbol, but we still have to tell Linux console that the symbol is now available! ### ⑧ Edit the Unicode character table Open (with your favourite text editor) the `LatGrkCyr-12x22.table` file that was extracted with the `psfgettable` command. Seek the line beginning `0x01d` and add `U+221E` into it: 0x01d U+221E Save this new table as `LatGrkCyr-12x22-inf.table`. ### ⑨ Add this new table to the font we created: $ psfaddtable LatGrkCyr-12x22-inf.psf LatGrkCyr-12x22-inf.table LatGrkCyr-12x22-inf.psfu (Please note that by tradition files ending with `.psf` are files without an Unicode table, and files ending with `.psfu` contain an Unicode table.) ### ⑩ Load our new font and test our new infinity symbol: $ setfont LatGrkCyr-12x22-inf.psfu $ echo -e '\u221e' ∞ Rinse and repeat! (`setfont`, `showconsolefont`, `psfgettable`, and `psfaddtable` commands are in most distros located in the `console-tools` package.) # Changing Font Geometry ############################################### Both `readpsf` and `writepsf` have the following command line options: Geometry: -tN --top=N Override character geometry. -lN --left=N (Top and left can be negative numbers.) -wN --width=N -hN --height=N Edge: -ew --edge=wrap When running out of pixels: wrap character. -er --edge=repeat When running out of pixels: repeat edge pixels. (Default action: use empty pixels.) With these you can manipulate the character geometry. The default character geometry is something like this: 01234567 0░░░░░░░░ Top: 0 1░░███░░░ Left: 0 2░██░██░░ 3██░░░██░ Width: 8 4██░░░██░ Height: 12 5███████░ 6██░░░██░ 7██░░░██░ 8██░░░██░ 9██░░░██░ 10░░░░░░░░ 11░░░░░░░░ If you set the `top` and `left` to negative numbers the character geometry will change to something like this: -10123456 -3▒▒▒▒▒▒▒▒ Top: -3 -2▒▒▒▒▒▒▒▒ Left: -1 -1▒▒▒▒▒▒▒▒ 0▒░░░░░░░ Width: 8 1▒░░███░░ Height: 12 2▒░██░██░ 3▒██░░░██ ▒ = New pixels (Default action: use empty pixels.) 4▒██░░░██ 5▒███████ 6▒██░░░██ 7▒██░░░██ 8▒██░░░██ Because width and height remained the same the character was cropped. To make character genuinely larger you have to also set the `width` and `height`: -1012345678 -3▒▒▒▒▒▒▒▒▒▒ Top: -3 -2▒▒▒▒▒▒▒▒▒▒ Left: -1 -1▒▒▒▒▒▒▒▒▒▒ 0▒░░░░░░░░▒ Width: 10 1▒░░███░░░▒ Height: 16 2▒░██░██░░▒ 3▒██░░░██░▒ ▒ = New pixels (Default action: use empty pixels.) 4▒██░░░██░▒ 5▒███████░▒ 6▒██░░░██░▒ 7▒██░░░██░▒ 8▒██░░░██░▒ 9▒██░░░██░▒ 10▒░░░░░░░░▒ 11▒░░░░░░░░▒ 12▒▒▒▒▒▒▒▒▒▒ By default the new pixels are created empty. With the `edge` option you can either `wrap` the current character over, or `repeat` the edge pixels. This is especially handy with the box drawing characters. (╨, ╪, ╕, ╫ et al.) Default: Wrap: Repeat: -1012345678 -1012345678 -1012345678 -3▒▒▒▒▒▒▒▒▒▒ -3▒▒██▒██▒▒▒ -3▒▒▒▒▒▒▒▒▒▒ Top: -3 -2▒▒▒▒▒▒▒▒▒▒ -2▒▒██▒██▒▒▒ -2▒▒▒▒▒▒▒▒▒▒ Left: -1 -1▒▒▒▒▒▒▒▒▒▒ -1▒▒██▒██▒▒▒ -1▒▒▒▒▒▒▒▒▒▒ 0▒░░░░░░░░▒ 0▒░░░░░░░░▒ 0▒░░░░░░░░▒ Width: 10 1▒░░░░░░░░▒ 1▒░░░░░░░░▒ 1▒░░░░░░░░▒ Height: 16 2▒░░░░░░░░▒ 2▒░░░░░░░░▒ 2▒░░░░░░░░▒ 3▒░░░░░░░░▒ 3▒░░░░░░░░▒ 3▒░░░░░░░░▒ ▒ = New pixels 4▒░███████▒ 4█░███████▒ 4▒░████████ 5▒░██░░░░░▒ 5▒░██░░░░░▒ 5▒░██░░░░░▒ 6▒░██░████▒ 6█░██░████▒ 6▒░██░█████ 7▒░██░██░░▒ 7▒░██░██░░▒ 7▒░██░██░░▒ 8▒░██░██░░▒ 8▒░██░██░░▒ 8▒░██░██░░▒ 9▒░██░██░░▒ 9▒░██░██░░▒ 9▒░██░██░░▒ 10▒░██░██░░▒ 10▒░██░██░░▒ 10▒░██░██░░▒ 11▒░██░██░░▒ 11▒░██░██░░▒ 11▒░██░██░░▒ 12▒▒▒▒▒▒▒▒▒▒ 12▒▒▒▒▒▒▒▒▒▒ 12▒▒██▒██▒▒▒ Because both `readpsf` and `writepsf` support these options you can first create one base BMP file, manually fix it, and then (when you know it will grow without edge problems) create multiple larger ones from it: $ readpsf --top=-1 --left=-1 --width=10 --height=16 --edge=wrap font8x14.psf bmp Manually fix the font, save it as 'stretchable.bmp'. Then create different line heights easily from it: $ readpsf --top=-1 --height=18 --edge=repeat stretchable.bmp font10x18.psf $ readpsf --top=-1 --height=19 --edge=repeat stretchable.bmp font10x19.psf $ readpsf --top=-2 --height=20 --edge=repeat stretchable.bmp font10x20.psf $ readpsf --top=-2 --height=21 --edge=repeat stretchable.bmp font10x21.psf $ readpsf --top=-3 --height=22 --edge=repeat stretchable.bmp font10x22.psf # Thank You! ########################################################### Have fun!
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.