Clone in a terminal:
CligFeature.vala
/*
	Copyright (C) 2015 Johan Mattsson

	This library is free software; you can redistribute it and/or modify 
	it under the terms of the GNU Lesser General Public License as 
	published by the Free Software Foundation; either version 3 of the 
	License, or (at your option) any later version.

	This library is distributed in the hope that it will be useful, but 
	WITHOUT ANY WARRANTY; without even the implied warranty of 
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 
	Lesser General Public License for more details.
*/
using Math;

namespace BirdFont {

public class CligFeature : GLib.Object {
	public LigatureCollection clig;
	public ContextualLigatureCollection contextual;
	Lookups lookups;
	GlyfTable glyf_table;
	
	public CligFeature (GlyfTable glyf_table) throws GLib.Error {	
		this.glyf_table = glyf_table;
		generate_feature ();
	}
	
	public bool has_regular_ligatures () {
		return clig.ligature_sets.size > 0;
	}
	
	public Lookups get_lookups () {
		return lookups;
	}
	
	private void generate_feature () throws GLib.Error {
		Gee.ArrayList<FontData> chain_data;
		FontData clig_subtable;
		FontData fd;
		Lookup lookup;
		
		fd = new FontData ();
		clig = new LigatureCollection.clig (glyf_table);
		contextual = new ContextualLigatureCollection (glyf_table);

		clig_subtable = clig.get_font_data (glyf_table);
		clig_subtable.pad ();
		
		chain_data = get_chaining_contextual_substition_subtable (contextual);
		
		// lookup table
		lookups = new Lookups ();
		
		if (contextual.has_ligatures ()) {
			foreach (LigatureCollection s in contextual.ligatures) {
				lookup = new Lookup (4, 0, "chained data");
				lookup.add_subtable (s.get_font_data (glyf_table));
				lookups.add_lookup(lookup);
			}

			lookup = new Lookup (6, 0, "chain context");
			foreach (FontData d in chain_data) {
				lookup.add_subtable (d);
			}
			lookups.add_lookup(lookup);			
		}

		lookup = new Lookup (4, 0, "ligatures");
		lookup.add_subtable (clig_subtable);
		lookups.add_lookup(lookup);
	}
	
	// chaining contextual substitution format3
	Gee.ArrayList<FontData> get_chaining_contextual_substition_subtable (ContextualLigatureCollection contexts) throws GLib.Error {
		Gee.ArrayList<FontData> fd = new Gee.ArrayList<FontData> ();
		uint16 ligature_lookup_index = 0;
		
		foreach (ContextualLigature context in contexts.ligature_context) {
			fd.add (context.get_font_data (glyf_table, ligature_lookup_index)); 
			ligature_lookup_index++;
		}
		
		return fd;
	}
}

}

Contact

Email: johan.mattsson.m@gmail.com
Mastodon: typo.social/@birdfont
GitHub: johanmattssonm
LinkedIn: johan-mattsson-2ab324112