Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

Handjet: an element-based variable font

License

NotificationsYou must be signed in to change notification settings

rosettatype/handjet

Repository files navigation

Handjet is an element-based variable font (aka pixel font, modular font, …) where every glyph is composed using multiple copies of the same element. Each element can take 1 of 23 shapes and transition smoothly between them while creating various effects. The font currently supports these scripts: Arabic, Armenian, Cyrillic, Greek, Hebrew, Latin, and Korean.

Handjet’s ELSH axis animationHandjet’s ELSH axis animationHandjet’s ELSH axis animationHandjet’s wght axis animationHandjet’s ELGR axis animation

The story

In autumn 2018, I had the opportunity to teach type design to a group of talented graphic design students at theFaculty of Fine Arts in Brno. Their first exercise was to build a simple element-based font that would be tailored to work well withhandjet printers. The handjet’s 32-pixel vertical matrix defined the constraints, the only contour to draw was the shape of the element, and the rest of the design job was “only” a matter of placing the elements on the grid to form letters. The clocks were ticking and the students were fierce. Most of them had their font with basic English and Czech alphabets done by the end of the day!

Upon realizing the task could be taken even further, I set out to design my own font. I did not leave the house that weekend and ended up with a complete pan-European Latin. A couple of days later I had Greek and Cyrillic too. It was hard to stop. And once I started interpolating the element shapes, it got out of control completely.

In its current version, the Handjet type system contains 23 elemental shapes. Smooth transitions between them create various effects: a triangle appears out of thin air and expands into a square, the square rotates to create a lozenge and then scales into a thin rectangle, a rounded square smoothly turns into a circle and the circle into an oval, a clover becomes a rotating star, and a spindle, and a heart. The size of elements can be changed as well, producing different font weights. Plus, one can choose to use groups of 2x2 smaller elements instead of a single element. All of these components work together within a single variable font, allowing users to produce their custom variations and animations easily.

In 2019, Google sponsored the extension and open-sourcing of Handjet. All variations and element shapes have been thoroughly revisited and extended. Working with consultants Borna Izadpanah, Khajag Apelian, and Meir Sadan, I have also added support for Arabic, Armenian, and Hebrew (respectively). Selected symbols representing wild and domestic animals were included together with various seasonal symbols and patterns. I hope you will have as much fun using them as I had designing them.

In 2023, Park Ha-neul (박하늘) and Lee-su Yoo (유이수) have included support for the Korean script.

— David Březina, November 2023

P.S. If you want to do this exercise with your students, have a look at thisGlyphs tutorial.

P.P.S. To be perfectly clear, I went way beyond what a handjet's grids permit, so only some of the fonts are suited to use with these printers.

WARNING: We have found that InDesign 2023 (18+) and Illustrator 2023 (27+) have issues displaying Handjet. You can solve this issue by either upgrading to the latest 2024 versions (19.2 and 28.3 respectively) or by downgrading to older versions. The font may show unwanted visual artifacts in small sizes in Safari/Webkit due to the specifics of the default rendering setup. Change the default anti-aliasing setting in your CSS to eliminate them:-webkit-font-smoothing: antialiased (for example).

Handjet preview

Variable font

Handjet is a variable font with the following axes:

  • Weight (wght) (100-900) controls the size of the element,
  • Element Shape (ELSH) (0.0-16.0) controls the shape of the element,
  • Element Grid (ELGR) (1.0-2.0) controls how many elements are used per one grid unit.

Weight (wght)

The weight is represented by the size of the element used.

ValueDescriptionInstance
100Thin*
200ExtraLight*
300Light*
400Regular*
500Medium*
600SemiBold*
700Bold*
800ExtraBold*
900Black*

Element Shape axis (ELSH)

The interpolation between different element shapes along this axis creates a rotation or disappearing effect for some of them. This was done (instead of having independent rotation and scale axes for example) to simplify the design space, and to keep things manageable for users as well as computers. For a preview of the available element shapes and their transitions, see the animations above.

ValueDescriptionInstance
0.00Blank*
1.00Triangle*
2.00Square (default)*
2.11Square at 20 degrees-
2.25Lozenge*
2.36Square at 65 degrees-
2.50Square (transitional master)x
3.19Block*
3.36Rectangle*
4.00Bar (Vertical)*
4.11Bar at 20 degrees-
4.25Bar (Diagonal Up)*
4.36Bar at 65 degrees-
4.50Bar (Horizontal)*
4.61Bar at 110 degrees-
4.75Bar (Diagonal Down)*
4.86Bar at 155 degrees-
5.00Bar at 180 degrees-
6.50Square (transitional master)x
6.90Rounded Square*
7.63Squircle*
8.00Circle*
8.69Egg*
8.86Oval*
9.50Thinner Oval*
11.00Circle (transitional master)x
12.00Clover*
13.00Flower*
14.00Star*
14.11Star at 20 degrees-
14.25Diagonal Star*
14.36Star at 65 degrees-
14.50Star at 90 degrees-
14.75Big Star*
15.00Spindle*
15.37Pin*
16.00Heart*

Rows marked with* are available as instances in the STAT table.
Rows marked withx are repeated shapes that allow for a better transition.
Rows marked with- are for example only.

Element Grid axis (ELGR)

This axis controls how many elements are used per one grid unit.

ValueDescriptionInstance
1.00Single element (single)*
2.00Group of 2x2 elements (double)*

Source files

In principle, all glyphs remain structurally the same across all masters except for one special glyph,pixel, which represents the element shape and is different for each master.

Thepixel glyph is compiled from all non-exportingpixel.xxx glyphs and is the only component that changes between the masters of this variable font. You can recompile thepixel glyph by using theproduction/glyphs-scripts/compile pixel glyph.py macro in the Glyphs app.

Building a the Variable Font from the sources

  • In your Python 3 environment, make sure to install the required pip packages:$ pip install -r requirements.txt
  • Make sure you make theproduction/build.sh file executable:$ chmod +x production/build.sh
  • To recompile, run$ ./production/build.sh and new fonts will be generated in thefonts/ directory (it's a complex file and takes a while to recompile)

Scripting

If you would like to animate Handjet using Python andDrawBot, you can check out thesource code for the animations.


[8]ページ先頭

©2009-2025 Movatter.jp