First Commit
[orfont.git] / ttf / fontchunk.rb
blob05a29ca4fcdb889cb3fd5a110694b0bffcad7e6d
1 # TTF/Ruby, a library to read and write TrueType fonts in Ruby.
2 # Copyright (C) 2006  Mathieu Blondel
3
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 2 of the License, or
7 # (at your option) any later version.
8
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
18 module FontTTF
19 module TTF
21 # A FontChunk is a portion of font. It starts at an offset and has a given
22 # length. It is useful to handle tables that have not been implemented
23 # or to quickly get a dump for a table that has not been modified.
24 class FontChunk 
26     attr_reader :font
27     attr_accessor :offset, :len
29     def initialize(font, offset=nil, len=nil)
30         @font = font
31         # When a FontChunk is modified by user,
32         # offset and len are not true anymore
33         @offset = offset
34         @len = len
35     end
37     # Returns the end of the class name as a Symbol.
38     # Will be useful for tables, which are subclasses of FontChunk.
39     # For example, calling tag on Font::TTF:Table::Loca object will return
40     # :loca.
41     def tag
42         t = self.class.name.split("::").last.downcase.to_sym
43         t = :"OS/2" if t == :os2
44         t
45     end
47     # Basically each table is a FontChunk and tables may be created by hand
48     # (i.e. not exist in file yet). This method returns whether the FontChunk
49     # already exists in file or not.
50     def exists_in_file?
51         not @offset.nil?
52     end
54     # Returns raw binary data of the FontChunk.
55     def dump
56         @font.at_offset(@offset) do
57             @font.read(@len)
58         end
59     end
61     # Returns a checksum of dump.
62     def self.checksum(dump)
63         # FIXME: this methods seems to be buggy
64         len = ((raw.length + 3) & ~3) / IO::SIZEOF_ULONG
65         sum = 0
66         (len - 1).times do |i|
67             ulong_str = raw.slice(i * IO::SIZEOF_ULONG, IO::SIZEOF_ULONG)
68             ulong = ulong_str.unpack("N")[0]
69             sum += ulong
70         end        
71         sum
72     end
74 end
76 end
77 end