Provided by: hxtools_20211204-1_amd64 bug

Name

       vfontas — a bitmap font file transformation utility

Syntax

       vfontas commands...

   Commands
       -blankfnt

       -canvas xsize ysize

       -clearmap

       -crop xpos ypos width height

       -fliph

       -flipv

       -invert

       -lge

       -lgeu

       -lgeuf

       -loadbdf ff.bdf

       -loadclt directory/

       -loadfnt mu.fnt

       -loadhex unicode.hex

       -loadmap cp437AB.uni

       -loadpsf ter-v32b.psfu

       -move shiftx shifty

       -savebdf out.bdf

       -saveclt outdir/

       -savefnt x.fnt

       -saven1 new.sfd

       -saven2 new.sfd

       -savepbm outdir/

       -savepsf new.psfu

       -savesfd new.sfd

       -setbold

       -setname name

       -setprop key value

       -upscale xscale yscale

       -xcpi ega437.cpi outdir/

       -xlat xoffset yoffset

Description

       vfontas  (originally  "VGA  font file assembler") can read/write bitmap fonts from/to a number of formats
       and transform the glyphs in various ways. vfontas is able to generate a vector format.

       vfontas does not have a direct integration of or with FontForge, but thanks to the BDF read/write support
       on both sides, fonts in formats like FNT and PSF can be made available  to  FontForge  by  vfontas,  and,
       conversely, fonts in formats like FON and TTF can be made available to vfontas by FF.

       With its own CLT format, vfontas makes glyphs in a textgraphical format to facilitate editing with plain-
       text screen editors such as vi, nano, etc.

Aspect ratio

       CRT  screens  of the time commonly had an aspect ratio of 4:3, and whatever resolution was shown would be
       squeezed into that frame, potentially making the pixels non-square. This means that bitmap fonts  of  the
       time  will  need  a  corrective  factor  for  modern  display  hardware to be reproduced faithfully. This
       correction can happen either during conversion (vfontas has no support for this at present),  or  at  the
       time  of  rendering.  The  font  can  either  be stretched in the vertical direction or compressed in the
       horizontal by using the reciprocal.
       ┌──────────┬───────────┬────────────┬──────────────┐
       │ Text resChar sizeResolutionVStretch     │
       ├──────────┼───────────┼────────────┼──────────────┤
       │ 80x25    │ 9x14      │ 720x350    │ 54/35 = 1.54 │
       ├──────────┼───────────┼────────────┼──────────────┤
       │ 40x25    │ 8x8       │ 320x200    │ 6/5 = 1.2    │
       ├──────────┼───────────┼────────────┼──────────────┤
       │ 80x25    │ 8x8       │ 640x200    │ 12/5 = 2.4   │
       ├──────────┼───────────┼────────────┼──────────────┤
       │ 80x25    │ 8x14      │ 640x350    │ 48/35 = 1.37 │
       ├──────────┼───────────┼────────────┼──────────────┤
       │ 80x43    │ 8x8       │ 640x350    │ 48/35 = 1.37 │
       ├──────────┼───────────┼────────────┼──────────────┤
       │ 80x25    │ 9x16      │ 720x400    │ 27/20 = 1.35 │
       ├──────────┼───────────┼────────────┼──────────────┤
       │ 80x30    │ 8x16      │ 640x480    │ 1.0          │
       ├──────────┼───────────┼────────────┼──────────────┤
       │ 80x50    │ 9x8       │ 720x400    │ 27/20 = 1.35 │
       ├──────────┼───────────┼────────────┼──────────────┤
       │          │           │ x*y        │ x*y/3*4      │
       └──────────┴───────────┴────────────┴──────────────┘

