OffsetTable.vala
/*
Copyright (C) 2012, 2013 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.
*/
namespace BirdFont {
public class OffsetTable : OtfTable {
DirectoryTable directory_table;
public uint16 num_tables = 0;
uint16 search_range = 0;
uint16 entry_selector = 0;
uint16 range_shift = 0;
public OffsetTable (DirectoryTable t) {
id = "Offset table";
directory_table = t;
}
public override void parse (FontData dis) throws Error {
Fixed version;
dis.seek (offset);
version = dis.read_fixed ();
num_tables = dis.read_ushort ();
search_range = dis.read_ushort ();
entry_selector = dis.read_ushort ();
range_shift = dis.read_ushort ();
printd (@"Font file version $(version.get_string ())\n");
printd (@"Number of tables $num_tables\n");
}
public void process () throws GLib.Error {
FontData fd = new FontData ();
Fixed version = 0x00010000; // sfnt version 1.0 for TTF CFF else use OTTO
num_tables = (uint16) directory_table.get_tables ().size - 2; // number of tables, skip DirectoryTable and OffsetTable
search_range = max_pow_2_less_than_i (num_tables) * 16;
entry_selector = max_log_2_less_than_i (num_tables);
range_shift = 16 * num_tables - search_range;
fd.add_fixed (version);
fd.add_u16 (num_tables);
fd.add_u16 (search_range);
fd.add_u16 (entry_selector);
fd.add_u16 (range_shift);
// skip padding for offset table
this.font_data = fd;
}
}
}