Indic Fonts with Fontforge

Now, finally we come to Indic fonts. To begin with, you will have to choose the legacy font you want to extract your glyphs from. I won't be covering the topic of drawing your own glyphs - but you can refer to the Fontforge Tutorial for that.

Choosing a font and getting the glyphs

Your chosen font can be of any kind - Truetype, Postscript - even the *.mf fonts used in TeX (extracting glyphs from *.mf can be a little tricky and I'll be telling you on how to do it in Appendix A (section 1) ). When you choose a font, please be aware of the various legal aspects. Font licensing is a tricky issue - and here are the major points you need to be aware of -

  • Glyphs are copyrighted matter - you cannot simply choose any font and rip off its glyphs.

  • You must have the permission to modify and make defivative works of your chosen font.

  • If the original font is GPL'ed - your derivative font must also be GPL'ed

  • One may use different licenses for the actual font and the glyphs - if possible verify the licensing issues with the original author.

Once you are satisfied that you can actually make derivative works of your chosen font, you can begin proper work on it.


During choosing your font - make sure that it has got all the glyphs that you require. To do this, open up the font in FontForge - and enable View->Compacted View Then verify (usually by cross checking with a characters and conjunct list, which can usually be found in a dictionary) whether the font has got all the requisite glyphs or not. You can also compare the glyphlist with the glyphlist of an existing OpenType font.

Getting the glyphs in place

At first, the bulk of your job will consist of copying and pasting the glyphs in the right positions. To do that, you will need to have a blank font at first. From the Fontforge menu - choose File->New A blank font will open up. You'll need to edit some of the basic properties of this font - so open up the Element->Font Info.. dialog. In the Name tab of that dialog box - fill in the FontName field in the format <Fontname><Weight>. (Weight determines how dark text rendered in a font appears - ie, bold, light, etc). The other fields in that tab (except the copyright one) will get populated automatically. Now, move on to the Encoding tab, and select ISO 10646-1 (Unicode, BMP). Now select the General tab and copy the values from the original font (this would make the job of transferring the glyphs much easier).

Once all of this has been completed - open up a character map application like Gucharmap and find the beginning of the Unicode block for your script. Once you have found that out - scroll down in Fontforge to that codepoint, and start copying the glyphs from the legacy font to the proper codepoints. Usually the sequence of the glyphs in the two fonts will not match - so you will have to do a little hunting around to do the transfers.


Sometimes, in a typical legacy Indic font - you will often get weird forms of ordinary characters (cut off portion of a "ja", etc) - search for the other half - and you'll get that too. After you locate the "pieces", just paste them one by one into the same outline view, and adjust their positions, and you'll get the requisite (and complete glyph)

Once you have covered the entire Unicode block for your script (don't worry if you don't manage to find glyphs for some of the more unusual characters like currency signs, etc - usually they are not used in daily work), you will need to move on to handling the conjuncts.

While putting the conjuncts in your fonts, you must make sure that you don't put them in an area which has been assigned by Unicode to some other characters. To do this, try to estimate the number of conjuncts that you are going to have in your font. Now, add twenty to this figure, and open the Encoding tab in the "Font Info" dialog. In the Number of Glyphs field, enter the sum of the result figure and 65536 Now start adding the conjuncts, starting from point 65536.

Naming the Glyphs

Once you have finished transferring all the glyphs, you will have to name them. (Actually, a default name is already assign to the glyphs, but choosing an alternative, more human readable naming convention helps a lot later on.) To change the name of the glyph, go to the Character Information dialog box by using the Char Info... in the right click menu, or by using Element->Char Info... The naming convention that we usually follow is <Language Code>_< Character Name<. By this convention, Ux0995 becomes bn_ka.

Adding the substitution tables

Once the naming has been done, you will have to start adding the substitution information for the conjuncts and the other complex glyphs. However, before going into that, you must understand the concept of "features".

Once you have gone through the list of features, select the first conjunct in your list, and open up the "Char Info.." dialog either through the menu or by using the Ctrl-L key combination. Select the Ligature tab and click on the New button. In the dialog that comes up, in the Components field, write the components that make up that particular ligature, ie, for the hi_ka_ka ligature, the components would be hi_ka hi_halant hi_ka. (Now do you understand why using sensible names for the glyphs help ?). Select the appropriate feature from the "Tag" drop down list and select the script name (this can also be DFLT) from the Language and Scripts drop down menu.

Figure 2.7. Modifying ligature information

Modifying ligature information

Fontforge - Modifying ligature information


Remember that a glyph which substitute another single glyph is not a ligature, but simply, a substitution. This kind of substitutions are handled in the "Subs" tab of the Fontforge Char Info dialog box.


In Bangla, most of the ligature have the Pre Base Substitution (pres) Tag, and I usually tend to group the ligature glyphs featurewise. This makes adding Tag information slightly easier.


Also remember that a single ligature can have multiple substitution information associated with it. For example, the sequence Bengali Ra + Hashanta and Assamese Ra + Hashanta combine to form the same glyph of a reph.

Adding the Positioning Information

After the substitution information has been added, you will have to add the positioning information for the various marks (like chandrabindu, ukaar, reph, etc.). Positioning in Fontforge is done via anchors.

There are one or more anchor class in a font, and they can be added or removed by using the Anchor Classes tab in the Font Info.. dialog box. To add an anchor class, press the New button in the Anchor Classes tab. Usually, we use one (or two) marks per anchor class, so the Name should be in the format bn_ukaar_pos (in case of one mark) bn_ukaar_uukaar (in case of two marks). If the mark attaches to the top of the base glyph, then the Tag should be Above Base Mark (abvm). Examples of such marks include the reph and the bindi, and for Devanagari, ekaar, aikaar, etc. Below Base Mark or blwm include ukaar, uukaar, rikaar, etc.

Figure 2.8. Adding a new anchor class

Adding a new anchor class

Fontforge - Adding a new anchor class

Once you have added the Anchor Class, open up the Outline View of the mark, and from Point->Add Anchor A dialog box, titled Anchor Point Info will pop up. Choose the proper anchor class from the drop down menu. Since you are adding the anchor point to a mark, the Mark will be automatically enabled (if it is not, enable it). After you are satisfied with all the settings, click on OK . A blue cross will appear on the Outline View canvas. Click on it, and drag it to the the desired position.


It is important that you choose the right Anchor Class while adding the anchor point - otherwise your font may look really really weird in some cases.

The process for adding anchor points to the base glyphs is more or less the same - only you will have to enable the BaseChar radio button in case of characters and the BaseLig radio button in case of ligatures.

Figure 2.9. Adding a new anchor point

Adding a new anchor point

Fontforge - Adding a new anchor point


To preposition the anchor point, just click on the desired position on the Outline View canvas before clicking on Add Anchor. The anchor point will automagically appear in the position that you clicked.