Commands

   blankfnt
       Initializes the memory buffer with 256 empty 8x16 glyphs. The primary purpose for this is with saveclt to
       get blank glyph files for hand-editing. For a differently-sized canvas, combine with -crop or -canvas.

   canvas
       Enlarges the glyph box to the specified size. (It never shrinks it.)

   clearmap
       Discards the in-memory glyph index <-> Unicode mapping table.

   crop
       Removes an outer area from the glyph images, shrinking the image in the process.

   fliph, flipv
       Mirrors/flips glyphs.

   lge
       Applies a "Line Graphics Enable" transformation on glyphs. It copies the pixels in the  second  rightmost
       column  to  the  rightmost  column,  and  does  this  for glyph indices 0xC0 to 0xDF. In other words, the
       usefulness of the -lge command is more or less limited to DOS fonts  which  have  graphic  characters  in
       exactly those indices.

   lgeu
       Applies  LGE  on  the  graphic glyphs that are in cp437 and other DOS codepages. It does this for unicode
       codepoints rather than glyph indices.  This is suitable for all kinds of font formats, but do make sure a
       Unicode table is present. (BDF and PSF come with a table, .fnt does not, so use -loadmap before -lgeu).

   lgeuf
       Applies LGE on all glyphs from U+2500 thru U+25FF (Unicode "box drawing"  and  "box  elements"  classes),
       with  special  handling  for  the shades at U+2591 thru U+2593. This is provided as an alternative to the
       "true DOS look" that lge/lgeu would make.

   loadbdf
       Reads a BDF (Adobe Glyph Bitmap Distribution Format) font file.

   loadclt
       Reads a directory full of CLT files containing glyphs. CLT is a textgraphical format to facilitate visual
       editing with a text console editor.

   loadfnt
       Reads a headerless bitmap font file, as typically used for CGA/EGA/VGA/MDA hardware, from  the  specified
       file into memory. 8x8x256 (width/height/glyphs), 8x12x256, 8x14x256, 8x16x256 and 8x16x512 are supported.

   loadfnth
       Reads  a headerless bitmap font file, using the specified height N and width 8.  The number of characters
       is then autoderived from the filesize.

   loadhex
       Reads a Unifont .hex encoded file.

   loadmap
       Reads a glyphindex <-> Unicode codepoint mapping table from  the  given  file  into  memory.  The  format
       follows  the  maps  from  /usr/share/kbd/unimaps,  that  is,  "0x00  U+0000" at its simplest. Multiple U+
       codepoints can be specified in a line.  -loadmap does  not  clear  the  mapping  table,  which  makes  it
       possible to cumulate mappings from multiple files.

   loadpsf
       Reads a PC Screen Font PSF 2 version 0. If the psf file comes with a mapping table, the current in-memory
       table will be discarded and replaced with the one from the PSF.

   move
       Shift all glyphs by the given x/y offsets within their existing glyph box (possibly truncating them).

   savebdf
       Saves  the  font  to  a  Glyph  Bitmap Distribution Format file (BDF). This type of file can be processed
       further by other tools such as bdftopcf(1) or fontforge(1) to,  for  example,  turn  them  into  Portable
       Compiled Format (PCF) or TrueType/OpenType (TTF/OTF) files. (See the "Examples" section.)

   saveclt
       Saves  the  current in-memory glyphs as multiple CLT files to the given directory. CLT is a textgraphical
       format to facilitate visual editing with a text console editor.

   savefnt
       Saves the current in-memory glyphs to the given file, using the headerless format.

   savemap
       Saves the current in-memory Unicode mapping table to the given file.

   saven1
       N1 was an experiment to try and model the "diagonalization idea" (cf. -saven2) by analyzing the  original
       glyph bitmap. Its defining characteristic is a lookaround window of 3x3 pixels, whose contents are mapped
       to a set of triangles. N1 has some drawbacks over the newer N2:

       •   N1  adds  diagonals on single-pixel protrusions (e.g. the left end of the horizontal bar in an 'f' in
           certain fonts). This is definitely not fixable with a 3x3 window and would require using 5x5.

       •   N1 adds triangles between pixels that do not necessarily belong together, such  as  in  spirals  like
           U+0040  or  jampacked  glyphs like U+20A7. N2 operates on edges and knows their direction, and avoids
           making connections to "pixel islands" at certain angles.

   saven2
       Similar to -savesfd, this produces an SFD file, but uses an  alternate  vectorizer  (aptly  named  "N2"),
       which smoothens the jagged edges of a bitmap font.

       The  N2  vectorizer  is  able  to recognize the "stair" pattern of pixels and transform these sections to
       45-degree angles. This diagonalization was originally employed by  Arto  Hatanpää  (possibly  in  a  long
       session  of  manual work) for the "Nouveau IBM" and "Nouveau IBM Stretch" vector font versions of the IBM
       VGA 9x16 ROM font.

       The defining characteristic of N2 is that it analyzes glyph edges (similar to those produced by -savesfd)
       using a lookaround window of 7 edge segments, which is used to work on areas of effectively  5x5  pixels.
       When a 90/270 corner is found, it will be transformed by adding diagonal edges.

       In comparison to other scalers,

       •   xBRZ erroneously round the ends of strokes (e.g. the '-' dash), N1/N2 does not.

       •   While  xBRZ  is  a bitmap-to-bitmap procedure (also limited to 6x magnification as of writing), N1/N2
           converts to vector.

       •   Autotrace/Potrace just is not targeted for low resolution sources (as 8x16 bitmap fonts are).  Either
           it  will  convert the bitmap 1:1 with jagged edges, or turn it into three or so beziers, which is not
           nearly enough for '&'.

       •   N1/N2 is only specified for monochrome input.

   savepsf
       Saves the current in-memory glyphs as a PC Screen Font PSF2.0 file, which can then be loaded into a Linux
       text console with setfont(1). The in-memory Unicode mapping table is added to the PSF.

   savesfd
       Saves the font to a Spline Font Database file (SFD). This type  of  file  can  be  processed  further  by
       fontforge(1).  A  fairly  trivial vectorizer is used that maps each pixels to a square and then collapses
       shared edges between those to reduce the number of polygons fontforge has to process.

   setbold
       For BDF/SFD output: Declare the font as being bold.

   setname
       Sets a name for the font, which gets emitted for BDF/SFD output. (The other file formats have no metadata
       field for a name, so the filename is all you get.)

   setprop
       Sets a specific property for SFD fonts (also partly used by BDF).

   upscale
       Performs a linear upscale by an integral factor for all glyphs.

   xcpi
       Extracts a multi-font .cpi file (as was typically used on DOS) as separate .fnt files into the  specified
       directory. This operation does not touch the in-memory glyph buffers or Unicode mapping table.

   xlat
       Moves  all  glyphs around within their canvases by the specified amount.  vfontas's coordinate system has
       (0,0) in the upper left corner, with positive x going to the right, and positive y going down.

