A 3270 font in a modern format

rbanffy, updated 🕥 2023-01-03 04:20:43

3270font: A font for the nostalgic

Travis-CI Debian package Ubuntu package

Screenshot

Sample

A little bit of history

This font is derived from the x3270 font, which, in turn, was translated from the one in Georgia Tech's 3270tool, which was itself hand-copied from a 3270 series terminal. I built it because I felt terminals deserve to be pretty. The .sfd font file contains a x3270 bitmap font that was used for guidance.

Using with the cool-old-tern (now cool-retro-term) terminal program

Getting it

If you are running Debian or Ubuntu and you don't want to mess with building your font files, you can simply apt-get install fonts-3270 (It's available from the Debian (https://packages.debian.org/sid/fonts/fonts-3270) and Ubuntu (http://packages.ubuntu.com/impish/fonts-3270) package repos at https://packages.debian.org/sid/fonts/fonts-3270 and https://packages.ubuntu.com/impish/fonts/fonts-3270, although the packaged version may not be the latest version, but it's good enough for most purposes.

On FreeBSD the font can be installed with pkg install 3270font.

For those who don't have the luxury of a proper system-managed package, Adobe Type 1, TTF, OTF and WOFF versions are available for download on https://3270font.s3.amazonaws.com/3270_fonts_d916271.zip (although this URL may not always reflect the latest build or release).

ASCII is so 60's

The format

The "source" file is edited using FontForge. You'll need it if you want to generate fonts for your platform. On most civilized operating systems, you can simply apt-get install fontforge, yum install fontforge or even port install fontforge. On others, you may need to grab your copy from https://fontforge.org/. I encourage you to drop by and read the tutorials.

Using it on OSX (don't forget to turn antialiasing on)

If you are running Windows, you'll probably need something like WSL or Cygwin, but, in the end, the font works correctly (with some very minor hinting issues).

Works on Windows

Generating usable font files

The easiest way to generate the font files your computer can use is to run make all (if you are running Ubuntu or Debian, make install will install them too). Using make help will offer a handy list of options.

The script generate_derived.pe calls FontForge and generates PostScript, OTF, TTF and WOFF versions of the base font, as well as a slightly more condensed .sfd file with the base font narrowed to 488 units, with no glyph rescaling (or cropping - we need to fix that) and its corresponding PostScript, TTF, OTF and WOFF versions.

For your favorite editor

Contributing

I fear GitHub's pull-request mechanism may not be very FontForge-friendly. If you want to contribute (there are a lot of missing glyphs, such as most non-latin alphabets which most likely were never built into 3270 terminals), the best workflow would probably be to add the encoding slots (if needed), add/make the changes, remove the unchanged glyphs and save it as a different file. If, in doubt, get in touch and we will figure out how to do it right.

In order to generate the sample image and the grids for FontForge, you'll need a Python 3 environment with PIL or pillow installed. The requirements.txt file lists everything you need to do it.

If all you want is an easier way to provide feedback, you can use a container runtime, Docker, Podman, and etc, and use these make targets:

  • make image - builds a local image with fontforge and make
  • make generate - uses the local container image to run make font

Build Requirements

On Debian derived distros, you'll need Fontforge and python3-dev. On Red Hat ans similar distros, you'll need Fontforge and python3-devel. Since some packages will need to be compiled, you'll need a build system (GNU Make, a C compiler, etc).

Screenshots

xterm

Gnome Terminal

Konsole

Terminator

urxvt

Known problems

Not all symbols in the 3270 charset have Unicode counterparts. When possible, they are duplicated in the Unicode space. The 3270-only symbols are at the end of the font, along with some glyphs useful for building others.

Please refer to http://x3270.bgp.nu/Charset.html for a complete map.

Future improvements

A grid generator is provided for producing various grid sizes for the font. Those grids are not used yet, but they are intended to be used to align font features to provide better rendering at common font size choices. The captures below exemplify these choices:

x3270 with 32 pixel font (used as bitmap template for the font)

x3270 with 20 pixel font

Gnome Terminal on Ubuntu 17.10

Issues

Changes for wx3270:

opened on 2023-01-03 04:20:43 by pmattes

Edited slot 151, U+00B6, PLICROW SIGN. It was the old Pesetas glyph. Edited slot 563, U+03B1, GREEK SMALL LETTER ALPHA, to make it more distinctive. Assigned slot 1432 to U+E000, boxA (A over a box). Assigned slot 1433 to U+E001, insert mode. Assigned slot 1434 to U+E002, boxB (B over a box). Assigned slot 1435 to U+E003, box6 (6 in a box). Assigned slot 1436 to U+E004, rightarrow. Assigned slot 1437 to U+E005, upshift. Assigned slot 1438 to U+E006, underB (raised underlined B). Assigned slot 1439 to U+E007, downshift. Assigned slot 1440 to U+E008, boxquestion. Assigned slot 1441 to U+E009, boxsolid. Assigned slot 1442 to U+E00A, badcommhigh. Assigned slot 1443 to U+E00B, commhigh. Assigned slot 1444 to U+E00C, commjag. Assigned slot 1445 to U+E00D, commlo. Assigned slot 1446 to U+E00E, clockleft. Assigned slot 1447 to U+E00F, clockright. Assigned slot 1448 to U+E010, keyboard lock. Also restored missing edge. Assigned slot 1449 to U+E011, leftarrow. Assigned slot 1450 to U+E012, keyleft. Assigned slot 1451 to U+E013, keyright. Assigned slot 1452 to U+E014, box4 (4 in a box). Assigned slot 1454 to U+E015, underA (raised underlined A). Assigned slot 1455 to U+E016, magcard. Assigned slot 1456 to U+E017, boxhuman. Assigned slot 1457 to U+E018, human. Assigned slot 1458 to U+E02A, fm. Assigned slot 1459 to U+E03B, dup. Assigned slot 2227 (new) to U+E01B, lock icon (TLS). Assigned slot 2228 (new) to U+E019, boxN (N in a box). Assigned slot 2229 (new) to U+E01A, printer.

Upper-right double-horizontal single-vertical line box drawing characters are not aligned with the vertical bar

opened on 2022-09-27 17:27:21 by rbanffy

image

fontforge 220308 test fail

opened on 2022-06-24 12:08:01 by kilobyte

As reported in Debian:

CHECKING build/3270-Regular.otf CHECKING 98 Self-intersecting glyph (issue #2) when FontForge is able to correct this (overrides general setting) ERROR 2 Self-intersecting glyph ERROR 5 Missing points at extrema FAIL build/3270-Regular.otf

Target `make upload` should update the zip name in the README file.

opened on 2022-03-15 10:49:53 by rbanffy

As it is now, updating the README file is a manual process where the updated URL is inserted in the place of the previous one. That's not really a good solution and automating it would make releases much easier. With that, the workflow for a release would be simplified and development "releases" would be possible.

License file LICENSE.txt exists but NameID 13 (LICENSE DESCRIPTION) value on platform 1 (MACINTOSH) is not specified for that

opened on 2022-03-13 20:16:59 by rbanffy

com.google.fonts/check/name/license Check copyright namerecords match license file. with gfonts_files/3270/3270-Regular.ttf

  Rationale:                                                                
  A known licensing description must be provided in the NameID 14 (LICENSE  
  DESCRIPTION) entries of the name table.

  The source of truth for this check (to determine which license is in use) 
  is a file placed side-by-side to your font project including the licensing
  terms.

  Depending on the chosen license, one of the following string snippets is  
  expected to be found on the NameID 13 (LICENSE DESCRIPTION) entries of the
  name table:                                                               
  - "This Font Software is licensed under the SIL Open Font License, Version
  1.1. This license is available with a FAQ at: https://scripts.sil.org/OFL"
  - "Licensed under the Apache License, Version 2.0"                        
  - "Licensed under the Ubuntu Font Licence 1.0."


  Currently accepted licenses are Apache or Open Font License.              
  For a small set of legacy families the Ubuntu Font License may be         
  acceptable as well.

  When in doubt, please choose OFL for new font projects.

 FAIL License file LICENSE.txt exists but NameID 13                         
      (LICENSE DESCRIPTION) value on platform 1 (MACINTOSH) is not specified
      for that. Value was: "This Font Software is licensed under the SIL    
      Open Font License, Version 1.1. This license is available with a FAQ  
      at: https://scripts.sil.org/OFL" Must be changed to "Licensed under   
      the Apache License, Version 2.0" [code: wrong]

 FAIL License file LICENSE.txt exists but NameID 13                         
      (LICENSE DESCRIPTION) value on platform 3 (WINDOWS) is not specified  
      for that. Value was: "This Font Software is licensed under the SIL    
      Open Font License, Version 1.1. This license is available with a FAQ  
      at: https://scripts.sil.org/OFL" Must be changed to "Licensed under   
      the Apache License, Version 2.0" [code: wrong]


Result: FAIL

Glyphs had components with scaling or rotation

opened on 2022-03-13 20:13:26 by rbanffy

com.google.fonts/check/transformed_components Ensure component transforms do not perform scaling or rotation. with gfonts_files/3270/3270-Regular.ttf

  Rationale:                                                                
  Some families have glyphs which have been constructed by using transformed
  components e.g the 'u' being constructed from a flipped 'n'.

  From a designers point of view, this sounds like a win (less work).       
  However, such approaches can lead to rasterization issues, such as having 
  the 'u' not sitting on the baseline at certain sizes after running the    
  font through ttfautohint.

  As of July 2019, Marc Foley observed that ttfautohint assigns cvt values  
  to transformed glyphs as if they are not transformed and the result is    
  they render very badly, and that vttLib does not support flipped          
  components.

  When building the font with fontmake, this problem can be fixed by using  
  the "Decompose Transformed Components" filter.

 FAIL The following glyphs had components with scaling or                   
      rotation:

       • greater (component less)                                           
       • backslash (component slash)                                        
       • uni02BB (component comma)                                          
       • uni02C3 (component uni02C2)                                        
       • uni02C4 (component uni02C2)                                        
       • uni02C5 (component uni02C2)                                        
       • caron (component asciicircum)                                      
       • uni02E0 (component gamma)                                          
       • uni02E1 (component l)                                              
       • uni02E2 (component s)                                              
       • uni02E3 (component x)                                              
       • uni02EC (component asciicircum)                                    
       • uni032F (component breve)                                          
       • uni0339 (component uni031C)                                        
       • uni033A (component uni032A)                                        
       • uni033C (component uni032B)                                        
       • NameMe.2166 (component NameMe.2199)                                
       • NameMe.2168 (component asterisk)                                   
       • uni0361 (component NameMe.2172)                                    
       • uni0363 (component a)                                              
       • uni0364 (component e)                                              
       • uni0366 (component o)                                              
       • uni0367 (component u)                                              
       • uni0368 (component c)                                              
       • uni036B (component m)                                              
       • uni036C (component r)                                              
       • uni036E (component u)                                              
       • uni036F (component x)                                              
       • uni037B (component c)                                              
       • uni037D (component c)                                              
       • epsilontonos (component acute)                                     
       • etatonos (component acute)                                         
       • iotatonos (component acute)                                        
       • uni03FD (component C)                                              
       • uni03FF (component C)                                              
       • afii10052 (component acute)                                        
       • afii10053 (component afii10047)                                    
       • afii10100 (component acute)                                        
       • afii10101 (component afii10095)                                    
       • afii10109 (component acute)                                        
       • uni04D8 (component NameMe.1783)                                    
       • afii10846 (component NameMe.1579)                                  
       • uni169C (component uni169B)                                        
       • uni2127 (component uni2126)                                        
       • uni214B (component ampersand)                                      
       • NameMe.863 (component NameMe.864)                                  
       • arrowdblup (component arrowdblleft)                                
       • arrowdbldown (component arrowdblup)                                
       • uni21E5 (component uni21E4)                                        
       • universal (component A)                                            
       • existential (component E)                                          
       • gradient (component uni2206)                                       
       • element (component afii10047)                                      
       • uni220D (component afii10101)                                      
       • uni2210 (component product)                                        
       • uni2213 (component plusminus)                                      
       • uni226B (component less)                                           
       • uni226B (component less)                                           
       • circlemultiply (component NameMe.2198)                             
       • uni231A (component NameMe.955)                                     
       • uni2326 (component uni232B)                                        
       • uni2351 (component apltack)                                        
       • uni2351 (component underbar)                                       
       • uni2361 (component apltack)                                        
       • uni25B6 (component uni25B4)                                        
       • uni276E (component uni276F)                                        
       • uni2B07 (component uni2B06)                                        
       • apl_upperright (component apl_lowerleft)                           
       • NameMe.1114234 (component NameMe.721)                              
       • downshoe (component leftshoe)                                      
       • NameMe.2206 (component breve)

      [code: transformed-components]


Result: FAIL

Releases

More fixes 2022-07-29 21:32:33

  • Remove redundant tests in Makefile
  • Replace deprecated Resampling.NEAREST with Image.Dither.NONE
  • Fixes to ∄, dec_vt, 𝗞, ¶, £, ¢
  • Simplify /, 𝟠, ➥, ➦, fix fat /

Better condensed, fixes, improved testing 2022-07-01 19:28:10

Fix WOFF major version Remove unnecessary Adobe XUID Change width for semi-condensed and condensed versions Add sample images for each font variation Scale glyphs before making the bounding box narrower Generate a ‘PfEd’ table and store glyph comments in the PS font Change OTF flags - don't generate glyph map remove PS-related flag Added building blocks for Kaypro octants Fix ӗ, ⇵, ㄍ, , p, n Re-add Ogham bar Added a social preview image Added note to README on build dependencies Added ⋈, ⨝, ⋉, ⋊, Ō, ŕ, ˅, ѐ, ӕ, ⇑, ⇓, ∔, ✙, ⌁ Added 4-dotted numbers to rendering sample Moved ⃛ and ⃜ up away from topline Add GitHub workflow for testing Fix cache clear utility Update requirements.txt

Lots of fixes and new glyphs 2021-10-08 18:37:33

  • Swap ⊓ and ⊔
  • Fix ˜ (make it different from ~)
  • Fix F, G, L, Ä¢, Ä£, €, a, Њ, њ, ª, q, r, ă, 𝔾. 𝕗, 𝕣, 𝗮, 𝗾, 𝗿, 🬭, 🬮, 🬼, 🬽, 🬾, 🬿, 🭀, 🭂, 🭄, 🭆, 🭍, 🭏, 🭐, 🭒, 🭓, 🭕, 🭖, 🯆, 🯇, 🯈, ԍ, 🯉, ↉, ⅒, ↩, ↪, ❌
  • Point to SIL license using HTTPS URL
  • Add ╵, ╷, ╶, ╴, and ⃛
  • Use a constant to set which font file to use

New glyphs, some fixes. 2021-03-07 20:35:26

  • Add '⋅'
  • Add "╭", "╮", "╰", and "╯". Fixes #89
  • Improve ▴, ►, ▾, ◄
  • Add missing glyph ▋, ▽, △

APL set fixes, combining chars, build process fixes, fix derived font names 2021-01-16 19:40:26

  • Add a hooks folder with a suggested pre-commit hook
  • Add APL and BQN glyphs ⊂, ⊃, ⊆, ⊇, ⊏, ⊐, ⊑, ⊒, ⊔, ⊓, ⊕, ⊖, ⊗, ⊘, ⊙, ⌾, ⊝, ⋆, ⌈, ⌉, ⌊, ⌋, ⁼, ⇐, ⇒, ⊸, ⟜, ⟨, ⟩, ⋄, ∧, ∨, ⊢, ⊣, ⊤, ⊥, ≢, ⚇, ⎉, ⎊, ◴, ◵, ◶, ◷, ⥊, ⥋, ∾, ‿, ↩, ↪, ≍, 𝕩, 𝕨, 𝕤, 𝕣, 𝕘, 𝕗, 𝕏, 𝕎, 𝕊, 𝔾, 𝔽
  • Modify some glyphs to improve consistency in APL and BQN code: ¬, ⌙, ⌜, ⌝, ⌞, ⌟, •, ∩, ⌐, ○, ∪, ∘, ⍷
  • Fix ●
  • Add combining glyphs ̉, ̍, ̎, ̏, ̐, ̑, ̒ , ̓ , ̔ , ̕ , ̖ , ̗ , ̜ , ̘ , ̙ , ̚ , ̛ , ̜ ,ㄍ, ̞ , ̟ , Ì  , Ì¡ , Ì¢ , Ì£ , ̤ , Ì¥ , ̦ , ̧ , ̨ , Ì© , ̪ , Ì« , ̬ , Ì­ , Ì® , ̯ , Ì° , ̱ , ̲ , ̳ , Ì´ , ̵ , ̶ , Ì· , ̸ , ̹ , ̺ , Ì» , ̼ , ̽ , ̾ , Ì¿, ̀ , ́ , ͂ , ̓ , ̈́ , ͅ , ͆ , ͇ , ͈ , ͉ , ͊ , ͋ , ͌ , ͎ , ͍ , ͐ , ͑ , ͒ , ͓ , ͔ , ͕ , ͖ , ͗ , ͘ , ͙ , ͚ , ͛ , ͜ , ͝ , ͞ , ͟ , Í  , Í¡ , Í¢ , Í£ , ͤ , Í¥ , ͦ , ͧ , ͨ , Í© , ͪ , Í« , ͬ , Í­ , Í® , ͯ .
  • Add ँ, Ê», ê­ª, ê­«
  • Add composing glyphs to rendering test
  • Adjust derived font names
  • Simplify cedilla, fix overlap in ç and Ç

Fixing tag format 2020-09-17 10:24:25

This is exactly the same as tag v.2.1.0

Ricardo Bánffy

Computer whisperer, cloud charmer, seasoned geek, round peg, writer of executable poetry.

GitHub Repository

font fontforge ibm font-files sfd programming-font programming-fonts typography mainframe