Known limits

       The Linux kernel accepts console font glyphs of at most 32x32 in size.

The Consoleet bitmap format

       The Consoleet text bitmap format is very similar to PBM itself. Instead of "P1" as in  PBM,  a  CLT  file
       begins  with  "PCLT"  on  the first line. In the second line, width and height of the bitmap in pixels is
       given. What follow is the bitmap data: Each "off" pixel is represented by  the  2-character  string  ".."
       Each  "on"  pixel  is represented by the 2-character "##". Each row of pixels is terminated by a newline,
       like in PBM.

            PCLT
            9 7
            ..................
            ....##....##..##..
            ..##..##..##..##..
            ..##..##..####....
            ..##..##..##..##..
            ....##....##..##..
            ..................

Examples

       Decompose a classic file into editable pictograph text files (with the help of a Unicode map):

           mkdir mu; vfontas -loadfnt /usr/share/kbd/consolefonts/mu.fnt -loadmap
           /usr/share/kbd/unimaps/cp437.uni -saveclt mu/

       To convert a .fnt and scale it up to make it comfortably usable with a FullHD resolution Linux fbconsole:

           vfontas -loadfnt mu.fnt -loadmap cp437.uni -canvas 9 16 -lge -upscale 2 2
           -savepsf mu.psf

       To convert a .fnt to TrueType/OpenType/WOFF (the Fontforge part is unfortunately manual):

           vfontas -loadfnt mux.fnt -loadmap cp437AB.uni -canvas 9 16 -lge -savesfd
           mux.sfd # && fontforge mux.sfd

       To convert a .fnt for use under X11 and XTerm (generates sizes 12, 24 and 36, @96dpi):

           for i in 1 2 3; do vfontas -loadfnt mux.fnt -loadmap cp437AB.uni -canvas 9
           16 -lge -upscale $i $i -setname Mux -savebdf | bdftopcf | gzip
           >~/.fonts/mux$i.pcf.gz; done; xterm -fa "misc Mux:size=24"

Comparison to earlier vfontas (2005-2018) invocation syntax

       `vfontas -D out/ -xf x.fnt` has become `vfontas -loadfnt x.fnt -saveclt out/`.

       `vfontas -D out/ -cf x.fnt` has become `vfontas -loadclt out/ -savefnt x.fnt`.

       `vfontas -Ecf x.fnt` has become `vfontas -blankfnt -savefnt x.fnt`.

       `vfontas -G <x.fnt >x.psf` has become `vfontas -loadfnt x.fnt -canvas 9 16 -lge -savepsf2 x.psf`.

       `vfontas -W <x.fnt >x.psf` has become `vfontas -loadfnt x.fnt -upscale 2 1 -savepsf2 x.psf`.

       `vfontas --cpi -D out/ -f x.cpi/` has become `vfontas -xcpi x.cpi out/`.

See also

       hxtools(7)

hxtools                                            2019-04-21                                         vfontas(1)